• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • kdepim
  • Sitemap
  • Contact Us
 

knode

knfiltermanager.cpp

Go to the documentation of this file.
00001 /*
00002     KNode, the KDE newsreader
00003     Copyright (c) 1999-2005 the KNode authors.
00004     See file AUTHORS for details
00005 
00006     This program is free software; you can redistribute it and/or modify
00007     it under the terms of the GNU General Public License as published by
00008     the Free Software Foundation; either version 2 of the License, or
00009     (at your option) any later version.
00010     You should have received a copy of the GNU General Public License
00011     along with this program; if not, write to the Free Software Foundation,
00012     Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
00013 */
00014 
00015 #include <stdlib.h>
00016 
00017 #include <klocale.h>
00018 #include <kmessagebox.h>
00019 #include <kmenu.h>
00020 #include <kstandarddirs.h>
00021 #include <kconfig.h>
00022 #include <kicon.h>
00023 
00024 #include "utilities.h"
00025 #include "knglobals.h"
00026 #include "knarticlefilter.h"
00027 #include "knfilterdialog.h"
00028 #include "knfiltermanager.h"
00029 #include "knconfig.h"
00030 #include "knconfigwidgets.h"
00031 
00032 
00033 KNFilterSelectAction::KNFilterSelectAction( const QString& text, const QString& pix,
00034                                             KActionCollection* parent, const char *name )
00035   : KActionMenu(text, parent), currentItem(-42)
00036 {
00037   setIcon(KIcon(pix));
00038   menu()->setCheckable(true);
00039   connect(menu(),SIGNAL(activated(int)),this,SLOT(slotMenuActivated(int)));
00040   setDelayed(false);
00041   parent->addAction(name, this);
00042 }
00043 
00044 
00045 
00046 KNFilterSelectAction::~KNFilterSelectAction()
00047 {
00048 }
00049 
00050 void KNFilterSelectAction::setCurrentItem(int id)
00051 {
00052   menu()->setItemChecked(currentItem, false);
00053   menu()->setItemChecked(id, true);
00054   currentItem = id;
00055 }
00056 
00057 
00058 void KNFilterSelectAction::slotMenuActivated(int id)
00059 {
00060   setCurrentItem(id);
00061   emit(activated(id));
00062 }
00063 
00064 
00065 //==============================================================================
00066 
00067 KNFilterManager::KNFilterManager( QObject * parent )
00068  : QObject( parent ), fset(0), currFilter(0), a_ctFilter(0)
00069 {
00070   loadFilters();
00071 
00072   KConfigGroup conf(knGlobals.config(), "READNEWS");
00073   setFilter(conf.readEntry("lastFilterID", 1));
00074 }
00075 
00076 
00077 
00078 KNFilterManager::~KNFilterManager()
00079 {
00080   qDeleteAll( mFilterList );
00081 }
00082 
00083 
00084 
00085 void KNFilterManager::readOptions()
00086 {
00087 }
00088 
00089 
00090 
00091 void KNFilterManager::saveOptions()
00092 {
00093 }
00094 
00095 
00096 void KNFilterManager::prepareShutdown()
00097 {
00098   if (currFilter) {
00099     KConfig *conf=knGlobals.config();
00100     KConfigGroup group = conf->group("READNEWS");
00101     group.writeEntry("lastFilterID", currFilter->id());
00102   }
00103 }
00104 
00105 
00106 void KNFilterManager::loadFilters()
00107 {
00108   QString fname(KStandardDirs::locate("data","knode/filters/filters.rc") );
00109 
00110   if (!fname.isNull()) {
00111     KConfig conf( fname, KConfig::SimpleConfig);
00112     KConfigGroup grp( &conf, QString());
00113     QList<int> activeFilters = grp.readEntry("Active",QList<int>());
00114     menuOrder = grp.readEntry("Menu",QList<int>());
00115 
00116     foreach ( int filterId, activeFilters ) {
00117       KNArticleFilter *f = new KNArticleFilter( filterId );
00118       if ( f->loadInfo() )
00119         addFilter( f );
00120       else
00121         delete f;
00122     }
00123   }
00124   updateMenu();
00125 }
00126 
00127 
00128 
00129 void KNFilterManager::saveFilterLists()
00130 {
00131   QString dir(KStandardDirs::locateLocal("data","knode/")+"filters/");
00132 
00133   if (dir.isNull()) {
00134     KNHelper::displayInternalFileError();
00135     return;
00136   }
00137   KConfig conf(dir+"filters.rc", KConfig::SimpleConfig);
00138   KConfigGroup grp(&conf, QString());
00139   QList<int> activeFilters;
00140   foreach ( KNArticleFilter *filter, mFilterList )
00141     activeFilters << filter->id();
00142 
00143   grp.writeEntry("Active",activeFilters);
00144   grp.writeEntry("Menu",menuOrder);
00145 }
00146 
00147 
00148 
00149 void KNFilterManager::startConfig(KNode::FilterListWidget *fs)
00150 {
00151   fset=fs;
00152   commitNeeded = false;
00153 
00154   foreach ( KNArticleFilter* filter, mFilterList )
00155     fset->addItem( filter );
00156 
00157   foreach ( int id, menuOrder ) {
00158     if (id!=-1)
00159       fset->addMenuItem(byID(id));
00160     else
00161       fset->addMenuItem(0);
00162   }
00163 }
00164 
00165 
00166 
00167 void KNFilterManager::endConfig()
00168 {
00169   fset=0;
00170 }
00171 
00172 
00173 
00174 void KNFilterManager::commitChanges()
00175 {
00176   menuOrder = fset->menuOrder();
00177   saveFilterLists();
00178 
00179   if(currFilter)
00180     if(!currFilter->isEnabled()) currFilter=0;
00181 
00182   updateMenu();
00183 
00184   if (commitNeeded)
00185     emit filterChanged(currFilter);
00186 }
00187 
00188 
00189 
00190 void KNFilterManager::newFilter()
00191 {
00192   KNArticleFilter *f=new KNArticleFilter();
00193   editFilter(f);
00194 }
00195 
00196 
00197 
00198 void KNFilterManager::addFilter(KNArticleFilter *f)
00199 {
00200   if ( f->id() == -1 ) {      // new filter, find suitable ID
00201     QList<int> activeFilters;
00202     // ok, this is a ugly hack: we want to reuse old id's, so we try to find the first unused id
00203     foreach ( KNArticleFilter *filter, mFilterList )
00204       activeFilters << filter->id();
00205     int newId = 1;
00206     while ( activeFilters.contains( newId ) > 0 )
00207       newId++;
00208     f->setId( newId );
00209   }
00210   mFilterList.append( f );
00211 }
00212 
00213 
00214 
00215 void KNFilterManager::editFilter(KNArticleFilter *f)
00216 {
00217   if (!f->loaded() && f->id()!=-1)
00218     f->load();
00219 
00220   KNFilterDialog *fdlg=new KNFilterDialog(f,(fset)? fset:knGlobals.topWidget);
00221 
00222   if (fdlg->exec()) {
00223     commitNeeded = true;
00224     if(f->id()==-1) {  // new filter
00225       addFilter(f);
00226       f->setLoaded(true);
00227       if(fset) {           // updating settings tab
00228         fset->addItem(f);
00229         if(f->isEnabled())
00230           fset->addMenuItem(f);
00231       }
00232     } else {
00233       if(fset) {          // updating settings tab
00234         if(f->isEnabled())
00235           fset->addMenuItem(f);
00236         else
00237           fset->removeMenuItem(f);
00238         fset->updateItem(f);
00239       }
00240     }
00241     f->save();
00242   } else {
00243     if(f->id()==-1)   // new filter
00244       delete f;
00245   }
00246 
00247   delete fdlg;
00248 }
00249 
00250 
00251 void KNFilterManager::copyFilter(KNArticleFilter *f)
00252 {
00253   if (!f->loaded())
00254     f->load();
00255   KNArticleFilter *newf=new KNArticleFilter(*f);
00256   editFilter(newf);
00257 }
00258 
00259 
00260 void KNFilterManager::deleteFilter(KNArticleFilter *f)
00261 {
00262   if ( KMessageBox::warningContinueCancel( fset ? fset : knGlobals.topWidget,
00263        i18n("Do you really want to delete this filter?"), QString(), KGuiItem( i18n("&Delete"), "edit-delete" ) )
00264        == KMessageBox::Continue ) {
00265     if ( mFilterList.removeAll( f ) ) { // does not delete surplus config files
00266       if ( fset ) {                 // we reuse ids to reduce the number of dead files
00267         fset->removeItem( f );
00268         fset->removeMenuItem( f );
00269       }
00270       if ( currFilter == f ) {
00271         currFilter = 0;
00272         emit filterChanged( currFilter );
00273       }
00274     }
00275   }
00276 }
00277 
00278 
00279 bool KNFilterManager::newNameIsOK(KNArticleFilter *f, const QString &newName)
00280 {
00281   foreach ( KNArticleFilter *filter, mFilterList )
00282     if ( filter != f && newName == filter->translatedName() )
00283       return false;
00284 
00285   return true;
00286 }
00287 
00288 
00289 
00290 KNArticleFilter* KNFilterManager::setFilter(const int id)
00291 {
00292   KNArticleFilter *bak=currFilter;
00293 
00294   currFilter=byID(id);
00295 
00296   if(currFilter) {
00297     if(a_ctFilter)
00298       a_ctFilter->setCurrentItem(currFilter->id());
00299     emit(filterChanged(currFilter));
00300   } else
00301     currFilter=bak;
00302 
00303   return currFilter;
00304 }
00305 
00306 
00307 
00308 KNArticleFilter* KNFilterManager::byID(int id)
00309 {
00310   foreach ( KNArticleFilter *filter, mFilterList )
00311     if ( filter->id() == id )
00312       return filter;
00313 
00314   return 0;
00315 }
00316 
00317 
00318 
00319 void KNFilterManager::updateMenu()
00320 {
00321   if(!a_ctFilter)
00322     return;
00323 
00324   a_ctFilter->menu()->clear();
00325   KNArticleFilter *f=0;
00326 
00327   foreach ( int id, menuOrder ) {
00328     if ( id != -1 ) {
00329       if ( ( f = byID( id ) ) )
00330         a_ctFilter->menu()->insertItem( f->translatedName(), f->id() );
00331     } else
00332       a_ctFilter->menu()->addSeparator();
00333   }
00334 
00335   if(currFilter)
00336     a_ctFilter->setCurrentItem(currFilter->id());
00337 }
00338 
00339 
00340 
00341 void KNFilterManager::slotMenuActivated(int id)
00342 {
00343   KNArticleFilter *f=setFilter(id);
00344 
00345   if (!f)
00346     KMessageBox::error(knGlobals.topWidget, i18n("ERROR: no such filter."));
00347 }
00348 
00349 
00350 void KNFilterManager::slotShowFilterChooser()
00351 {
00352   KNArticleFilter *f=0;
00353   QStringList items;
00354   QList<int> ids;
00355 
00356   foreach ( int id, menuOrder ) {
00357     if ( id != -1 )
00358       if ( ( f = byID( id ) ) ) {
00359         items.append( f->translatedName() );
00360         ids.append( id );
00361       }
00362   }
00363 
00364   int currentItem=0;
00365   if (currFilter)
00366     currentItem=ids.indexOf(currFilter->id());
00367   if (currentItem==-1)
00368     currentItem=0;
00369 
00370   int newFilter = KNHelper::selectDialog(knGlobals.topWidget, i18n("Select Filter"), items, currentItem);
00371   if (newFilter != -1)
00372     setFilter(ids[newFilter]);
00373 }
00374 
00375 
00376 void KNFilterManager::setMenuAction(KNFilterSelectAction *a, QAction *keybA)
00377 {
00378   if(a) {
00379     a_ctFilter = a;
00380     connect(a_ctFilter, SIGNAL(activated(int)), this,  SLOT(slotMenuActivated(int)));
00381   }
00382   if(keybA)
00383     connect(keybA, SIGNAL(activated()), this,  SLOT(slotShowFilterChooser()));
00384 
00385   updateMenu();
00386 }
00387 
00388 //--------------------------------
00389 
00390 #include "knfiltermanager.moc"

knode

Skip menu "knode"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Class Members
  • Related Pages

kdepim

Skip menu "kdepim"
  • akonadi
  •   clients
  •   kabc
  •   kcal
  •   kcm
  • akregator
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt
  • kdgantt1
  • kjots
  • kleopatra
  • kmail
  • kmobiletools
  • knode
  • knotes
  • kontact
  • kontactinterfaces
  • korganizer
  •   korgac
  • kpilot
  • ktimetracker
  •   doc
  • libkdepim
  • libkholidays
  • libkleo
  • libkpgp
  • maildir
Generated for kdepim by doxygen 1.5.4
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal