diff options
Diffstat (limited to 'src/app/krslots.cpp')
-rw-r--r-- | src/app/krslots.cpp | 944 |
1 files changed, 944 insertions, 0 deletions
diff --git a/src/app/krslots.cpp b/src/app/krslots.cpp new file mode 100644 index 0000000..b6d45c6 --- /dev/null +++ b/src/app/krslots.cpp @@ -0,0 +1,944 @@ +/*************************************************************************** + krslots.cpp + ------------------- + copyright : (C) 2001 by Shie Erlich & Rafi Yanai + email : krusader@users.sourceforge.net + web site : http://krusader.sourceforge.net + --------------------------------------------------------------------------- + Description + *************************************************************************** + + A + + db dD d8888b. db db .d8888. .d8b. d8888b. d88888b d8888b. + 88 ,8P' 88 `8D 88 88 88' YP d8' `8b 88 `8D 88' 88 `8D + 88,8P 88oobY' 88 88 `8bo. 88ooo88 88 88 88ooooo 88oobY' + 88`8b 88`8b 88 88 `Y8b. 88~~~88 88 88 88~~~~~ 88`8b + 88 `88. 88 `88. 88b d88 db 8D 88 88 88 .8D 88. 88 `88. + YP YD 88 YD ~Y8888P' `8888Y' YP YP Y8888D' Y88888P 88 YD + + S o u r c e F i l e + + *************************************************************************** + * * + * 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 <tqdir.h> +#include <tqpoint.h> +#include <tqstringlist.h> +#include <tqprogressdialog.h> +#include <tqlistview.h> +#include <tqpixmapcache.h> +// TDE includes +#include <tdelocale.h> +#include <kprocess.h> +#include <tdemessagebox.h> +#include <klineeditdlg.h> +#include <kdirnotify_stub.h> +#include <tdeio/netaccess.h> +#include <kedittoolbar.h> +#include <tdeversion.h> +#include <tdecmdlineargs.h> +#include <KViewer/krviewer.h> + +#ifdef __KJSEMBED__ +#include "KrJS/krjs.h" +#include <kjsembed/jsconsolewidget.h> +#endif + +// Krusader includes +#include "krslots.h" +#include "krusader.h" +#include "krusaderview.h" +#include "Panel/listpanel.h" +#include "Panel/krselectionmode.h" +#include "Panel/krdetailedview.h" +#include "Panel/krdetailedviewitem.h" +#include "Panel/krbriefview.h" +#include "Panel/krbriefviewitem.h" +#include "Dialogs/krdialogs.h" +#include "Dialogs/krspwidgets.h" +#include "Dialogs/krkeydialog.h" +#include "GUI/krusaderstatus.h" +#include "RemoteMan/remoteman.h" +#include "Panel/panelfunc.h" +#include "Konfigurator/konfigurator.h" +#include "MountMan/kmountman.h" +#include "defaults.h" +#include "resources.h" +#include "GUI/kfnkeys.h" +#include "GUI/kcmdline.h" +#include "GUI/syncbrowsebutton.h" +#include "VFS/krquery.h" +#include "Search/krsearchmod.h" +#include "Search/krsearchdialog.h" +#include "Locate/locate.h" +#include "VFS/vfs.h" +#include "panelmanager.h" +#include "Splitter/splittergui.h" +#include "Splitter/splitter.h" +#include "Splitter/combiner.h" +#include "ActionMan/actionman.h" +#include "UserMenu/usermenu.h" +#include "Panel/panelpopup.h" +#include "Synchronizer/synchronizergui.h" +#include "DiskUsage/diskusagegui.h" +#include "krservices.h" +#include "Panel/krviewitem.h" + +#define REFRESH_BOTH_PANELS { ListPanel *p=ACTIVE_PANEL; \ + MAIN_VIEW->left->func->refresh(); \ + MAIN_VIEW->right->func->refresh();\ + p->slotFocusOnMe(); } +#define ACTIVE_PANEL_MANAGER (ACTIVE_PANEL == krApp->mainView->left ? krApp->mainView->leftMng : \ + krApp->mainView->rightMng) + +void KRslots::sendFileByEmail(TQString filename) { + TQString mailProg; + TQStringList lst = Krusader::supportedTools(); + if (lst.contains("MAIL")) mailProg=lst[lst.findIndex("MAIL") + 1]; + else { + KMessageBox::error(0,i18n("Krusader can't find a supported mail client. Please install one to your path. Hint: Krusader supports Kmail.")); + return; + } + + KShellProcess proc; + + if ( vfs::fromPathOrURL( mailProg ).fileName() == "kmail") { + proc << "kmail" << "--subject \""+i18n("Sending file: ")+ + filename.mid(filename.findRev('/')+1)+"\"" << TQString() + + "--attach "+"\"" + filename + "\""; + } + + if (!proc.start(TDEProcess::DontCare)) + KMessageBox::error(0,i18n("Error executing ")+mailProg+" !"); + else proc.detach(); +} + +void KRslots::compareContent() { + TQStringList lstLeft, lstRight; + TQStringList* lstActive; + KURL name1, name2; + + MAIN_VIEW->left->getSelectedNames( &lstLeft ); + MAIN_VIEW->right->getSelectedNames( &lstRight ); + lstActive = ( ACTIVE_PANEL->isLeft() ? &lstLeft : &lstRight ); + + if ( lstLeft.count() == 1 && lstRight.count() == 1 ) { + // first, see if we've got exactly 1 selected file in each panel: + name1 = MAIN_VIEW->left->func->files()->vfs_getFile( lstLeft[0] ); + name2 = MAIN_VIEW->right->func->files()->vfs_getFile( lstRight[0] ); + } + else if ( lstActive->count() == 2 ) { + // next try: are in the current panel exacty 2 files selected? + name1 = ACTIVE_PANEL->func->files()->vfs_getFile( (*lstActive)[0] ); + name2 = ACTIVE_PANEL->func->files()->vfs_getFile( (*lstActive)[1] ); + } + else if ( ACTIVE_PANEL->otherPanel->func->files()->vfs_search( ACTIVE_PANEL->view->getCurrentItem() ) ) { + // next try: is in the other panel a file with the same name? + name1 = ACTIVE_PANEL->func->files()->vfs_getFile( ACTIVE_PANEL->view->getCurrentItem() ); + name2 = ACTIVE_PANEL->otherPanel->func->files()->vfs_getFile( ACTIVE_PANEL->view->getCurrentItem() ); + } + else { + // if we got here, then we can't be sure what file to diff + KMessageBox::detailedError(0, i18n("Don't know which files to compare."), "<qt>" + i18n("To compare two files by content, you can either:<ul><li>Select one file in the left panel, and one in the right panel.</li><li>Select exactly two files in the active panel.</li><li>Make sure there is a file in the other panel, with the same name as the current file in the active panel.</li></ul>") + "</qt>" ); + + return; + } + + // else implied: all ok, let's call kdiff + // but if one of the files isn't local, download them first + compareContent( name1, name2 ); +} + +class KrProcess: public TDEProcess +{ + TQString tmp1, tmp2; + +public: + KrProcess( TQString in1, TQString in2 ) + { + tmp1 = in1; + tmp2 = in2; + } + + virtual void processHasExited (int ) + { + if( !tmp1.isEmpty() ) + TDEIO::NetAccess::removeTempFile( tmp1 ); + if( !tmp2.isEmpty() ) + TDEIO::NetAccess::removeTempFile( tmp2 ); + delete this; + } +}; + +void KRslots::compareContent( KURL url1, KURL url2 ) +{ + TQString diffProg; + TQStringList lst = Krusader::supportedTools(); + if (lst.contains("DIFF")) diffProg=lst[lst.findIndex("DIFF") + 1]; + else { + KMessageBox::error(0,i18n("Krusader can't find any of the supported diff-frontends. Please install one to your path. Hint: Krusader supports Kompare, Kdiff3 and Xxdiff.")); + return; + } + + TQString tmp1 = TQString(), tmp2 = TQString(); + + if (!url1.isLocalFile()) { + if( !TDEIO::NetAccess::download( url1, tmp1, 0 ) ){ + KMessageBox::sorry(krApp,i18n("Krusader is unable to download: ")+url1.fileName()); + return; + } + } else tmp1 = url1.path(); + if (!url2.isLocalFile()) { + if( !TDEIO::NetAccess::download( url2, tmp2, 0 ) ){ + KMessageBox::sorry(krApp,i18n("Krusader is unable to download: ")+url2.fileName()); + if( tmp1 != url1.path() ) + TDEIO::NetAccess::removeTempFile( tmp1 ); + return; + } + } else tmp2 = url2.path(); + + KrProcess *p = new KrProcess( tmp1 != url1.path() ? tmp1 : TQString(), + tmp2 != url2.path() ? tmp2 : TQString() ); + *p << diffProg << tmp1 << tmp2; + if (!p->start(TDEProcess::DontCare)) + KMessageBox::error(0,i18n("Error executing ")+diffProg+" !"); +} + +void KRslots::rightclickMenu() { + if( dynamic_cast<KrDetailedView*>(ACTIVE_PANEL->view) != 0 ) + { + TQListViewItem * currentItem = dynamic_cast<TQListViewItem*>(ACTIVE_PANEL->view->getCurrentKrViewItem()); + if( currentItem ) + { + ACTIVE_PANEL->popRightClickMenu( + ACTIVE_PANEL->mapToGlobal( + dynamic_cast<TDEListView*>(ACTIVE_PANEL->view)->itemRect( currentItem ).topLeft() + ) + ); + } + } + else if( dynamic_cast<KrBriefView*>(ACTIVE_PANEL->view) != 0 ) + { + TQIconViewItem * currentItem = dynamic_cast<TQIconViewItem*>(ACTIVE_PANEL->view->getCurrentKrViewItem()); + if( currentItem ) + { + ACTIVE_PANEL->popRightClickMenu( + ACTIVE_PANEL->mapToGlobal( + currentItem->rect().topLeft() + ) + ); + } + } +} + +void KRslots::addBookmark(){ + // TODO: this no longer works! +} + +// GUI toggle slots +void KRslots::toggleFnkeys(){ + if( MAIN_VIEW->fnKeys->isVisible() ) MAIN_VIEW->fnKeys->hide(); + else MAIN_VIEW->fnKeys->show(); +} + +void KRslots::toggleCmdline(){ + if( MAIN_VIEW->cmdLine->isVisible() ) MAIN_VIEW->cmdLine->hide(); + else MAIN_VIEW->cmdLine->show(); +} + +void KRslots::toggleToolbar() { + if (krApp->toolBar()->isVisible()) + krApp->toolBar()->hide(); + else krApp->toolBar()->show(); +} + +void KRslots::toggleActionsToolbar() { + if (krApp->toolBar("actionsToolBar")->isVisible()) + krApp->toolBar("actionsToolBar")->hide(); + else krApp->toolBar("actionsToolBar")->show(); +} + + +void KRslots::toggleStatusbar() { + if (krApp->statusBar()->isVisible()) + krApp->statusBar()->hide(); + else krApp->statusBar()->show(); +} + +void KRslots::toggleTerminal() { + if( MAIN_VIEW->terminal_dock->isVisible() ) MAIN_VIEW->slotTerminalEmulator(false); + else MAIN_VIEW->slotTerminalEmulator(true); +} + +void KRslots::insertFileName(bool full_path) +{ + TQString filename = ACTIVE_PANEL->view->getCurrentItem(); + if( filename == TQString() ) + return; + + if( full_path ){ + TQString path=vfs::pathOrURL( ACTIVE_FUNC->files()->vfs_getOrigin(), 1 ); + filename = path+filename; + } + + filename = KrServices::quote( filename ); + + if(MAIN_VIEW->cmdLine->isVisible() || !MAIN_VIEW->konsole_part || !MAIN_VIEW->konsole_part->widget() || + !MAIN_VIEW->konsole_part->widget()->isVisible() ){ + TQString current = MAIN_VIEW->cmdLine->text(); + if( current.length() != 0 && !current.endsWith( " " ) ) + current += " "; + MAIN_VIEW->cmdLine->setText( current + filename ); + MAIN_VIEW->cmdLine->setFocus(); + } + else if(MAIN_VIEW->konsole_part){ + filename = TQString( " " ) + filename + TQString( " " ); + TQKeyEvent keyEvent( TQEvent::KeyPress, 0, -1, 0, filename); + TQApplication::sendEvent( MAIN_VIEW->konsole_part->widget(), &keyEvent ); + MAIN_VIEW->konsole_part->widget()->setFocus(); + } +} + +// directory list functions +void KRslots::allFilter() { ACTIVE_PANEL->setFilter(KrViewProperties::All); } +void KRslots::execFilter() { ACTIVE_PANEL->setFilter(KrViewProperties::All); } +void KRslots::customFilter() { ACTIVE_PANEL->setFilter(KrViewProperties::Custom); } +void KRslots::markAll() { ACTIVE_PANEL->select(true,true); } +void KRslots::unmarkAll() { ACTIVE_PANEL->select(false,true); } +void KRslots::markGroup() { ACTIVE_PANEL->select(true,false); } +void KRslots::markGroup(const TQString& mask, bool select) { ACTIVE_PANEL->select( KRQuery( mask ), select); } +void KRslots::unmarkGroup() { ACTIVE_PANEL->select(false,false); } +void KRslots::invert() { ACTIVE_PANEL->invertSelection(); } + +void KRslots::root() { ACTIVE_FUNC->openUrl(vfs::fromPathOrURL("/"));} +void KRslots::refresh(const KURL& u){ ACTIVE_FUNC->openUrl(u); } +void KRslots::home() { ACTIVE_FUNC->openUrl(TQDir::homeDirPath()); } +void KRslots::refresh() { ACTIVE_FUNC->refresh(); } +void KRslots::properties() { ACTIVE_FUNC->properties(); } +void KRslots::dirUp() { ACTIVE_FUNC->dirUp(); } +void KRslots::back() { ACTIVE_FUNC->goBack(); } +void KRslots::slotPack() { ACTIVE_FUNC->pack(); } +void KRslots::slotUnpack() { ACTIVE_FUNC->unpack(); } +void KRslots::testArchive() { ACTIVE_FUNC->testArchive(); } +void KRslots::calcSpace() { ACTIVE_FUNC->calcSpace(); } +void KRslots::FTPDisconnect() { ACTIVE_FUNC->FTPDisconnect(); } +void KRslots::newFTPconnection(){ ACTIVE_FUNC->newFTPconnection(); } +void KRslots::cut() { ACTIVE_FUNC->copyToClipboard( true ); } +void KRslots::copy() { ACTIVE_FUNC->copyToClipboard( false ); } +void KRslots::paste() { ACTIVE_FUNC->pasteFromClipboard(); } +void KRslots::createChecksum() { ACTIVE_FUNC->createChecksum(); } +void KRslots::matchChecksum() { ACTIVE_FUNC->matchChecksum(); } + +// run external modules / programs +void KRslots::runKonfigurator(bool firstTime) { + + krConfig->setGroup( "Look&Feel" ); + int size = (krConfig->readEntry("Filelist Icon Size",_FilelistIconSize)).toInt(); + + Konfigurator *konfigurator = new Konfigurator(firstTime); + + if( konfigurator->isGUIRestartNeeded() ) + { + krConfig->setGroup( "Look&Feel" ); + if((krConfig->readEntry("Filelist Icon Size",_FilelistIconSize)).toInt() != size ) + TQPixmapCache::clear(); + + KrDetailedViewItem::itemHeightChanged(); // needed when icon size / font size changes + KrBriefViewItem::itemHeightChanged(); + + MAIN_VIEW->leftMng->slotRecreatePanels(); + MAIN_VIEW->rightMng->slotRecreatePanels(); + MAIN_VIEW->fnKeys->updateShortcuts(); + KrSelectionMode::resetSelectionHandler(); + } + + krApp->configChanged(); + delete konfigurator; +} + +void KRslots::setDetailedView() { + if( ACTIVE_PANEL && ACTIVE_PANEL->getType() != "Detailed" ) + ACTIVE_PANEL->changeType( "Detailed" ); +} + +void KRslots::setBriefView() { + if( ACTIVE_PANEL && ACTIVE_PANEL->getType() != "Brief" ) + ACTIVE_PANEL->changeType( "Brief" ); +} + +void KRslots::toggleHidden(){ + krConfig->setGroup("Look&Feel"); + bool show = !krConfig->readBoolEntry("Show Hidden",_ShowHidden); + krApp->actToggleHidden->setChecked(show); + krConfig->writeEntry("Show Hidden",show); + + MAIN_VIEW->leftMng->refreshAllTabs( true ); + MAIN_VIEW->rightMng->refreshAllTabs( true ); +} + +void KRslots::swapPanels(){ + KURL leftURL = MAIN_VIEW->left->func->files()->vfs_getOrigin(); + KURL rightURL = MAIN_VIEW->right->func->files()->vfs_getOrigin(); + + MAIN_VIEW->left->func->openUrl( rightURL ); + MAIN_VIEW->right->func->openUrl( leftURL ); +} + +void KRslots::toggleSwapSides(){ + TQValueList<int> lst = MAIN_VIEW->horiz_splitter->sizes(); + + MAIN_VIEW->horiz_splitter->moveToLast( MAIN_VIEW->leftMng ); + + int old = lst[ 0 ]; + lst[ 0 ] = lst [ 1 ]; + lst[ 1 ] = old; + + MAIN_VIEW->horiz_splitter->setSizes( lst ); + + ListPanel *tmpPanel; // temporary variables for swapping + PanelManager *tmpMng; + + tmpMng = MAIN_VIEW->leftMng; + MAIN_VIEW->leftMng = MAIN_VIEW->rightMng; + MAIN_VIEW->rightMng = tmpMng; + + tmpPanel = MAIN_VIEW->left; + MAIN_VIEW->left = MAIN_VIEW->right; + MAIN_VIEW->right = tmpPanel; + + MAIN_VIEW->leftMng->swapPanels(); + MAIN_VIEW->rightMng->swapPanels(); + + MAIN_VIEW->left->updateGeometry(); + MAIN_VIEW->right->updateGeometry(); +} + +void KRslots::search() { + if ( KrSearchDialog::SearchDialog != 0 ) { + krConfig->setGroup( "Search" ); + if( krConfig->readBoolEntry( "Window Maximized", false ) ) + KrSearchDialog::SearchDialog->showMaximized(); + else + KrSearchDialog::SearchDialog->showNormal(); + + KrSearchDialog::SearchDialog->raise(); + KrSearchDialog::SearchDialog->setActiveWindow(); + } else + KrSearchDialog::SearchDialog = new KrSearchDialog(); +} + +void KRslots::locate() +{ + if( !KrServices::cmdExist( "locate" ) ) + { + KMessageBox::error(krApp, i18n( "Can't find the 'locate' command. Please install the " + "findutils-locate package of GNU, or set its dependencies in " + "Konfigurator" )); + return; + } + + if ( LocateDlg::LocateDialog != 0 ) { + LocateDlg::LocateDialog->showNormal(); + LocateDlg::LocateDialog->raise(); + LocateDlg::LocateDialog->setActiveWindow(); + LocateDlg::LocateDialog->reset(); + } else + LocateDlg::LocateDialog = new LocateDlg(); +} + +void KRslots::runRemoteMan() { + // display outage information + KMessageBox::information(krApp, i18n( "Important: RemoteMan has been replaced by our new bookmark manager. " + "The new manager handles local files and remote URLs the same way. " + "RemoteMan is being left around to allow an easier transition and " + "give you a chance to move your bookmarks. IT WILL BE REMOVED SOON!" + "\n" + "Try the new bookmark-manager: open a new remote connection, once " + "done, press the bookmark button, select 'Add bookmark' and that's it!")); + + TQString host=remoteMan::getHost(); + if (host==TQString()) return; + // otherwise, attempt a connection + ACTIVE_FUNC->openUrl(vfs::fromPathOrURL(host)); +} + +void KRslots::runMountMan() { + // left as a precaution, although we use kde's services now + if( !KrServices::cmdExist( "df" ) || !KrServices::cmdExist( "mount" ) ) + { + KMessageBox::error(0, + i18n("Can't start 'mount'! Check the 'Dependencies' page in konfigurator.")); + return; + } + + krApp->mountMan->mainWindow(); +} + +void KRslots::homeTerminal(){ + TQString save = getcwd(0,0); + chdir (TQDir::homeDirPath().local8Bit()); + + TDEProcess proc; + krConfig->setGroup("General"); + TQString term = krConfig->readEntry("Terminal",_Terminal); + proc << KrServices::separateArgs( term ); + + 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 ")+"\""+term+"\""); + + chdir(save.local8Bit()); +} + +void KRslots::sysInfo(){ + TDEProcess proc; + proc << "tdecmshell" << "System/ksysctrl"; + if (!proc.start(TDEProcess::DontCare)){ + KMessageBox::sorry(krApp,i18n("Can't find \"KsysCtrl\". Please install the TDE admin package")); + } +} + +void KRslots::multiRename(){ + TQStringList lst = Krusader::supportedTools(); + int i = lst.findIndex("RENAME"); + if (i == -1){ + KMessageBox::sorry(krApp,i18n("Can't find a batch rename tool.\nYou can get Krename at http://www.krename.net")); + return; + } + TQString pathToRename = lst[i+1]; + + TQStringList names; + ((ListPanel*)ACTIVE_PANEL)->getSelectedNames(&names); + KURL::List* urls = ACTIVE_FUNC->files()->vfs_getFiles(&names); + + if( urls->isEmpty() ){ + delete urls; + return; + } + + KShellProcess proc; + proc << pathToRename; + + for( KURL::List::iterator u=urls->begin(); u != urls->end(); ++u){ + if( TQFileInfo((*u).path()).isDir() ) proc << "-r"; + proc << "\"" + (*u).path() + "\""; // patch thanks to Tobias Vogele + } + + proc.start(TDEProcess::DontCare); + delete urls; +} + +void KRslots::rootKrusader() +{ + if( !KrServices::cmdExist( "krusader" ) || !KrServices::cmdExist( "tdesu" ) ) + { + KMessageBox::sorry( krApp, i18n( "Can't start root mode krusader, because krusader or tdesu is missing from the path. Please configure the dependencies in Konfigurator!" ) ); + return; + } + + KShellProcess proc; + proc << KrServices::fullPathName( "tdesu" ) << TQString("'") + KrServices::fullPathName( "krusader" ) + + " --left=\"" +MAIN_VIEW->left->func->files()->vfs_getOrigin().url() + + "\" --right=\""+MAIN_VIEW->right->func->files()->vfs_getOrigin().url() + "\"'"; + + proc.start(TDEProcess::DontCare); +} + +// settings slots +void KRslots::configToolbar(){ + KEditToolbar dlg(krApp->factory()); + if (dlg.exec()) krApp->updateGUI(); +} + +void KRslots::configKeys(){ + KrKeyDialog( MAIN_VIEW ); +} + +// misc +void KRslots::changeTrashIcon(){ + // update trash bin icon - this is "stolen" konqi code + // Copyright (C) 2000 David Faure <faure@kde.org> + KURL trash; + trash.setPath(TDEGlobalSettings::trashPath()); + KURL::List lst; + lst.append(trash); + KDirNotify_stub allDirNotify("*","KDirNotify*"); + allDirNotify.FilesChanged( lst ); + // end of konqi code +} + +// F2 +void KRslots::terminal() { ACTIVE_FUNC->terminal(); } +// F3 +void KRslots::view() { ACTIVE_FUNC->view(); } +// F4 +void KRslots::edit() { ACTIVE_FUNC->editFile(); } +// F5 +void KRslots::copyFiles() { ACTIVE_FUNC->copyFiles(); } +// F6 +void KRslots::moveFiles() { ACTIVE_FUNC->moveFiles(); } +// F7 +void KRslots::mkdir() { ACTIVE_FUNC->mkdir(); } +// F8 +void KRslots::deleteFiles(bool reallyDelete) { ACTIVE_FUNC->deleteFiles(reallyDelete);} +// F9 +void KRslots::rename() { ACTIVE_FUNC->rename(); } + +// Shift F3 +void KRslots::viewDlg(){ + // ask the user for a url to view + KURL dest = KChooseDir::getDir(i18n("Enter a URL to view:"), ACTIVE_PANEL->virtualPath(), ACTIVE_PANEL->virtualPath()); + if ( dest.isEmpty() ) return ; // the user canceled + + KrViewer::view( dest ); // view the file +// } + // nothing more to it! +} + +// Shift F4 +void KRslots::editDlg(){ + // ask the user for the filename to edit + KURL dest = KChooseDir::getDir(i18n("Enter the filename to edit:"), ACTIVE_PANEL->virtualPath(), ACTIVE_PANEL->virtualPath()); + if ( dest.isEmpty() ) return ; // the user canceled + + KrViewer::edit( dest ); + + if( dest.upURL().equals( ACTIVE_PANEL->virtualPath(), true ) ) + refresh(); +} + +void KRslots::duplicateTab() { + ACTIVE_PANEL_MANAGER->slotNewTab(ACTIVE_PANEL->virtualPath()); +} + +// ugly: do this right before release! +void KRslots::newTab(const KURL& url) { + if (url.isValid()) + ACTIVE_PANEL_MANAGER->slotNewTab(url); + else ACTIVE_PANEL_MANAGER->slotNewTab(); +} + +void KRslots::nextTab() { + ACTIVE_PANEL_MANAGER->slotNextTab(); +} + +void KRslots::previousTab() { + ACTIVE_PANEL_MANAGER->slotPreviousTab(); +} + +void KRslots::newTab(KrViewItem *it) { + if (!it) return; + if( it->name() == ".." ) { + KURL url = ACTIVE_PANEL->virtualPath(); + ACTIVE_PANEL_MANAGER->slotNewTab( url.upURL() ); + } + else if (ITEM2VFILE(ACTIVE_PANEL, it)->vfile_isDir()) { + KURL url = ACTIVE_PANEL->virtualPath(); + url.addPath( it->name() ); + ACTIVE_PANEL_MANAGER->slotNewTab( url ); + } +} + +void KRslots::closeTab() { + ACTIVE_PANEL_MANAGER->slotCloseTab(); +} + +void KRslots::slotSplit() +{ + TQStringList list; + TQString name; + + ((ListPanel*)ACTIVE_PANEL)->getSelectedNames(&list); + + // first, see if we've got exactly 1 selected file, if not, try the current one + if (list.count() == 1) name = list[0]; + + if ( name.isEmpty() ) { + // if we got here, then one of the panel can't be sure what file to diff + KMessageBox::error(0,i18n("Don't know which file to split.")); + return; + } + + KURL fileURL = ACTIVE_FUNC->files()->vfs_getFile(name); + if( fileURL.isEmpty() ) + return; + + if ( ACTIVE_FUNC->files()->vfs_search( name )->vfile_isDir() ) { + KMessageBox::sorry( krApp, i18n( "You can't split a directory!" ) ); + return ; + } + + KURL destDir = ACTIVE_PANEL->otherPanel->func->files()->vfs_getOrigin(); + + SplitterGUI splitterGUI( MAIN_VIEW, fileURL, destDir ); + + if( splitterGUI.result() == TQDialog::Accepted ) + { + bool splitToOtherPanel = ( splitterGUI.getDestinationDir().equals( ACTIVE_PANEL->otherPanel->virtualPath(), true ) ); + + Splitter split( MAIN_VIEW, fileURL, splitterGUI.getDestinationDir() ); + split.split( splitterGUI.getSplitSize() ); + + if ( splitToOtherPanel ) + ACTIVE_PANEL->otherPanel->func->refresh(); + } +} + +void KRslots::slotCombine(){ + TQStringList list; + KURL baseURL; + bool unixStyle = false; + bool windowsStyle = false; + TQString commonName = TQString(); + unsigned int commonLength = 0; + + ((ListPanel*)ACTIVE_PANEL)->getSelectedNames(&list); + if ( list.isEmpty() ) + { + KMessageBox::error(0,i18n("Don't know which files to combine.")); + return; + } + + /* checking splitter names */ + for ( TQStringList::Iterator it = list.begin(); it != list.end(); ++it ) + { + KURL url = ACTIVE_FUNC->files()->vfs_getFile(*it); + if( url.isEmpty() ) + return; + + if ( ACTIVE_FUNC->files()->vfs_search( *it )->vfile_isDir() ) { + KMessageBox::sorry( krApp, i18n( "You can't combine a directory!" ) ); + return ; + } + + if( !unixStyle ) + { + TQString name = url.fileName(); + int extPos = name.findRev( '.' ); + TQString ext = name.mid( extPos + 1 ); + name.truncate( extPos ); + url.setFileName( name ); + + bool isExtInt; + ext.toInt( &isExtInt, 10 ); + + if( extPos < 1 || ext.isEmpty() || ( ext != "crc" && !isExtInt ) ) + { + if( windowsStyle ) + { + KMessageBox::error(0,i18n("Not a split file %1!").arg( vfs::pathOrURL( url ) )); + return; + } + unixStyle = true; + } + else + { + + if( ext != "crc" ) + windowsStyle = true; + + if( baseURL.isEmpty() ) + baseURL = url; + else if( baseURL != url ) + { + KMessageBox::error(0,i18n("Select only one split file!")); + return; + } + } + } + + if( unixStyle ) + { + bool error = true; + + do + { + TQString shortName = *it; + TQChar lastChar = shortName.at( shortName.length()-1 ); + + if( lastChar.isLetter() ) + { + char fillLetter = ( lastChar.upper() == lastChar ) ? 'A' : 'a'; + + if( commonName.isNull() ) + { + commonLength = shortName.length(); + commonName = shortName; + + while ( commonName.length() ) + { + TQString shorter = commonName.left( commonName.length() - 1 ); + TQString testFile = shorter.leftJustify( commonLength, fillLetter ); + + if( ACTIVE_FUNC->files()->vfs_search( testFile ) == 0 ) + break; + else + { + commonName = shorter; + baseURL = ACTIVE_FUNC->files()->vfs_getOrigin(); + baseURL.addPath( testFile ); + } + } + + error = ( commonName == shortName ); + } + else if( commonLength == shortName.length() && shortName.startsWith( commonName ) ) + error = false; + } + }while ( false ); + + if( error ) + { + KMessageBox::error(0,i18n("Not a splitted file %1!").arg( vfs::pathOrURL( url ) )); + return; + } + } + } + + // ask the user for the copy dest + KURL dest = KChooseDir::getDir(i18n("Combining %1.* to directory:" ).arg( vfs::pathOrURL( baseURL ) ), + ACTIVE_PANEL->otherPanel->virtualPath(), ACTIVE_PANEL->virtualPath()); + if ( dest.isEmpty() ) return ; // the user canceled + + bool combineToOtherPanel = ( dest.equals( ACTIVE_PANEL->otherPanel->virtualPath(), true ) ); + + Combiner combine( MAIN_VIEW, baseURL, dest, unixStyle ); + combine.combine(); + + if ( combineToOtherPanel ) + ACTIVE_PANEL->otherPanel->func->refresh(); +} + +void KRslots::userMenu() { + //UserMenu um; + //um.exec(); + krApp->userMenu->exec(); +} + +void KRslots::manageUseractions() { + ActionMan actionMan( MAIN_VIEW ); +} + +void KRslots::slotSynchronizeDirs( TQStringList selected ) { + new SynchronizerGUI( 0, MAIN_VIEW->left->func->files()->vfs_getOrigin(), + MAIN_VIEW->right->func->files()->vfs_getOrigin(), selected ); +} + +void KRslots::slotSyncBrowse() { + ACTIVE_PANEL->syncBrowseButton->toggle(); +} + +void KRslots::updatePopupPanel(KrViewItem *item) { + // which panel to display on? + ListPanel *lp = 0; + if (ACTIVE_PANEL->popup->isHidden() && + ACTIVE_PANEL->otherPanel->popup->isHidden()) return; + if (ACTIVE_PANEL->popup->isShown()) + lp = ACTIVE_PANEL; + else if (ACTIVE_PANEL->otherPanel->popup->isShown()) + lp = ACTIVE_PANEL->otherPanel; + + KURL url; + if (item->name()!="..") // updir + url = ACTIVE_FUNC->files()->vfs_getFile(item->name()); + lp->popup->update(url); +} + +void KRslots::compareDirs() +{ + ACTIVE_PANEL->compareDirs(); + ACTIVE_PANEL->otherPanel->compareDirs(); +} + +void KRslots::compareSetup() +{ + for( int i=0; Krusader::compareArray[i] != 0; i++ ) + if( (*Krusader::compareArray[i])->isChecked() ) + { + krConfig->setGroup( "Private" ); + krConfig->writeEntry( "Compare Mode", i ); + break; + } +} + +/** called by actions actExec* to choose the built-in command line mode */ +void KRslots::execTypeSetup() +{ + for( int i=0; Krusader::execTypeArray[i] != 0; i++ ) + if( (*Krusader::execTypeArray[i])->isChecked() ) + { + if( *Krusader::execTypeArray[i] == Krusader::actExecTerminalEmbedded ){ + // if commands are to be executed in the TE, it must be loaded + MAIN_VIEW->createTE(); + } + TDEConfigGroup grp(krConfig, "Private" ); + grp.writeEntry( "Command Execution Mode", i ); + break; + } +} + +void KRslots::togglePopupPanel() { + ACTIVE_PANEL->togglePanelPopup(); +} + +void KRslots::slotDiskUsage() +{ + DiskUsageGUI du( ACTIVE_FUNC->files()->vfs_getOrigin(), MAIN_VIEW, "DiskUsage" ); +} + +// when window becomes focused, enable the refresh in the visible panels +void KRslots::windowActive() { + if( MAIN_VIEW != 0 ) { /* CRASH FIX: it's possible that the method is called after destroying the main view */ + MAIN_VIEW->left->panelActive(); + MAIN_VIEW->right->panelActive(); + } +} + +// when another application becomes focused, do a windows-commander style refresh: don't +// refresh at all until krusader becomes focused again +void KRslots::windowInactive() { + if( MAIN_VIEW != 0 ) { /* CRASH FIX: it's possible that the method is called after destroying the main view */ + MAIN_VIEW->left->panelInactive(); + MAIN_VIEW->right->panelInactive(); + } +} + +void KRslots::slotLocationBar() { + ACTIVE_PANEL->origin->lineEdit()->selectAll(); + ACTIVE_PANEL->origin->setFocus(); +} + +void KRslots::slotJumpBack() { + ACTIVE_PANEL->jumpBack(); +} + +void KRslots::slotSetJumpBack() { + ACTIVE_PANEL->setJumpBack( ACTIVE_PANEL->virtualPath() ); +} + +//shows the JavaScript-Console +void KRslots::jsConsole() { +#ifdef __KJSEMBED__ + if ( ! krJS ) + krJS = new KrJS(); + krJS->view()->show(); +#endif +} + +void KRslots::bookmarkCurrent() { + krBookMan->bookmarkCurrent(ACTIVE_PANEL->virtualPath()); +} + +#include "krslots.moc" |