You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
krusader/krusader/krslots.cpp

945 lines
30 KiB

/***************************************************************************
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"