]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphinmainwindow.cpp
Sourcecode hierarchy cleanup: Move class PixmapViewer from "src" to "src/panels/infor...
[dolphin.git] / src / dolphinmainwindow.cpp
index 00255131849e9846faf4fd78a8dcc836c00e2b0f..bc0f9d65133966faed2505dae3be42af453d447e 100644 (file)
  ***************************************************************************/
 
 #include "dolphinmainwindow.h"
-#include "dolphinviewactionhandler.h"
-#include "dolphinremoteencoding.h"
 
 #include <config-nepomuk.h>
-#ifdef HAVE_NEPOMUK
-#include "search/dolphinsearchoptionsconfigurator.h"
-#endif
 
 #include "dolphinapplication.h"
 #include "dolphincontextmenu.h"
 #include "dolphinnewmenu.h"
-#include "search/dolphinsearchbox.h"
-#include "settings/dolphinsettings.h"
-#include "settings/dolphinsettingsdialog.h"
 #include "dolphinviewcontainer.h"
+#include "mainwindowadaptor.h"
 #include "panels/folders/folderspanel.h"
 #include "panels/places/placespanel.h"
 #include "panels/information/informationpanel.h"
-#include "mainwindowadaptor.h"
+#include "settings/dolphinsettings.h"
+#include "settings/dolphinsettingsdialog.h"
 #include "statusbar/dolphinstatusbar.h"
-#include "viewproperties.h"
+#include "views/dolphinviewactionhandler.h"
+#include "views/dolphinremoteencoding.h"
+#include "views/draganddrophelper.h"
+#include "views/viewproperties.h"
 
 #ifndef Q_OS_WIN
 #include "panels/terminal/terminalpanel.h"
 
 #include "dolphin_generalsettings.h"
 #include "dolphin_iconsmodesettings.h"
-#include "draganddrophelper.h"
 
 #include <kaction.h>
 #include <kactioncollection.h>
+#include <kactionmenu.h>
 #include <kconfig.h>
 #include <kdesktopfile.h>
 #include <kdeversion.h>
@@ -111,17 +108,14 @@ DolphinMainWindow::DolphinMainWindow(int id) :
     m_tabBar(0),
     m_activeViewContainer(0),
     m_centralWidgetLayout(0),
-    m_searchBox(0),
-#ifdef HAVE_NEPOMUK
-    m_searchOptionsConfigurator(0),
-#endif
     m_id(id),
     m_tabIndex(0),
     m_viewTab(),
     m_actionHandler(0),
     m_remoteEncoding(0),
     m_settingsDialog(0),
-    m_captionStatJob(0)
+    m_captionStatJob(0),
+    m_lastHandleUrlStatJob(0)
 {
     setObjectName("Dolphin#");
 
@@ -386,12 +380,18 @@ void DolphinMainWindow::openNewMainWindow()
 
 void DolphinMainWindow::openNewTab()
 {
+    const bool isUrlEditable =  m_activeViewContainer->urlNavigator()->isUrlEditable();
+
     openNewTab(m_activeViewContainer->url());
     m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
 
+    // The URL navigator of the new tab should have the same editable state
+    // as the current tab
     KUrlNavigator* navigator = m_activeViewContainer->urlNavigator();
-    if (navigator->isUrlEditable()) {
-        // if a new tab is opened and the URL is editable, assure that
+    navigator->setUrlEditable(isUrlEditable);
+
+    if (isUrlEditable) {
+        // If a new tab is opened and the URL is editable, assure that
         // the user can edit the URL without manually setting the focus
         navigator->setFocus();
     }
@@ -528,7 +528,6 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
         dialog->setCaption(i18nc("@title:window", "Confirmation"));
         dialog->setButtons(KDialog::Yes | KDialog::No | KDialog::Cancel);
         dialog->setModal(true);
-        dialog->showButtonSeparator(true);
         dialog->setButtonGuiItem(KDialog::Yes, KStandardGuiItem::quit());
         dialog->setButtonGuiItem(KDialog::No, KGuiItem(i18n("C&lose Current Tab"), KIcon("tab-close")));
         dialog->setButtonGuiItem(KDialog::Cancel, KStandardGuiItem::cancel());
@@ -632,7 +631,7 @@ void DolphinMainWindow::readProperties(const KConfigGroup& group)
 void DolphinMainWindow::updateNewMenu()
 {
     m_newMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles());
-    m_newMenu->slotCheckUpToDate();
+    m_newMenu->checkUpToDate();
     m_newMenu->setPopupFiles(activeViewContainer()->url());
 }
 
@@ -723,6 +722,11 @@ void DolphinMainWindow::paste()
     m_activeViewContainer->view()->paste();
 }
 
+void DolphinMainWindow::find()
+{
+    m_activeViewContainer->setSearchModeEnabled(true);
+}
+
 void DolphinMainWindow::updatePasteAction()
 {
     QAction* pasteAction = actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
@@ -823,7 +827,15 @@ void DolphinMainWindow::replaceLocation()
 void DolphinMainWindow::goBack()
 {
     clearStatusBar();
-    m_activeViewContainer->urlNavigator()->goBack();
+    
+    KUrlNavigator* urlNavigator = m_activeViewContainer->urlNavigator();
+    urlNavigator->goBack();
+    
+    if (urlNavigator->locationState().isEmpty()) {
+        // An empty location state indicates a redirection URL,
+        // which must be skipped too
+        urlNavigator->goBack();       
+    }
 }
 
 void DolphinMainWindow::goForward()
@@ -1115,30 +1127,46 @@ void DolphinMainWindow::slotTestCanDecode(const QDragMoveEvent* event, bool& can
     canDecode = KUrl::List::canDecode(event->mimeData());
 }
 
-void DolphinMainWindow::searchItems()
+void DolphinMainWindow::handleUrl(const KUrl& url)
 {
-#ifdef HAVE_NEPOMUK
-    const KUrl nepomukSearchUrl = m_searchOptionsConfigurator->nepomukSearchUrl();
-    m_activeViewContainer->setUrl(nepomukSearchUrl);
-#endif
-}
+    delete m_lastHandleUrlStatJob;
+    m_lastHandleUrlStatJob = 0;
 
-void DolphinMainWindow::showSearchOptions()
-{
-#ifdef HAVE_NEPOMUK
-    m_searchOptionsConfigurator->show();
-#endif
+    if (url.isLocalFile() && QFileInfo(url.toLocalFile()).isDir()) {
+        activeViewContainer()->setUrl(url);
+    } else if (KProtocolManager::supportsListing(url)) {
+        // stat the URL to see if it is a dir or not
+        m_lastHandleUrlStatJob = KIO::stat(url, KIO::HideProgressInfo);
+        connect(m_lastHandleUrlStatJob, SIGNAL(result(KJob*)),
+                this, SLOT(slotHandleUrlStatFinished(KJob*)));
+
+    } else {
+        new KRun(url, this);
+    }
 }
 
-void DolphinMainWindow::handleUrl(const KUrl& url)
+void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job)
 {
-    if (KProtocolManager::supportsListing(url)) {
+    m_lastHandleUrlStatJob = 0;
+    const KIO::UDSEntry entry = static_cast<KIO::StatJob*>(job)->statResult();
+    const KUrl url = static_cast<KIO::StatJob*>(job)->url();
+    if ( entry.isDir() ) {
         activeViewContainer()->setUrl(url);
     } else {
         new KRun(url, this);
     }
 }
 
+void DolphinMainWindow::tabDropEvent(int tab, QDropEvent* event)
+{
+    const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
+    if (!urls.isEmpty() && tab != -1) {
+        const ViewTab& viewTab = m_viewTab[tab];
+        const KUrl destPath = viewTab.isPrimaryViewActive ? viewTab.primaryView->url() : viewTab.secondaryView->url();
+        DragAndDropHelper::instance().dropUrls(KFileItem(), destPath, event, m_tabBar);
+    }
+}
+
 void DolphinMainWindow::slotCaptionStatFinished(KJob* job)
 {
     m_captionStatJob = 0;
@@ -1200,14 +1228,6 @@ void DolphinMainWindow::init()
     connect(this, SIGNAL(urlChanged(const KUrl&)),
             m_remoteEncoding, SLOT(slotAboutToOpenUrl()));
 
-#ifdef HAVE_NEPOMUK
-    m_searchOptionsConfigurator = new DolphinSearchOptionsConfigurator(this);
-    m_searchOptionsConfigurator->hide();
-    connect(m_searchOptionsConfigurator, SIGNAL(searchOptionsChanged()),
-            this, SLOT(searchItems()));
-    connect(this, SIGNAL(urlChanged(KUrl)), m_searchOptionsConfigurator, SLOT(setDirectory(KUrl)));
-#endif
-
     m_tabBar = new KTabBar(this);
     m_tabBar->setMovable(true);
     m_tabBar->setTabsClosable(true);
@@ -1227,6 +1247,8 @@ void DolphinMainWindow::init()
             this, SLOT(closeTab(int)));
     connect(m_tabBar, SIGNAL(tabMoved(int, int)),
             this, SLOT(slotTabMoved(int, int)));
+    connect(m_tabBar, SIGNAL(receivedDropEvent(int, QDropEvent*)),
+            this, SLOT(tabDropEvent(int, QDropEvent*)));
 
     m_tabBar->blockSignals(true);  // signals get unblocked after at least 2 tabs are open
 
@@ -1234,9 +1256,6 @@ void DolphinMainWindow::init()
     m_centralWidgetLayout = new QVBoxLayout(centralWidget);
     m_centralWidgetLayout->setSpacing(0);
     m_centralWidgetLayout->setMargin(0);
-#ifdef HAVE_NEPOMUK
-    m_centralWidgetLayout->addWidget(m_searchOptionsConfigurator);
-#endif
     m_centralWidgetLayout->addWidget(m_tabBar);
     m_centralWidgetLayout->addWidget(m_viewTab[m_tabIndex].splitter, 1);
 
@@ -1245,28 +1264,18 @@ void DolphinMainWindow::init()
     emit urlChanged(homeUrl);
 
     setupGUI(Keys | Save | Create | ToolBar);
-
-    m_searchBox->setParent(toolBar("searchToolBar"));
-    m_searchBox->show();
-    connect(m_searchBox, SIGNAL(requestSearchOptions()),
-            this, SLOT(showSearchOptions()));
-#ifdef HAVE_NEPOMUK
-    connect(m_searchBox, SIGNAL(searchTextChanged(QString)),
-            m_searchOptionsConfigurator, SLOT(setCustomSearchQuery(QString)));
-#endif
-
     stateChanged("new_file");
 
     QClipboard* clipboard = QApplication::clipboard();
     connect(clipboard, SIGNAL(dataChanged()),
             this, SLOT(updatePasteAction()));
-    updatePasteAction();
-    updateGoActions();
 
     if (generalSettings->splitView()) {
         toggleSplitView();
     }
+    updateEditActions();
     updateViewActions();
+    updateGoActions();
 
     QAction* showFilterBarAction = actionCollection()->action("show_filter_bar");
     showFilterBarAction->setChecked(generalSettings->filterBar());
@@ -1364,6 +1373,8 @@ void DolphinMainWindow::setupActions()
     // due to the long text, the text "Paste" is used:
     paste->setIconText(i18nc("@action:inmenu Edit", "Paste"));
 
+    KStandardAction::find(this, SLOT(find()), actionCollection());
+
     KAction* selectAll = actionCollection()->addAction("select_all");
     selectAll->setText(i18nc("@action:inmenu Edit", "Select All"));
     selectAll->setShortcut(Qt::CTRL + Qt::Key_A);
@@ -1433,11 +1444,6 @@ void DolphinMainWindow::setupActions()
     KStandardAction::home(this, SLOT(goHome()), actionCollection());
 
     // setup 'Tools' menu
-    KToggleAction* showSearchBar = actionCollection()->add<KToggleAction>("show_search_bar");
-    showSearchBar->setText(i18nc("@action:inmenu Tools", "Show Search Bar"));
-    showSearchBar->setShortcut(Qt::CTRL | Qt::Key_S);
-    connect(showSearchBar, SIGNAL(triggered(bool)), this, SLOT(toggleFilterBarVisibility(bool)));
-
     KToggleAction* showFilterBar = actionCollection()->add<KToggleAction>("show_filter_bar");
     showFilterBar->setText(i18nc("@action:inmenu Tools", "Show Filter Bar"));
     showFilterBar->setIcon(KIcon("view-filter"));
@@ -1461,17 +1467,23 @@ void DolphinMainWindow::setupActions()
     KStandardAction::preferences(this, SLOT(editSettings()), actionCollection());
 
     // not in menu actions
+    QList<QKeySequence> nextTabKeys;
+    nextTabKeys.append(KStandardShortcut::tabNext().primary());
+    nextTabKeys.append(QKeySequence(Qt::CTRL + Qt::Key_Tab));
+
+    QList<QKeySequence> prevTabKeys;
+    prevTabKeys.append(KStandardShortcut::tabPrev().primary());
+    prevTabKeys.append(QKeySequence(Qt::CTRL + Qt::SHIFT + Qt::Key_Tab));
+
     KAction* activateNextTab = actionCollection()->addAction("activate_next_tab");
     activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
     connect(activateNextTab, SIGNAL(triggered()), SLOT(activateNextTab()));
-    activateNextTab->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabPrev() :
-                                                                  KStandardShortcut::tabNext());
+    activateNextTab->setShortcuts(QApplication::isRightToLeft() ? prevTabKeys : nextTabKeys);
 
     KAction* activatePrevTab = actionCollection()->addAction("activate_prev_tab");
     activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
     connect(activatePrevTab, SIGNAL(triggered()), SLOT(activatePrevTab()));
-    activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabNext() :
-                                                                  KStandardShortcut::tabPrev());
+    activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? nextTabKeys : prevTabKeys);
 
     // for context menu
     KAction* openInNewTab = actionCollection()->addAction("open_in_new_tab");
@@ -1483,16 +1495,6 @@ void DolphinMainWindow::setupActions()
     openInNewWindow->setText(i18nc("@action:inmenu", "Open in New Window"));
     openInNewWindow->setIcon(KIcon("window-new"));
     connect(openInNewWindow, SIGNAL(triggered()), this, SLOT(openInNewWindow()));
-
-    // 'Search' toolbar
-    m_searchBox = new DolphinSearchBox(this);
-    connect(m_searchBox, SIGNAL(search(QString)), this, SLOT(searchItems()));
-
-    KAction* search = new KAction(this);
-    actionCollection()->addAction("search_bar", search);
-    search->setText(i18nc("@action:inmenu", "Search Bar"));
-    search->setDefaultWidget(m_searchBox);
-    search->setShortcutConfigurable(false);
 }
 
 void DolphinMainWindow::setupDockWidgets()
@@ -1505,12 +1507,9 @@ void DolphinMainWindow::setupDockWidgets()
     connect(infoPanel, SIGNAL(urlActivated(KUrl)), this, SLOT(handleUrl(KUrl)));
     infoDock->setWidget(infoPanel);
 
-    KAction* infoAction = new KAction(this);
-    infoAction->setText(i18nc("@title:window", "Information"));
-    infoAction->setShortcut(Qt::Key_F11);
+    QAction* infoAction = infoDock->toggleViewAction();
     infoAction->setIcon(KIcon("dialog-information"));
-    actionCollection()->addAction("show_info_panel", infoAction);
-    connect(infoAction, SIGNAL(triggered()), infoDock->toggleViewAction(), SLOT(trigger()));
+    infoAction->setShortcut(Qt::Key_F11);
 
     addDockWidget(Qt::RightDockWidgetArea, infoDock);
     connect(this, SIGNAL(urlChanged(KUrl)),
@@ -1527,12 +1526,9 @@ void DolphinMainWindow::setupDockWidgets()
     FoldersPanel* foldersPanel = new FoldersPanel(foldersDock);
     foldersDock->setWidget(foldersPanel);
 
-    KAction* foldersAction = new KAction(this);
-    foldersAction->setText(i18nc("@title:window", "Folders"));
+    QAction* foldersAction = foldersDock->toggleViewAction();
     foldersAction->setShortcut(Qt::Key_F7);
     foldersAction->setIcon(KIcon("folder"));
-    actionCollection()->addAction("show_folders_panel", foldersAction);
-    connect(foldersAction, SIGNAL(triggered()), foldersDock->toggleViewAction(), SLOT(trigger()));
 
     addDockWidget(Qt::LeftDockWidgetArea, foldersDock);
     connect(this, SIGNAL(urlChanged(KUrl)),
@@ -1550,12 +1546,9 @@ void DolphinMainWindow::setupDockWidgets()
 
     connect(terminalPanel, SIGNAL(hideTerminalPanel()), terminalDock, SLOT(hide()));
 
-    KAction* terminalAction = new KAction(this);
-    terminalAction->setText(i18nc("@title:window Shell terminal", "Terminal"));
+    QAction* terminalAction = terminalDock->toggleViewAction();
     terminalAction->setShortcut(Qt::Key_F4);
     terminalAction->setIcon(KIcon("utilities-terminal"));
-    actionCollection()->addAction("show_terminal_panel", terminalAction);
-    connect(terminalAction, SIGNAL(triggered()), terminalDock->toggleViewAction(), SLOT(trigger()));
 
     addDockWidget(Qt::BottomDockWidgetArea, terminalDock);
     connect(this, SIGNAL(urlChanged(KUrl)),
@@ -1564,6 +1557,7 @@ void DolphinMainWindow::setupDockWidgets()
 
     const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun();
     if (firstRun) {
+        infoDock->hide();
         foldersDock->hide();
 #ifndef Q_OS_WIN
         terminalDock->hide();
@@ -1580,18 +1574,25 @@ void DolphinMainWindow::setupDockWidgets()
     placesPanel->setModel(DolphinSettings::instance().placesModel());
     placesPanel->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
 
-    KAction* placesAction = new KAction(this);
-    placesAction->setText(i18nc("@title:window", "Places"));
+    QAction* placesAction = placesDock->toggleViewAction();
     placesAction->setShortcut(Qt::Key_F9);
     placesAction->setIcon(KIcon("bookmarks"));
-    actionCollection()->addAction("show_places_panel", placesAction);
-    connect(placesAction, SIGNAL(triggered()), placesDock->toggleViewAction(), SLOT(trigger()));
 
     addDockWidget(Qt::LeftDockWidgetArea, placesDock);
     connect(placesPanel, SIGNAL(urlChanged(KUrl, Qt::MouseButtons)),
             this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons)));
     connect(this, SIGNAL(urlChanged(KUrl)),
             placesPanel, SLOT(setUrl(KUrl)));
+
+    KActionMenu* panelsMenu = new KActionMenu(i18nc("@action:inmenu View", "Panels"), this);
+    actionCollection()->addAction("panels", panelsMenu);
+    panelsMenu->setDelayed(false);
+    panelsMenu->addAction(placesAction);
+    panelsMenu->addAction(infoAction);
+    panelsMenu->addAction(foldersAction);
+#ifndef Q_OS_WIN
+    panelsMenu->addAction(terminalAction);
+#endif
 }
 
 void DolphinMainWindow::updateEditActions()
@@ -1711,6 +1712,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container)
             this, SLOT(updateHistory()));
     connect(navigator, SIGNAL(editableStateChanged(bool)),
             this, SLOT(slotEditableStateChanged(bool)));
+    connect(navigator, SIGNAL(tabRequested(const KUrl&)),
+            this, SLOT(openNewTab(KUrl)));
 }
 
 void DolphinMainWindow::updateSplitAction()