#ifndef DOLPHINCONTEXTMENU_H
#define DOLPHINCONTEXTMENU_H
-#include <kdedesktopmimetype.h>
+#include <kdesktopfileactions.h>
#include <kfileitem.h>
#include <kservice.h>
#include <kurl.h>
+#include <konq_copytomenu.h>
-#include <QString>
-#include <QVector>
+#include <QtCore/QObject>
+
+#include <QtCore/QVector>
+
+#include <QScopedPointer>
class KMenu;
class KFileItem;
class QAction;
class DolphinMainWindow;
+class KFileItemActions;
+class KFileItemListProperties;
/**
* @brief Represents the context menu which appears when doing a right
* - 'Actions': Contains all actions which can be applied to the
* given item.
*/
-class DolphinContextMenu
+class DolphinContextMenu : public QObject
{
+ Q_OBJECT
+
public:
+ enum Command
+ {
+ None,
+ OpenParentFolderInNewWindow,
+ OpenParentFolderInNewTab
+ };
+
/**
* @parent Pointer to the main window the context menu
* belongs to.
* is above the viewport.
* @baseUrl Base URL of the viewport where the context menu
* should be opened.
- * @selectedItems Selected items where the actions of the context menu
- * are applied.
*/
DolphinContextMenu(DolphinMainWindow* parent,
- KFileItem* fileInfo,
- const KUrl& baseUrl,
- KFileItemList selectedItems);
+ const KFileItem& fileInfo,
+ const KUrl& baseUrl);
virtual ~DolphinContextMenu();
- /** Opens the context menu modal. */
- void open();
+ void setCustomActions(const QList<QAction*>& actions);
+
+ /**
+ * Opens the context menu model and returns the requested
+ * command, that should be triggered by the caller. If
+ * Command::None has been returned, either the context-menu
+ * had been closed without executing an action or an
+ * already available action from the main-window has been
+ * executed.
+ */
+ Command open();
+
+ /**
+ * TODO: This method is a workaround for a X11-issue in combination
+ * with KModifierKeyInfo: When constructing KModifierKeyInfo in the
+ * constructor of the context menu, the user interface might freeze.
+ * To bypass this, the KModifierKeyInfo is constructed in DolphinMainWindow
+ * directly after starting the application. Remove this method, if
+ * the X11-issue got fixed (contact the maintainer of KModifierKeyInfo for
+ * more details).
+ */
+ static void initializeModifierKeyInfo();
+
+private slots:
+ /**
+ * Is invoked if a key modifier has been pressed and updates the context
+ * menu to show the 'Delete' action instead of the 'Move To Trash' action
+ * if the shift-key has been pressed.
+ */
+ void slotKeyModifierPressed(Qt::Key key, bool pressed);
+
+ /**
+ * Triggers the 'Delete'-action if the shift-key has been pressed, otherwise
+ * the 'Move to Trash'-action gets triggered.
+ */
+ void slotRemoveActionTriggered();
private:
void openTrashContextMenu();
void openItemContextMenu();
void openViewportContextMenu();
- void insertDefaultItemActions(KMenu* popup);
+ void insertDefaultItemActions();
/**
- * Inserts the 'Open With...' submenu to \a popup.
- * @param popup Menu where the 'Open With...' sub menu should
- * be added.
- * @param openWithVector Output parameter which contains all 'Open with...'
- * services.
- * @return Identifier of the first 'Open With...' entry.
- * All succeeding identifiers have an increased value of 1
- * to the predecessor.
+ * Adds the "Show menubar" action to the menu if the
+ * menubar is hidden.
*/
- QList<QAction*> insertOpenWithItems(KMenu* popup,
- QVector<KService::Ptr>& openWithVector);
+ void addShowMenubarAction();
/**
- * Inserts the 'Actions...' submenu to \a popup.
- * @param popup Menu where the 'Actions...' sub menu should
- * be added.
- * @param openWithVector Output parameter which contains all 'Actions...'
- * services.
+ * Returns a name for adding the URL \a url to the Places panel.
*/
- QList<QAction*> insertActionItems(KMenu* popup,
- QVector<KDEDesktopMimeType::Service>& actionsVector);
+ QString placesName(const KUrl& url) const;
+
+ bool placeExists(const KUrl& url) const;
+
+ QAction* createPasteAction();
+
+ KFileItemListProperties& capabilities();
+ void addServiceActions(KFileItemActions& fileItemActions);
+ void addVersionControlActions();
+ void addCustomActions();
/**
- * Returns true, if 'menu' contains already
- * an entry with the name 'entryName'.
+ * Updates m_removeAction to represent the 'Delete'-action if the shift-key
+ * has been pressed. Otherwise it represents the 'Move to Trash'-action.
*/
- bool containsEntry(const KMenu* menu,
- const QString& entryName) const;
+ void updateRemoveAction();
private:
- struct Entry {
+ struct Entry
+ {
int type;
QString name;
QString filePath; // empty for separator
QString comment;
};
- enum ContextType {
+ enum ContextType
+ {
NoContext = 0,
ItemContext = 1,
TrashContext = 2
};
DolphinMainWindow* m_mainWindow;
- KFileItem* m_fileInfo;
+ KFileItemListProperties* m_capabilities;
+ KFileItem m_fileInfo;
KUrl m_baseUrl;
KFileItemList m_selectedItems;
KUrl::List m_selectedUrls;
int m_context;
+ KonqCopyToMenu m_copyToMenu;
+ QList<QAction*> m_customActions;
+ QScopedPointer<KMenu> m_popup;
+
+ Command m_command;
+
+ bool m_shiftPressed;
+ QAction* m_removeAction; // Action that represents either 'Move To Trash' or 'Delete'
};
#endif