#include "metadatawidget.h"
#include "mainwindowadaptor.h"
#include "treeviewsidebarpage.h"
-#include "viewpropertiesdialog.h"
#include "viewproperties.h"
#ifndef Q_OS_WIN
#include <kmenu.h>
#include <kmenubar.h>
#include <kmessagebox.h>
-#include <kurlnavigator.h>
+#include <konq_fileitemcapabilities.h>
#include <konqmimedata.h>
#include <kpropertiesdialog.h>
#include <kprotocolinfo.h>
-#include <ktoggleaction.h>
#include <krun.h>
#include <kshell.h>
#include <kstandarddirs.h>
#include <kstatusbar.h>
#include <kstandardaction.h>
#include <ktabbar.h>
+#include <ktoggleaction.h>
+#include <kurlnavigator.h>
#include <kurl.h>
#include <kurlcombobox.h>
new MainWindowAdaptor(this);
QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this);
- KonqFileUndoManager::incRef();
-
- KonqFileUndoManager* undoManager = KonqFileUndoManager::self();
- undoManager->setUiInterface(new UndoUiInterface(this));
+ KIO::FileUndoManager* undoManager = KIO::FileUndoManager::self();
+ undoManager->setUiInterface(new UndoUiInterface());
connect(undoManager, SIGNAL(undoAvailable(bool)),
this, SLOT(slotUndoAvailable(bool)));
DolphinMainWindow::~DolphinMainWindow()
{
- KonqFileUndoManager::decRef();
DolphinApplication::app()->removeMainWindow(this);
}
m_viewTab[m_tabIndex].secondaryView = container;
}
-void DolphinMainWindow::slotDoingOperation(KonqFileUndoManager::CommandType commandType)
+void DolphinMainWindow::slotDoingOperation(KIO::FileUndoManager::CommandType commandType)
{
clearStatusBar();
m_undoCommandTypes.append(commandType);
const KUrl& destination)
{
DolphinDropController dropController(this);
- connect(&dropController, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)),
- this, SLOT(slotDoingOperation(KonqFileUndoManager::CommandType)));
+ connect(&dropController, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)),
+ this, SLOT(slotDoingOperation(KIO::FileUndoManager::CommandType)));
dropController.dropUrls(urls, destination);
}
updateEditActions();
updateViewActions();
updateGoActions();
- const QString caption = url.fileName();
- setCaption(caption);
+ setCaption(url.fileName());
if (m_viewTab.count() > 1) {
- m_tabBar->setTabText(m_tabIndex, caption);
+ m_tabBar->setTabText(m_tabIndex, tabName(url));
}
emit urlChanged(url);
}
QAction* compareFilesAction = actionCollection()->action("compare_files");
if (selectedUrlsCount == 2) {
- const bool kompareInstalled = !KGlobal::dirs()->findExe("kompare").isEmpty();
- compareFilesAction->setEnabled(selectedUrlsCount == 2 && kompareInstalled);
+ compareFilesAction->setEnabled(isKompareInstalled());
} else {
compareFilesAction->setEnabled(false);
}
if (m_viewTab.count() == 1) {
// Only one view is open currently and hence no tab is shown at
// all. Before creating a tab for 'url', provide a tab for the current URL.
- m_tabBar->addTab(KIcon("folder"), m_activeViewContainer->url().fileName());
+ m_tabBar->addTab(KIcon("folder"), tabName(m_activeViewContainer->url()));
m_tabBar->blockSignals(false);
}
- m_tabBar->addTab(KIcon("folder"), url.fileName());
+ m_tabBar->addTab(KIcon("folder"), tabName(url));
ViewTab viewTab;
viewTab.splitter = new QSplitter(this);
void DolphinMainWindow::properties()
{
+ KPropertiesDialog* dialog = 0;
const KFileItemList list = m_activeViewContainer->view()->selectedItems();
+ if (list.isEmpty()) {
+ const KUrl url = activeViewContainer()->url();
+ dialog = new KPropertiesDialog(url, this);
+ } else {
+ dialog = new KPropertiesDialog(list, this);
+ }
- KPropertiesDialog *dialog = new KPropertiesDialog(list, this);
dialog->setAttribute(Qt::WA_DeleteOnClose);
dialog->show();
dialog->raise();
}
if (available && (m_undoCommandTypes.count() > 0)) {
- const KonqFileUndoManager::CommandType command = m_undoCommandTypes.takeFirst();
+ const KIO::FileUndoManager::CommandType command = m_undoCommandTypes.takeFirst();
DolphinStatusBar* statusBar = m_activeViewContainer->statusBar();
switch (command) {
- case KonqFileUndoManager::COPY:
+ case KIO::FileUndoManager::Copy:
statusBar->setMessage(i18nc("@info:status", "Copy operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::MOVE:
+ case KIO::FileUndoManager::Move:
statusBar->setMessage(i18nc("@info:status", "Move operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::LINK:
+ case KIO::FileUndoManager::Link:
statusBar->setMessage(i18nc("@info:status", "Link operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::TRASH:
+ case KIO::FileUndoManager::Trash:
statusBar->setMessage(i18nc("@info:status", "Move to trash operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::RENAME:
+ case KIO::FileUndoManager::Rename:
statusBar->setMessage(i18nc("@info:status", "Renaming operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::MKDIR:
+ case KIO::FileUndoManager::Mkdir:
statusBar->setMessage(i18nc("@info:status", "Created folder."),
DolphinStatusBar::OperationCompleted);
break;
void DolphinMainWindow::undo()
{
clearStatusBar();
- KonqFileUndoManager::self()->undo();
+ KIO::FileUndoManager::self()->uiInterface()->setParentWidget(this);
+ KIO::FileUndoManager::self()->undo();
}
void DolphinMainWindow::cut()
void DolphinMainWindow::updatePasteAction()
{
QAction* pasteAction = actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
- if (pasteAction == 0) {
- return;
- }
-
QPair<bool, QString> pasteInfo = m_activeViewContainer->view()->pasteInfo();
pasteAction->setEnabled(pasteInfo.first);
pasteAction->setText(pasteInfo.second);
m_viewTab[m_tabIndex].secondaryView->view()->reload();
m_viewTab[m_tabIndex].secondaryView->setActive(false);
m_viewTab[m_tabIndex].secondaryView->show();
+
+ setActiveViewContainer(m_viewTab[m_tabIndex].secondaryView);
} else if (m_activeViewContainer == m_viewTab[m_tabIndex].primaryView) {
// remove secondary view
m_viewTab[m_tabIndex].secondaryView->close();
m_viewTab[m_tabIndex].secondaryView->deleteLater();
m_viewTab[m_tabIndex].secondaryView = 0;
+
+ setActiveViewContainer(m_viewTab[m_tabIndex].primaryView);
} else {
// The secondary view is active, hence from a users point of view
// the content of the secondary view should be moved to the primary view.
m_viewTab[m_tabIndex].primaryView->deleteLater();
m_viewTab[m_tabIndex].primaryView = m_viewTab[m_tabIndex].secondaryView;
m_viewTab[m_tabIndex].secondaryView = 0;
+
+ setActiveViewContainer(m_viewTab[m_tabIndex].primaryView);
}
- setActiveViewContainer(m_viewTab[m_tabIndex].primaryView);
updateViewActions();
}
lineEdit->setSelection(0, text.length());
}
-void DolphinMainWindow::adjustViewProperties()
-{
- clearStatusBar();
- ViewPropertiesDialog dlg(m_activeViewContainer->view());
- dlg.exec();
-}
-
void DolphinMainWindow::goBack()
{
clearStatusBar();
m_activeViewContainer->urlNavigator()->goHome();
}
-void DolphinMainWindow::findFile()
-{
- KRun::run("kfind", m_activeViewContainer->url(), this);
-}
-
void DolphinMainWindow::compareFiles()
{
// The method is only invoked if exactly 2 files have
viewTab.secondaryView);
}
+void DolphinMainWindow::closeTab()
+{
+ closeTab(m_tabBar->currentIndex());
+}
+
void DolphinMainWindow::closeTab(int index)
{
Q_ASSERT(index >= 0);
}
}
+void DolphinMainWindow::openTabContextMenu(int index, const QPoint& pos)
+{
+ KMenu menu(this);
+
+ QAction* newTabAction = menu.addAction(KIcon("tab-new"), i18nc("@action:inmenu", "New Tab"));
+ newTabAction->setShortcut(actionCollection()->action("new_tab")->shortcut());
+
+ QAction* closeOtherTabsAction = menu.addAction(KIcon("tab-close-other"), i18nc("@action:inmenu", "Close Other Tabs"));
+
+ QAction* closeTabAction = menu.addAction(KIcon("tab-close"), i18nc("@action:inmenu", "Close Tab"));
+ closeTabAction->setShortcut(actionCollection()->action("close_tab")->shortcut());
+
+ QAction* selectedAction = menu.exec(pos);
+ if (selectedAction == newTabAction) {
+ const ViewTab& tab = m_viewTab[index];
+ Q_ASSERT(tab.primaryView != 0);
+ const KUrl url = (tab.secondaryView != 0) && tab.secondaryView->isActive() ?
+ tab.secondaryView->url() : tab.primaryView->url();
+ openNewTab(url);
+ m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
+ } else if (selectedAction == closeOtherTabsAction) {
+ const int count = m_tabBar->count();
+ for (int i = 0; i < index; ++i) {
+ closeTab(0);
+ }
+ for (int i = index + 1; i < count; ++i) {
+ closeTab(1);
+ }
+ } else if (selectedAction == closeTabAction) {
+ closeTab(index);
+ }
+}
+
+void DolphinMainWindow::handlePlacesClick(const KUrl& url, Qt::MouseButtons buttons)
+{
+ if (buttons & Qt::MidButton) {
+ openNewTab(url);
+ m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
+ } else {
+ changeUrl(url);
+ }
+}
+
void DolphinMainWindow::init()
{
DolphinSettings& settings = DolphinSettings::instance();
this, SLOT(setActiveTab(int)));
connect(m_tabBar, SIGNAL(closeRequest(int)),
this, SLOT(closeTab(int)));
+ connect(m_tabBar, SIGNAL(contextMenu(int, const QPoint&)),
+ this, SLOT(openTabContextMenu(int, const QPoint&)));
+ connect(m_tabBar, SIGNAL(newTabRequest()),
+ this, SLOT(openNewTab()));
m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open
QWidget* centralWidget = new QWidget(this);
updateGoActions();
const KUrl& url = m_activeViewContainer->url();
- const QString caption = url.fileName();
- setCaption(caption);
+ setCaption(url.fileName());
if (m_viewTab.count() > 1) {
- m_tabBar->setTabText(m_tabIndex, caption);
+ m_tabBar->setTabText(m_tabIndex, tabName(url));
}
emit urlChanged(url);
KAction* newTab = actionCollection()->addAction("new_tab");
newTab->setIcon(KIcon("tab-new"));
newTab->setText(i18nc("@action:inmenu File", "New Tab"));
- newTab->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_N);
+ newTab->setShortcut(KShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_N, Qt::CTRL | Qt::Key_T));
connect(newTab, SIGNAL(triggered()), this, SLOT(openNewTab()));
+ QAction* closeTab = new QAction(KIcon("tab-close"), i18nc("@action:inmenu File", "Close Tab"), this);
+ closeTab->setShortcut(Qt::CTRL | Qt::Key_W);
+ connect(closeTab, SIGNAL(triggered()), this, SLOT(closeTab()));
+ actionCollection()->addAction("close_tab", closeTab);
+
KAction* properties = actionCollection()->addAction("properties");
properties->setText(i18nc("@action:inmenu File", "Properties"));
properties->setShortcut(Qt::ALT | Qt::Key_Return);
editLocation->setShortcut(Qt::Key_F6);
connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation()));
- KAction* adjustViewProps = actionCollection()->addAction("view_properties");
- adjustViewProps->setText(i18nc("@action:inmenu View", "Adjust View Properties..."));
- connect(adjustViewProps, SIGNAL(triggered()), this, SLOT(adjustViewProperties()));
-
// setup 'Go' menu
KAction* backAction = KStandardAction::back(this, SLOT(goBack()), actionCollection());
KShortcut backShortcut = backAction->shortcut();
KStandardAction::home(this, SLOT(goHome()), actionCollection());
// setup 'Tools' menu
- QAction* findFile = actionCollection()->addAction("find_file");
- findFile->setText(i18nc("@action:inmenu Tools", "Find File..."));
- findFile->setShortcut(Qt::CTRL | Qt::Key_F);
- findFile->setIcon(KIcon("edit-find"));
- connect(findFile, SIGNAL(triggered()), this, SLOT(findFile()));
-
KToggleAction* showFilterBar = actionCollection()->add<KToggleAction>("show_filter_bar");
showFilterBar->setText(i18nc("@action:inmenu Tools", "Show Filter Bar"));
showFilterBar->setShortcut(Qt::CTRL | Qt::Key_I);
addDockWidget(Qt::LeftDockWidgetArea, treeViewDock);
connect(this, SIGNAL(urlChanged(KUrl)),
treeWidget, SLOT(setUrl(KUrl)));
- connect(treeWidget, SIGNAL(changeUrl(KUrl)),
- this, SLOT(changeUrl(KUrl)));
+ connect(treeWidget, SIGNAL(changeUrl(KUrl, Qt::MouseButtons)),
+ this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons)));
connect(treeWidget, SIGNAL(changeSelection(KFileItemList)),
this, SLOT(changeSelection(KFileItemList)));
connect(treeWidget, SIGNAL(urlsDropped(KUrl::List, KUrl)),
actionCollection()->addAction("show_places_panel", placesDock->toggleViewAction());
addDockWidget(Qt::LeftDockWidgetArea, placesDock);
- connect(placesView, SIGNAL(urlChanged(KUrl)),
- this, SLOT(changeUrl(KUrl)));
+ connect(placesView, SIGNAL(urlChanged(KUrl, Qt::MouseButtons)),
+ this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons)));
connect(this, SIGNAL(urlChanged(KUrl)),
placesView, SLOT(setUrl(KUrl)));
}
} else {
stateChanged("has_selection");
- QAction* renameAction = actionCollection()->action("rename");
- if (renameAction != 0) {
- renameAction->setEnabled(true);
- }
+ KActionCollection* col = actionCollection();
+ QAction* renameAction = col->action("rename");
+ QAction* moveToTrashAction = col->action("move_to_trash");
+ QAction* deleteAction = col->action("delete");
+ QAction* cutAction = col->action(KStandardAction::name(KStandardAction::Cut));
+ QAction* deleteWithTrashShortcut = col->action("delete_shortcut"); // see DolphinViewActionHandler
- bool enableMoveToTrash = true;
-
- KFileItemList::const_iterator it = list.begin();
- const KFileItemList::const_iterator end = list.end();
- while (it != end) {
- const KUrl& url = (*it).url();
- // only enable the 'Move to Trash' action for local files
- if (!url.isLocalFile()) {
- enableMoveToTrash = false;
- }
- ++it;
- }
+ KonqFileItemCapabilities capabilities(list);
+ const bool enableMoveToTrash = capabilities.isLocal() && capabilities.supportsMoving();
- QAction* moveToTrashAction = actionCollection()->action("move_to_trash");
+ renameAction->setEnabled(capabilities.supportsMoving());
moveToTrashAction->setEnabled(enableMoveToTrash);
+ deleteAction->setEnabled(capabilities.supportsDeleting());
+ deleteWithTrashShortcut->setEnabled(capabilities.supportsDeleting() && !enableMoveToTrash);
+ cutAction->setEnabled(capabilities.supportsMoving());
}
updatePasteAction();
}
this, SLOT(slotRequestItemInfo(KFileItem)));
connect(view, SIGNAL(activated()),
this, SLOT(toggleActiveView()));
- connect(view, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)),
- this, SLOT(slotDoingOperation(KonqFileUndoManager::CommandType)));
+ connect(view, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)),
+ this, SLOT(slotDoingOperation(KIO::FileUndoManager::CommandType)));
connect(view, SIGNAL(tabRequested(const KUrl&)),
this, SLOT(openNewTab(const KUrl&)));
}
}
-DolphinMainWindow::UndoUiInterface::UndoUiInterface(DolphinMainWindow* mainWin) :
- KonqFileUndoManager::UiInterface(mainWin),
- m_mainWin(mainWin)
+QString DolphinMainWindow::tabName(const KUrl& url) const
+{
+ QString name;
+ if (url.equals(KUrl("file:///"))) {
+ name = "/";
+ } else {
+ name = url.fileName();
+ if (name.isEmpty()) {
+ name = url.protocol();
+ }
+ }
+ return name;
+}
+
+bool DolphinMainWindow::isKompareInstalled() const
+{
+ static bool initialized = false;
+ static bool installed = false;
+ if (!initialized) {
+ // TODO: maybe replace this approach later by using a menu
+ // plugin like kdiff3plugin.cpp
+ installed = !KGlobal::dirs()->findExe("kompare").isEmpty();
+ initialized = true;
+ }
+ return installed;
+}
+
+DolphinMainWindow::UndoUiInterface::UndoUiInterface() :
+ KIO::FileUndoManager::UiInterface()
{
- Q_ASSERT(m_mainWin != 0);
}
DolphinMainWindow::UndoUiInterface::~UndoUiInterface()
void DolphinMainWindow::UndoUiInterface::jobError(KIO::Job* job)
{
- DolphinStatusBar* statusBar = m_mainWin->activeViewContainer()->statusBar();
- statusBar->setMessage(job->errorString(), DolphinStatusBar::Error);
+ DolphinMainWindow* mainWin= qobject_cast<DolphinMainWindow *>(parentWidget());
+ if (mainWin) {
+ DolphinStatusBar* statusBar = mainWin->activeViewContainer()->statusBar();
+ statusBar->setMessage(job->errorString(), DolphinStatusBar::Error);
+ } else {
+ KIO::FileUndoManager::UiInterface::jobError(job);
+ }
}
#include "dolphinmainwindow.moc"