From kde-commits Wed Jan 21 07:45:10 2004 From: Jens Dagerbo Date: Wed, 21 Jan 2004 07:45:10 +0000 To: kde-commits Subject: kdevelop/parts/fileview Message-Id: <20040121074510.613E91A27 () office ! kde ! org> X-MARC-Message: https://marc.info/?l=kde-commits&m=107467118107847 CVS commit by dagerbo: Improve File Groups plugin performance. Closes bug 72831. Main part of patch written by Jonas Jacobi. CCMAIL: 72831-done@bugs.kde.org M +57 -10 filegroupswidget.cpp 1.23 --- kdevelop/parts/fileview/filegroupswidget.cpp #1.22:1.23 @@ -44,4 +44,32 @@ static const char *translations[] = { }; +class FileComparator { +public: + virtual ~FileComparator(){ + }; + virtual bool matches(const QString& name) const = 0; +}; + +class RegExpComparator : public FileComparator { +public: + RegExpComparator(const QString& pattern) : m_exp(pattern, true, true){ + } + bool matches(const QString& name) const{ + return m_exp.exactMatch(name); + } +private: + const QRegExp m_exp; +}; + +class EndingComparator : public FileComparator { +public: + EndingComparator(const QString& pattern) : m_pattern ( pattern){ + } + bool matches(const QString& name) const{ + return name.endsWith(m_pattern); + } +private: + const QString m_pattern; +}; class FileViewFolderItem : public QListViewItem @@ -52,5 +80,5 @@ public: private: - QStringList patterns; + QPtrList m_patterns; }; @@ -60,5 +88,28 @@ FileViewFolderItem::FileViewFolderItem(Q { setPixmap(0, SmallIcon("folder")); - patterns = QStringList::split(';', pattern); + m_patterns.setAutoDelete(true); + QStringList patternstring = QStringList::split(';', pattern); + QStringList::ConstIterator theend = patternstring.end(); + for (QStringList::ConstIterator ci = patternstring.begin(); ci != theend; ++ci) + { + QString pattern = *ci; + QString tail = pattern.right( pattern.length() - 1 ); + + if ( (tail).contains('*') || pattern.contains('?') || pattern.contains('[') || pattern.contains(']') ) + { + m_patterns.append( new RegExpComparator( pattern ) ); + } + else + { + if ( pattern.startsWith("*") ) + { + m_patterns.append( new EndingComparator( tail ) ); + } + else + { + m_patterns.append( new EndingComparator( pattern ) ); + } + } + } } @@ -69,12 +120,8 @@ bool FileViewFolderItem::matches(const Q QString fName = QFileInfo(fileName).filePath(); - QStringList::ConstIterator it; - for (it = patterns.begin(); it != patterns.end(); ++it) { - // The regexp objects could be created already - // in the constructor - QRegExp re(*it, true, true); - if (re.exactMatch(fName)) + QPtrList::ConstIterator theend = m_patterns.end(); + for (QPtrList::ConstIterator ci = m_patterns.begin(); ci != theend; ++ci) + if ((*ci)->matches(fName)) return true; - } return false;