diff options
Diffstat (limited to 'libkdepim/kscoringeditor.cpp')
-rw-r--r-- | libkdepim/kscoringeditor.cpp | 1029 |
1 files changed, 0 insertions, 1029 deletions
diff --git a/libkdepim/kscoringeditor.cpp b/libkdepim/kscoringeditor.cpp deleted file mode 100644 index 6e520e983..000000000 --- a/libkdepim/kscoringeditor.cpp +++ /dev/null @@ -1,1029 +0,0 @@ -/* - kscoringeditor.cpp - - Copyright (c) 2001 Mathias Waack - Copyright (C) 2005 by Volker Krause <volker.krause@rwth-aachen.de> - - Author: Mathias Waack <mathias@atoll-net.de> - - 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 -*/ - -#undef TQT_NO_COMPAT - -#include "kscoring.h" -#include "kscoringeditor.h" - -#include <kdebug.h> -#include <klocale.h> -#include <kcombobox.h> -#include <kcolorcombo.h> -#include <kiconloader.h> -#include <kregexpeditorinterface.h> -#include <ktrader.h> -#include <kparts/componentfactory.h> - - -#include <tqlabel.h> -#include <tqpushbutton.h> -#include <tqlayout.h> -#include <tqtooltip.h> -#include <tqcheckbox.h> -#include <tqbuttongroup.h> -#include <tqradiobutton.h> -#include <tqwidgetstack.h> -#include <tqapplication.h> -#include <tqtimer.h> -#include <tqhbox.h> - -// works for both ListBox and ComboBox -template <class T> static int setCurrentItem(T *box, const TQString& s) -{ - int cnt = box->count(); - for (int i=0;i<cnt;++i) { - if (box->text(i) == s) { - box->setCurrentItem(i); - return i; - } - } - return -1; -} - - -//============================================================================ -// -// class SingleConditionWidget (editor for one condition, used in ConditionEditWidget) -// -//============================================================================ -SingleConditionWidget::SingleConditionWidget(KScoringManager *m,TQWidget *p, const char *n) - : TQFrame(p,n), manager(m) -{ - TQBoxLayout *topL = new TQVBoxLayout(this,5); - TQBoxLayout *firstRow = new TQHBoxLayout(topL); - neg = new TQCheckBox(i18n("Not"),this); - TQToolTip::add(neg,i18n("Negate this condition")); - firstRow->addWidget(neg); - headers = new KComboBox(this); - headers->insertStringList(manager->getDefaultHeaders()); - headers->setEditable( true ); - TQToolTip::add(headers,i18n("Select the header to match this condition against")); - firstRow->addWidget(headers,1); - matches = new KComboBox(this); - matches->insertStringList(KScoringExpression::conditionNames()); - TQToolTip::add(matches,i18n("Select the type of match")); - firstRow->addWidget(matches,1); - connect( matches, TQT_SIGNAL( activated( int ) ), TQT_SLOT( toggleRegExpButton( int ) ) ); - TQHBoxLayout *secondRow = new TQHBoxLayout( topL ); - secondRow->setSpacing( 1 ); - expr = new KLineEdit( this ); - TQToolTip::add(expr,i18n("The condition for the match")); - // reserve space for at least 20 characters - expr->setMinimumWidth(fontMetrics().maxWidth()*20); - secondRow->addWidget( expr ); - regExpButton = new TQPushButton( i18n("Edit..."), this ); - secondRow->addWidget( regExpButton ); - connect( regExpButton, TQT_SIGNAL( clicked() ), TQT_SLOT( showRegExpDialog() ) ); - - // occupy at much width as possible - tqsetSizePolicy(TQSizePolicy(TQSizePolicy::Expanding,TQSizePolicy::Fixed)); - setFrameStyle(Box | Sunken); - setLineWidth(1); -} - -SingleConditionWidget::~SingleConditionWidget() -{} - -void SingleConditionWidget::setCondition(KScoringExpression *e) -{ - neg->setChecked(e->isNeg()); - headers->setCurrentText( e->getHeader() ); - setCurrentItem(matches,KScoringExpression::getNameForCondition(e->getCondition())); - toggleRegExpButton( matches->currentItem() ); - expr->setText(e->getExpression()); -} - -KScoringExpression* SingleConditionWidget::createCondition() const -{ - TQString head = headers->currentText(); - TQString match = matches->currentText(); - int condType = KScoringExpression::getConditionForName(match); - match = KScoringExpression::getTypeString(condType); - TQString cond = expr->text(); - TQString negs = (neg->isChecked())?"1":"0"; - return new KScoringExpression(head,match,cond,negs); -} - -void SingleConditionWidget::clear() -{ - neg->setChecked(false); - expr->clear(); -} - -void SingleConditionWidget::toggleRegExpButton( int selected ) -{ - bool isRegExp = (KScoringExpression::MATCH == selected || - KScoringExpression::MATCHCS == selected) && - !KTrader::self()->query("KRegExpEditor/KRegExpEditor").isEmpty(); - regExpButton->setEnabled( isRegExp ); -} - -void SingleConditionWidget::showRegExpDialog() -{ - TQDialog *editorDialog = KParts::ComponentFactory::createInstanceFromQuery<TQDialog>( "KRegExpEditor/KRegExpEditor" ); - if ( editorDialog ) { - KRegExpEditorInterface *editor = static_cast<KRegExpEditorInterface *>( editorDialog->qt_cast( "KRegExpEditorInterface" ) ); - Q_ASSERT( editor ); // This should not fail! - editor->setRegExp( expr->text() ); - editorDialog->exec(); - expr->setText( editor->regExp() ); - } -} - -//============================================================================ -// -// class ConditionEditWidget (the widget to edit the conditions of a rule) -// -//============================================================================ -ConditionEditWidget::ConditionEditWidget(KScoringManager *m, TQWidget *p, const char *n) - : KWidgetLister(1,8,p,n), manager(m) -{ - // create one initial widget - addWidgetAtEnd(); -} - -ConditionEditWidget::~ConditionEditWidget() -{} - -TQWidget* ConditionEditWidget::createWidget(TQWidget *parent) -{ - return new SingleConditionWidget(manager,parent); -} - -void ConditionEditWidget::clearWidget(TQWidget *w) -{ - Q_ASSERT( w->isA("SingleConditionWidget") ); - SingleConditionWidget *sw = dynamic_cast<SingleConditionWidget*>(w); - if (sw) - sw->clear(); -} - -void ConditionEditWidget::slotEditRule(KScoringRule *rule) -{ - KScoringRule::ScoreExprList l; - if (rule) l = rule->getExpressions(); - if (!rule || l.count() == 0) { - slotClear(); - } else { - setNumberOfShownWidgetsTo(l.count()); - KScoringExpression *e = l.first(); - SingleConditionWidget *scw = static_cast<SingleConditionWidget*>(mWidgetList.first()); - while (e && scw) { - scw->setCondition(e); - e = l.next(); - scw = static_cast<SingleConditionWidget*>(mWidgetList.next()); - } - } -} - -void ConditionEditWidget::updateRule(KScoringRule *rule) -{ - rule->cleanExpressions(); - for(TQWidget *w = mWidgetList.first(); w; w = mWidgetList.next()) { - if (! w->isA("SingleConditionWidget")) { - kdWarning(5100) << "there is a widget in ConditionEditWidget " - << "which isn't a SingleConditionWidget" << endl; - } else { - SingleConditionWidget *saw = dynamic_cast<SingleConditionWidget*>(w); - if (saw) - rule->addExpression(saw->createCondition()); - } - } -} - -//============================================================================ -// -// class SingleActionWidget (editor for one action, used in ActionEditWidget) -// -//============================================================================ -SingleActionWidget::SingleActionWidget(KScoringManager *m,TQWidget *p, const char *n) - : TQWidget(p,n), notifyEditor(0), scoreEditor(0), colorEditor(0),manager(m) -{ - TQHBoxLayout *topL = new TQHBoxLayout(this,0,5); - types = new KComboBox(this); - types->setEditable(false); - topL->addWidget(types); - stack = new TQWidgetStack(this); - topL->addWidget(stack); - - dummyLabel = new TQLabel(i18n("Select an action."), stack); - stack->addWidget(dummyLabel, 0); - - // init widget stack and the types combo box - int index = 1; - types->insertItem(TQString()); - TQStringList l = ActionBase::userNames(); - for ( TQStringList::Iterator it = l.begin(); it != l.end(); ++it ) { - TQString name = *it; - int feature = ActionBase::getTypeForUserName(name); - if (manager->hasFeature(feature)) { - types->insertItem(name); - TQWidget *w=0; - switch (feature) { - case ActionBase::SETSCORE: - w = scoreEditor = new KIntSpinBox(-99999,99999,1,0,10, stack); - break; - case ActionBase::NOTIFY: - w = notifyEditor = new KLineEdit(stack); - break; - case ActionBase::COLOR: - w = colorEditor = new KColorCombo(stack); - break; - case ActionBase::MARKASREAD: - w = new TQLabel( stack ); // empty dummy - break; - } - if ( w ) - stack->addWidget(w,index++); - } - } - - connect(types,TQT_SIGNAL(activated(int)),stack,TQT_SLOT(raiseWidget(int))); - - // raise the dummy label - types->setCurrentItem(0); - stack->raiseWidget(dummyLabel); -} - -SingleActionWidget::~SingleActionWidget() -{ -} - -void SingleActionWidget::setAction(ActionBase *act) -{ - kdDebug(5100) << "SingleActionWidget::setAction()" << endl; - setCurrentItem(types,ActionBase::userName(act->getType())); - int index = types->currentItem(); - stack->raiseWidget(index); - switch (act->getType()) { - case ActionBase::SETSCORE: - scoreEditor->setValue(act->getValueString().toInt()); - break; - case ActionBase::NOTIFY: - notifyEditor->setText(act->getValueString()); - break; - case ActionBase::COLOR: - colorEditor->setColor(TQColor(act->getValueString())); - break; - case ActionBase::MARKASREAD: - // nothing - break; - default: - kdWarning(5100) << "unknown action type in SingleActionWidget::setAction()" << endl; - } -} - -ActionBase* SingleActionWidget::createAction() const -{ - // no action selected... - if (types->currentText().isEmpty()) - return 0; - - int type = ActionBase::getTypeForUserName(types->currentText()); - switch (type) { - case ActionBase::SETSCORE: - return new ActionSetScore(scoreEditor->value()); - case ActionBase::NOTIFY: - return new ActionNotify(notifyEditor->text()); - case ActionBase::COLOR: - return new ActionColor(TQString(colorEditor->color().name())); - case ActionBase::MARKASREAD: - return new ActionMarkAsRead(); - default: - kdWarning(5100) << "unknown action type in SingleActionWidget::getValue()" << endl; - return 0; - } -} - -void SingleActionWidget::clear() -{ - if (scoreEditor) scoreEditor->setValue(0); - if (notifyEditor) notifyEditor->clear(); - if (colorEditor) colorEditor->setCurrentItem(0); - types->setCurrentItem(0); - stack->raiseWidget(dummyLabel); -} - -//============================================================================ -// -// class ActionEditWidget (the widget to edit the actions of a rule) -// -//============================================================================ -ActionEditWidget::ActionEditWidget(KScoringManager *m,TQWidget *p, const char *n) - : KWidgetLister(1,8,p,n), manager(m) -{ - // create one initial widget - addWidgetAtEnd(); -} - -ActionEditWidget::~ActionEditWidget() -{} - -TQWidget* ActionEditWidget::createWidget( TQWidget *parent ) -{ - return new SingleActionWidget(manager,parent); -} - -void ActionEditWidget::slotEditRule(KScoringRule *rule) -{ - KScoringRule::ActionList l; - if (rule) l = rule->getActions(); - if (!rule || l.count() == 0) { - slotClear(); - } else { - setNumberOfShownWidgetsTo(l.count()); - ActionBase *act = l.first(); - SingleActionWidget *saw = static_cast<SingleActionWidget*>(mWidgetList.first()); - while (act && saw) { - saw->setAction(act); - act = l.next(); - saw = static_cast<SingleActionWidget*>(mWidgetList.next()); - } - } -} - -void ActionEditWidget::updateRule(KScoringRule *rule) -{ - rule->cleanActions(); - for(TQWidget *w = mWidgetList.first(); w; w = mWidgetList.next()) { - if (! w->isA("SingleActionWidget")) { - kdWarning(5100) << "there is a widget in ActionEditWidget " - << "which isn't a SingleActionWidget" << endl; - } else { - SingleActionWidget *saw = dynamic_cast<SingleActionWidget*>(w); - if (saw) - { - ActionBase *act = saw->createAction(); - if (act) - rule->addAction(act); - } - } - } -} - -void ActionEditWidget::clearWidget(TQWidget *w) -{ - Q_ASSERT( w->isA("SingleActionWidget") ); - SingleActionWidget *sw = dynamic_cast<SingleActionWidget*>(w); - if (sw) - sw->clear(); -} - -//============================================================================ -// -// class RuleEditWidget (the widget to edit one rule) -// -//============================================================================ -RuleEditWidget::RuleEditWidget(KScoringManager *m,TQWidget *p, const char *n) - : TQWidget(p,n), dirty(false), manager(m), oldRuleName(TQString()) -{ - kdDebug(5100) << "RuleEditWidget::RuleEditWidget()" << endl; - if ( !n ) setName( "RuleEditWidget" ); - TQVBoxLayout *topLayout = new TQVBoxLayout( this, 5, KDialog::spacingHint() ); - - //------------- Name, Servers, Groups --------------------- - TQGroupBox *groupB = new TQGroupBox(i18n("Properties"),this); - topLayout->addWidget(groupB); - TQGridLayout* groupL = new TQGridLayout(groupB, 6,2, 8,5); - groupL->addRowSpacing(0, fontMetrics().lineSpacing()-4); - - // name - ruleNameEdit = new KLineEdit( groupB, "ruleNameEdit" ); - groupL->addWidget( ruleNameEdit, 1, 1 ); - TQLabel *ruleNameLabel = new TQLabel(ruleNameEdit, i18n("&Name:"), groupB, "ruleNameLabel"); - groupL->addWidget( ruleNameLabel, 1, 0 ); - - // groups - groupsEdit = new KLineEdit( groupB, "groupsEdit" ); - groupL->addWidget( groupsEdit, 2, 1 ); - TQLabel *groupsLabel = new TQLabel(groupsEdit, i18n("&Groups:"), groupB, "groupsLabel"); - groupL->addWidget( groupsLabel, 2, 0 ); - - TQPushButton *groupsBtn = new TQPushButton(i18n("A&dd Group"), groupB); - connect(groupsBtn,TQT_SIGNAL(clicked()),TQT_SLOT(slotAddGroup())); - groupL->addWidget( groupsBtn, 3, 0 ); - - groupsBox = new KComboBox( false, groupB, "groupsBox" ); - groupsBox->setDuplicatesEnabled(false); - groupsBox->insertStringList(manager->getGroups()); - groupsBox->tqsetSizePolicy(TQSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Fixed)); - groupL->addWidget( groupsBox, 3, 1 ); - - // expires - expireCheck = new TQCheckBox(i18n("&Expire rule automatically"), groupB); - groupL->addMultiCellWidget( expireCheck, 4,4, 0,1 ); - expireEdit = new KIntSpinBox(1,99999,1,30,10, groupB, "expireWidget"); - //Init suffix - slotExpireEditChanged(30); - connect(expireEdit, TQT_SIGNAL(valueChanged(int)), TQT_SLOT(slotExpireEditChanged(int))); - groupL->addWidget( expireEdit, 5, 1 ); - expireLabel = new TQLabel(expireEdit, i18n("&Rule is valid for:"), groupB, "expireLabel"); - groupL->addWidget( expireLabel, 5, 0 ); - expireLabel->setEnabled(false); - expireEdit->setEnabled(false); - - connect(expireCheck, TQT_SIGNAL(toggled(bool)), expireLabel, TQT_SLOT(setEnabled(bool))); - connect(expireCheck, TQT_SIGNAL(toggled(bool)), expireEdit, TQT_SLOT(setEnabled(bool))); - - //------------- Conditions --------------------- - TQGroupBox *groupConds = new TQGroupBox(i18n("Conditions"), this); - topLayout->addWidget(groupConds); - TQGridLayout *condL = new TQGridLayout(groupConds, 3,2, 8,5); - - condL->addRowSpacing(0, fontMetrics().lineSpacing()-4); - - TQButtonGroup *buttonGroup = new TQButtonGroup(groupConds); - buttonGroup->hide(); - linkModeAnd = new TQRadioButton(i18n("Match a&ll conditions"), groupConds); - buttonGroup->insert(linkModeAnd); - condL->addWidget(linkModeAnd, 1,0); - linkModeOr = new TQRadioButton(i18n("Matc&h any condition"), groupConds); - buttonGroup->insert(linkModeOr); - condL->addWidget(linkModeOr, 1,1); - linkModeAnd->setChecked(true); - - condEditor = new ConditionEditWidget(manager,groupConds); - condL->addMultiCellWidget(condEditor, 2,2, 0,1); - connect(condEditor,TQT_SIGNAL(widgetRemoved()),this,TQT_SLOT(slotShrink())); - - //------------- Actions --------------------- - TQGroupBox *groupActions = new TQGroupBox(i18n("Actions"), this); - topLayout->addWidget(groupActions); - TQBoxLayout *actionL = new TQVBoxLayout(groupActions,8,5); - actionL->addSpacing(fontMetrics().lineSpacing()-4); - actionEditor = new ActionEditWidget(manager,groupActions); - actionL->addWidget(actionEditor); - connect(actionEditor,TQT_SIGNAL(widgetRemoved()),this,TQT_SLOT(slotShrink())); - - topLayout->addStretch(1); - - kdDebug(5100) << "constructed RuleEditWidget" << endl; -} - -RuleEditWidget::~RuleEditWidget() -{ -} - -void RuleEditWidget::slotEditRule(const TQString& ruleName) -{ - kdDebug(5100) << "RuleEditWidget::slotEditRule(" << ruleName << ")" << endl; -// // first update the old rule if there is one -// kdDebug(5100) << "let see if we have a rule with name " << oldRuleName << endl; -// KScoringRule *rule; -// if (!oldRuleName.isNull() && oldRuleName != ruleName) { -// rule = manager->findRule(oldRuleName); -// if (rule) { -// kdDebug(5100) << "updating rule " << rule->getName() << endl; -// updateRule(rule); -// } -// } - - KScoringRule* rule = manager->findRule(ruleName); - if (!rule) { - kdDebug(5100) << "no rule for ruleName " << ruleName << endl; - clearContents(); - return; - } - oldRuleName = rule->getName(); - ruleNameEdit->setText(rule->getName()); - groupsEdit->setText(rule->getGroups().join(";")); - - bool b = rule->getExpireDate().isValid(); - expireCheck->setChecked(b); - expireEdit->setEnabled(b); - expireLabel->setEnabled(b); - if (b) - expireEdit->setValue(TQDate::tqcurrentDate().daysTo(rule->getExpireDate())); - else - expireEdit->setValue(30); - if (rule->getLinkMode() == KScoringRule::AND) { - linkModeAnd->setChecked(true); - } - else { - linkModeOr->setChecked(true); - } - - condEditor->slotEditRule(rule); - actionEditor->slotEditRule(rule); - - kdDebug(5100) << "RuleEditWidget::slotEditRule() ready" << endl; -} - -void RuleEditWidget::clearContents() -{ - ruleNameEdit->setText(""); - groupsEdit->setText(""); - expireCheck->setChecked(false); - expireEdit->setValue(30); - expireEdit->setEnabled(false); - condEditor->slotEditRule(0); - actionEditor->slotEditRule(0); - oldRuleName = TQString(); -} - -void RuleEditWidget::updateRule(KScoringRule *rule) -{ - oldRuleName = TQString(); - TQString groups = groupsEdit->text(); - if (groups.isEmpty()) - rule->setGroups(TQStringList(".*")); - else - rule->setGroups(TQStringList::split(";",groups)); - bool b = expireCheck->isChecked(); - if (b) - rule->setExpireDate(TQDate::tqcurrentDate().addDays(expireEdit->value())); - else - rule->setExpireDate(TQDate()); - actionEditor->updateRule(rule); - rule->setLinkMode(linkModeAnd->isChecked()?KScoringRule::AND:KScoringRule::OR); - condEditor->updateRule(rule); - if (rule->getName() != ruleNameEdit->text()) - manager->setRuleName(rule,ruleNameEdit->text()); -} - -void RuleEditWidget::updateRule() -{ - KScoringRule *rule = manager->findRule(oldRuleName); - if (rule) updateRule(rule); -} - -void RuleEditWidget::slotAddGroup() -{ - TQString grp = groupsBox->currentText(); - if ( grp.isEmpty() ) - return; - TQString txt = groupsEdit->text().stripWhiteSpace(); - if ( txt == ".*" || txt.isEmpty() ) groupsEdit->setText(grp); - else groupsEdit->setText(txt + ";" + grp); -} - -void RuleEditWidget::setDirty() -{ - kdDebug(5100) << "RuleEditWidget::setDirty()" << endl; - if (dirty) return; - dirty = true; -} - -void RuleEditWidget::slotShrink() -{ - emit(shrink()); -} - -void RuleEditWidget::slotExpireEditChanged(int value) -{ - expireEdit->setSuffix(i18n(" day", " days", value)); -} - -//============================================================================ -// -// class RuleListWidget (the widget for managing a list of rules) -// -//============================================================================ -RuleListWidget::RuleListWidget(KScoringManager *m, bool standalone, TQWidget *p, const char *n) - : TQWidget(p,n), alone(standalone), manager(m) -{ - kdDebug(5100) << "RuleListWidget::RuleListWidget()" << endl; - if (!n) setName("RuleListWidget"); - TQVBoxLayout *topL = new TQVBoxLayout(this,standalone? 0:5,KDialog::spacingHint()); - ruleList = new KListBox(this); - if (standalone) { - connect(ruleList,TQT_SIGNAL(doubleClicked(TQListBoxItem*)), - this,TQT_SLOT(slotEditRule(TQListBoxItem*))); - connect(ruleList,TQT_SIGNAL(returnPressed(TQListBoxItem*)), - this,TQT_SLOT(slotEditRule(TQListBoxItem*))); - } - connect(ruleList, TQT_SIGNAL(currentChanged(TQListBoxItem*)), - this, TQT_SLOT(slotRuleSelected(TQListBoxItem*))); - topL->addWidget(ruleList); - - TQHBoxLayout *btnL = new TQHBoxLayout( topL, KDialog::spacingHint() ); - mRuleUp = new TQPushButton( this ); - mRuleUp->setPixmap( BarIcon( "up", KIcon::SizeSmall ) ); - TQToolTip::add( mRuleUp, i18n("Move rule up") ); - btnL->addWidget( mRuleUp ); - connect( mRuleUp, TQT_SIGNAL( clicked() ), TQT_SLOT( slotRuleUp() ) ); - mRuleDown = new TQPushButton( this ); - mRuleDown->setPixmap( BarIcon( "down", KIcon::SizeSmall ) ); - TQToolTip::add( mRuleDown, i18n("Move rule down") ); - btnL->addWidget( mRuleDown ); - connect( mRuleDown, TQT_SIGNAL( clicked() ), TQT_SLOT( slotRuleDown() ) ); - - btnL = new TQHBoxLayout( topL, KDialog::spacingHint() ); - editRule=0L; - newRule = new TQPushButton(this); - newRule->setPixmap( BarIcon( "filenew", KIcon::SizeSmall ) ); - TQToolTip::add(newRule,i18n("New rule")), - btnL->addWidget(newRule); - connect(newRule, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotNewRule())); - // if we're standalone, we need an additional edit button - if (standalone) { - editRule = new TQPushButton(this); - editRule->setIconSet( BarIconSet("edit", KIcon::SizeSmall) ); - TQToolTip::add(editRule,i18n("Edit rule")); - btnL->addWidget(editRule); - connect(editRule,TQT_SIGNAL(clicked()),this,TQT_SLOT(slotEditRule())); - } - delRule = new TQPushButton(this); - delRule->setIconSet( BarIconSet( "editdelete", KIcon::SizeSmall ) ); - TQToolTip::add(delRule,i18n("Remove rule")); - btnL->addWidget(delRule); - connect(delRule, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotDelRule())); - copyRule = new TQPushButton(this); - copyRule->setIconSet(BarIconSet("editcopy", KIcon::SizeSmall)); - TQToolTip::add(copyRule,i18n("Copy rule")); - btnL->addWidget(copyRule); - connect(copyRule, TQT_SIGNAL(clicked()), this, TQT_SLOT(slotCopyRule())); - - // the group filter - TQBoxLayout *filterL = new TQVBoxLayout(topL,KDialog::spacingHint()); - KComboBox *filterBox = new KComboBox(this); - TQStringList l = m->getGroups(); - filterBox->insertItem(i18n("<all groups>")); - filterBox->insertStringList(l); - filterBox->tqsetSizePolicy(TQSizePolicy(TQSizePolicy::Expanding, TQSizePolicy::Fixed)); - connect(filterBox,TQT_SIGNAL(activated(const TQString&)), - this,TQT_SLOT(slotGroupFilter(const TQString&))); - slotGroupFilter(i18n("<all groups>")); - TQLabel *lab = new TQLabel(filterBox,i18n("Sho&w only rules for group:"),this); - filterL->addWidget(lab); - filterL->addWidget(filterBox); - - connect(manager,TQT_SIGNAL(changedRules()), - this,TQT_SLOT(updateRuleList())); - connect(manager,TQT_SIGNAL(changedRuleName(const TQString&,const TQString&)), - this,TQT_SLOT(slotRuleNameChanged(const TQString&,const TQString&))); - - updateRuleList(); - updateButton(); -} - -RuleListWidget::~RuleListWidget() -{ -} - -void RuleListWidget::updateButton() -{ - bool state = ruleList->count() > 0; - if(editRule) - editRule->setEnabled(state); - delRule->setEnabled(state); - copyRule->setEnabled(state); - - TQListBoxItem *item = ruleList->item( ruleList->currentItem() ); - if ( item ) { - mRuleUp->setEnabled( item->prev() != 0 ); - mRuleDown->setEnabled( item->next() != 0 ); - } -} - -void RuleListWidget::updateRuleList() -{ - emit leavingRule(); - kdDebug(5100) << "RuleListWidget::updateRuleList()" << endl; - TQString curr = ruleList->currentText(); - ruleList->clear(); - if (group == i18n("<all groups>")) { - TQStringList l = manager->getRuleNames(); - ruleList->insertStringList(l); - } else { - KScoringManager::ScoringRuleList l = manager->getAllRules(); - for (KScoringRule* rule = l.first(); rule; rule = l.next() ) { - if (rule->matchGroup(group)) ruleList->insertItem(rule->getName()); - } - } - int index = setCurrentItem(ruleList,curr); - if (index <0) { - ruleList->setCurrentItem(0); - slotRuleSelected(ruleList->currentText()); - } - else { - slotRuleSelected(curr); - } -} - -void RuleListWidget::updateRuleList(const KScoringRule *rule) -{ - kdDebug(5100) << "RuleListWidget::updateRuleList(" << rule->getName() << ")" << endl; - TQString name = rule->getName(); - updateRuleList(); - slotRuleSelected(name); -} - -void RuleListWidget::slotRuleNameChanged(const TQString& oldName, const TQString& newName) -{ - int ind = ruleList->currentItem(); - for (uint i=0;i<ruleList->count();++i) - if (ruleList->text(i) == oldName) { - ruleList->changeItem(newName,i); - ruleList->setCurrentItem(ind); - return; - } -} - -void RuleListWidget::slotEditRule(const TQString& s) -{ - emit ruleEdited(s); -} - -void RuleListWidget::slotEditRule() -{ - if (ruleList->currentItem() >= 0) { - emit ruleEdited(ruleList->currentText()); - } - else if (ruleList->count() == 0) - emit ruleEdited(TQString()); -} - -void RuleListWidget::slotEditRule(TQListBoxItem* item) -{ - slotEditRule(item->text()); -} - -void RuleListWidget::slotGroupFilter(const TQString& s) -{ - group = s; - updateRuleList(); -} - -void RuleListWidget::slotRuleSelected(const TQString& ruleName) -{ - emit leavingRule(); - kdDebug(5100) << "RuleListWidget::slotRuleSelected(" << ruleName << ")" << endl; - if (ruleName != ruleList->currentText()) { - setCurrentItem(ruleList,ruleName); - } - updateButton(); - emit ruleSelected(ruleName); -} - -void RuleListWidget::slotRuleSelected(TQListBoxItem *item) -{ - if (!item) return; - TQString ruleName = item->text(); - slotRuleSelected(ruleName); -} - -void RuleListWidget::slotRuleSelected(int index) -{ - uint idx = index; - if (idx >= ruleList->count()) return; - TQString ruleName = ruleList->text(index); - slotRuleSelected(ruleName); -} - -void RuleListWidget::slotNewRule() -{ - emit leavingRule(); - KScoringRule *rule = manager->addRule(); - updateRuleList(rule); - if (alone) slotEditRule(rule->getName()); - updateButton(); -} - -void RuleListWidget::slotDelRule() -{ - KScoringRule *rule = manager->findRule(ruleList->currentText()); - if (rule) - manager->deleteRule(rule); - // goto the next rule - if (!alone) slotEditRule(); - updateButton(); -} - -void RuleListWidget::slotCopyRule() -{ - emit leavingRule(); - TQString ruleName = ruleList->currentText(); - KScoringRule *rule = manager->findRule(ruleName); - if (rule) { - KScoringRule *nrule = manager->copyRule(rule); - updateRuleList(nrule); - slotEditRule(nrule->getName()); - } - updateButton(); -} - -void RuleListWidget::slotRuleUp() -{ - KScoringRule *rule = 0, *below = 0; - TQListBoxItem *item = ruleList->item( ruleList->currentItem() ); - if ( item ) { - rule = manager->findRule( item->text() ); - item = item->prev(); - if ( item ) - below = manager->findRule( item->text() ); - } - if ( rule && below ) - manager->moveRuleAbove( rule, below ); - updateRuleList(); - updateButton(); -} - -void RuleListWidget::slotRuleDown() -{ - KScoringRule *rule = 0, *above = 0; - TQListBoxItem *item = ruleList->item( ruleList->currentItem() ); - if ( item ) { - rule = manager->findRule( item->text() ); - item = item->next(); - if ( item ) - above = manager->findRule( item->text() ); - } - if ( rule && above ) - manager->moveRuleBelow( rule, above ); - updateRuleList(); - updateButton(); -} - -//============================================================================ -// -// class KScoringEditor (the score edit dialog) -// -//============================================================================ -KScoringEditor* KScoringEditor::scoreEditor = 0; - -KScoringEditor::KScoringEditor(KScoringManager* m, - TQWidget *parent, const char *name) - : KDialogBase(parent,name,false,i18n("Rule Editor"),Ok|Apply|Cancel,Ok,true), manager(m) -{ - manager->pushRuleList(); - if (!scoreEditor) scoreEditor = this; - kdDebug(5100) << "KScoringEditor::KScoringEditor()" << endl; - if (!name) setName("KScoringEditor"); - // the left side gives an overview about all rules, the right side - // shows a detailed view of an selected rule - TQWidget *w = new TQWidget(this); - setMainWidget(w); - TQHBoxLayout *hbl = new TQHBoxLayout(w,0,spacingHint()); - ruleLister = new RuleListWidget(manager,false,w); - hbl->addWidget(ruleLister); - ruleEditor = new RuleEditWidget(manager,w); - hbl->addWidget(ruleEditor); - connect(ruleLister,TQT_SIGNAL(ruleSelected(const TQString&)), - ruleEditor, TQT_SLOT(slotEditRule(const TQString&))); - connect(ruleLister, TQT_SIGNAL(leavingRule()), - ruleEditor, TQT_SLOT(updateRule())); - connect(ruleEditor, TQT_SIGNAL(shrink()), TQT_SLOT(slotShrink())); - connect(this,TQT_SIGNAL(finished()),TQT_SLOT(slotFinished())); - ruleLister->slotRuleSelected(0); - resize(550, tqsizeHint().height()); -} - -void KScoringEditor::setDirty() -{ - TQPushButton *applyBtn = actionButton(Apply); - applyBtn->setEnabled(true); -} - -KScoringEditor::~KScoringEditor() -{ - scoreEditor = 0; -} - -KScoringEditor* KScoringEditor::createEditor(KScoringManager* m, - TQWidget *parent, const char *name) -{ - if (scoreEditor) return scoreEditor; - else return new KScoringEditor(m,parent,name); -} - -void KScoringEditor::setRule(KScoringRule* r) -{ - kdDebug(5100) << "KScoringEditor::setRule(" << r->getName() << ")" << endl; - TQString ruleName = r->getName(); - ruleLister->slotRuleSelected(ruleName); -} - -void KScoringEditor::slotShrink() -{ - TQTimer::singleShot(5, this, TQT_SLOT(slotDoShrink())); -} - -void KScoringEditor::slotDoShrink() -{ - updateGeometry(); - TQApplication::sendPostedEvents(); - resize(width(),tqsizeHint().height()); -} - -void KScoringEditor::slotApply() -{ - TQString ruleName = ruleLister->currentRule(); - KScoringRule *rule = manager->findRule(ruleName); - if (rule) { - ruleEditor->updateRule(rule); - ruleLister->updateRuleList(rule); - } - manager->removeTOS(); - manager->pushRuleList(); -} - -void KScoringEditor::slotOk() -{ - slotApply(); - manager->removeTOS(); - KDialogBase::slotOk(); - manager->editorReady(); -} - -void KScoringEditor::slotCancel() -{ - manager->popRuleList(); - KDialogBase::slotCancel(); -} - -void KScoringEditor::slotFinished() -{ - delayedDestruct(); -} - -//============================================================================ -// -// class KScoringEditorWidgetDialog (a dialog for the KScoringEditorWidget) -// -//============================================================================ -KScoringEditorWidgetDialog::KScoringEditorWidgetDialog(KScoringManager *m, const TQString& r, TQWidget *p, const char *n) - : KDialogBase(p,n,true,i18n("Edit Rule"), - KDialogBase::Ok|KDialogBase::Apply|KDialogBase::Close, - KDialogBase::Ok,true), - manager(m), ruleName(r) -{ - TQFrame *f = makeMainWidget(); - TQBoxLayout *topL = new TQVBoxLayout(f); - ruleEditor = new RuleEditWidget(manager,f); - connect(ruleEditor, TQT_SIGNAL(shrink()), TQT_SLOT(slotShrink())); - topL->addWidget(ruleEditor); - ruleEditor->slotEditRule(ruleName); - resize(0,0); -} - -void KScoringEditorWidgetDialog::slotApply() -{ - KScoringRule *rule = manager->findRule(ruleName); - if (rule) { - ruleEditor->updateRule(rule); - ruleName = rule->getName(); - } -} - -void KScoringEditorWidgetDialog::slotOk() -{ - slotApply(); - KDialogBase::slotOk(); -} - -void KScoringEditorWidgetDialog::slotShrink() -{ - TQTimer::singleShot(5, this, TQT_SLOT(slotDoShrink())); -} - -void KScoringEditorWidgetDialog::slotDoShrink() -{ - updateGeometry(); - TQApplication::sendPostedEvents(); - resize(width(),tqsizeHint().height()); -} - -//============================================================================ -// -// class KScoringEditorWidget (a reusable widget for config dialog...) -// -//============================================================================ -KScoringEditorWidget::KScoringEditorWidget(KScoringManager *m,TQWidget *p, const char *n) - : TQWidget(p,n), manager(m) -{ - TQBoxLayout *topL = new TQVBoxLayout(this); - ruleLister = new RuleListWidget(manager,true,this); - topL->addWidget(ruleLister); - connect(ruleLister,TQT_SIGNAL(ruleEdited(const TQString&)), - this,TQT_SLOT(slotRuleEdited(const TQString &))); -} - -KScoringEditorWidget::~KScoringEditorWidget() -{ - manager->editorReady(); -} - -void KScoringEditorWidget::slotRuleEdited(const TQString& ruleName) -{ - KScoringEditorWidgetDialog dlg(manager,ruleName,this); - dlg.exec(); - ruleLister->updateRuleList(); -} - -#include "kscoringeditor.moc" |