kmail Library API Documentation

kmpopfiltercnfrmdlg.cpp

00001 /*************************************************************************** 00002 kmpopheadersdlg.cpp 00003 ------------------- 00004 begin : Mon Oct 22 2001 00005 copyright : (C) 2001 by Heiko Hund 00006 Thorsten Zachmann 00007 email : heiko@ist.eigentlich.net 00008 T.Zachmann@zagge.de 00009 ***************************************************************************/ 00010 00011 #include <config.h> 00012 #include "kmpopfiltercnfrmdlg.h" 00013 #include "kmheaders.h" 00014 00015 #include <qlayout.h> 00016 #include <qlabel.h> 00017 #include <qheader.h> 00018 #include <qcheckbox.h> 00019 #include <qvgroupbox.h> 00020 #include <qtimer.h> 00021 00022 #include <klocale.h> 00023 #include <kio/global.h> 00024 00025 #include <assert.h> 00026 00029 KMPopHeadersView::KMPopHeadersView(QWidget *aParent, KMPopFilterCnfrmDlg *aDialog) 00030 : KListView(aParent) 00031 { 00032 mDialog=aDialog; 00033 int mDownIndex=addColumn(QIconSet(QPixmap(mDown)), QString::null, 24); 00034 assert( mDownIndex == Down ); //This code relies on the fact that radiobuttons are the first three columns for easier Column-Action mapping 00035 //it does not necessarily be true - you could redefine mapToColumn and mapToAction to eg. shift those numbers by 1 00036 addColumn(QIconSet(QPixmap(mLater)), QString::null, 24); 00037 addColumn(QIconSet(QPixmap(mDel)), QString::null, 24); 00038 00039 /*int subjCol =*/ addColumn(i18n("Subject"), 180); 00040 /*int sendCol =*/ addColumn(i18n("Sender"), 150); 00041 int dateCol = addColumn(i18n("Date"), 120); 00042 int sizeCol = addColumn(i18n("Size"), 80); 00043 00044 setAllColumnsShowFocus(true); 00045 00046 setColumnAlignment(Down, Qt::AlignHCenter); 00047 setColumnAlignment(Later, Qt::AlignHCenter); 00048 setColumnAlignment(Delete, Qt::AlignHCenter); 00049 setColumnAlignment(sizeCol, Qt::AlignRight); 00050 00051 setSorting(dateCol, false); 00052 setShowSortIndicator(true); 00053 header()->setResizeEnabled(false, Down); 00054 header()->setResizeEnabled(false, Later); 00055 header()->setResizeEnabled(false, Delete); 00056 header()->setClickEnabled(false, Down); 00057 header()->setClickEnabled(false, Later); 00058 header()->setClickEnabled(false, Delete); 00059 00060 //we rely on fixed column order, so we forbid this 00061 header()->setMovingEnabled(false); 00062 00063 connect(this, SIGNAL(pressed(QListViewItem*, const QPoint&, int)), 00064 SLOT(slotPressed(QListViewItem*, const QPoint&, int))); 00065 } 00066 00067 KMPopHeadersView::~KMPopHeadersView() 00068 { 00069 } 00070 00071 //Handle keystrokes - Left and Right key select previous/next action correspondingly 00072 void KMPopHeadersView::keyPressEvent( QKeyEvent *e ) 00073 { 00074 if (e->key() == Key_Left) { 00075 KMPopHeadersViewItem *item = dynamic_cast<KMPopHeadersViewItem*>( selectedItem() ); 00076 if (item&&mDialog) { 00077 if (item->action()) { //here we rely on the fact that the leftmost action is equal to 0! 00078 item->setAction((KMPopFilterAction)((int)item->action()-1)); 00079 mDialog->setAction( selectedItem(), item->action()); 00080 } 00081 } 00082 } else if (e->key() == Key_Right) { 00083 KMPopHeadersViewItem *item = dynamic_cast<KMPopHeadersViewItem*>( selectedItem() ); 00084 if (item&&mDialog) { 00085 if (item->action()<NoAction-1) { //here we rely on the fact that right most action is one less than NoAction! 00086 item->setAction((KMPopFilterAction)((int)item->action()+1)); 00087 mDialog->setAction( selectedItem(), item->action()); 00088 } 00089 } 00090 } else { 00091 QListView::keyPressEvent( e ); 00092 } 00093 } 00094 00095 void KMPopHeadersView::slotPressed(QListViewItem* aItem, const QPoint&, int aColumn) { 00096 if ( !( aItem && aColumn>=0 && aColumn<NoAction ) ) return; 00097 KMPopHeadersViewItem *item = dynamic_cast<KMPopHeadersViewItem*>(aItem); 00098 assert( item ); 00099 item->setAction(mapToAction(aColumn)); 00100 } 00101 00102 const char *KMPopHeadersView::mUnchecked[26] = { 00103 "19 16 9 1", 00104 " c None", 00105 "# c #000000", 00106 ". c #ffffff", 00107 "a c #4a4c4a", 00108 "b c #524c52", 00109 "c c #efefef", 00110 "e c #fff2ff", 00111 "f c #f6f2f6", 00112 "g c #fff6ff", 00113 " ", 00114 " ", 00115 " aaaa ", 00116 " ba####aa ", 00117 " a##....aac ", 00118 " a#......ec ", 00119 " a#........fc ", 00120 " a#........gc ", 00121 " a#........fc ", 00122 " b#........gc ", 00123 " a#......gc ", 00124 " age....gec ", 00125 " ccfgfgcc ", 00126 " cccc ", 00127 " ", 00128 " ",}; 00129 00130 const char *KMPopHeadersView::mChecked[26] = { 00131 "19 16 9 1", 00132 " c None", 00133 "# c #000000", 00134 ". c #ffffff", 00135 "a c #4a4c4a", 00136 "b c #524c52", 00137 "c c #efefef", 00138 "e c #fff2ff", 00139 "f c #f6f2f6", 00140 "g c #fff6ff", 00141 " ", 00142 " ", 00143 " aaaa ", 00144 " ba####aa ", 00145 " a##....aac ", 00146 " a#......ec ", 00147 " a#...##...fc ", 00148 " a#..####..gc ", 00149 " a#..####..fc ", 00150 " b#...##...gc ", 00151 " a#......gc ", 00152 " age....gec ", 00153 " ccfgfgcc ", 00154 " cccc ", 00155 " ", 00156 " ",}; 00157 00158 const char *KMPopHeadersView::mLater[25] = { 00159 "16 16 8 1", 00160 ". c None", 00161 "g c #303030", 00162 "c c #585858", 00163 "f c #a0a0a0", 00164 "b c #c0c000", 00165 "e c #dcdcdc", 00166 "a c #ffff00", 00167 "d c #ffffff", 00168 "................", 00169 "...........eaa..", 00170 "..........eaaa..", 00171 ".........ebaab..", 00172 ".........eaaa...", 00173 "........eaaab...", 00174 "........eaaa....", 00175 ".......eaaab....", 00176 "eaae..ebaccccc..", 00177 "eaaae.eaacdedc..", 00178 "ebaaabaaabcdc...", 00179 ".ebaaaaaa.fgf...", 00180 "..ebaaaa..cec...", 00181 "...ebaab.cdedc..", 00182 "........eccccc..", 00183 "................"}; 00184 00185 const char *KMPopHeadersView::mDown[20] = { 00186 "16 16 3 1", 00187 ". c None", 00188 "a c #008000", 00189 "b c #00c000", 00190 "................", 00191 "............aa..", 00192 "...........aaa..", 00193 "..........baab..", 00194 "..........aaa...", 00195 ".........baab...", 00196 ".........aaa....", 00197 "........aaab....", 00198 ".aa....baaa.....", 00199 ".aaa...aaa......", 00200 ".baaabaaab......", 00201 "..baaaaaa.......", 00202 "...baaaa........", 00203 "....baab........", 00204 "................", 00205 "................"}; 00206 00207 const char *KMPopHeadersView::mDel[19] = { 00208 "16 16 2 1", 00209 ". c None", 00210 "# c #c00000", 00211 "................", 00212 "................", 00213 "..##.......##...", 00214 "..###.....###...", 00215 "...###...###....", 00216 "....###.###.....", 00217 ".....#####......", 00218 "......###.......", 00219 ".....#####......", 00220 "....###.###.....", 00221 "...###...###....", 00222 "..###.....###...", 00223 "..##.......##...", 00224 "................", 00225 "................", 00226 "................"}; 00227 00228 00234 KMPopHeadersViewItem::KMPopHeadersViewItem(KMPopHeadersView *aParent, KMPopFilterAction aAction) 00235 : KListViewItem(aParent) 00236 { 00237 mParent = aParent; 00238 mAction = NoAction; 00239 00240 setPixmap(mParent->mapToColumn(Delete), QPixmap(KMPopHeadersView::mUnchecked)); 00241 setPixmap(mParent->mapToColumn(Down), QPixmap(KMPopHeadersView::mUnchecked)); 00242 setPixmap(mParent->mapToColumn(Later), QPixmap(KMPopHeadersView::mUnchecked)); 00243 00244 setAction( aAction ); 00245 } 00246 00247 KMPopHeadersViewItem::~KMPopHeadersViewItem() 00248 { 00249 } 00250 00251 void KMPopHeadersViewItem::setAction(KMPopFilterAction aAction) 00252 { 00253 if(aAction != NoAction && aAction!=mAction) 00254 { 00255 if ( mAction!=NoAction ) setPixmap(mParent->mapToColumn(mAction), QPixmap(KMPopHeadersView::mUnchecked)); 00256 setPixmap(mParent->mapToColumn(aAction), QPixmap(KMPopHeadersView::mChecked)); 00257 mAction=aAction; 00258 } 00259 } 00260 00261 void KMPopHeadersViewItem::paintFocus(QPainter *, const QColorGroup &, const QRect &) 00262 { 00263 } 00264 00265 QString KMPopHeadersViewItem::key(int col, bool) const 00266 { 00267 if (col == 3) return KMMsgBase::skipKeyword(text(col).lower()); 00268 if (col == 5) return text(7); 00269 if (col == 6) 00270 { 00271 QString st = text(col); 00272 while (st.length() < 10) st = "0" + st; 00273 return st; 00274 } 00275 return text(col); 00276 } 00277 00283 KMPopFilterCnfrmDlg::KMPopFilterCnfrmDlg(QPtrList<KMPopHeaders> *aHeaders, const QString &aAccount, bool aShowLaterMsgs, QWidget *aParent, const char *aName) 00284 : KDialogBase(aParent, aName, TRUE, i18n("POP Filter"), Ok | Help, Ok, FALSE) 00285 { 00286 unsigned int rulesetCount = 0; 00287 //mHeaders = aHeaders; 00288 mShowLaterMsgs = aShowLaterMsgs; 00289 mLowerBoxVisible = false; 00290 00291 QWidget *w = new QWidget(this); 00292 setMainWidget(w); 00293 00294 QVBoxLayout *vbl = new QVBoxLayout(w, 0, spacingHint()); 00295 00296 QLabel *l = new QLabel(i18n("Messages to filter found on POP Account: <b>%1</b><p>" 00297 "The messages shown exceed the maximum size limit you defined for this account.<br>You can select " 00298 "what you want to do with them by checking the appropriate button.").arg(aAccount), w); 00299 vbl->addWidget(l); 00300 00301 QVGroupBox *upperBox = new QVGroupBox(i18n("Messages Exceeding Size"), w); 00302 upperBox->hide(); 00303 KMPopHeadersView *lv = new KMPopHeadersView(upperBox, this); 00304 vbl->addWidget(upperBox); 00305 00306 QVGroupBox *lowerBox = new QVGroupBox(i18n("Ruleset Filtered Messages: none"), w); 00307 QString checkBoxText((aShowLaterMsgs)? 00308 i18n("Show messages matched by a ruleset and tagged 'Download' or 'Delete'"): 00309 i18n("Show messages matched by a filter ruleset")); 00310 QCheckBox* cb = new QCheckBox(checkBoxText, lowerBox); 00311 cb->setEnabled(false); 00312 mFilteredHeaders = new KMPopHeadersView(lowerBox, this); 00313 mFilteredHeaders->hide(); 00314 vbl->addWidget(lowerBox); 00315 00316 mFilteredHeaders->header()->setResizeEnabled(false, 7); 00317 mFilteredHeaders->setColumnWidth(7, 0); 00318 00319 // fill the listviews with data from the headers 00320 KMPopHeaders *headers; 00321 for(headers = aHeaders->first(); headers; headers = aHeaders->next()) 00322 { 00323 KMPopHeadersViewItem *lvi = 0; 00324 00325 if(headers->ruleMatched()) 00326 { 00327 if(aShowLaterMsgs && headers->action() == Later) 00328 { 00329 // insert messages tagged 'later' only 00330 lvi = new KMPopHeadersViewItem(mFilteredHeaders, headers->action()); 00331 mFilteredHeaders->show(); 00332 mLowerBoxVisible = true; 00333 } 00334 else if(aShowLaterMsgs) 00335 { 00336 // enable checkbox to show 'delete' and 'download' msgs 00337 // but don't insert them into the listview yet 00338 mDDLList.append(headers); 00339 cb->setEnabled(true); 00340 } 00341 else if(!aShowLaterMsgs) 00342 { 00343 // insert all messaged tagged by a ruleset, enable 00344 // the checkbox, but don't show the listview yet 00345 lvi = new KMPopHeadersViewItem(mFilteredHeaders, headers->action()); 00346 cb->setEnabled(true); 00347 } 00348 rulesetCount++; 00349 } 00350 else 00351 { 00352 // insert all messages not tagged by a ruleset 00353 // into the upper listview 00354 lvi = new KMPopHeadersViewItem(lv, headers->action()); 00355 upperBox->show(); 00356 } 00357 00358 if(lvi) 00359 { 00360 mItemMap[lvi] = headers; 00361 setupLVI(lvi,headers->header()); 00362 } 00363 } 00364 00365 if(rulesetCount) 00366 lowerBox->setTitle(i18n("Ruleset Filtered Messages: %1").arg(rulesetCount)); 00367 00368 // connect signals and slots 00369 connect(lv, SIGNAL(pressed(QListViewItem*, const QPoint&, int)), 00370 this, SLOT(slotPressed(QListViewItem*, const QPoint&, int))); 00371 connect(mFilteredHeaders, SIGNAL(pressed(QListViewItem*, const QPoint&, int)), 00372 this, SLOT(slotPressed(QListViewItem*, const QPoint&, int))); 00373 connect(cb, SIGNAL(toggled(bool)), 00374 this, SLOT(slotToggled(bool))); 00375 00376 adjustSize(); 00377 QTimer::singleShot(0, this, SLOT(slotUpdateMinimumSize())); 00378 } 00379 00380 KMPopFilterCnfrmDlg::~KMPopFilterCnfrmDlg() 00381 { 00382 } 00383 00384 void KMPopFilterCnfrmDlg::setupLVI(KMPopHeadersViewItem *lvi, KMMessage *msg) 00385 { 00386 // set the subject 00387 QString tmp = msg->subject(); 00388 if(tmp.isEmpty()) 00389 tmp = i18n("no subject"); 00390 lvi->setText(3, tmp); 00391 // set the sender 00392 tmp = msg->fromStrip(); 00393 if(tmp.isEmpty()) 00394 tmp = i18n("unknown"); 00395 lvi->setText(4, msg->fromStrip()); 00396 // set the date 00397 lvi->setText(5, KMime::DateFormatter::formatDate( KMime::DateFormatter::Fancy, msg->date() ) ); 00398 // set the size 00399 lvi->setText(6, KIO::convertSize(msg->msgLength())); 00400 // Date for sorting 00401 lvi->setText(7, msg->dateIsoStr()); 00402 } 00403 00404 void KMPopFilterCnfrmDlg::setAction(QListViewItem *aItem, KMPopFilterAction aAction) 00405 { 00406 mItemMap[aItem]->setAction(aAction); 00407 } 00414 void KMPopFilterCnfrmDlg::slotPressed(QListViewItem *aItem, const QPoint &, int aColumn) 00415 { 00416 if ( aColumn>=0 && aColumn<NoAction ) setAction(aItem,KMPopHeadersView::mapToAction(aColumn)); 00417 } 00418 00419 void KMPopFilterCnfrmDlg::slotToggled(bool aOn) 00420 { 00421 if(aOn) 00422 { 00423 if(mShowLaterMsgs) 00424 { 00425 // show download and delete msgs in the list view too 00426 for(KMPopHeaders* headers = mDDLList.first(); headers; headers = mDDLList.next()) 00427 { 00428 KMPopHeadersViewItem *lvi = new KMPopHeadersViewItem(mFilteredHeaders, headers->action()); 00429 mItemMap[lvi] = headers; 00430 mDelList.append(lvi); 00431 setupLVI(lvi,headers->header()); 00432 } 00433 } 00434 00435 if(!mLowerBoxVisible) 00436 { 00437 mFilteredHeaders->show(); 00438 } 00439 } 00440 else 00441 { 00442 if(mShowLaterMsgs) 00443 { 00444 // delete download and delete msgs from the lower listview 00445 for(KMPopHeadersViewItem* item = mDelList.first(); item; item = mDelList.next()) 00446 { 00447 mFilteredHeaders->takeItem(item); 00448 } 00449 mDelList.clear(); 00450 } 00451 00452 if(!mLowerBoxVisible) 00453 { 00454 mFilteredHeaders->hide(); 00455 } 00456 } 00457 QTimer::singleShot(0, this, SLOT(slotUpdateMinimumSize())); 00458 } 00459 00460 void KMPopFilterCnfrmDlg::slotUpdateMinimumSize() 00461 { 00462 mainWidget()->setMinimumSize(mainWidget()->sizeHint()); 00463 } 00464 00465 #include "kmpopfiltercnfrmdlg.moc"
KDE Logo
This file is part of the documentation for kmail Library Version 3.3.0.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Aug 27 12:52:48 2004 by doxygen 1.3.8 written by Dimitri van Heesch, © 1997-2003