#include "dolphinmainwindow.h"
#include "dolphinviewactionhandler.h"
-#include "dolphindropcontroller.h"
#include <config-nepomuk.h>
#include "dolphin_generalsettings.h"
#include "dolphin_iconsmodesettings.h"
+#include "draganddrophelper.h"
#include <kaction.h>
#include <kactioncollection.h>
#include <kio/netaccess.h>
#include <kinputdialog.h>
#include <klocale.h>
+#include <kprotocolmanager.h>
#include <kmenu.h>
#include <kmenubar.h>
#include <kmessagebox.h>
#include <QSplitter>
#include <QDockWidget>
-#include <kdebug.h>
-
DolphinMainWindow::DolphinMainWindow(int id) :
KXmlGuiWindow(0),
m_newMenu(0),
connect(undoManager, SIGNAL(jobRecordingFinished(CommandType)),
this, SLOT(showCommand(CommandType)));
connect(DolphinSettings::instance().placesModel(), SIGNAL(errorMessage(const QString&)),
- this, SLOT(slotHandlePlacesError(const QString&)));
+ this, SLOT(showErrorMessage(const QString&)));
+ connect(&DragAndDropHelper::instance(), SIGNAL(errorMessage(const QString&)),
+ this, SLOT(showErrorMessage(const QString&)));
}
DolphinMainWindow::~DolphinMainWindow()
// the secondary view
DolphinViewContainer* activeViewContainer = m_activeViewContainer;
- m_viewTab[m_tabIndex].primaryView->view()->refresh();
- if (m_viewTab[m_tabIndex].secondaryView != 0) {
- m_viewTab[m_tabIndex].secondaryView->view()->refresh();
+ const int tabCount = m_viewTab.count();
+ for (int i = 0; i < tabCount; ++i) {
+ m_viewTab[i].primaryView->refresh();
+ if (m_viewTab[i].secondaryView != 0) {
+ m_viewTab[i].secondaryView->refresh();
+ }
}
setActiveViewContainer(activeViewContainer);
void DolphinMainWindow::changeUrl(const KUrl& url)
{
+ if (!KProtocolManager::supportsListing(url)) {
+ // The URL navigator only checks for validity, not
+ // if the URL can be listed. An error message is
+ // shown due to DolphinViewContainer::restoreView().
+ return;
+ }
+
DolphinViewContainer* view = activeViewContainer();
if (view != 0) {
view->setUrl(url);
compareFilesAction->setEnabled(false);
}
+#if defined(QUICK_VIEW)
const bool activeViewHasSelection = (activeViewContainer()->view()->selectedItemsCount() > 0);
actionCollection()->action("quick_view")->setEnabled(activeViewHasSelection);
+#endif
m_activeViewContainer->updateStatusBar();
{
openNewTab(m_activeViewContainer->url());
m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
+
+ KUrlNavigator* navigator = m_activeViewContainer->urlNavigator();
+ if (navigator->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();
+ }
}
void DolphinMainWindow::openNewTab(const KUrl& url)
ViewTab viewTab;
viewTab.splitter = new QSplitter(this);
viewTab.primaryView = new DolphinViewContainer(this, viewTab.splitter, url);
+ viewTab.primaryView->setActive(false);
connectViewSignals(viewTab.primaryView);
viewTab.primaryView->view()->reload();
actionCollection()->action("close_tab")->setEnabled(true);
}
+void DolphinMainWindow::activateNextTab()
+{
+ if (m_viewTab.count() == 1 || m_tabBar->count() < 2) {
+ return;
+ }
+
+ const int tabIndex = (m_tabBar->currentIndex() + 1) % m_tabBar->count();
+ m_tabBar->setCurrentIndex(tabIndex);
+}
+
+void DolphinMainWindow::activatePrevTab()
+{
+ if (m_viewTab.count() == 1 || m_tabBar->count() < 2) {
+ return;
+ }
+
+ int tabIndex = m_tabBar->currentIndex() - 1;
+ if (tabIndex == -1) {
+ tabIndex = m_tabBar->count() - 1;
+ }
+ m_tabBar->setCurrentIndex(tabIndex);
+}
+
+void DolphinMainWindow::openInNewTab()
+{
+ const KFileItemList list = m_activeViewContainer->view()->selectedItems();
+ if ((list.count() == 1) && list[0].isDir()) {
+ openNewTab(m_activeViewContainer->view()->selectedUrls()[0]);
+ }
+}
+
+void DolphinMainWindow::openInNewWindow()
+{
+ const KFileItemList list = m_activeViewContainer->view()->selectedItems();
+ if ((list.count() == 1) && list[0].isDir()) {
+ DolphinMainWindow* window = DolphinApplication::app()->createMainWindow();
+ window->changeUrl(m_activeViewContainer->view()->selectedUrls()[0]);
+ window->show();
+ }
+}
+
void DolphinMainWindow::toggleActiveView()
{
if (m_viewTab[m_tabIndex].secondaryView == 0) {
close();
}
-void DolphinMainWindow::slotHandlePlacesError(const QString &message)
+void DolphinMainWindow::showErrorMessage(const QString& message)
{
if (!message.isEmpty()) {
DolphinStatusBar* statusBar = m_activeViewContainer->statusBar();
urlNavigator->setUrlEditable(action->isChecked());
}
-void DolphinMainWindow::editLocation()
+void DolphinMainWindow::replaceLocation()
{
KUrlNavigator* navigator = m_activeViewContainer->urlNavigator();
navigator->setUrlEditable(true);
}
// hide current tab content
- m_viewTab[m_tabIndex].isPrimaryViewActive = m_viewTab[m_tabIndex].primaryView->isActive();
+ ViewTab& hiddenTab = m_viewTab[m_tabIndex];
+ hiddenTab.isPrimaryViewActive = hiddenTab.primaryView->isActive();
+ hiddenTab.primaryView->setActive(false);
+ if (hiddenTab.secondaryView != 0) {
+ hiddenTab.secondaryView->setActive(false);
+ }
QSplitter* splitter = m_viewTab[m_tabIndex].splitter;
splitter->hide();
m_centralWidgetLayout->removeWidget(splitter);
setCentralWidget(centralWidget);
setupDockWidgets();
+ emit urlChanged(homeUrl);
setupGUI(Keys | Save | Create | ToolBar);
}
m_showMenuBar->setChecked(!menuBar()->isHidden()); // workaround for bug #171080
- emit urlChanged(homeUrl);
}
void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* viewContainer)
void DolphinMainWindow::setupActions()
{
// setup 'File' menu
- m_newMenu = new DolphinNewMenu(this);
+ m_newMenu = new DolphinNewMenu(this, this);
KMenu* menu = m_newMenu->menu();
menu->setTitle(i18nc("@title:menu Create new folder, file, link, etc.", "Create New"));
menu->setIcon(KIcon("document-new"));
stop->setIcon(KIcon("process-stop"));
connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));
- // TODO: the naming "Show full Location" is currently confusing...
KToggleAction* showFullLocation = actionCollection()->add<KToggleAction>("editable_location");
- showFullLocation->setText(i18nc("@action:inmenu Navigation Bar", "Show Full Location"));
+ showFullLocation->setText(i18nc("@action:inmenu Navigation Bar", "Editable Location"));
showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L);
connect(showFullLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation()));
- KAction* editLocation = actionCollection()->addAction("edit_location");
- editLocation->setText(i18nc("@action:inmenu Navigation Bar", "Edit Location"));
- editLocation->setShortcut(Qt::Key_F6);
- connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation()));
+ KAction* replaceLocation = actionCollection()->addAction("replace_location");
+ replaceLocation->setText(i18nc("@action:inmenu Navigation Bar", "Replace Location"));
+ replaceLocation->setShortcut(Qt::Key_F6);
+ connect(replaceLocation, SIGNAL(triggered()), this, SLOT(replaceLocation()));
// setup 'Go' menu
KAction* backAction = KStandardAction::back(this, SLOT(goBack()), actionCollection());
compareFiles->setEnabled(false);
connect(compareFiles, SIGNAL(triggered()), this, SLOT(compareFiles()));
+ // disabled Quick View
+#if defined(QUICK_VIEW)
KAction* quickView = actionCollection()->addAction("quick_view");
quickView->setText(i18nc("@action:inmenu Tools", "Quick View"));
quickView->setIcon(KIcon("view-preview"));
quickView->setShortcut(Qt::CTRL + Qt::Key_Return);
quickView->setEnabled(false);
connect(quickView, SIGNAL(triggered()), this, SLOT(quickView()));
+#endif
// setup 'Settings' menu
m_showMenuBar = KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection());
KStandardAction::preferences(this, SLOT(editSettings()), actionCollection());
+
+ // not in menu actions
+ KAction* activateNextTab = actionCollection()->addAction("activatenexttab");
+ activateNextTab->setText(i18nc("@action:inmenu", "Activate Next Tab"));
+ connect(activateNextTab, SIGNAL(triggered()), SLOT(activateNextTab()));
+ activateNextTab->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabPrev() :
+ KStandardShortcut::tabNext());
+
+ KAction* activatePrevTab = actionCollection()->addAction("activateprevtab");
+ activatePrevTab->setText(i18nc("@action:inmenu", "Activate Previous Tab"));
+ connect(activatePrevTab, SIGNAL(triggered()), SLOT(activatePrevTab()));
+ activatePrevTab->setShortcuts(QApplication::isRightToLeft() ? KStandardShortcut::tabNext() :
+ KStandardShortcut::tabPrev());
+
+ // for context menu
+ KAction* openInNewTab = actionCollection()->addAction("open_in_new_tab");
+ openInNewTab->setText(i18nc("@action:inmenu", "Open in New Tab"));
+ openInNewTab->setIcon(KIcon("tab-new"));
+ connect(openInNewTab, SIGNAL(triggered()), this, SLOT(openInNewTab()));
+
+ KAction* openInNewWindow = actionCollection()->addAction("open_in_new_window");
+ openInNewWindow->setText(i18nc("@action:inmenu", "Open in New Window"));
+ openInNewWindow->setIcon(KIcon("window-new"));
+ connect(openInNewWindow, SIGNAL(triggered()), this, SLOT(openInNewWindow()));
}
void DolphinMainWindow::setupDockWidgets()