// kmfilterdlg.cpp #include #include "kmfilterdlg.h" #include "kmfilter.h" #include "kmfiltermgr.h" #include "kmglobal.h" #include "kmfolder.h" #include "kmfolderdir.h" #include "kmfoldermgr.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include static QStrList sFilterOpList, sFilterFuncList, sFilterFieldList, sFilterActionList; //============================================================================= KMFaComboBox::KMFaComboBox(QWidget* p, const char* n): KMFaComboBoxInherited(p, n) { initMetaObject(); connect(this, SIGNAL(activated(int)), SLOT(slotSelected(int))); } void KMFaComboBox::slotSelected(int idx) { emit selectType(this, idx); } //============================================================================= KMFilterDlg::KMFilterDlg(QWidget* parent, const char* name): KMFilterDlgInherited(parent, name, FALSE) { KButtonBox *buttonBox; QPushButton *btnHelp; QGridLayout *fgrid, *grid, *agrid; int h, w, i; QSize sz; initMetaObject(); warning("Mail filters are still broken and unusable."); grid = new QGridLayout(this, 3, 2, 4, 4); mFilter = NULL; setCaption(i18n("Filter Rules")); //setOKButton(i18n("Ok")); //setCancelButton(i18n("Cancel")); mFilterList = new QListBox(this); mFilterList->setMinimumSize(100, 200); grid->addMultiCellWidget(mFilterList, 0, 1, 0, 0); connect(mFilterList,SIGNAL(highlighted(int)),SLOT(slotFilterSelected(int))); initLists(); //---------- static filter fields fgrid = new QGridLayout(3, 3, 4); grid->addLayout(fgrid, 0, 1); mRuleFieldA = new QComboBox(TRUE, this); mRuleFieldA->insertStrList(&sFilterFieldList); sz = mRuleFieldA->sizeHint(); w = sz.width(); h = sz.height(); mRuleFieldA->setMinimumSize(50, h); mRuleFieldA->setMaximumSize(32767, h); fgrid->addWidget(mRuleFieldA, 0, 0); mRuleFieldB = new QComboBox(TRUE, this); mRuleFieldB->insertStrList(&sFilterFieldList); mRuleFieldB->setMinimumSize(50, h); mRuleFieldB->setMaximumSize(32767, h); fgrid->addWidget(mRuleFieldB, 2, 0); mRuleFuncA = new QComboBox(this); mRuleFuncA->setMinimumSize(40, h); mRuleFuncA->setMaximumSize(32767, h); mRuleFuncA->insertStrList(&sFilterFuncList); fgrid->addWidget(mRuleFuncA, 0, 1); mRuleFuncB = new QComboBox(this); mRuleFuncB->setMinimumSize(40, h); mRuleFuncB->setMaximumSize(32767, h); mRuleFuncB->insertStrList(&sFilterFuncList); fgrid->addWidget(mRuleFuncB, 2, 1); mRuleValueA = new QLineEdit(this); mRuleValueA->adjustSize(); mRuleValueA->setMinimumSize(80, mRuleValueA->sizeHint().height()); fgrid->addWidget(mRuleValueA, 0, 2); mRuleValueB = new QLineEdit(this); mRuleValueB->adjustSize(); mRuleValueB->setMinimumSize(80, mRuleValueB->sizeHint().height()); fgrid->addWidget(mRuleValueB, 2, 2); mRuleOp = new QComboBox(this); mRuleOp->insertStrList(&sFilterOpList); mRuleOp->setMinimumSize(50, h); mRuleOp->setMaximumSize(32767, h); fgrid->addMultiCellWidget(mRuleOp, 1, 1, 0, 1); //---------- filter action area agrid = new QGridLayout(FILTER_MAX_ACTIONS, 3, 4); grid->addLayout(agrid, 1, 1); for (i=0; iinsertStrList(&sFilterActionList); mFaType[i]->setMinimumSize(80, h); mFaType[i]->setMaximumSize(32767, h); agrid->addWidget(mFaType[i], i, 0); connect(mFaType[i], SIGNAL(selectType(KMFaComboBox*, int)), SLOT(slotActionTypeSelected(KMFaComboBox*,int))); mFaBtnDetails[i] = NULL; mFaField[i] = NULL; } mActLineHeight = mFaType[0]->size().height(); //---------- button area buttonBox = new KButtonBox(this, KButtonBox::HORIZONTAL, 0, 2); grid->addMultiCellWidget(buttonBox, 2, 2, 0, 1); mBtnUp = buttonBox->addButton(i18n("Up")); connect(mBtnUp,SIGNAL(clicked()),SLOT(slotBtnUp())); mBtnDown = buttonBox->addButton(i18n("Down")); connect(mBtnDown,SIGNAL(clicked()),SLOT(slotBtnDown())); mBtnNew = buttonBox->addButton(i18n("New")); connect(mBtnNew,SIGNAL(clicked()),SLOT(slotBtnNew())); mBtnDelete = buttonBox->addButton(i18n("Delete")); connect(mBtnDelete,SIGNAL(clicked()),SLOT(slotBtnDelete())); buttonBox->addStretch(); mBtnOk = buttonBox->addButton(i18n("Ok")); connect(mBtnOk,SIGNAL(clicked()),SLOT(slotBtnOk())); mBtnCancel = buttonBox->addButton(i18n("Cancel")); connect(mBtnCancel,SIGNAL(clicked()),SLOT(slotBtnCancel())); buttonBox->addStretch(); btnHelp = buttonBox->addButton(i18n("Help")); connect(btnHelp,SIGNAL(clicked()),SLOT(slotBtnHelp())); buttonBox->layout(); buttonBox->setMaximumSize(32767, buttonBox->sizeHint().height()); //---------- grid->setRowStretch(0, 2); grid->setRowStretch(1, 10); grid->setRowStretch(2, 2); grid->setColStretch(0, 10); grid->setColStretch(1, 20); grid->activate(); reloadFilterList(); mFilterList->setCurrentItem(0); } //----------------------------------------------------------------------------- KMFilterDlg::~KMFilterDlg() { } //----------------------------------------------------------------------------- void KMFilterDlg::reloadFilterList(void) { KMFilter* filter; int i, num; mFilterList->clear(); num = filterMgr->count(); for (i=0; iat(i); if (!filter) continue; mFilterList->insertItem(filter->name()); } } //----------------------------------------------------------------------------- void KMFilterDlg::clear(void) { int i; for (i=0; isetCurrentItem((int)aFilter->oper()); i = indexOfRuleField(aFilter->ruleA().field()); if (i < 0) { mRuleFieldA->changeItem(aFilter->ruleA().field(),0); i = 0; } else mRuleFieldA->changeItem(" ",0); mRuleFieldA->setCurrentItem(i); mRuleFuncA->setCurrentItem((int)aFilter->ruleA().function()); mRuleValueA->setText(aFilter->ruleA().contents()); i = indexOfRuleField(aFilter->ruleB().field()); if (i < 0) { mRuleFieldB->changeItem(aFilter->ruleB().field(),0); i = 0; } else mRuleFieldB->changeItem(" ",0); mRuleFieldB->setCurrentItem(i); mRuleFuncB->setCurrentItem((int)aFilter->ruleB().function()); mRuleValueB->setText(aFilter->ruleB().contents()); for (i=0; iaction(i); if (mFaField[i]) delete mFaField[i]; mFaField[i] = NULL; if (!action) mFaType[i]->setCurrentItem(0); else { mFaType[i]->setCurrentItem(1+filterActionDict->indexOf(action->name())); pwidg = action->createParamWidget(this); mFaField[i] = pwidg; if (pwidg) { QPoint pos = mFaType[i]->pos(); pos.setX(pos.x() + mFaType[i]->width() + 4); pwidg->move(pos); pwidg->show(); } } } mFilter = aFilter; mCurFilterIdx = mFilterList->currentItem(); } //----------------------------------------------------------------------------- void KMFilterDlg::applyFilterChanges(void) { KMFilterAction* action; int i; if (!mFilter) return; mFilter->ruleA().init(mRuleFieldA->currentText(), (KMFilterRule::Function)mRuleFuncA->currentItem(), mRuleValueA->text()); mFilter->ruleB().init(mRuleFieldB->currentText(), (KMFilterRule::Function)mRuleFuncB->currentItem(), mRuleValueB->text()); mFilter->setOper((KMFilter::Operator)mRuleOp->currentItem()); mFilter->setName(QString("<")+mRuleFieldA->currentText()+">:"+ mRuleValueA->text()); mFilterList->changeItem(mFilter->name(), mCurFilterIdx); for (i=0; iaction(i); if (!action) continue; action->applyParamWidgetValue(mFaField[i]); } } //----------------------------------------------------------------------------- bool KMFilterDlg::testOpts(const QWidget* w) const { if (!w) debug("KMFilterDlg: no widget given"); return (w!=NULL); } //----------------------------------------------------------------------------- QPushButton* KMFilterDlg::createDetailsButton(void) { QPushButton* btn; btn = mFaBtnDetails[mGridRow]; if (!btn) { btn = new QPushButton("...", this); mFaBtnDetails[mGridRow] = btn; } return btn; } //----------------------------------------------------------------------------- QComboBox* KMFilterDlg::createFolderCombo(const QString curFolder) { QComboBox* cbx = new QComboBox(this); KMFolderDir* fdir = &(folderMgr->dir()); KMFolder* cur; int i, idx=-1; for (i=0,cur=(KMFolder*)fdir->first(); cur; cur=(KMFolder*)fdir->next(), i++) { cbx->insertItem(cur->name()); if (cur->name() == curFolder) idx=i; } if (idx>=0) cbx->setCurrentItem(idx); debug("KMFilterDlg::createFolderCombo: idx=%d, arg=%s, name=%s", idx, curFolder.data(), cbx->text(idx)); return cbx; } //----------------------------------------------------------------------------- void KMFilterDlg::slotActionTypeSelected(KMFaComboBox* cbx, int idx) { KMFilterAction* action; QWidget* widg; QPoint pos; int i; if (!mFilter) return; for (i=FILTER_MAX_ACTIONS-1; i>0; i--) if (cbx == mFaType[i]) break; if (i < 0) return; if (mFaField[i]) delete mFaField[i]; mFaField[i] = NULL; mGridRow = i; if (mFilter->action(i)) delete mFilter->action(i); action = filterActionDict->create( filterActionDict->nameOf(sFilterActionList.at(idx))); mFilter->setAction(i, action); if (!action || idx < 0) { debug("no action selected"); return; } widg = action->createParamWidget(this); mFaField[i] = widg; if (!widg) return; pos = mFaType[i]->pos(); pos.setX(pos.x() + mFaType[idx]->width() + 4); widg->move(pos); widg->show(); } //----------------------------------------------------------------------------- void KMFilterDlg::slotFilterSelected(int idx) { KMFilter* filter; debug("KMFilterDlg::slotFilterSelected()"); if (mFilter) applyFilterChanges(); if (idx < filterMgr->count()) { filter = filterMgr->at(idx); if (filter) showFilter(filter); } else { clear(); mFilter = NULL; } } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnUp() { int idx = mFilterList->currentItem(); KMFilter* filter; if (idx < 1) return; filter = filterMgr->take(idx); assert(filter != NULL); filterMgr->insert(idx-1, filter); mFilterList->removeItem(idx); mFilterList->insertItem(filter->name(), idx-1); mFilterList->setCurrentItem(idx-1); } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnDown() { int idx = mFilterList->currentItem(); KMFilter* filter; if (idx < 0 || idx >= (int)mFilterList->count()-1) return; filter = filterMgr->take(idx); assert(filter != NULL); filterMgr->insert(idx+1, filter); mFilterList->removeItem(idx); mFilterList->insertItem(filter->name(), idx+1); mFilterList->setCurrentItem(idx+1); } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnNew() { int idx; KMFilter* filter = new KMFilter; filter->setName(i18n("Unnamed")); idx = mFilterList->currentItem(); if (idx >= 0) filterMgr->insert(idx, filter); else filterMgr->append(filter); idx = filterMgr->find(filter); mFilterList->insertItem(filter->name(), idx); mFilterList->setCurrentItem(idx); slotFilterSelected(idx); } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnDelete() { int idx = mFilterList->currentItem(); if (idx < 0) return; filterMgr->remove(idx); mFilterList->removeItem(idx); if (idx >= (int)filterMgr->count()) idx = (int)filterMgr->count()-1; if (idx >= 0) mFilterList->setCurrentItem(idx); } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnOk() { if (mFilter) applyFilterChanges(); accept(); } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnCancel() { reject(); } //----------------------------------------------------------------------------- void KMFilterDlg::slotBtnHelp() { } //----------------------------------------------------------------------------- int KMFilterDlg::indexOfRuleField(const QString aName) const { int i; for (i=sFilterFieldList.count()-1; i>=0; i--) { if (sFilterFieldList.at(i)==aName) break; } return i; } //----------------------------------------------------------------------------- void KMFilterDlg::initLists(void) { QString name; //---------- initialize list of filter actions if (sFilterActionList.count() <= 0) { sFilterActionList.append(i18n("")); for (name=filterActionDict->first(); !name.isEmpty(); name=filterActionDict->next()) { sFilterActionList.append(filterActionDict->currentLabel()); } } //---------- initialize list of filter functions if (sFilterOpList.count() <= 0) { sFilterOpList.append(i18n("ignore")); sFilterOpList.append(i18n("and")); sFilterOpList.append(i18n("unless")); sFilterOpList.append(i18n("or")); } //---------- initialize list of filter operators if (sFilterFuncList.count() <= 0) { sFilterFuncList.append(i18n("equals")); sFilterFuncList.append(i18n("not equal")); sFilterFuncList.append(i18n("contains")); sFilterFuncList.append(i18n("doesn't contain")); sFilterFuncList.append(i18n("regular expression")); } //---------- initialize list of filter operators if (sFilterFieldList.count() <= 0) { sFilterFieldList.append(" "); sFilterFieldList.append(i18n("")); sFilterFieldList.append(i18n("")); sFilterFieldList.append(i18n("")); sFilterFieldList.append("Subject"); sFilterFieldList.append("From"); sFilterFieldList.append("To"); sFilterFieldList.append("Reply-To"); sFilterFieldList.append("Organization"); sFilterFieldList.append("Resent-From"); sFilterFieldList.append("X-Loop"); } } //----------------------------------------------------------------------------- #include "kmfilterdlg.moc"