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
16 #include <kmessagebox.h>
18 #include <kstandarddirs.h>
22 #include "utilities.h"
23 #include "knglobals.h"
24 #include "knarticlefilter.h"
25 #include "knfilterdialog.h"
26 #include "knfiltermanager.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)
36 menu()->setCheckable(true);
37 connect(menu(),SIGNAL(activated(int)),this,SLOT(slotMenuActivated(int)));
39 parent
->addAction(name
, this);
44 KNFilterSelectAction::~KNFilterSelectAction()
48 void KNFilterSelectAction::setCurrentItem(int id
)
50 menu()->setItemChecked(currentItem
, false);
51 menu()->setItemChecked(id
, true);
56 void KNFilterSelectAction::slotMenuActivated(int id
)
63 //==============================================================================
65 KNFilterManager::KNFilterManager( QObject
* parent
)
66 : QObject( parent
), fset(0), currFilter(0), a_ctFilter(0)
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()
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
);
127 void KNFilterManager::saveFilterLists()
129 QString
dir( KStandardDirs::locateLocal( "data","knode/filters/" ) );
132 KNHelper::displayInternalFileError();
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
)
150 commitNeeded
= false;
152 foreach ( KNArticleFilter
* filter
, mFilterList
)
153 fset
->addItem( filter
);
155 foreach ( int id
, menuOrder
) {
157 fset
->addMenuItem(byID(id
));
159 fset
->addMenuItem(0);
165 void KNFilterManager::endConfig()
172 void KNFilterManager::commitChanges()
174 menuOrder
= fset
->menuOrder();
178 if(!currFilter
->isEnabled()) currFilter
=0;
183 emit
filterChanged(currFilter
);
188 void KNFilterManager::newFilter()
190 KNArticleFilter
*f
=new KNArticleFilter();
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();
204 while ( activeFilters
.contains( newId
) > 0 )
208 mFilterList
.append( f
);
213 void KNFilterManager::editFilter(KNArticleFilter
*f
)
215 if (!f
->loaded() && f
->id()!=-1)
218 KNFilterDialog
*fdlg
=new KNFilterDialog(f
,(fset
)? fset
:knGlobals
.topWidget
);
222 if(f
->id()==-1) { // new filter
225 if(fset
) { // updating settings tab
228 fset
->addMenuItem(f
);
231 if(fset
) { // updating settings tab
233 fset
->addMenuItem(f
);
235 fset
->removeMenuItem(f
);
241 if(f
->id()==-1) // new filter
249 void KNFilterManager::copyFilter(KNArticleFilter
*f
)
253 KNArticleFilter
*newf
=new KNArticleFilter(*f
);
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
) {
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() )
288 KNArticleFilter
* KNFilterManager::setFilter(const int id
)
290 KNArticleFilter
*bak
=currFilter
;
296 a_ctFilter
->setCurrentItem(currFilter
->id());
297 emit(filterChanged(currFilter
));
306 KNArticleFilter
* KNFilterManager::byID(int id
)
308 foreach ( KNArticleFilter
*filter
, mFilterList
)
309 if ( filter
->id() == id
)
317 void KNFilterManager::updateMenu()
322 a_ctFilter
->menu()->clear();
323 KNArticleFilter
*f
=0;
325 foreach ( int id
, menuOrder
) {
327 if ( ( f
= byID( id
) ) )
328 a_ctFilter
->menu()->insertItem( f
->translatedName(), f
->id() );
330 a_ctFilter
->menu()->addSeparator();
334 a_ctFilter
->setCurrentItem(currFilter
->id());
339 void KNFilterManager::slotMenuActivated(int id
)
341 KNArticleFilter
*f
=setFilter(id
);
344 KMessageBox::error(knGlobals
.topWidget
, i18n("ERROR: no such filter."));
348 void KNFilterManager::slotShowFilterChooser()
350 KNArticleFilter
*f
=0;
354 foreach ( int id
, menuOrder
) {
356 if ( ( f
= byID( id
) ) ) {
357 items
.append( f
->translatedName() );
364 currentItem
=ids
.indexOf(currFilter
->id());
368 int newFilter
= KNHelper::selectDialog(knGlobals
.topWidget
, i18n("Select Filter"), items
, currentItem
);
370 setFilter(ids
[newFilter
]);
374 void KNFilterManager::setMenuAction(KNFilterSelectAction
*a
, QAction
*keybA
)
378 connect(a_ctFilter
, SIGNAL(activated(int)), this, SLOT(slotMenuActivated(int)));
381 connect(keybA
, SIGNAL(activated()), this, SLOT(slotShowFilterChooser()));
386 //--------------------------------
388 #include "knfiltermanager.moc"