]> cloud.milkyroute.net Git - dolphin.git/blobdiff - src/dolphincontextmenu.cpp
allow Konqueror to open also files inside a new tab, not only directories
[dolphin.git] / src / dolphincontextmenu.cpp
index ce315eb5735f88c2b2f866eaf806d20d2606be8a..81194e42b0dd20ea548aa2ed1049a12d0a977d93 100644 (file)
@@ -24,6 +24,8 @@
 #include "dolphinsettings.h"
 #include "dolphinview.h"
 #include "dolphinviewcontainer.h"
+#include "dolphin_generalsettings.h"
+#include "fileitemcapabilities.h"
 
 #include <kactioncollection.h>
 #include <kfileplacesmodel.h>
@@ -32,6 +34,7 @@
 #include <kiconloader.h>
 #include <kio/netaccess.h>
 #include <kmenu.h>
+#include <kmenubar.h>
 #include <kmessagebox.h>
 #include <kmimetypetrader.h>
 #include <knewmenu.h>
@@ -52,6 +55,7 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent,
                                        const KFileItem& fileInfo,
                                        const KUrl& baseUrl) :
     m_mainWindow(parent),
+    m_capabilities(0),
     m_fileInfo(fileInfo),
     m_baseUrl(baseUrl),
     m_context(NoContext)
@@ -65,6 +69,8 @@ DolphinContextMenu::DolphinContextMenu(DolphinMainWindow* parent,
 
 DolphinContextMenu::~DolphinContextMenu()
 {
+    delete m_capabilities;
+    m_capabilities = 0;
 }
 
 void DolphinContextMenu::open()
@@ -74,7 +80,7 @@ void DolphinContextMenu::open()
         m_context |= TrashContext;
     }
 
-    if (!m_fileInfo.isNull()) {
+    if (!m_fileInfo.isNull() && (m_selectedItems.count() > 0)) {
         m_context |= ItemContext;
         // TODO: handle other use cases like devices + desktop files
     }
@@ -94,23 +100,28 @@ void DolphinContextMenu::open()
     }
 }
 
-
 void DolphinContextMenu::openTrashContextMenu()
 {
     Q_ASSERT(m_context & TrashContext);
 
     KMenu* popup = new KMenu(m_mainWindow);
 
-    QAction* emptyTrashAction = new QAction(KIcon("emptytrash"), i18nc("@action:inmenu", "Empty Trash"), popup);
-    KConfig trashConfig("trashrc", KConfig::OnlyLocal);
+    addShowMenubarAction(popup);
+
+    QAction* emptyTrashAction = new QAction(KIcon("trash-empty"), i18nc("@action:inmenu", "Empty Trash"), popup);
+    KConfig trashConfig("trashrc", KConfig::SimpleConfig);
     emptyTrashAction->setEnabled(!trashConfig.group("Status").readEntry("Empty", true));
     popup->addAction(emptyTrashAction);
 
+    QAction* addToPlacesAction = popup->addAction(KIcon("bookmark-new"),
+                                                  i18nc("@action:inmenu Add current folder to places", "Add to Places"));
+
     QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
     popup->addAction(propertiesAction);
 
-    if (popup->exec(QCursor::pos()) == emptyTrashAction) {
-        const QString text(i18nc("@info", "Do you really want to empty the Trash? All items will get deleted."));
+    QAction *action = popup->exec(QCursor::pos());
+    if (action == emptyTrashAction) {
+        const QString text(i18nc("@info", "Do you really want to empty the Trash? All items will be deleted."));
         const bool del = KMessageBox::warningContinueCancel(m_mainWindow,
                                                             text,
                                                             QString(),
@@ -120,6 +131,11 @@ void DolphinContextMenu::openTrashContextMenu()
         if (del) {
             KonqOperations::emptyTrash(m_mainWindow);
         }
+    } else if (action == addToPlacesAction) {
+        const KUrl& url = m_mainWindow->activeViewContainer()->url();
+        if (url.isValid()) {
+            DolphinSettings::instance().placesModel()->addPlace(i18nc("@label", "Trash"), url);
+        }
     }
 
     popup->deleteLater();
@@ -132,6 +148,8 @@ void DolphinContextMenu::openTrashItemContextMenu()
 
     KMenu* popup = new KMenu(m_mainWindow);
 
+    addShowMenubarAction(popup);
+
     QAction* restoreAction = new QAction(i18nc("@action:inmenu", "Restore"), m_mainWindow);
     popup->addAction(restoreAction);
 
@@ -153,6 +171,7 @@ void DolphinContextMenu::openItemContextMenu()
     Q_ASSERT(!m_fileInfo.isNull());
 
     KMenu* popup = new KMenu(m_mainWindow);
+    addShowMenubarAction(popup);
     insertDefaultItemActions(popup);
 
     popup->addSeparator();
@@ -160,7 +179,7 @@ void DolphinContextMenu::openItemContextMenu()
     // insert 'Bookmark This Folder' entry if exactly one item is selected
     QAction* addToPlacesAction = 0;
     if (m_fileInfo.isDir() && (m_selectedUrls.count() == 1)) {
-        addToPlacesAction = popup->addAction(KIcon("bookmark-folder"),
+        addToPlacesAction = popup->addAction(KIcon("bookmark-new"),
                                              i18nc("@action:inmenu Add selected folder to places", "Add to Places"));
     }
 
@@ -171,8 +190,17 @@ void DolphinContextMenu::openItemContextMenu()
     // Insert 'Actions' sub menu
     KonqMenuActions menuActions;
     menuActions.setItems(m_selectedItems);
-    if (menuActions.addActionsTo(popup))
+    if (menuActions.addActionsTo(popup)) {
+        popup->addSeparator();
+    }
+
+    // Insert 'Copy To' and 'Move To' sub menus
+    if (DolphinSettings::instance().generalSettings()->showCopyMoveMenu()) {
+        m_copyToMenu.setItems(m_selectedItems);
+        m_copyToMenu.setReadOnly(!capabilities().supportsMoving());
+        m_copyToMenu.addActionsTo(popup);
         popup->addSeparator();
+    }
 
     // insert 'Properties...' entry
     QAction* propertiesAction = m_mainWindow->actionCollection()->action("properties");
@@ -183,7 +211,7 @@ void DolphinContextMenu::openItemContextMenu()
     if ((addToPlacesAction != 0) && (activatedAction == addToPlacesAction)) {
         const KUrl selectedUrl(m_fileInfo.url());
         if (selectedUrl.isValid()) {
-            DolphinSettings::instance().placesModel()->addPlace(selectedUrl.fileName(),
+            DolphinSettings::instance().placesModel()->addPlace(placesName(selectedUrl),
                                                                 selectedUrl);
         }
     } else if (openWithActions.contains(activatedAction)) {
@@ -204,9 +232,10 @@ void DolphinContextMenu::openItemContextMenu()
 
 void DolphinContextMenu::openViewportContextMenu()
 {
-    Q_ASSERT(m_fileInfo.isNull());
     KMenu* popup = new KMenu(m_mainWindow);
 
+    addShowMenubarAction(popup);
+
     // setup 'Create New' menu
     KNewMenu* newMenu = m_mainWindow->newMenu();
     newMenu->slotCheckUpToDate();
@@ -214,7 +243,7 @@ void DolphinContextMenu::openViewportContextMenu()
     popup->addMenu(newMenu->menu());
     popup->addSeparator();
 
-    QAction* pasteAction = m_mainWindow->actionCollection()->action(KStandardAction::stdName(KStandardAction::Paste));
+    QAction* pasteAction = createPasteAction();
     popup->addAction(pasteAction);
 
     // setup 'View Mode' menu
@@ -236,7 +265,7 @@ void DolphinContextMenu::openViewportContextMenu()
 
     popup->addSeparator();
 
-    QAction* addToPlacesAction = popup->addAction(KIcon("bookmark-folder"),
+    QAction* addToPlacesAction = popup->addAction(KIcon("bookmark-new"),
                                                   i18nc("@action:inmenu Add current folder to places", "Add to Places"));
     popup->addSeparator();
 
@@ -245,12 +274,12 @@ void DolphinContextMenu::openViewportContextMenu()
     QAction* action = popup->exec(QCursor::pos());
     if (action == propertiesAction) {
         const KUrl& url = m_mainWindow->activeViewContainer()->url();
-        KPropertiesDialog dialog(url);
+        KPropertiesDialog dialog(url, m_mainWindow);
         dialog.exec();
     } else if (action == addToPlacesAction) {
         const KUrl& url = m_mainWindow->activeViewContainer()->url();
         if (url.isValid()) {
-            DolphinSettings::instance().placesModel()->addPlace(url.fileName(), url);
+            DolphinSettings::instance().placesModel()->addPlace(placesName(url), url);
         }
     }
 
@@ -263,9 +292,9 @@ void DolphinContextMenu::insertDefaultItemActions(KMenu* popup)
     const KActionCollection* collection = m_mainWindow->actionCollection();
 
     // insert 'Cut', 'Copy' and 'Paste'
-    QAction* cutAction = collection->action(KStandardAction::stdName(KStandardAction::Cut));
-    QAction* copyAction  = collection->action(KStandardAction::stdName(KStandardAction::Copy));
-    QAction* pasteAction = collection->action(KStandardAction::stdName(KStandardAction::Paste));
+    QAction* cutAction = collection->action(KStandardAction::name(KStandardAction::Cut));
+    QAction* copyAction  = collection->action(KStandardAction::name(KStandardAction::Copy));
+    QAction* pasteAction = createPasteAction();
 
     popup->addAction(cutAction);
     popup->addAction(copyAction);
@@ -277,8 +306,7 @@ void DolphinContextMenu::insertDefaultItemActions(KMenu* popup)
     popup->addAction(renameAction);
 
     // insert 'Move to Trash' and (optionally) 'Delete'
-    const KSharedConfig::Ptr globalConfig = KSharedConfig::openConfig("kdeglobals", KConfig::NoGlobals);
-    const KConfigGroup kdeConfig(globalConfig, "KDE");
+    KConfigGroup kdeConfig(KGlobal::config(), "KDE");
     bool showDeleteCommand = kdeConfig.readEntry("ShowDeleteCommand", false);
     const KUrl& url = m_mainWindow->activeViewContainer()->url();
     if (url.isLocalFile()) {
@@ -378,4 +406,50 @@ bool DolphinContextMenu::containsEntry(const KMenu* menu,
     return false;
 }
 
+void DolphinContextMenu::addShowMenubarAction(KMenu* menu)
+{
+    KAction* showMenuBar = m_mainWindow->showMenuBarAction();
+    if (!m_mainWindow->menuBar()->isVisible()) {
+        // TODO: it should not be necessary to uncheck the menu
+        // bar action, but currently the action states don't get
+        // updated if the menu is disabled
+        showMenuBar->setChecked(false);
+        menu->addAction(showMenuBar);
+        menu->addSeparator();
+    }
+}
+
+QString DolphinContextMenu::placesName(const KUrl& url) const
+{
+    QString name = url.fileName();
+    if (name.isEmpty()) {
+        name = url.host();
+    }
+    return name;
+}
+
+QAction* DolphinContextMenu::createPasteAction()
+{
+    QAction* action = 0;
+    if ((m_selectedItems.count() == 1) && m_fileInfo.isDir()) {
+        action = new QAction(KIcon("edit-paste"), i18nc("@action:inmenu", "Paste Into Folder"), this);
+        const QMimeData* mimeData = QApplication::clipboard()->mimeData();
+        const KUrl::List pasteData = KUrl::List::fromMimeData(mimeData);
+        action->setEnabled(!pasteData.isEmpty() && capabilities().supportsWriting());
+        connect(action, SIGNAL(triggered()), m_mainWindow, SLOT(pasteIntoFolder()));
+    } else {
+        action = m_mainWindow->actionCollection()->action(KStandardAction::name(KStandardAction::Paste));
+    }
+
+    return action;
+}
+
+FileItemCapabilities& DolphinContextMenu::capabilities()
+{
+    if (m_capabilities == 0) {
+        m_capabilities = new FileItemCapabilities(m_selectedItems);
+    }
+    return *m_capabilities;
+}
+
 #include "dolphincontextmenu.moc"