diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2025-08-28 22:44:34 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2025-08-31 23:30:34 +0900 |
commit | f9abd9d505434c9244c03eac708e29a0ca042f6b (patch) | |
tree | 30a197ab4c413849188bc131ff859212e636c821 /src/app/Panel/krpopupmenu.cpp | |
parent | 14d42d284de233f9937becf3fc9ee0dabede3b21 (diff) | |
download | krusader-r14.1.x.tar.gz krusader-r14.1.x.zip |
Restructure source foldersr14.1.x
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit 086012dcad8a976a0dabbb7cbc20c9cb612cdfa9)
Diffstat (limited to 'src/app/Panel/krpopupmenu.cpp')
-rw-r--r-- | src/app/Panel/krpopupmenu.cpp | 354 |
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" |