00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
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 ) {
00201 QList<int> activeFilters;
00202
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) {
00225 addFilter(f);
00226 f->setLoaded(true);
00227 if(fset) {
00228 fset->addItem(f);
00229 if(f->isEnabled())
00230 fset->addMenuItem(f);
00231 }
00232 } else {
00233 if(fset) {
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)
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 ) ) {
00266 if ( fset ) {
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"