akregator/src

actionmanagerimpl.cpp
1 /*
2  This file is part of Akregator.
3 
4  Copyright (C) 2005 Frank Osterfeld <frank.osterfeld at kdemail.net>
5 
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 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 
20  As a special exception, permission is given to link this program
21  with any edition of TQt, and distribute the resulting executable,
22  without including the source code for TQt in the source distribution.
23 */
24 
25 #include <tqwidget.h>
26 #include <kaction.h>
27 #include <kactioncollection.h>
28 #include <klocale.h>
29 #include <kpopupmenu.h>
30 #include <kshortcut.h>
31 #include <kxmlguifactory.h>
32 
33 #include <tqmap.h>
34 #include <tqstring.h>
35 #include <tqvaluelist.h>
36 
37 #include "actionmanagerimpl.h"
38 #include "akregatorconfig.h"
39 #include "akregator_part.h"
40 #include "akregator_view.h"
41 #include "articlelistview.h"
42 #include "articleviewer.h"
43 #include "feed.h"
44 #include "feedlistview.h"
45 #include "fetchqueue.h"
46 #include "folder.h"
47 #include "listtabwidget.h"
48 #include "kernel.h"
49 #include "speechclient.h"
50 #include "tag.h"
51 #include "tagaction.h"
52 #include "tagnode.h"
53 #include "tagset.h"
54 #include "trayicon.h"
55 #include "treenode.h"
56 #include "treenodevisitor.h"
57 #include "tabwidget.h"
58 #include "kstdaccel.h"
59 
60 
61 
62 #include <kdebug.h>
63 
64 namespace Akregator
65 {
66 
67 class ActionManagerImpl::NodeSelectVisitor : public TreeNodeVisitor
68 {
69  public:
70  NodeSelectVisitor(ActionManagerImpl* manager) : m_manager(manager) {}
71 
72  virtual bool visitFeed(Feed* node)
73  {
74  KAction* remove = m_manager->action("feed_remove");
75  if (remove)
76  remove->setEnabled(true);
77  KAction* hp = m_manager->action("feed_homepage");
78  if (hp)
79  hp->setEnabled(!node->htmlUrl().isEmpty());
80  m_manager->action("feed_fetch")->setText(i18n("&Fetch Feed"));
81  m_manager->action("feed_remove")->setText(i18n("&Delete Feed"));
82  m_manager->action("feed_modify")->setText(i18n("&Edit Feed..."));
83  m_manager->action("feed_mark_all_as_read")->setText(i18n("&Mark Feed as Read"));
84 
85  return true;
86  }
87 
88  virtual bool visitFolder(Folder* node)
89  {
90  KAction* remove = m_manager->action("feed_remove");
91  if (remove)
92  remove->setEnabled(node->parent()); // root nodes must not be deleted
93  KAction* hp = m_manager->action("feed_homepage");
94  if (hp)
95  hp->setEnabled(false);
96 
97  m_manager->action("feed_fetch")->setText(i18n("&Fetch Feeds"));
98  m_manager->action("feed_remove")->setText(i18n("&Delete Folder"));
99  m_manager->action("feed_modify")->setText(i18n("&Rename Folder"));
100  m_manager->action("feed_mark_all_as_read")->setText(i18n("&Mark Feeds as Read"));
101 
102  return true;
103  }
104 
105  virtual bool visitTagNode(TagNode* /*node*/)
106  {
107  KAction* remove = m_manager->action("feed_remove");
108  if (remove)
109  remove->setEnabled(true);
110  KAction* hp = m_manager->action("feed_homepage");
111  if (hp)
112  hp->setEnabled(false);
113  m_manager->action("feed_mark_all_as_read")->setText(i18n("&Mark Articles as Read"));
114  m_manager->action("feed_remove")->setText(i18n("&Delete Tag"));
115  m_manager->action("feed_modify")->setText(i18n("&Edit Tag..."));
116 
117  return true;
118  }
119  private:
120  ActionManagerImpl* m_manager;
121 };
122 
123 class ActionManagerImpl::ActionManagerImplPrivate
124 {
125 public:
126 
127  NodeSelectVisitor* nodeSelectVisitor;
128  ArticleListView* articleList;
129  ListTabWidget* listTabWidget;
130  View* view;
131  ArticleViewer* articleViewer;
132  Part* part;
133  TrayIcon* trayIcon;
134  KActionMenu* tagMenu;
135  KActionCollection* actionCollection;
136  TagSet* tagSet;
137  TQMap<TQString, TagAction*> tagActions;
138  TabWidget* tabWidget;
139  KAction* speakSelectedArticlesAction;
140 };
141 
142 void ActionManagerImpl::slotUpdateTagActions(bool enabled, const TQStringList& tagIds)
143 {
144  if (Settings::showTaggingGUI() && d->tagMenu)
145  {
146  d->tagMenu->setEnabled(enabled);
147  TQValueList<TagAction*> actions = d->tagActions.values();
148 
149  for (TQValueList<TagAction*>::ConstIterator it = actions.begin(); it != actions.end(); ++it)
150  {
151  (*it)->setChecked(tagIds.contains((*it)->tag().id()));
152  }
153  }
154 }
155 
156 void ActionManagerImpl::setTagSet(TagSet* tagSet)
157 {
158  if (tagSet == d->tagSet)
159  return;
160 
161  if (d->tagSet != 0)
162  {
163  disconnect(d->tagSet, TQT_SIGNAL(signalTagAdded(const Tag&)), this, TQT_SLOT(slotTagAdded(const Tag&)));
164  disconnect(d->tagSet, TQT_SIGNAL(signalTagRemoved(const Tag&)), this, TQT_SLOT(slotTagRemoved(const Tag&)));
165  }
166 
167  d->tagSet = tagSet;
168 
169  if (tagSet != 0)
170  {
171  connect(d->tagSet, TQT_SIGNAL(signalTagAdded(const Tag&)), this, TQT_SLOT(slotTagAdded(const Tag&)));
172  connect(d->tagSet, TQT_SIGNAL(signalTagRemoved(const Tag&)), this, TQT_SLOT(slotTagRemoved(const Tag&)));
173  }
174 
175  TQValueList<TagAction*> actions = d->tagActions.values();
176  for (TQValueList<TagAction*>::ConstIterator it = actions.begin(); it != actions.end(); ++it)
177  {
178  d->tagMenu->remove(*it);
179  delete *it;
180  }
181 
182 
183  d->tagActions.clear();
184 
185  //TODO: remove actions from menus, delete actions, clear maps
186 
187  if (tagSet != 0L)
188  {
189  TQValueList<Tag> list = tagSet->toMap().values();
190  for (TQValueList<Tag>::ConstIterator it = list.begin(); it != list.end(); ++it)
191  slotTagAdded(*it);
192  }
193 }
194 
195 void ActionManagerImpl::slotTagAdded(const Tag& tag)
196 {
197  if (!Settings::showTaggingGUI())
198  return;
199 
200  if (!d->tagActions.contains(tag.id()))
201  {
202  d->tagActions[tag.id()] = new TagAction(tag, TQT_TQOBJECT(d->view), TQT_SLOT(slotAssignTag(const Tag&, bool)), d->tagMenu);
203  d->tagMenu->insert(d->tagActions[tag.id()]);
204  }
205 }
206 
207 void ActionManagerImpl::slotTagRemoved(const Tag& tag)
208 {
209  if (!Settings::showTaggingGUI())
210  return;
211 
212  TQString id = tag.id();
213  TagAction* action = d->tagActions[id];
214  d->tagMenu->remove(action);
215  d->tagActions.remove(id);
216  delete action;
217 }
218 
219 void ActionManagerImpl::slotNodeSelected(TreeNode* node)
220 {
221  if (node != 0)
222  d->nodeSelectVisitor->visit(node);
223 }
224 
225 ActionManagerImpl::ActionManagerImpl(Part* part, TQObject* parent, const char* name) : ActionManager(parent, name), d(new ActionManagerImplPrivate)
226 {
227  d->nodeSelectVisitor = new NodeSelectVisitor(this);
228  d->part = part;
229  d->tagSet = 0;
230  d->listTabWidget = 0;
231  d->articleList = 0;
232  d->trayIcon = 0;
233  d->articleViewer = 0;
234  d->view = 0;
235  d->tabWidget = 0;
236  d->tagMenu = 0;
237  d->speakSelectedArticlesAction = 0;
238  d->actionCollection = part->actionCollection();
239  initPart();
240 }
241 
242 ActionManagerImpl::~ActionManagerImpl()
243 {
244  delete d->nodeSelectVisitor;
245  delete d;
246  d = 0;
247 }
248 
249 void ActionManagerImpl::initTrayIcon(TrayIcon* trayIcon)
250 {
251  if (d->trayIcon)
252  return;
253  else d->trayIcon = trayIcon;
254 
255  KPopupMenu* traypop = trayIcon->contextMenu();
256 
257  if (actionCollection()->action("feed_fetch_all"))
258  actionCollection()->action("feed_fetch_all")->plug(traypop, 1);
259  if (actionCollection()->action("akregator_configure_akregator"))
260  actionCollection()->action("akregator_configure_akregator")->plug(traypop, 2);
261 }
262 
263 void ActionManagerImpl::initPart()
264 {
265  new KAction(i18n("&Import Feeds..."), "", "", d->part, TQT_SLOT(fileImport()), d->actionCollection, "file_import");
266  new KAction(i18n("&Export Feeds..."), "", "", d->part, TQT_SLOT(fileExport()), d->actionCollection, "file_export");
267  //new KAction(i18n("&Get Feeds From Web..."), "", "", d->part, TQT_SLOT(fileGetFeeds()), d->actionCollection, "file_getfromweb");
268 
269  new KAction(i18n("Send &Link Address..."), "mail_generic", "", d->part, TQT_SLOT(fileSendLink()), d->actionCollection, "file_sendlink");
270  new KAction(i18n("Send &File..."), "mail_generic", "", d->part, TQT_SLOT(fileSendFile()), d->actionCollection, "file_sendfile");
271 
272  KStdAction::configureNotifications(d->part, TQT_SLOT(showKNotifyOptions()), d->actionCollection); // options_configure_notifications
273  new KAction( i18n("Configure &Akregator..."), "configure", "", d->part, TQT_SLOT(showOptions()), d->actionCollection, "akregator_configure_akregator" );
274 }
275 
276 void ActionManagerImpl::initView(View* view)
277 {
278  if (d->view)
279  return;
280  else
281  d->view = view;
282 
283  // tag actions
284  new KAction(i18n("&New Tag..."), "", "", TQT_TQOBJECT(d->view), TQT_SLOT(slotNewTag()), actionCollection(), "tag_new");
285 
286  // Feed/Feed Group popup menu
287  new KAction(i18n("&Open Homepage"), "", "Ctrl+H", TQT_TQOBJECT(d->view), TQT_SLOT(slotOpenHomepage()), actionCollection(), "feed_homepage");
288  new KAction(i18n("&Add Feed..."), "bookmark_add", "Insert", TQT_TQOBJECT(d->view), TQT_SLOT(slotFeedAdd()), actionCollection(), "feed_add");
289  new KAction(i18n("Ne&w Folder..."), "folder_new", "Shift+Insert", TQT_TQOBJECT(d->view), TQT_SLOT(slotFeedAddGroup()), actionCollection(), "feed_add_group");
290  new KAction(i18n("&Delete Feed"), "editdelete", "Alt+Delete", TQT_TQOBJECT(d->view), TQT_SLOT(slotFeedRemove()), actionCollection(), "feed_remove");
291  new KAction(i18n("&Edit Feed..."), "edit", "F2", TQT_TQOBJECT(d->view), TQT_SLOT(slotFeedModify()), actionCollection(), "feed_modify");
292  KActionMenu* vm = new KActionMenu( i18n( "&View Mode" ), actionCollection(), "view_mode" );
293 
294  KRadioAction *ra = new KRadioAction(i18n("&Normal View"), "view_top_bottom", "Ctrl+Shift+1", TQT_TQOBJECT(d->view), TQT_SLOT(slotNormalView()), actionCollection(), "normal_view");
295  ra->setExclusiveGroup( "ViewMode" );
296  vm->insert(ra);
297 
298  ra = new KRadioAction(i18n("&Widescreen View"), "view_left_right", "Ctrl+Shift+2", TQT_TQOBJECT(d->view), TQT_SLOT(slotWidescreenView()), actionCollection(), "widescreen_view");
299  ra->setExclusiveGroup( "ViewMode" );
300  vm->insert(ra);
301 
302  ra = new KRadioAction(i18n("C&ombined View"), "view_text", "Ctrl+Shift+3", TQT_TQOBJECT(d->view), TQT_SLOT(slotCombinedView()), actionCollection(), "combined_view");
303  ra->setExclusiveGroup( "ViewMode" );
304  vm->insert(ra);
305 
306  // toolbar / feed menu
307  new KAction(i18n("&Fetch Feed"), "down", KStdAccel::shortcut(KStdAccel::Reload), TQT_TQOBJECT(d->view), TQT_SLOT(slotFetchCurrentFeed()), actionCollection(), "feed_fetch");
308  new KAction(i18n("Fe&tch All Feeds"), "bottom", "Ctrl+L", TQT_TQOBJECT(d->view), TQT_SLOT(slotFetchAllFeeds()), actionCollection(), "feed_fetch_all");
309 
310  KAction* stopAction = new KAction(i18n( "&Abort Fetches" ), "stop", Key_Escape, Kernel::self()->fetchQueue(), TQT_SLOT(slotAbort()), actionCollection(), "feed_stop");
311  stopAction->setEnabled(false);
312 
313  new KAction(i18n("&Mark Feed as Read"), "goto", "Ctrl+R", TQT_TQOBJECT(d->view), TQT_SLOT(slotMarkAllRead()), actionCollection(), "feed_mark_all_as_read");
314  new KAction(i18n("Ma&rk All Feeds as Read"), "goto", "Ctrl+Shift+R", TQT_TQOBJECT(d->view), TQT_SLOT(slotMarkAllFeedsRead()), actionCollection(), "feed_mark_all_feeds_as_read");
315 
316  // Settings menu
317  KToggleAction* sqf = new KToggleAction(i18n("Show Quick Filter"), TQString(), 0, TQT_TQOBJECT(d->view), TQT_SLOT(slotToggleShowQuickFilter()), actionCollection(), "show_quick_filter");
318  sqf->setChecked( Settings::showQuickFilter() );
319 
320  new KAction( i18n("Open in Tab"), "tab_new", "Shift+Return", TQT_TQOBJECT(d->view), TQT_SLOT(slotOpenCurrentArticle()), actionCollection(), "article_open" );
321  new KAction( i18n("Open in Background Tab"), TQString(), "tab_new", TQT_TQOBJECT(d->view), TQT_SLOT(slotOpenCurrentArticleBackgroundTab()), actionCollection(), "article_open_background_tab" );
322  new KAction( i18n("Open in External Browser"), "window_new", "Ctrl+Shift+Return", TQT_TQOBJECT(d->view), TQT_SLOT(slotOpenCurrentArticleExternal()), actionCollection(), "article_open_external" );
323  new KAction( i18n("Copy Link Address"), TQString(), TQString(), TQT_TQOBJECT(d->view), TQT_SLOT(slotCopyLinkAddress()), actionCollection(), "article_copy_link_address" );
324 
325  new KAction(i18n("Pre&vious Unread Article"), "", Key_Minus, TQT_TQOBJECT(d->view), TQT_SLOT(slotPrevUnreadArticle()),actionCollection(), "go_prev_unread_article");
326  new KAction(i18n("Ne&xt Unread Article"), "", Key_Plus, TQT_TQOBJECT(d->view), TQT_SLOT(slotNextUnreadArticle()),actionCollection(), "go_next_unread_article");
327 
328  new KAction(i18n("&Delete"), "editdelete", "Delete", TQT_TQOBJECT(d->view), TQT_SLOT(slotArticleDelete()), actionCollection(), "article_delete");
329 
330  if (Settings::showTaggingGUI())
331  {
332  d->tagMenu = new KActionMenu ( i18n( "&Set Tags" ), "rss_tag", actionCollection(), "article_tagmenu" );
333  d->tagMenu->setEnabled(false); // only enabled when articles are selected
334  }
335  KActionMenu* statusMenu = new KActionMenu ( i18n( "&Mark As" ),
336  actionCollection(), "article_set_status" );
337 
338  d->speakSelectedArticlesAction = new KAction(i18n("&Speak Selected Articles"), "kttsd", "", TQT_TQOBJECT(d->view), TQT_SLOT(slotTextToSpeechRequest()), actionCollection(), "akr_texttospeech");
339 
340  KAction* abortTTS = new KAction(i18n( "&Stop Speaking" ), "player_stop", Key_Escape, SpeechClient::self(), TQT_SLOT(slotAbortJobs()), actionCollection(), "akr_aborttexttospeech");
341  abortTTS->setEnabled(false);
342 
343  connect(SpeechClient::self(), TQT_SIGNAL(signalActivated(bool)),
344  abortTTS, TQT_SLOT(setEnabled(bool)));
345 
346  statusMenu->insert(new KAction(KGuiItem(i18n("as in: mark as read","&Read"), "",
347  i18n("Mark selected article as read")),
348  "Ctrl+E", TQT_TQOBJECT(d->view), TQT_SLOT(slotSetSelectedArticleRead()),
349  actionCollection(), "article_set_status_read"));
350 
351  statusMenu->insert(new KAction(KGuiItem(i18n("&New"), "",
352  i18n("Mark selected article as new")),
353  "Ctrl+N", TQT_TQOBJECT(d->view), TQT_SLOT(slotSetSelectedArticleNew()),
354  actionCollection(), "article_set_status_new" ));
355 
356 
357  statusMenu->insert(new KAction(KGuiItem(i18n("&Unread"), "",
358  i18n("Mark selected article as unread")),
359  "Ctrl+U", TQT_TQOBJECT(d->view), TQT_SLOT(slotSetSelectedArticleUnread()),
360  actionCollection(), "article_set_status_unread"));
361 
362  KToggleAction* importantAction = new KToggleAction(i18n("&Mark as Important"), "flag", "Ctrl+I", actionCollection(), "article_set_status_important");
363  importantAction->setCheckedState(i18n("Remove &Important Mark"));
364  connect(importantAction, TQT_SIGNAL(toggled(bool)), TQT_TQOBJECT(d->view), TQT_SLOT(slotArticleToggleKeepFlag(bool)));
365 
366 
367  new KAction( i18n("Move Node Up"), TQString(), "Shift+Alt+Up", TQT_TQOBJECT(view), TQT_SLOT(slotMoveCurrentNodeUp()), d->actionCollection, "feedstree_move_up" );
368  new KAction( i18n("Move Node Down"), TQString(), "Shift+Alt+Down", TQT_TQOBJECT(view), TQT_SLOT(slotMoveCurrentNodeDown()), d->actionCollection, "feedstree_move_down" );
369  new KAction( i18n("Move Node Left"), TQString(), "Shift+Alt+Left", TQT_TQOBJECT(view), TQT_SLOT(slotMoveCurrentNodeLeft()), d->actionCollection, "feedstree_move_left" );
370  new KAction( i18n("Move Node Right"), TQString(), "Shift+Alt+Right", TQT_TQOBJECT(view), TQT_SLOT(slotMoveCurrentNodeRight()), d->actionCollection, "feedstree_move_right");
371 }
372 
373 void ActionManagerImpl::initArticleViewer(ArticleViewer* articleViewer)
374 {
375  if (d->articleViewer)
376  return;
377  else
378  d->articleViewer = articleViewer;
379 }
380 
381 void ActionManagerImpl::initArticleListView(ArticleListView* articleList)
382 {
383  if (d->articleList)
384  return;
385  else
386  d->articleList = articleList;
387 
388  new KAction( i18n("&Previous Article"), TQString(), "Left", TQT_TQOBJECT(articleList), TQT_SLOT(slotPreviousArticle()), actionCollection(), "go_previous_article" );
389  new KAction( i18n("&Next Article"), TQString(), "Right", TQT_TQOBJECT(articleList), TQT_SLOT(slotNextArticle()), actionCollection(), "go_next_article" );
390 }
391 
392 void ActionManagerImpl::initListTabWidget(ListTabWidget* listTabWidget)
393 {
394  if (d->listTabWidget)
395  return;
396  else
397  d->listTabWidget = listTabWidget;
398 
399  new KAction(i18n("&Previous Feed"), "", "P", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotPrevFeed()),actionCollection(), "go_prev_feed");
400  new KAction(i18n("&Next Feed"), "", "N", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotNextFeed()),actionCollection(), "go_next_feed");
401  new KAction(i18n("N&ext Unread Feed"), "", "Alt+Plus", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotNextUnreadFeed()),actionCollection(), "go_next_unread_feed");
402  new KAction(i18n("Prev&ious Unread Feed"), "", "Alt+Minus", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotPrevUnreadFeed()),actionCollection(), "go_prev_unread_feed");
403 
404  new KAction( i18n("Go to Top of Tree"), TQString(), "Ctrl+Home", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotItemBegin()), d->actionCollection, "feedstree_home" );
405  new KAction( i18n("Go to Bottom of Tree"), TQString(), "Ctrl+End", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotItemEnd()), d->actionCollection, "feedstree_end" );
406  new KAction( i18n("Go Left in Tree"), TQString(), "Ctrl+Left", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotItemLeft()), d->actionCollection, "feedstree_left" );
407  new KAction( i18n("Go Right in Tree"), TQString(), "Ctrl+Right", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotItemRight()), d->actionCollection, "feedstree_right" );
408  new KAction( i18n("Go Up in Tree"), TQString(), "Ctrl+Up", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotItemUp()), d->actionCollection, "feedstree_up" );
409  new KAction( i18n("Go Down in Tree"), TQString(), "Ctrl+Down", TQT_TQOBJECT(listTabWidget), TQT_SLOT(slotItemDown()), d->actionCollection, "feedstree_down" );
410 }
411 
412 void ActionManagerImpl::initTabWidget(TabWidget* tabWidget)
413 {
414  if (d->tabWidget)
415  return;
416  else
417  d->tabWidget = tabWidget;
418 
419  new KAction(i18n("Select Next Tab"), "", "Ctrl+Period", TQT_TQOBJECT(d->tabWidget), TQT_SLOT(slotNextTab()),actionCollection(), "select_next_tab");
420  new KAction(i18n("Select Previous Tab"), "", "Ctrl+Comma", TQT_TQOBJECT(d->tabWidget), TQT_SLOT(slotPreviousTab()),actionCollection(), "select_previous_tab");
421  new KAction( i18n("Detach Tab"), "tab_breakoff", CTRL+SHIFT+Key_B, TQT_TQOBJECT(d->tabWidget), TQT_SLOT(slotDetachTab()), actionCollection(), "tab_detach" );
422  new KAction( i18n("Copy Link Address"), TQString(), TQString(), TQT_TQOBJECT(d->tabWidget), TQT_SLOT(slotCopyLinkAddress()), actionCollection(), "tab_copylinkaddress" );
423  new KAction( i18n("&Close Tab"), "tab_remove", KStdAccel::close(), TQT_TQOBJECT(d->tabWidget), TQT_SLOT(slotCloseTab()), actionCollection(), "tab_remove" );
424 }
425 
426 TQWidget* ActionManagerImpl::container(const char* name)
427 {
428  return d->part->factory()->container(name, d->part);
429 }
430 
431 
432 KActionCollection* ActionManagerImpl::actionCollection()
433 {
434  return d->actionCollection;
435 }
436 KAction* ActionManagerImpl::action(const char* name, const char* classname)
437 {
438  return d->actionCollection != 0 ? d->actionCollection->action(name, classname) : 0;
439 }
440 
441 } // namespace Akregator
442 
443 #include "actionmanagerimpl.moc"