diff options
Diffstat (limited to 'src/filter.cpp')
-rw-r--r-- | src/filter.cpp | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/src/filter.cpp b/src/filter.cpp new file mode 100644 index 0000000..9672937 --- /dev/null +++ b/src/filter.cpp @@ -0,0 +1,137 @@ +/*************************************************************************** + copyright : (C) 2003-2006 by Robby Stephenson + email : [email protected] + ***************************************************************************/ + +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of version 2 of the GNU General Public License as * + * published by the Free Software Foundation; * + * * + ***************************************************************************/ + +#include "filter.h" +#include "entry.h" + +#include "tellico_debug.h" + +#include <qregexp.h> + +using Tellico::Filter; +using Tellico::FilterRule; + +FilterRule::FilterRule() : m_function(FuncEquals) { +} + +FilterRule::FilterRule(const QString& fieldName_, const QString& pattern_, Function func_) + : m_fieldName(fieldName_), m_function(func_), m_pattern(pattern_) { +} + +bool FilterRule::matches(Data::EntryPtr entry_) const { + switch (m_function) { + case FuncEquals: + return equals(entry_); + case FuncNotEquals: + return !equals(entry_); + case FuncContains: + return contains(entry_); + case FuncNotContains: + return !contains(entry_); + case FuncRegExp: + return matchesRegExp(entry_); + case FuncNotRegExp: + return !matchesRegExp(entry_); + default: + kdWarning() << "FilterRule::matches() - invalid function!" << endl; + break; + } + return true; +} + +bool FilterRule::equals(Data::EntryPtr entry_) const { + // empty field name means search all + if(m_fieldName.isEmpty()) { + QStringList list = entry_->fieldValues() + entry_->formattedFieldValues(); + for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + if(QString::compare((*it).lower(), m_pattern.lower()) == 0) { + return true; + } + } + } else { + return QString::compare(entry_->field(m_fieldName).lower(), m_pattern.lower()) == 0 + || QString::compare(entry_->formattedField(m_fieldName).lower(), m_pattern.lower()) == 0; + } + + return false; +} + +bool FilterRule::contains(Data::EntryPtr entry_) const { + // empty field name means search all + if(m_fieldName.isEmpty()) { + QStringList list = entry_->fieldValues() + entry_->formattedFieldValues(); + // match is true if any strings match + for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + if((*it).find(m_pattern, 0, false) >= 0) { + return true; + } + } + } else { + return entry_->field(m_fieldName).find(m_pattern, 0, false) >= 0 + || entry_->formattedField(m_fieldName).find(m_pattern, 0, false) >= 0; + } + + return false; +} + +bool FilterRule::matchesRegExp(Data::EntryPtr entry_) const { + QRegExp rx(m_pattern, false); + // empty field name means search all + if(m_fieldName.isEmpty()) { + QStringList list = entry_->fieldValues() + entry_->formattedFieldValues(); + for(QStringList::ConstIterator it = list.begin(); it != list.end(); ++it) { + if((*it).find(rx) >= 0) { + return true; + break; + } + } + } else { + return entry_->field(m_fieldName).find(rx) >= 0 + || entry_->formattedField(m_fieldName).find(rx) >= 0; + } + + return false; +} + + +/*******************************************************/ + +Filter::Filter(const Filter& other_) : QPtrList<FilterRule>(), KShared(), m_op(other_.op()), m_name(other_.name()) { + for(QPtrListIterator<FilterRule> it(other_); it.current(); ++it) { + append(new FilterRule(*it.current())); + } + setAutoDelete(true); +} + +bool Filter::matches(Data::EntryPtr entry_) const { + if(isEmpty()) { + return true; + } + + bool match = false; + for(QPtrListIterator<FilterRule> it(*this); it.current(); ++it) { + if(it.current()->matches(entry_)) { + if(m_op == Filter::MatchAny) { + return true; + } else { + match = true; + } + } else { + if(m_op == Filter::MatchAll) { + return false; + } + } + } + + return match; +} |