french -> French
[kdepim.git] / knode / knfiltermanager.cpp
blob4055e329bebd4ade606a7c44f31a5997d04baf2e
1 /*
2 KNode, the KDE newsreader
3 Copyright (c) 1999-2005 the KNode authors.
4 See file AUTHORS for details
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 You should have received a copy of the GNU General Public License
11 along with this program; if not, write to the Free Software Foundation,
12 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, US
15 #include <klocale.h>
16 #include <kmessagebox.h>
17 #include <kmenu.h>
18 #include <kstandarddirs.h>
19 #include <kconfig.h>
20 #include <kicon.h>
22 #include "utilities.h"
23 #include "knglobals.h"
24 #include "knarticlefilter.h"
25 #include "knfilterdialog.h"
26 #include "knfiltermanager.h"
27 #include "knconfig.h"
28 #include "knconfigwidgets.h"
31 KNFilterSelectAction::KNFilterSelectAction( const QString& text, const QString& pix,
32 KActionCollection* parent, const char *name )
33 : KActionMenu(text, parent), currentItem(-42)
35 setIcon(KIcon(pix));
36 menu()->setCheckable(true);
37 connect(menu(),SIGNAL(activated(int)),this,SLOT(slotMenuActivated(int)));
38 setDelayed(false);
39 parent->addAction(name, this);
44 KNFilterSelectAction::~KNFilterSelectAction()
48 void KNFilterSelectAction::setCurrentItem(int id)
50 menu()->setItemChecked(currentItem, false);
51 menu()->setItemChecked(id, true);
52 currentItem = id;
56 void KNFilterSelectAction::slotMenuActivated(int id)
58 setCurrentItem(id);
59 emit(activated(id));
63 //==============================================================================
65 KNFilterManager::KNFilterManager( QObject * parent )
66 : QObject( parent ), fset(0), currFilter(0), a_ctFilter(0)
68 loadFilters();
70 KConfigGroup conf(knGlobals.config(), "READNEWS");
71 setFilter(conf.readEntry("lastFilterID", 1));
76 KNFilterManager::~KNFilterManager()
78 qDeleteAll( mFilterList );
83 void KNFilterManager::readOptions()
89 void KNFilterManager::saveOptions()
94 void KNFilterManager::prepareShutdown()
96 if (currFilter) {
97 KConfig *conf=knGlobals.config();
98 KConfigGroup group = conf->group("READNEWS");
99 group.writeEntry("lastFilterID", currFilter->id());
104 void KNFilterManager::loadFilters()
106 QString fname( KStandardDirs::locate( "data","knode/filters/filters.rc" ) );
108 if (!fname.isNull()) {
109 KConfig conf( fname, KConfig::SimpleConfig);
110 KConfigGroup grp( &conf, QString());
111 QList<int> activeFilters = grp.readEntry("Active",QList<int>());
112 menuOrder = grp.readEntry("Menu",QList<int>());
114 foreach ( int filterId, activeFilters ) {
115 KNArticleFilter *f = new KNArticleFilter( filterId );
116 if ( f->loadInfo() )
117 addFilter( f );
118 else
119 delete f;
122 updateMenu();
127 void KNFilterManager::saveFilterLists()
129 QString dir( KStandardDirs::locateLocal( "data","knode/filters/" ) );
131 if (dir.isNull()) {
132 KNHelper::displayInternalFileError();
133 return;
135 KConfig conf(dir+"filters.rc", KConfig::SimpleConfig);
136 KConfigGroup grp(&conf, QString());
137 QList<int> activeFilters;
138 foreach ( KNArticleFilter *filter, mFilterList )
139 activeFilters << filter->id();
141 grp.writeEntry("Active",activeFilters);
142 grp.writeEntry("Menu",menuOrder);
147 void KNFilterManager::startConfig(KNode::FilterListWidget *fs)
149 fset=fs;
150 commitNeeded = false;
152 foreach ( KNArticleFilter* filter, mFilterList )
153 fset->addItem( filter );
155 foreach ( int id, menuOrder ) {
156 if (id!=-1)
157 fset->addMenuItem(byID(id));
158 else
159 fset->addMenuItem(0);
165 void KNFilterManager::endConfig()
167 fset=0;
172 void KNFilterManager::commitChanges()
174 menuOrder = fset->menuOrder();
175 saveFilterLists();
177 if(currFilter)
178 if(!currFilter->isEnabled()) currFilter=0;
180 updateMenu();
182 if (commitNeeded)
183 emit filterChanged(currFilter);
188 void KNFilterManager::newFilter()
190 KNArticleFilter *f=new KNArticleFilter();
191 editFilter(f);
196 void KNFilterManager::addFilter(KNArticleFilter *f)
198 if ( f->id() == -1 ) { // new filter, find suitable ID
199 QList<int> activeFilters;
200 // ok, this is a ugly hack: we want to reuse old id's, so we try to find the first unused id
201 foreach ( KNArticleFilter *filter, mFilterList )
202 activeFilters << filter->id();
203 int newId = 1;
204 while ( activeFilters.contains( newId ) > 0 )
205 newId++;
206 f->setId( newId );
208 mFilterList.append( f );
213 void KNFilterManager::editFilter(KNArticleFilter *f)
215 if (!f->loaded() && f->id()!=-1)
216 f->load();
218 KNFilterDialog *fdlg=new KNFilterDialog(f,(fset)? fset:knGlobals.topWidget);
220 if (fdlg->exec()) {
221 commitNeeded = true;
222 if(f->id()==-1) { // new filter
223 addFilter(f);
224 f->setLoaded(true);
225 if(fset) { // updating settings tab
226 fset->addItem(f);
227 if(f->isEnabled())
228 fset->addMenuItem(f);
230 } else {
231 if(fset) { // updating settings tab
232 if(f->isEnabled())
233 fset->addMenuItem(f);
234 else
235 fset->removeMenuItem(f);
236 fset->updateItem(f);
239 f->save();
240 } else {
241 if(f->id()==-1) // new filter
242 delete f;
245 delete fdlg;
249 void KNFilterManager::copyFilter(KNArticleFilter *f)
251 if (!f->loaded())
252 f->load();
253 KNArticleFilter *newf=new KNArticleFilter(*f);
254 editFilter(newf);
258 void KNFilterManager::deleteFilter(KNArticleFilter *f)
260 if ( KMessageBox::warningContinueCancel( fset ? fset : knGlobals.topWidget,
261 i18n("Do you really want to delete this filter?"), QString(), KGuiItem( i18n("&Delete"), "edit-delete" ) )
262 == KMessageBox::Continue ) {
263 if ( mFilterList.removeAll( f ) ) { // does not delete surplus config files
264 if ( fset ) { // we reuse ids to reduce the number of dead files
265 fset->removeItem( f );
266 fset->removeMenuItem( f );
268 if ( currFilter == f ) {
269 currFilter = 0;
270 emit filterChanged( currFilter );
277 bool KNFilterManager::newNameIsOK(KNArticleFilter *f, const QString &newName)
279 foreach ( KNArticleFilter *filter, mFilterList )
280 if ( filter != f && newName == filter->translatedName() )
281 return false;
283 return true;
288 KNArticleFilter* KNFilterManager::setFilter(const int id)
290 KNArticleFilter *bak=currFilter;
292 currFilter=byID(id);
294 if(currFilter) {
295 if(a_ctFilter)
296 a_ctFilter->setCurrentItem(currFilter->id());
297 emit(filterChanged(currFilter));
298 } else
299 currFilter=bak;
301 return currFilter;
306 KNArticleFilter* KNFilterManager::byID(int id)
308 foreach ( KNArticleFilter *filter, mFilterList )
309 if ( filter->id() == id )
310 return filter;
312 return 0;
317 void KNFilterManager::updateMenu()
319 if(!a_ctFilter)
320 return;
322 a_ctFilter->menu()->clear();
323 KNArticleFilter *f=0;
325 foreach ( int id, menuOrder ) {
326 if ( id != -1 ) {
327 if ( ( f = byID( id ) ) )
328 a_ctFilter->menu()->insertItem( f->translatedName(), f->id() );
329 } else
330 a_ctFilter->menu()->addSeparator();
333 if(currFilter)
334 a_ctFilter->setCurrentItem(currFilter->id());
339 void KNFilterManager::slotMenuActivated(int id)
341 KNArticleFilter *f=setFilter(id);
343 if (!f)
344 KMessageBox::error(knGlobals.topWidget, i18n("ERROR: no such filter."));
348 void KNFilterManager::slotShowFilterChooser()
350 KNArticleFilter *f=0;
351 QStringList items;
352 QList<int> ids;
354 foreach ( int id, menuOrder ) {
355 if ( id != -1 )
356 if ( ( f = byID( id ) ) ) {
357 items.append( f->translatedName() );
358 ids.append( id );
362 int currentItem=0;
363 if (currFilter)
364 currentItem=ids.indexOf(currFilter->id());
365 if (currentItem==-1)
366 currentItem=0;
368 int newFilter = KNHelper::selectDialog(knGlobals.topWidget, i18n("Select Filter"), items, currentItem);
369 if (newFilter != -1)
370 setFilter(ids[newFilter]);
374 void KNFilterManager::setMenuAction(KNFilterSelectAction *a, QAction *keybA)
376 if(a) {
377 a_ctFilter = a;
378 connect(a_ctFilter, SIGNAL(activated(int)), this, SLOT(slotMenuActivated(int)));
380 if(keybA)
381 connect(keybA, SIGNAL(activated()), this, SLOT(slotShowFilterChooser()));
383 updateMenu();
386 //--------------------------------