summaryrefslogtreecommitdiffstats
path: root/libkdepim/kscoring.h
diff options
context:
space:
mode:
Diffstat (limited to 'libkdepim/kscoring.h')
-rw-r--r--libkdepim/kscoring.h427
1 files changed, 427 insertions, 0 deletions
diff --git a/libkdepim/kscoring.h b/libkdepim/kscoring.h
new file mode 100644
index 000000000..3252a33ea
--- /dev/null
+++ b/libkdepim/kscoring.h
@@ -0,0 +1,427 @@
+/*
+ kscoring.h
+
+ Copyright (c) 2001 Mathias Waack
+ Copyright (C) 2005 by Volker Krause <[email protected]>
+
+ Author: Mathias Waack <[email protected]>
+
+ 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.
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
+*/
+
+#ifndef KSCORING_H
+#define KSCORING_H
+
+#include <unistd.h>
+
+#include <qglobal.h>
+#include <qptrlist.h>
+#include <qptrstack.h>
+#include <qregexp.h>
+
+#include <qobject.h>
+#include <qstring.h>
+#include <qstringlist.h>
+#include <qdatetime.h>
+#include <qcolor.h>
+#include <qtable.h>
+#include <qmap.h>
+#include <qdict.h>
+
+#include <kdialogbase.h>
+#include <klineedit.h>
+#include <knuminput.h>
+
+#include <kdepimmacros.h>
+
+class QDomNode;
+class QDomDocument;
+class QDomElement;
+class QTextStream;
+class QLabel;
+
+
+/**
+ The following classes ScorableArticle, ScorableGroup define
+ the interface for the scoring. Any application using this mechanism should
+ create its own subclasses of this classes. The scoring itself will be handled
+ by the ScoringManager class.
+ */
+
+//----------------------------------------------------------------------------
+class KDE_EXPORT ScorableGroup
+{
+public:
+ virtual ~ScorableGroup();
+};
+
+class KDE_EXPORT ScorableArticle
+{
+public:
+ virtual ~ScorableArticle();
+
+ virtual void addScore(short) {}
+ virtual void displayMessage(const QString&);
+ virtual void changeColor(const QColor&) {}
+ virtual void markAsRead() {}
+ virtual QString from() const = 0;
+ virtual QString subject() const = 0;
+ virtual QString getHeaderByType(const QString&) const = 0;
+ //virtual ScorableGroup group() const =0;
+};
+
+
+//----------------------------------------------------------------------------
+/**
+ Base class for other Action classes.
+ */
+class KDE_EXPORT ActionBase {
+ public:
+ ActionBase();
+ virtual ~ActionBase();
+ virtual QString toString() const =0;
+ virtual void apply(ScorableArticle&) const =0;
+ virtual ActionBase* clone() const =0;
+ virtual int getType() const =0;
+ virtual QString getValueString() const { return QString(); }
+ virtual void setValue(const QString&) {}
+ static ActionBase* factory(int type, const QString &value);
+ static QStringList userNames();
+ static QString userName(int type);
+ static int getTypeForName(const QString& name);
+ static int getTypeForUserName(const QString& name);
+ QString userName() { return userName(getType()); }
+ enum ActionTypes { SETSCORE, NOTIFY, COLOR, MARKASREAD };
+};
+
+class KDE_EXPORT ActionColor : public ActionBase {
+public:
+ ActionColor(const QColor&);
+ ActionColor(const QString&);
+ ActionColor(const ActionColor&);
+ virtual ~ActionColor();
+ virtual QString toString() const;
+ virtual int getType() const { return COLOR; }
+ virtual QString getValueString() const { return color.name(); }
+ virtual void setValue(const QString& s) { color.setNamedColor(s); }
+ void setValue(const QColor& c) { color = c; }
+ QColor value() const { return color; }
+ virtual void apply(ScorableArticle&) const;
+ virtual ActionColor* clone() const;
+private:
+ QColor color;
+};
+
+class KDE_EXPORT ActionSetScore : public ActionBase {
+ public:
+ ActionSetScore(short);
+ ActionSetScore(const ActionSetScore&);
+ ActionSetScore(const QString&);
+ virtual ~ActionSetScore();
+ virtual QString toString() const;
+ virtual int getType() const { return SETSCORE; }
+ virtual QString getValueString() const { return QString::number(val); }
+ virtual void setValue(const QString& s) { val = s.toShort(); }
+ void setValue(short v) { val = v; }
+ short value() const { return val; }
+ virtual void apply(ScorableArticle&) const;
+ virtual ActionSetScore* clone() const;
+ private:
+ short val;
+};
+
+class KDE_EXPORT ActionNotify : public ActionBase {
+ public:
+ ActionNotify(const QString&);
+ ActionNotify(const ActionNotify&);
+ virtual ~ActionNotify() {}
+ virtual QString toString() const;
+ virtual int getType() const { return NOTIFY; }
+ virtual QString getValueString() const { return note; }
+ virtual void setValue(const QString& s) { note = s; }
+ virtual void apply(ScorableArticle&) const;
+ virtual ActionNotify* clone() const;
+ private:
+ QString note;
+};
+
+class KDE_EXPORT ActionMarkAsRead : public ActionBase {
+ public:
+ ActionMarkAsRead();
+ ActionMarkAsRead( const ActionMarkAsRead& );
+ virtual ~ActionMarkAsRead() {}
+ virtual QString toString() const;
+ virtual int getType() const { return MARKASREAD; }
+ virtual void apply( ScorableArticle &article ) const;
+ virtual ActionMarkAsRead* clone() const;
+};
+
+class KDE_EXPORT NotifyCollection
+{
+public:
+ NotifyCollection();
+ ~NotifyCollection();
+ void addNote(const ScorableArticle&, const QString&);
+ QString collection() const;
+ void displayCollection(QWidget *p=0) const;
+private:
+ struct article_info {
+ QString from;
+ QString subject;
+ };
+ typedef QValueList<article_info> article_list;
+ typedef QDict<article_list> note_list;
+ note_list notifyList;
+};
+
+
+//----------------------------------------------------------------------------
+class KDE_EXPORT KScoringExpression
+{
+ friend class KScoringRule;
+ public:
+ enum Condition { CONTAINS, MATCH, EQUALS, SMALLER, GREATER, MATCHCS };
+
+ KScoringExpression(const QString&,const QString&,const QString&, const QString&);
+ ~KScoringExpression();
+
+ bool match(ScorableArticle& a) const ;
+ QString getTypeString() const;
+ static QString getTypeString(int);
+ int getType() const;
+ QString toString() const;
+ void write(QTextStream& ) const;
+
+ bool isNeg() const { return neg; }
+ Condition getCondition() const { return cond; }
+ QString getExpression() const { return expr_str; }
+ QString getHeader() const { return header; }
+ static QStringList conditionNames();
+ static QStringList headerNames();
+ static int getConditionForName(const QString&);
+ static QString getNameForCondition(int);
+ private:
+ bool neg;
+ QString header;
+ const char* c_header;
+ Condition cond;
+ QRegExp expr;
+ QString expr_str;
+ int expr_int;
+};
+
+//----------------------------------------------------------------------------
+class KDE_EXPORT KScoringRule
+{
+ friend class KScoringManager;
+ public:
+ KScoringRule(const QString& name);
+ KScoringRule(const KScoringRule& r);
+ ~KScoringRule();
+
+ typedef QPtrList<KScoringExpression> ScoreExprList;
+ typedef QPtrList<ActionBase> ActionList;
+ typedef QStringList GroupList;
+ enum LinkMode { AND, OR };
+
+ QString getName() const { return name; }
+ QStringList getGroups() const { return groups; }
+ void setGroups(const QStringList &l) { groups = l; }
+ LinkMode getLinkMode() const { return link; }
+ QString getLinkModeName() const;
+ QString getExpireDateString() const;
+ QDate getExpireDate() const { return expires; }
+ void setExpireDate(const QDate &d) { expires = d; }
+ bool isExpired() const;
+ ScoreExprList getExpressions() const { return expressions; }
+ ActionList getActions() const { return actions; }
+ void cleanExpressions();
+ void cleanActions();
+
+ bool matchGroup(const QString& group) const ;
+ void applyRule(ScorableArticle& a) const;
+ void applyRule(ScorableArticle& a, const QString& group) const;
+ void applyAction(ScorableArticle& a) const;
+
+ void setLinkMode(const QString& link);
+ void setLinkMode(LinkMode m) { link = m; }
+ void setExpire(const QString& exp);
+ void addExpression( KScoringExpression* );
+ void addGroup( const QString& group) { groups.append(group); }
+ //void addServer(const QString& server) { servers.append(server); }
+ void addAction(int, const QString& );
+ void addAction(ActionBase*);
+
+ void updateXML(QDomElement& e, QDomDocument& d);
+ QString toString() const;
+
+ // writes the rule in XML format into the textstream
+ void write(QTextStream& ) const;
+protected:
+ //! assert that the name is unique
+ void setName(const QString &n) { name = n; }
+private:
+ QString name;
+ GroupList groups;
+ //ServerList servers;
+ LinkMode link;
+ ScoreExprList expressions;
+ ActionList actions;
+ QDate expires;
+};
+
+/** this helper class implements a stack for lists of lists of rules.
+ With the help of this class its very easy for the KScoringManager
+ to temporary drop lists of rules and restore them afterwards
+*/
+class KDE_EXPORT RuleStack
+{
+public:
+ RuleStack();
+ ~RuleStack();
+ //! puts the list on the stack, doesn't change the list
+ void push(QPtrList<KScoringRule>&);
+ //! clears the argument list and copy the content of the TOS into it
+ //! after that the TOS gets dropped
+ void pop(QPtrList<KScoringRule>&);
+ //! like pop but without dropping the TOS
+ void top(QPtrList<KScoringRule>&);
+ //! drops the TOS
+ void drop();
+private:
+ QPtrStack< QPtrList<KScoringRule> > stack;
+};
+
+//----------------------------------------------------------------------------
+// Manages the score rules.
+class KDE_EXPORT KScoringManager : public QObject
+{
+ Q_OBJECT
+
+ public:
+ //* this is the container for all rules
+ typedef QPtrList<KScoringRule> ScoringRuleList;
+
+ KScoringManager(const QString& appName = QString::null);
+ virtual ~KScoringManager();
+
+ //* returns a list of all available groups, must be overridden
+ virtual QStringList getGroups() const =0;
+
+ //! returns a list of common (or available) headers
+ //! defaults to returning { Subject, From, Message-ID, Date }
+ virtual QStringList getDefaultHeaders() const;
+
+ //* setting current server and group and calling applyRules(ScorableArticle&)
+ void applyRules(ScorableArticle& article, const QString& group/*, const QString& server*/);
+ //* assuming a properly set group
+ void applyRules(ScorableArticle&);
+ //* same as above
+ void applyRules(ScorableGroup* group);
+
+ //* pushes the current rule list onto a stack
+ void pushRuleList();
+ //* restores the current rule list from list stored on a stack
+ //* by a previous call to pushRuleList (this implicitly deletes the
+ //* current rule list)
+ void popRuleList();
+ //* removes the TOS from the stack of rule lists
+ void removeTOS();
+
+ KScoringRule* addRule(KScoringRule *);
+ KScoringRule* addRule(const ScorableArticle&, QString group, short =0);
+ KScoringRule* addRule();
+ void cancelNewRule(KScoringRule *);
+ void deleteRule(KScoringRule *);
+ void editRule(KScoringRule *e, QWidget *w=0);
+ KScoringRule* copyRule(KScoringRule *);
+ void moveRuleAbove( KScoringRule *above, KScoringRule *below );
+ void moveRuleBelow( KScoringRule *below, KScoringRule *above );
+ void setGroup(const QString& g);
+ // has to be called after setGroup() or initCache()
+ bool hasRulesForCurrentGroup();
+ QString findUniqueName() const;
+
+ /** called from an editor whenever it finishes editing the rule base,
+ causes the finishedEditing signal to be emitted */
+ void editorReady();
+
+ ScoringRuleList getAllRules() const { return allRules; }
+ KScoringRule *findRule(const QString&);
+ QStringList getRuleNames();
+ void setRuleName(KScoringRule *, const QString&);
+ int getRuleCount() const { return allRules.count(); }
+ QString toString() const;
+
+ bool setCacheValid(bool v);
+ bool isCacheValid() { return cacheValid; }
+ void initCache(const QString& group/*, const QString& server*/);
+
+ void load();
+ void save();
+
+ //--------------- Properties
+ virtual bool canScores() const { return true; }
+ virtual bool canNotes() const { return true; }
+ virtual bool canColors() const { return false; }
+ virtual bool canMarkAsRead() const { return false; }
+ virtual bool hasFeature(int);
+
+ signals:
+ void changedRules();
+ void changedRuleName(const QString& oldName, const QString& newName);
+ void finishedEditing();
+
+ private:
+ void addRuleInternal(KScoringRule *e);
+ void expireRules();
+
+ QDomDocument createXMLfromInternal();
+ void createInternalFromXML(QDomNode);
+
+ // list of all Rules
+ ScoringRuleList allRules;
+
+ // the stack for temporary storing rule lists
+ RuleStack stack;
+
+ // for the cache
+ bool cacheValid;
+ // current rule set, ie the cache
+ ScoringRuleList ruleList;
+ //QString server;
+ QString group;
+
+ //ScorableServer* _s;
+
+ // filename of the scorefile
+ QString mFilename;
+};
+
+
+//----------------------------------------------------------------------------
+class KDE_EXPORT NotifyDialog : public KDialogBase
+{
+ Q_OBJECT
+public:
+ static void display(ScorableArticle&,const QString&);
+protected slots:
+ void slotShowAgainToggled(bool);
+private:
+ NotifyDialog(QWidget* p =0);
+ static NotifyDialog *me;
+
+ QLabel *note;
+ QString msg;
+ typedef QMap<QString,bool> NotesMap;
+ static NotesMap dict;
+};
+
+
+#endif