summaryrefslogtreecommitdiffstats
path: root/scribus/filesearch.cpp
diff options
context:
space:
mode:
authorcraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
committercraig <craig@11d20701-8431-0410-a711-e3c959e3b870>2012-01-01 11:40:09 +0000
commit7ed83b6c6666eb8b6b104c211ae7e52907350372 (patch)
tree4430b556abac0ad660a0aacf1887d77f85d8be02 /scribus/filesearch.cpp
downloadscribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.gz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.tar.xz
scribus-7ed83b6c6666eb8b6b104c211ae7e52907350372.zip
Branch 1.3.5 tree to 1.4.x tree, goodbye 1.3.x
git-svn-id: svn://scribus.net/branches/Version14x/Scribus@17163 11d20701-8431-0410-a711-e3c959e3b870
Diffstat (limited to 'scribus/filesearch.cpp')
-rw-r--r--scribus/filesearch.cpp176
1 files changed, 176 insertions, 0 deletions
diff --git a/scribus/filesearch.cpp b/scribus/filesearch.cpp
new file mode 100644
index 0000000..85618c1
--- /dev/null
+++ b/scribus/filesearch.cpp
@@ -0,0 +1,176 @@
+/*
+For general Scribus (>=1.3.2) copyright and licensing information please refer
+to the COPYING file provided with the program. Following this notice may exist
+a copyright and/or license notice that predates the release of Scribus 1.3.2
+for which a new license (GPL+exception) is in place.
+*/
+#include "filesearch.h"
+//#include "filesearch.moc"
+#include <QTimer>
+#include <QRegExp>
+
+
+enum FileSearchStatus
+{
+ Status_NotStarted,
+ Status_Running,
+ Status_Cancelled,
+ Status_Failed,
+ Status_Finished,
+};
+
+
+FileSearch::FileSearch(QObject* parent, const QString & fileName,const QString & searchBase, int depthLimit, bool caseSensitive) :
+ DeferredTask(parent),
+ m_searchBase(searchBase.isNull() ? QDir::homePath() : searchBase),
+ m_fileName(fileName),
+ m_depth(0),
+ m_maxdepth(depthLimit)
+{
+ m_caseSensitive = caseSensitive;
+#ifdef _WIN32
+ // it has no meaning to set case sensitiveness on win
+ m_caseSensitive = false;
+#endif
+ DeferredTask::init();
+ m_dir.setPath(m_searchBase);
+ Q_ASSERT(m_dir.exists());
+ // Give ourselves a useful name for object browsers, etc.
+ setObjectName(QString("FileSearch for \"%1\"").arg(m_searchBase).toLocal8Bit());
+}
+
+FileSearch::~FileSearch()
+{
+ DeferredTask::cleanup();
+}
+
+const QStringList & FileSearch::matchingFiles() const
+{
+ return m_matchingFiles;
+}
+
+int FileSearch::foundCount() const
+{
+ return m_matchingFiles.count();
+}
+
+const QString & FileSearch::fileName() const
+{
+ return m_fileName;
+}
+
+const QDir & FileSearch::currentDir() const
+{
+ return m_dir;
+}
+
+void FileSearch::start()
+{
+ // Push the list of subdirs for the starting dir onto the stack
+ pushStack();
+ // and add the current directory's files to the list
+ addCurrentDirFiles();
+ DeferredTask::start();
+}
+
+void FileSearch::next()
+{
+ // We start off in a directory that has just been examined.
+ // A list of the names of directories in this directory is at the top of
+ // m_tree, and m_iter points to the first directory name in that list. The
+ // files in this directory have already been checked to see if they match,
+ // and added to the list of matches if they do.
+ // We need to select the directory to step into, and search its contents.
+ // skip '.', '..'
+// Qt-4
+// this crashes under Qt-4, don't know why FS
+// while ( *(m_iter.top()) == "." || *(m_iter.top()) == ".." )
+// ++m_iter.top();
+
+ if ( (m_iter.top() == m_tree.top().end()) || (m_depth == m_maxdepth) )
+ {
+ // We're at the end of the list of subdirectory names in this directory,
+ // or we've hit the maximum depth we're allowed to search to.
+ // Move up to the previous directory.
+ m_iter.pop();
+ m_tree.pop();
+ m_dir.cdUp();
+ m_depth--;
+ // Check if we've run out of tree and should finish up
+ if (m_depth < 0)
+ {
+ // We've run out of tree, so we're all done. Kill the timer and
+ // tell our owner we've finished.
+ Q_ASSERT(m_iter.count() == 0);
+ Q_ASSERT(m_tree.count() == 0);
+ DeferredTask::done();
+ emit searchComplete(m_matchingFiles, m_fileName);
+ }
+ else
+ {
+ // As an optimisation, call next() to do a short recursion back to the
+ // next subdir we actually need to search, so we don't have to wait for
+ // the timer to get around to firing for this trivial step. We're not
+ // putting anything on the stack so this should be pretty safe.
+ next();
+ }
+ }
+ else
+ {
+ // There are still subdirectories to search. Select the next one and step
+ // into it, incrementing the iterator for the current dir in the process.
+ m_dir.cd(*(m_iter.top()));
+ ++m_iter.top();
+ m_depth++;
+ pushStack();
+ addCurrentDirFiles();
+ }
+}
+
+void FileSearch::pushStack()
+{
+ m_tree.push(m_dir.entryList(QDir::Dirs|QDir::NoSymLinks|QDir::NoDotAndDotDot));
+ m_iter.push(m_tree.top().begin());
+}
+
+void FileSearch::addCurrentDirFiles()
+{
+ QStringList flist;
+ m_caseSensitive ? flist.append(m_fileName) : flist.append("*");
+ QFileInfoList filist = m_dir.entryInfoList(flist, QDir::Files);
+ QListIterator<QFileInfo> it( filist );
+ QFileInfo fi;
+ // Search files in this dir
+ if (m_caseSensitive)
+ {
+ while (it.hasNext())
+ {
+ fi = it.next();
+ m_matchingFiles.push_back(fi.absoluteFilePath());
+ }
+// Qt4
+/* while ( ( fi = it.current() ) != 0 )
+ {
+ ++it;
+ m_matchingFiles.push_back(fi->absFilePath());
+ } */
+ }
+ else
+ {
+ // unix only, resp. no meaning in windows
+ QRegExp r(m_fileName, Qt::CaseInsensitive, QRegExp::Wildcard);
+ while (it.hasNext())
+ {
+ fi = it.next();
+ if (r.exactMatch(fi.fileName()))
+ m_matchingFiles.push_back(fi.absoluteFilePath());
+ }
+// Qt4
+// while ( ( fi = it.current() ) != 0 )
+// {
+// ++it;
+// if (r.exactMatch(fi->fileName()))
+// m_matchingFiles.push_back(fi->absFilePath());
+// }
+ }
+}