diff --git a/src/kfinddlg.cpp b/src/kfinddlg.cpp
index 1f6a2b6f6..b9481af3b 100644
--- a/src/kfinddlg.cpp
+++ b/src/kfinddlg.cpp
@@ -1,298 +1,298 @@
/*******************************************************************
* kfinddlg.cpp
*
* 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.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
******************************************************************/
#include "kfinddlg.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "kftabdlg.h"
#include "kquery.h"
#include "kfindtreeview.h"
KfindDlg::KfindDlg(const QUrl &url, QWidget *parent)
: QDialog(parent)
{
QHBoxLayout *mainLayout = new QHBoxLayout;
setLayout(mainLayout);
setModal(true);
QWidget::setWindowTitle(i18nc("@title:window", "Find Files/Folders"));
isResultReported = false;
QFrame *frame = new QFrame;
mainLayout->addWidget(frame);
// create tabwidget
tabWidget = new KfindTabWidget(frame);
mainLayout->addWidget(tabWidget);
tabWidget->setURL(url);
// prepare window for find results
win = new KFindTreeView(frame, this);
mStatusBar = new QStatusBar(frame);
m_labelStatus = new QLabel(mStatusBar);
m_labelStatus->setAlignment (Qt::AlignLeft | Qt::AlignVCenter);
m_labelStatus->setText(i18nc("the application is currently idle, there is no active search", "Idle."));
m_labelProgress = new QLabel(mStatusBar);
m_labelProgress->setAlignment (Qt::AlignRight | Qt::AlignVCenter);
m_labelProgress->setText(QString());
mStatusBar->addWidget(m_labelStatus, 1);
mStatusBar->addWidget(m_labelProgress, 0);
QVBoxLayout *vBox = new QVBoxLayout(frame);
vBox->addWidget(tabWidget, 0);
vBox->addWidget(win, 1);
vBox->addWidget(mStatusBar, 0);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Help | QDialogButtonBox::Close, this);
m_findButton = new QPushButton;
buttonBox->addButton(m_findButton, QDialogButtonBox::ActionRole);
m_stopButton = new QPushButton;
buttonBox->addButton(m_stopButton, QDialogButtonBox::ActionRole);
m_saveAsButton = new QPushButton;
buttonBox->addButton(m_saveAsButton, QDialogButtonBox::ActionRole);
buttonBox->setOrientation(Qt::Vertical);
m_findButton->setDefault(true);
KGuiItem::assign(m_findButton, KStandardGuiItem::find());
KGuiItem::assign(m_stopButton, KStandardGuiItem::stop());
KGuiItem::assign(m_saveAsButton, KStandardGuiItem::saveAs());
m_findButton->setEnabled(true); // Enable "Find"
m_stopButton->setEnabled(false); // Disable "Stop"
m_saveAsButton->setEnabled(false); // Disable "Save As..."
mainLayout->addWidget(buttonBox);
connect(tabWidget, &KfindTabWidget::startSearch, this, &KfindDlg::startSearch);
connect(m_findButton, &QPushButton::clicked, this, &KfindDlg::startSearch);
connect(m_stopButton, &QPushButton::clicked, this, &KfindDlg::stopSearch);
connect(m_saveAsButton, &QPushButton::clicked, win, &KFindTreeView::saveResults);
connect(buttonBox->button(QDialogButtonBox::Close), &QPushButton::clicked, this, &KfindDlg::finishAndClose);
connect(win, &KFindTreeView::resultSelected, this, &KfindDlg::resultSelected);
query = new KQuery(frame);
connect(query, &KQuery::result, this, &KfindDlg::slotResult);
connect(query, &KQuery::foundFileList, this, &KfindDlg::addFiles);
KHelpMenu *helpMenu = new KHelpMenu(this, KAboutData::applicationData(), true);
buttonBox->button(QDialogButtonBox::Help)->setMenu(helpMenu->menu());
dirwatch = nullptr;
setFocus();
}
KfindDlg::~KfindDlg()
{
stopSearch();
delete dirwatch;
}
void KfindDlg::finishAndClose()
{
//Stop the current search and closes the dialog
stopSearch();
close();
}
void KfindDlg::setProgressMsg(const QString &msg)
{
m_labelProgress->setText(msg);
}
void KfindDlg::setStatusMsg(const QString &msg)
{
m_labelStatus->setText(msg);
}
void KfindDlg::startSearch()
{
tabWidget->setQuery(query);
isResultReported = false;
// Reset count - use the same i18n as below
setProgressMsg(i18n("0 items found"));
emit resultSelected(false);
emit haveResults(false);
m_findButton->setEnabled(false); // Disable "Find"
m_stopButton->setEnabled(true); // Enable "Stop"
m_saveAsButton->setEnabled(false); // Disable "Save As..."
delete dirwatch;
dirwatch = new KDirWatch();
connect(dirwatch, &KDirWatch::created, this, &KfindDlg::slotNewItems);
connect(dirwatch, &KDirWatch::deleted, this, &KfindDlg::slotDeleteItem);
dirwatch->addDir(query->url().toLocalFile(), KDirWatch::WatchFiles);
#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 separate 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)) {
const QStringList subdirs = getAllSubdirs(query->url().path());
for (QStringList::const_iterator it = subdirs.constBegin(); it != subdirs.constEnd(); ++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(i18nc("the application is currently idle, there is no active search", "Idle."));
} else if (errorCode == KIO::ERR_USER_CANCELED) {
setStatusMsg(i18n("Canceled."));
} 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 {
setStatusMsg(i18n("Error."));
}
m_findButton->setEnabled(true); // Enable "Find"
m_stopButton->setEnabled(false); // Disable "Stop"
m_saveAsButton->setEnabled(true); // Enable "Save As..."
win->endSearch();
tabWidget->endSearch();
setFocus();
}
void KfindDlg::addFiles(const QList< QPair > &pairs)
{
win->insertItems(pairs);
if (!isResultReported) {
emit haveResults(true);
isResultReported = true;
}
const QString str = i18np("one item found", "%1 items found", win->itemCount());
setProgressMsg(str);
}
void KfindDlg::setFocus()
{
tabWidget->setFocus();
}
void KfindDlg::copySelection()
{
win->copySelection();
}
void KfindDlg::about()
{
- KAboutApplicationDialog dlg(KAboutData::applicationData(), nullptr, this);
+ KAboutApplicationDialog dlg(KAboutData::applicationData(), KAboutApplicationDialog::NoOptions, this);
dlg.exec();
}
void KfindDlg::slotDeleteItem(const QString &file)
{
win->removeItem(QUrl::fromLocalFile(file));
const QString str = i18np("one item found", "%1 items found", win->itemCount());
setProgressMsg(str);
}
void KfindDlg::slotNewItems(const QString &file)
{
const QUrl url = QUrl::fromLocalFile(file);
if (query->url().isParentOf(url)) {
if (!win->isInserted(url)) {
query->slotListEntries(QStringList() << file);
}
}
}
QStringList KfindDlg::getAllSubdirs(QDir d)
{
QStringList dirs;
QStringList subdirs;
d.setFilter(QDir::Dirs);
dirs = d.entryList();
const QStringList::const_iterator end(dirs.constEnd());
for (QStringList::const_iterator it = dirs.constBegin(); it != end; ++it) {
if ((*it == QLatin1String(".")) || (*it == QLatin1String(".."))) {
continue;
}
subdirs.append(d.path()+QLatin1Char('/')+*it);
subdirs += getAllSubdirs(QString(d.path()+QLatin1Char('/')+*it));
}
return subdirs;
}