diff options
Diffstat (limited to 'kfind/kfinddlg.cpp')
-rw-r--r-- | kfind/kfinddlg.cpp | 293 |
1 files changed, 293 insertions, 0 deletions
diff --git a/kfind/kfinddlg.cpp b/kfind/kfinddlg.cpp new file mode 100644 index 000000000..4efafd2de --- /dev/null +++ b/kfind/kfinddlg.cpp @@ -0,0 +1,293 @@ +/*********************************************************************** + * + * Kfinddlg.cpp + * + **********************************************************************/ + +#include <qlayout.h> +#include <qpushbutton.h> + +#include <klocale.h> +#include <kglobal.h> +#include <kguiitem.h> +#include <kstatusbar.h> +#include <kmessagebox.h> +#include <kdebug.h> +#include <kaboutapplication.h> +#include <kstandarddirs.h> + +#include "kftabdlg.h" +#include "kquery.h" +#include "kfwin.h" + +#include "kfinddlg.h" +#include "kfinddlg.moc" + +KfindDlg::KfindDlg(const KURL & url, QWidget *parent, const char *name) + : KDialogBase( Plain, QString::null, + User1 | User2 | Apply | Close | Help, Apply, + parent, name, true, false, + KGuiItem(i18n("Stop"), "stop"), + KStdGuiItem::saveAs()) +{ + QWidget::setCaption( i18n("Find Files/Folders" ) ); + setButtonBoxOrientation(Vertical); + + enableButton(Apply, true); // Enable "Find" + enableButton(User1, false); // Disable "Stop" + enableButton(User2, false); // Disable "Save As..." + + setButtonApply(KGuiItem(i18n("&Find"), "find")); + + isResultReported = false; + + QFrame *frame = plainPage(); + + // create tabwidget + tabWidget = new KfindTabWidget( frame, "dialog"); + tabWidget->setURL( url ); + + // prepare window for find results + win = new KfindWindow(frame,"window"); + + mStatusBar = new KStatusBar(frame); + mStatusBar->insertFixedItem(i18n("AMiddleLengthText..."), 0, true); + setStatusMsg(i18n("Ready.")); + mStatusBar->setItemAlignment(0, AlignLeft | AlignVCenter); + mStatusBar->insertItem(QString::null, 1, 1, true); + mStatusBar->setItemAlignment(1, AlignLeft | AlignVCenter); + + QVBoxLayout *vBox = new QVBoxLayout(frame); + vBox->addWidget(tabWidget, 0); + vBox->addWidget(win, 1); + vBox->addWidget(mStatusBar, 0); + + connect(this, SIGNAL(applyClicked()), + this, SLOT(startSearch())); + connect(this, SIGNAL(user1Clicked()), + this, SLOT(stopSearch())); + connect(this, SIGNAL(user2Clicked()), + win, SLOT(saveResults())); + + connect(win ,SIGNAL(resultSelected(bool)), + this,SIGNAL(resultSelected(bool))); + + query = new KQuery(frame); + connect(query, SIGNAL(addFile(const KFileItem*,const QString&)), + SLOT(addFile(const KFileItem*,const QString&))); + connect(query, SIGNAL(result(int)), SLOT(slotResult(int))); + + dirwatch=NULL; +} + +KfindDlg::~KfindDlg() +{ + stopSearch(); +} + +void KfindDlg::closeEvent(QCloseEvent *) +{ + stopSearch(); + slotClose(); +} + +void KfindDlg::setProgressMsg(const QString &msg) +{ + mStatusBar->changeItem(msg, 1); +} + +void KfindDlg::setStatusMsg(const QString &msg) +{ + mStatusBar->changeItem(msg, 0); +} + + +void KfindDlg::startSearch() +{ + tabWidget->setQuery(query); + + isResultReported = false; + + // Reset count - use the same i18n as below + setProgressMsg(i18n("one file found", "%n files found", 0)); + + emit resultSelected(false); + emit haveResults(false); + + enableButton(Apply, false); // Disable "Find" + enableButton(User1, true); // Enable "Stop" + enableButton(User2, false); // Disable "Save As..." + + if(dirwatch!=NULL) + delete dirwatch; + dirwatch=new KDirWatch(); + connect(dirwatch, SIGNAL(created(const QString&)), this, SLOT(slotNewItems(const QString&))); + connect(dirwatch, SIGNAL(deleted(const QString&)), this, SLOT(slotDeleteItem(const QString&))); + dirwatch->addDir(query->url().path(),true); + +#if 0 + // waba: Watching for updates is disabled for now because even with FAM it causes too + // much problems. See BR68220, BR77854, BR77846, BR79512 and BR85802 + // There are 3 problems: + // 1) addDir() keeps looping on recursive symlinks + // 2) addDir() scans all subdirectories, so it basically does the same as the process that + // is started by KQuery but in-process, undoing the advantages of using a seperate find process + // A solution could be to let KQuery emit all the directories it has searched in. + // Either way, putting dirwatchers on a whole file system is probably just too much. + // 3) FAM has a tendency to deadlock with so many files (See BR77854) This has hopefully + // been fixed in KDirWatch, but that has not yet been confirmed. + + //Getting a list of all subdirs + if(tabWidget->isSearchRecursive() && (dirwatch->internalMethod() == KDirWatch::FAM)) + { + QStringList subdirs=getAllSubdirs(query->url().path()); + for(QStringList::Iterator it = subdirs.begin(); it != subdirs.end(); ++it) + dirwatch->addDir(*it,true); + } +#endif + + win->beginSearch(query->url()); + tabWidget->beginSearch(); + + setStatusMsg(i18n("Searching...")); + query->start(); +} + +void KfindDlg::stopSearch() +{ + query->kill(); +} + +void KfindDlg::newSearch() +{ + // WABA: Not used any longer? + stopSearch(); + + tabWidget->setDefaults(); + + emit haveResults(false); + emit resultSelected(false); + + setFocus(); +} + +void KfindDlg::slotResult(int errorCode) +{ + if (errorCode == 0) + setStatusMsg(i18n("Ready.")); + else if (errorCode == KIO::ERR_USER_CANCELED) + setStatusMsg(i18n("Aborted.")); + else if (errorCode == KIO::ERR_MALFORMED_URL) + { + setStatusMsg(i18n("Error.")); + KMessageBox::sorry( this, i18n("Please specify an absolute path in the \"Look in\" box.")); + } + else if (errorCode == KIO::ERR_DOES_NOT_EXIST) + { + setStatusMsg(i18n("Error.")); + KMessageBox::sorry( this, i18n("Could not find the specified folder.")); + } + else + { + kdDebug()<<"KIO error code: "<<errorCode<<endl; + setStatusMsg(i18n("Error.")); + }; + + enableButton(Apply, true); // Enable "Find" + enableButton(User1, false); // Disable "Stop" + enableButton(User2, true); // Enable "Save As..." + + win->endSearch(); + tabWidget->endSearch(); + setFocus(); + +} + +void KfindDlg::addFile(const KFileItem* item, const QString& matchingLine) +{ + win->insertItem(*item,matchingLine); + + if (!isResultReported) + { + emit haveResults(true); + isResultReported = true; + } + + int count = win->childCount(); + QString str = i18n("one file found", "%n files found", count); + setProgressMsg(str); +} + +void KfindDlg::setFocus() +{ + tabWidget->setFocus(); +} + +void KfindDlg::copySelection() +{ + win->copySelection(); +} + +void KfindDlg::about () +{ + KAboutApplication dlg(this, "about", true); + dlg.exec (); +} + +void KfindDlg::slotDeleteItem(const QString& file) +{ + kdDebug()<<QString("Will remove one item: %1").arg(file)<<endl; + QListViewItem *iter; + QString iterwithpath; + + iter=win->firstChild(); + while( iter ) { + iterwithpath=query->url().path(+1)+iter->text(1)+iter->text(0); + + if(iterwithpath==file) + { + win->takeItem(iter); + break; + } + iter = iter->nextSibling(); + } +} + +void KfindDlg::slotNewItems( const QString& file ) +{ + kdDebug()<<QString("Will add this item")<<endl; + QStringList newfiles; + QListViewItem *checkiter; + QString checkiterwithpath; + + if(file.find(query->url().path(+1))==0) + { + kdDebug()<<QString("Can be added, path OK")<<endl; + checkiter=win->firstChild(); + while( checkiter ) { + checkiterwithpath=query->url().path(+1)+checkiter->text(1)+checkiter->text(0); + if(file==checkiterwithpath) + return; + checkiter = checkiter->nextSibling(); + } + query->slotListEntries(QStringList(file)); + } +} + +QStringList KfindDlg::getAllSubdirs(QDir d) +{ + QStringList dirs; + QStringList subdirs; + + d.setFilter( QDir::Dirs ); + dirs = d.entryList(); + + for(QStringList::Iterator it = dirs.begin(); it != dirs.end(); ++it) + { + if((*it==".")||(*it=="..")) + continue; + subdirs.append(d.path()+"/"+*it); + subdirs+=getAllSubdirs(d.path()+"/"+*it); + } + return subdirs; +} |