summaryrefslogtreecommitdiffstats
path: root/src/app/Panel/krpopupmenu.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/app/Panel/krpopupmenu.cpp')
-rw-r--r--src/app/Panel/krpopupmenu.cpp354
1 files changed, 354 insertions, 0 deletions
diff --git a/src/app/Panel/krpopupmenu.cpp b/src/app/Panel/krpopupmenu.cpp
new file mode 100644
index 0000000..03c6f02
--- /dev/null
+++ b/src/app/Panel/krpopupmenu.cpp
@@ -0,0 +1,354 @@
+/***************************************************************************
+ krpopupmenu.cpp - description
+ -------------------
+ begin : Tue Aug 26 2003
+ copyright : (C) 2003 by Shie Erlich & Rafi Yanai
+ email :
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include <tdelocale.h>
+#include <kprocess.h>
+#include <kshred.h>
+#include <krun.h>
+#include <kiconloader.h>
+#include <tdemessagebox.h>
+#include "../krservices.h"
+#include "../defaults.h"
+#include "../MountMan/kmountman.h"
+#include "../krslots.h"
+#include "krpopupmenu.h"
+#include "krview.h"
+#include "krviewitem.h"
+#include "panelfunc.h"
+#include "../krusaderview.h"
+#include "../panelmanager.h"
+
+void KrPopupMenu::run(const TQPoint &pos, ListPanel *panel) {
+ KrPopupMenu menu(panel);
+ int result = menu.exec(pos);
+ menu.performAction(result);
+}
+
+KrPopupMenu::KrPopupMenu(ListPanel *thePanel, TQWidget *parent) : TDEPopupMenu(parent), panel(thePanel), empty(false),
+ multipleSelections(false),actions(0) {
+#ifdef __LIBKONQ__
+ konqMenu = 0;
+#endif
+
+ panel->view->getSelectedKrViewItems( &items );
+ if ( items.empty() ) {
+ addCreateNewMenu();
+ insertSeparator();
+ addEmptyMenuEntries();
+ return;
+ } else if ( items.size() > 1 ) multipleSelections = true;
+
+ item = items.first();
+ vfile *vf = panel->func->getVFile(item);
+
+ // ------------ the OPEN option - open prefered service
+ insertItem( i18n("Open/Run"), OPEN_ID );
+ if ( !multipleSelections ) { // meaningful only if one file is selected
+ changeItem( OPEN_ID, item->icon(), vf->vfile_isExecutable() && !vf->vfile_isDir() ? i18n("Run") : i18n("Open") );
+ // open in a new tab (if folder)
+ if ( vf->vfile_isDir() ) {
+ insertItem( i18n( "Open in New Tab" ), OPEN_TAB_ID );
+ changeItem( OPEN_TAB_ID, krLoader->loadIcon( "tab_new", TDEIcon::Panel ), i18n( "Open in New Tab" ) );
+ }
+ insertSeparator();
+ }
+
+ // ------------- Preview - normal vfs only ?
+ if ( panel->func->files()->vfs_getType() == vfs::NORMAL ) {
+ // create the preview popup
+ TQStringList names;
+ panel->getSelectedNames( &names );
+ preview.setUrls( panel->func->files() ->vfs_getFiles( &names ) );
+ insertItem( i18n("Preview"), &preview, PREVIEW_ID );
+ }
+
+ // -------------- Open with: try to find-out which apps can open the file
+ // this too, is meaningful only if one file is selected or if all the files
+ // have the same mimetype !
+ TQString mime = panel->func->getVFile(item)->vfile_getMime();
+ // check if all the list have the same mimetype
+ for ( unsigned int i = 1; i < items.size(); ++i ) {
+ if ( panel->func->getVFile(( *items.at( i ) )) ->vfile_getMime() != mime ) {
+ mime = TQString();
+ break;
+ }
+ }
+ if ( !mime.isEmpty() ) {
+ offers = KServiceTypeProfile::offers( mime );
+ for ( unsigned int i = 0; i < offers.count(); ++i ) {
+ KService::Ptr service = offers[ i ].service();
+ if ( service->isValid() && service->type() == "Application" ) {
+ openWith.insertItem( service->name(), SERVICE_LIST_ID + i );
+ openWith.changeItem( SERVICE_LIST_ID + i, service->pixmap( TDEIcon::Small ), service->name() );
+ }
+ }
+ openWith.insertSeparator();
+ if ( vf->vfile_isDir() )
+ openWith.insertItem( krLoader->loadIcon( "konsole", TDEIcon::Small ), i18n( "Terminal" ), OPEN_TERM_ID );
+ openWith.insertItem( i18n( "Other..." ), CHOOSE_ID );
+ insertItem( TQPixmap(), &openWith, OPEN_WITH_ID );
+ changeItem( OPEN_WITH_ID, i18n( "Open With" ) );
+ insertSeparator();
+ }
+
+ // --------------- user actions
+ insertItem( i18n("User Actions"), new UserActionPopupMenu( panel->func->files()->vfs_getFile( item->name() ).url() ) );
+ _items.setAutoDelete( true );
+ for ( KrViewItemList::Iterator it = items.begin(); it != items.end(); ++it ) {
+ vfile *file = panel->func->files()->vfs_search(((*it)->name()));
+ KURL url = file->vfile_getUrl();
+ _items.append( new KFileItem( url, file->vfile_getMime(), file->vfile_getMode() ) );
+ }
+
+#ifdef __LIBKONQ__
+ // -------------- konqueror menu
+ actions = new TDEActionCollection(this);
+ konqMenu = new KonqPopupMenu( KonqBookmarkManager::self(), _items, panel->func->files()->vfs_getOrigin(), *actions, 0, this,
+ KonqPopupMenu::NoFlags, KParts::BrowserExtension::DefaultPopupItems );
+ insertItem( TQPixmap(), konqMenu, KONQ_MENU_ID );
+ changeItem( KONQ_MENU_ID, i18n( "Konqueror Menu" ) );
+#endif
+
+ // ------------- 'create new' submenu
+ addCreateNewMenu();
+ insertSeparator();
+
+ // ---------- COPY
+ insertItem( i18n( "Copy..." ), COPY_ID );
+ if ( panel->func->files() ->vfs_isWritable() ) {
+ // ------- MOVE
+ insertItem( i18n( "Move..." ), MOVE_ID );
+ // ------- RENAME - only one file
+ if ( !multipleSelections )
+ insertItem( i18n( "Rename" ), RENAME_ID );
+
+ // -------- MOVE TO TRASH
+ TDEConfigGroupSaver saver(krConfig, "General");
+ bool trash = krConfig->readBoolEntry( "Move To Trash", _MoveToTrash );
+ if( trash )
+ insertItem( i18n( "Move to Trash" ), TRASH_ID );
+ // -------- DELETE
+ insertItem( i18n( "Delete" ), DELETE_ID );
+ // -------- SHRED - only one file
+ if ( panel->func->files() ->vfs_getType() == vfs::NORMAL &&
+ !vf->vfile_isDir() && !multipleSelections )
+ insertItem( i18n( "Shred" ), SHRED_ID );
+ }
+
+ // ---------- link handling
+ // create new shortcut or redirect links - only on local directories:
+ if ( panel->func->files() ->vfs_getType() == vfs::NORMAL ) {
+ insertSeparator();
+ linkPopup.insertItem( i18n( "New Symlink..." ), NEW_SYMLINK_ID );
+ linkPopup.insertItem( i18n( "New Hardlink..." ), NEW_LINK_ID );
+ if ( panel->func->getVFile(item)->vfile_isSymLink() )
+ linkPopup.insertItem( i18n( "Redirect Link..." ), REDIRECT_LINK_ID);
+ insertItem( TQPixmap(), &linkPopup, LINK_HANDLING_ID );
+ changeItem( LINK_HANDLING_ID, i18n( "Link Handling" ) );
+ }
+ insertSeparator();
+
+ // ---------- calculate space
+ if ( panel->func->files() ->vfs_getType() == vfs::NORMAL && ( vf->vfile_isDir() || multipleSelections ) )
+ krCalculate->plug( this );
+
+ // ---------- mount/umount/eject
+ if ( panel->func->files() ->vfs_getType() == vfs::NORMAL && vf->vfile_isDir() && !multipleSelections ) {
+ if ( krMtMan.getStatus( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) ) == KMountMan::MOUNTED )
+ insertItem( i18n( "Unmount" ), UNMOUNT_ID );
+ else if ( krMtMan.getStatus( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) ) == KMountMan::NOT_MOUNTED )
+ insertItem( i18n( "Mount" ), MOUNT_ID );
+ if ( krMtMan.ejectable( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) ) )
+ insertItem( i18n( "Eject" ), EJECT_ID );
+ }
+
+ // --------- send by mail
+ if ( Krusader::supportedTools().contains( "MAIL" ) && !vf->vfile_isDir() ) {
+ insertItem( i18n( "Send by Email" ), SEND_BY_EMAIL_ID );
+ }
+
+ // --------- synchronize
+ if ( panel->view->numSelected() ) {
+ insertItem( i18n( "Synchronize Selected Files..." ), SYNC_SELECTED_ID );
+ }
+
+ // --------- copy/paste
+ insertSeparator();
+ insertItem( i18n( "Copy to Clipboard" ), COPY_CLIP_ID );
+ if ( panel->func->files() ->vfs_isWritable() )
+ {
+ insertItem( i18n( "Cut to Clipboard" ), MOVE_CLIP_ID );
+ insertItem( i18n( "Paste from Clipboard" ), PASTE_CLIP_ID );
+ }
+ insertSeparator();
+
+ // --------- properties
+ krProperties->plug( this );
+}
+
+KrPopupMenu::~KrPopupMenu() {
+ if (actions) delete actions;
+#ifdef __LIBKONQ__
+ if (konqMenu) delete konqMenu;
+#endif
+}
+
+void KrPopupMenu::addEmptyMenuEntries() {
+ insertItem( i18n( "Paste from Clipboard" ), PASTE_CLIP_ID );
+}
+
+void KrPopupMenu::addCreateNewMenu() {
+ createNewPopup.insertItem( krLoader->loadIcon( "folder", TDEIcon::Small ), i18n("Folder..."), MKDIR_ID);
+ createNewPopup.insertItem( krLoader->loadIcon( "text-plain", TDEIcon::Small ), i18n("Text File..."), NEW_TEXT_FILE_ID);
+
+ insertItem( TQPixmap(), &createNewPopup, CREATE_NEW_ID);
+ changeItem( CREATE_NEW_ID, i18n( "Create New" ) );
+
+}
+
+void KrPopupMenu::performAction(int id) {
+ KURL u;
+ KURL::List lst;
+
+ switch ( id ) {
+ case - 1 : // the user clicked outside of the menu
+ return ;
+ case OPEN_TAB_ID :
+ // assuming only 1 file is selected (otherwise we won't get here)
+ ( ACTIVE_PANEL == LEFT_PANEL ? LEFT_MNG : RIGHT_MNG )->
+ slotNewTab( panel->func->files()->vfs_getFile( item->name() ).url() );
+ break;
+ case OPEN_ID :
+ for ( KrViewItemList::Iterator it = items.begin(); it != items.end(); ++it ) {
+ u = panel->func->files()->vfs_getFile( ( *it ) ->name() );
+ KRun::runURL( u, panel->func->getVFile(item)->vfile_getMime() );
+ }
+ break;
+ case COPY_ID :
+ panel->func->copyFiles();
+ break;
+ case MOVE_ID :
+ panel->func->moveFiles();
+ break;
+ case RENAME_ID :
+ SLOTS->rename();
+ break;
+ case TRASH_ID :
+ panel->func->deleteFiles( false );
+ break;
+ case DELETE_ID :
+ panel->func->deleteFiles( true );
+ break;
+ case EJECT_ID :
+ KMountMan::eject( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) );
+ break;
+ case SHRED_ID :
+ if ( KMessageBox::warningContinueCancel( krApp,
+ i18n("<qt>Do you really want to shred <b>%1</b>? Once shred, the file is gone forever!</qt>").arg(item->name()),
+ TQString(), KStdGuiItem::cont(), "Shred" ) == KMessageBox::Continue )
+ KShred::shred( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) );
+ break;
+ case OPEN_KONQ_ID :
+ kapp->startServiceByDesktopName( "konqueror", panel->func->files() ->vfs_getFile( item->name() ).url() );
+ break;
+ case CHOOSE_ID : // open-with dialog
+ u = panel->func->files() ->vfs_getFile( item->name() );
+ lst.append( u );
+ KRun::displayOpenWithDialog( lst );
+ break;
+ case MOUNT_ID :
+ krMtMan.mount( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) );
+ break;
+ case NEW_LINK_ID :
+ panel->func->krlink( false );
+ break;
+ case NEW_SYMLINK_ID :
+ panel->func->krlink( true );
+ break;
+ case REDIRECT_LINK_ID :
+ panel->func->redirectLink();
+ break;
+ case UNMOUNT_ID :
+ krMtMan.unmount( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ) );
+ break;
+ case COPY_CLIP_ID :
+ panel->func->copyToClipboard();
+ break;
+ case MOVE_CLIP_ID :
+ panel->func->copyToClipboard( true );
+ break;
+ case PASTE_CLIP_ID :
+ panel->func->pasteFromClipboard();
+ break;
+ case SEND_BY_EMAIL_ID :
+ SLOTS->sendFileByEmail( panel->func->files() ->vfs_getFile( item->name() ).url() );
+ break;
+ case MKDIR_ID :
+ SLOTS->mkdir();
+ break;
+ case NEW_TEXT_FILE_ID:
+ SLOTS->editDlg();
+ break;
+ case SYNC_SELECTED_ID :
+ {
+ TQStringList selectedNames;
+ for ( KrViewItemList::Iterator it = items.begin(); it != items.end(); ++it )
+ selectedNames.append( ( *it ) ->name() );
+ if( panel->otherPanel->view->numSelected() ) {
+ KrViewItemList otherItems;
+ panel->otherPanel->view->getSelectedKrViewItems( &otherItems );
+
+ for ( KrViewItemList::Iterator it2 = otherItems.begin(); it2 != otherItems.end(); ++it2 ) {
+ TQString name = ( *it2 ) ->name();
+ if( !selectedNames.contains( name ) )
+ selectedNames.append( name );
+ }
+ }
+ SLOTS->slotSynchronizeDirs( selectedNames );
+ }
+ break;
+ case OPEN_TERM_ID :
+ TQString save = getcwd( 0, 0 );
+ chdir( panel->func->files() ->vfs_getFile( item->name() ).path( -1 ).local8Bit() );
+ TDEProcess proc;
+ {
+ TDEConfigGroupSaver saver(krConfig, "General");
+ TQString term = krConfig->readEntry( "Terminal", _Terminal );
+ proc << KrServices::separateArgs( term );
+ if ( !panel->func->getVFile(item)->vfile_isDir() ) proc << "-e" << item->name();
+ if ( term.contains( "konsole" ) ) { /* KDE 3.2 bug (konsole is killed by pressing Ctrl+C) */
+ /* Please remove the patch if the bug is corrected */
+ proc << "&";
+ proc.setUseShell( true );
+ }
+ if ( !proc.start( TDEProcess::DontCare ) )
+ KMessageBox::sorry( krApp, i18n( "Can't open \"%1\"" ).arg(term) );
+ } // group-saver is blown out of scope here
+ chdir( save.local8Bit() );
+ break;
+ }
+
+ // check if something from the open-with-offered-services was selected
+ if ( id >= SERVICE_LIST_ID ) {
+ TQStringList names;
+ panel->getSelectedNames( &names );
+ KRun::run( *( offers[ id - SERVICE_LIST_ID ].service() ),
+ *( panel->func->files() ->vfs_getFiles( &names ) ) );
+ }
+}
+
+#include "krpopupmenu.moc"