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

akregator

  • sources
  • kde-4.12
  • kdepim
  • akregator
  • src
mainwidget.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Akregator.
3 
4  Copyright (C) 2004 Stanislav Karchebny <Stanislav.Karchebny@kdemail.net>
5  2004 Sashmit Bhaduri <smt@vfemail.net>
6  2005 Frank Osterfeld <osterfeld@kde.org>
7 
8  This program is free software; you can redistribute it and/or modify
9  it under the terms of the GNU General Public License as published by
10  the Free Software Foundation; either version 2 of the License, or
11  (at your option) any later version.
12 
13  This program is distributed in the hope that it will be useful,
14  but WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16  GNU General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 
22  As a special exception, permission is given to link this program
23  with any edition of Qt, and distribute the resulting executable,
24  without including the source code for Qt in the source distribution.
25 */
26 
27 #include "mainwidget.h"
28 #include "actionmanagerimpl.h"
29 #include "addfeeddialog.h"
30 #include "articlelistview.h"
31 #include "articleviewer.h"
32 #include "articlejobs.h"
33 #include "akregatorconfig.h"
34 #include "akregator_part.h"
35 #include "browserframe.h"
36 #include "createfeedcommand.h"
37 #include "createfoldercommand.h"
38 #include "deletesubscriptioncommand.h"
39 #include "editsubscriptioncommand.h"
40 #include "expireitemscommand.h"
41 #include "importfeedlistcommand.h"
42 #include "feed.h"
43 #include "feedlist.h"
44 #include "feedpropertiesdialog.h"
45 #include "fetchqueue.h"
46 #include "folder.h"
47 #include "framemanager.h"
48 #include "kernel.h"
49 #include "notificationmanager.h"
50 #include "openurlrequest.h"
51 #include "progressmanager.h"
52 #include "searchbar.h"
53 #include "selectioncontroller.h"
54 #include "speechclient.h"
55 #include "subscriptionlistjobs.h"
56 #include "subscriptionlistmodel.h"
57 #include "subscriptionlistview.h"
58 #include "tabwidget.h"
59 #include "treenode.h"
60 #include "treenodevisitor.h"
61 #include "types.h"
62 #include <solid/networking.h>
63 
64 #include <kaction.h>
65 #include <kdialog.h>
66 #include <KDebug>
67 #include <kfiledialog.h>
68 #include <kfileitem.h>
69 #include <kiconloader.h>
70 #include <kinputdialog.h>
71 #include <klocale.h>
72 #include <kmessagebox.h>
73 #include <krandom.h>
74 #include <kshell.h>
75 #include <kstandarddirs.h>
76 #include <ktoggleaction.h>
77 #include <ktoolinvocation.h>
78 #include <kurl.h>
79 
80 #include <QClipboard>
81 #include <QPixmap>
82 #include <QSplitter>
83 #include <QTextDocument>
84 #include <QDomDocument>
85 #include <QTimer>
86 
87 #include <algorithm>
88 #include <memory>
89 #include <cassert>
90 
91 using namespace boost;
92 using namespace Akregator;
93 using namespace Solid;
94 
95 Akregator::MainWidget::~MainWidget()
96 {
97  // if m_shuttingDown is false, slotOnShutdown was not called. That
98  // means that not the whole app is shutdown, only the part. So it
99  // should be no risk to do the cleanups now
100  if (!m_shuttingDown)
101  slotOnShutdown();
102 }
103 
104 Akregator::MainWidget::MainWidget( Part *part, QWidget *parent, ActionManagerImpl* actionManager, const char *name)
105  : QWidget(parent),
106  m_feedList(),
107  m_viewMode(NormalView),
108  m_actionManager(actionManager),
109  m_feedListManagementInterface( new FeedListManagementImpl )
110 {
111  setObjectName(name);
112 
113  FeedListManagementInterface::setInstance( m_feedListManagementInterface );
114 
115  m_actionManager->initMainWidget(this);
116  m_actionManager->initFrameManager(Kernel::self()->frameManager());
117  m_part = part;
118  m_shuttingDown = false;
119  m_displayingAboutPage = false;
120  setFocusPolicy(Qt::StrongFocus);
121 
122  QVBoxLayout *lt = new QVBoxLayout( this );
123  lt->setMargin(0);
124 
125  m_horizontalSplitter = new QSplitter(Qt::Horizontal, this);
126 
127  m_horizontalSplitter->setOpaqueResize(true);
128  lt->addWidget(m_horizontalSplitter);
129 
130  connect(Kernel::self()->fetchQueue(), SIGNAL(signalStarted()),
131  this, SLOT(slotFetchingStarted()));
132  connect(Kernel::self()->fetchQueue(), SIGNAL(signalStopped()),
133  this, SLOT(slotFetchingStopped()));
134 
135  m_feedListView = new SubscriptionListView( m_horizontalSplitter );
136  m_feedListView->setObjectName( "feedtree" );
137  m_actionManager->initSubscriptionListView( m_feedListView );
138 
139  connect( m_feedListView, SIGNAL(userActionTakingPlace()),
140  this, SLOT(ensureArticleTabVisible()) );
141 
142  // FIXME:
143  // connect(m_feedListView, SIGNAL(signalDropped (KUrl::List &, Akregator::TreeNode*,
144  // Akregator::Folder*)),
145  // this, SLOT(slotFeedUrlDropped (KUrl::List &,
146  // Akregator::TreeNode*, Akregator::Folder*)));
147 
148  m_tabWidget = new TabWidget(m_horizontalSplitter);
149  m_actionManager->initTabWidget(m_tabWidget);
150 
151  connect( m_part, SIGNAL(signalSettingsChanged()),
152  m_tabWidget, SLOT(slotSettingsChanged()));
153 
154  connect( m_tabWidget, SIGNAL(signalCurrentFrameChanged(int)),
155  Kernel::self()->frameManager(), SLOT(slotChangeFrame(int)));
156 
157  connect( m_tabWidget, SIGNAL(signalRemoveFrameRequest(int)),
158  Kernel::self()->frameManager(), SLOT(slotRemoveFrame(int)));
159 
160  connect( m_tabWidget, SIGNAL(signalOpenUrlRequest(Akregator::OpenUrlRequest&)),
161  Kernel::self()->frameManager(), SLOT(slotOpenUrlRequest(Akregator::OpenUrlRequest&)));
162 
163  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameAdded(Akregator::Frame*)),
164  m_tabWidget, SLOT(slotAddFrame(Akregator::Frame*)));
165 
166  connect( Kernel::self()->frameManager(), SIGNAL(signalSelectFrame(int)),
167  m_tabWidget, SLOT(slotSelectFrame(int)) );
168 
169  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameRemoved(int)),
170  m_tabWidget, SLOT(slotRemoveFrame(int)));
171 
172  connect( Kernel::self()->frameManager(), SIGNAL(signalRequestNewFrame(int&)),
173  this, SLOT(slotRequestNewFrame(int&)) );
174 
175  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameAdded(Akregator::Frame*)),
176  this, SLOT(slotFramesChanged()));
177  connect( Kernel::self()->frameManager(), SIGNAL(signalFrameRemoved(int)),
178  this, SLOT(slotFramesChanged()));
179  connect( Solid::Networking::notifier(), SIGNAL(statusChanged(Solid::Networking::Status)),
180  this,SLOT(slotNetworkStatusChanged(Solid::Networking::Status)));
181 
182  m_tabWidget->setWhatsThis( i18n("You can view multiple articles in several open tabs."));
183 
184  m_mainTab = new QWidget(this);
185  m_mainTab->setObjectName("Article Tab");
186  m_mainTab->setWhatsThis( i18n("Articles list."));
187 
188  QVBoxLayout *mainTabLayout = new QVBoxLayout( m_mainTab);
189  mainTabLayout->setMargin(0);
190 
191  m_searchBar = new SearchBar(m_mainTab);
192  if ( !Settings::showQuickFilter() )
193  m_searchBar->hide();
194 
195  mainTabLayout->addWidget(m_searchBar);
196 
197  m_articleSplitter = new QSplitter(Qt::Vertical, m_mainTab);
198  m_articleSplitter->setObjectName("panner2");
199 
200  m_articleListView = new ArticleListView( m_articleSplitter );
201  connect( m_articleListView, SIGNAL(userActionTakingPlace()),
202  this, SLOT(ensureArticleTabVisible()) );
203 
204  m_selectionController = new SelectionController( this );
205  m_selectionController->setArticleLister( m_articleListView );
206  m_selectionController->setFeedSelector( m_feedListView );
207 
208  connect(m_searchBar, SIGNAL(signalSearch(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)),
209  m_selectionController, SLOT(setFilters(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)) );
210 
211  FolderExpansionHandler* expansionHandler = new FolderExpansionHandler( this );
212  connect( m_feedListView, SIGNAL(expanded(QModelIndex)), expansionHandler, SLOT(itemExpanded(QModelIndex)) );
213  connect( m_feedListView, SIGNAL(collapsed(QModelIndex)), expansionHandler, SLOT(itemCollapsed(QModelIndex)) );
214 
215  m_selectionController->setFolderExpansionHandler( expansionHandler );
216 
217  connect( m_selectionController, SIGNAL(currentSubscriptionChanged(Akregator::TreeNode*)),
218  this, SLOT(slotNodeSelected(Akregator::TreeNode*)) );
219 
220  connect( m_selectionController, SIGNAL(currentArticleChanged(Akregator::Article)),
221  this, SLOT(slotArticleSelected(Akregator::Article)) );
222 
223  connect( m_selectionController, SIGNAL(articleDoubleClicked(Akregator::Article)),
224  this, SLOT(slotOpenArticleInBrowser(Akregator::Article)) );
225 
226  m_actionManager->initArticleListView(m_articleListView);
227 
228  connect( m_articleListView, SIGNAL(signalMouseButtonPressed(int,KUrl)),
229  this, SLOT(slotMouseButtonPressed(int,KUrl)));
230 
231 /*
232  connect( m_part, SIGNAL(signalSettingsChanged()),
233  m_articleListView, SLOT(slotPaletteOrFontChanged()));
234 */
235 
236  m_articleViewer = new ArticleViewer(m_articleSplitter);
237  m_actionManager->initArticleViewer(m_articleViewer);
238  m_articleListView->setFocusProxy(m_articleViewer);
239  setFocusProxy( m_articleViewer );
240 
241  connect( m_articleViewer, SIGNAL(signalOpenUrlRequest(Akregator::OpenUrlRequest&)),
242  Kernel::self()->frameManager(), SLOT(slotOpenUrlRequest(Akregator::OpenUrlRequest&)) );
243  connect( m_articleViewer->part()->browserExtension(), SIGNAL(mouseOverInfo(KFileItem)),
244  this, SLOT(slotMouseOverInfo(KFileItem)) );
245  connect( m_part, SIGNAL(signalSettingsChanged()),
246  m_articleViewer, SLOT(slotPaletteOrFontChanged()));
247  connect(m_searchBar, SIGNAL(signalSearch(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)),
248  m_articleViewer, SLOT(setFilters(std::vector<boost::shared_ptr<const Akregator::Filters::AbstractMatcher> >)) );
249 
250  m_articleViewer->part()->widget()->setWhatsThis( i18n("Browsing area."));
251 
252  mainTabLayout->addWidget( m_articleSplitter );
253 
254  m_mainFrame = new MainFrame( this, m_part, m_mainTab );
255  m_mainFrame->slotSetTitle( i18n("Articles") );
256  Kernel::self()->frameManager()->slotAddFrame(m_mainFrame);
257 
258  const QList<int> sp1sizes = Settings::splitter1Sizes();
259  if ( sp1sizes.count() >= m_horizontalSplitter->count() )
260  m_horizontalSplitter->setSizes( sp1sizes );
261  const QList<int> sp2sizes = Settings::splitter2Sizes();
262  if ( sp2sizes.count() >= m_articleSplitter->count() )
263  m_articleSplitter->setSizes( sp2sizes );
264 
265  KConfigGroup conf(Settings::self()->config(), "General");
266  if(!conf.readEntry("Disable Introduction", false))
267  {
268  m_articleListView->hide();
269  m_searchBar->hide();
270  m_articleViewer->displayAboutPage();
271  m_mainFrame->slotSetTitle(i18n("About"));
272  m_displayingAboutPage = true;
273  }
274 
275  m_fetchTimer = new QTimer(this);
276  connect( m_fetchTimer, SIGNAL(timeout()),
277  this, SLOT(slotDoIntervalFetches()) );
278  m_fetchTimer->start(1000*60);
279 
280  // delete expired articles once per hour
281  m_expiryTimer = new QTimer(this);
282  connect(m_expiryTimer, SIGNAL(timeout()),
283  this, SLOT(slotDeleteExpiredArticles()) );
284  m_expiryTimer->start(3600*1000);
285 
286  m_markReadTimer = new QTimer(this);
287  m_markReadTimer->setSingleShot(true);
288  connect(m_markReadTimer, SIGNAL(timeout()), this, SLOT(slotSetCurrentArticleReadDelayed()) );
289 
290  setFeedList( shared_ptr<FeedList>( new FeedList( Kernel::self()->storage() ) ) );
291 
292  switch (Settings::viewMode())
293  {
294  case CombinedView:
295  slotCombinedView();
296  break;
297  case WidescreenView:
298  slotWidescreenView();
299  break;
300  default:
301  slotNormalView();
302  }
303 
304  if ( !Settings::resetQuickFilterOnNodeChange() )
305  {
306  m_searchBar->slotSetStatus( Settings::statusFilter() );
307  m_searchBar->slotSetText( Settings::textFilter() );
308  }
309 
310  //Check network status
311  if(Solid::Networking::status() == Solid::Networking::Connected ||Solid::Networking::status() == Solid::Networking::Unknown)
312  this->m_networkAvailable=true;
313  else if(Solid::Networking::status() == Solid::Networking::Unconnected)
314  this->m_networkAvailable=false;
315 }
316 
317 void Akregator::MainWidget::slotOnShutdown()
318 {
319  m_shuttingDown = true;
320 
321  // close all pageviewers in a controlled way
322  // fixes bug 91660, at least when no part loading data
323  while ( m_tabWidget->count() > 1 ) { // remove frames until only the main frame remains
324  m_tabWidget->setCurrentIndex( m_tabWidget->count() - 1 ); // select last page
325  m_tabWidget->slotRemoveCurrentFrame();
326  }
327 
328  Kernel::self()->fetchQueue()->slotAbort();
329  setFeedList( shared_ptr<FeedList>() );
330 
331  delete m_feedListManagementInterface;
332  delete m_feedListView; // call delete here, so that the header settings will get saved
333  delete m_articleListView; // same for this one
334 
335  delete m_mainTab;
336  delete m_mainFrame;
337 
338  Settings::self()->writeConfig();
339 }
340 
341 
342 void Akregator::MainWidget::saveSettings()
343 {
344  const QList<int> spl1 = m_horizontalSplitter->sizes();
345  if ( std::count( spl1.begin(), spl1.end(), 0 ) == 0 )
346  Settings::setSplitter1Sizes( spl1 );
347  const QList<int> spl2 = m_articleSplitter->sizes();
348  if ( std::count( spl2.begin(), spl2.end(), 0 ) == 0 )
349  Settings::setSplitter2Sizes( spl2 );
350  Settings::setViewMode( m_viewMode );
351  Settings::self()->writeConfig();
352 }
353 
354 
355 void Akregator::MainWidget::slotRequestNewFrame(int& frameId)
356 {
357  BrowserFrame* frame = new BrowserFrame(m_tabWidget);
358 
359  connect( m_part, SIGNAL(signalSettingsChanged()), frame, SLOT(slotPaletteOrFontChanged()));
360  connect( m_tabWidget, SIGNAL(signalZoomInFrame(int)), frame, SLOT(slotZoomIn(int)));
361  connect( m_tabWidget, SIGNAL(signalZoomOutFrame(int)), frame, SLOT(slotZoomOut(int)));
362 
363  Kernel::self()->frameManager()->slotAddFrame(frame);
364 
365  frameId = frame->id();
366 }
367 
368 void Akregator::MainWidget::sendArticle(bool attach)
369 {
370  QByteArray text;
371  QString title;
372 
373  Frame* frame = Kernel::self()->frameManager()->currentFrame();
374 
375  if (frame && frame->id() > 0) { // are we in some other tab than the articlelist?
376  text = frame->url().prettyUrl().toLatin1();
377  title = frame->title();
378  }
379  else { // nah, we're in articlelist..
380  const Article article = m_selectionController->currentArticle();
381  if(!article.isNull()) {
382  text = article.link().prettyUrl().toLatin1();
383  title = article.title();
384  }
385  }
386 
387  if(text.isEmpty())
388  return;
389 
390  if(attach)
391  {
392  KToolInvocation::invokeMailer(QString(),
393  QString(),
394  QString(),
395  title,
396  QString(),
397  QString(),
398  QStringList(text),
399  text);
400  }
401  else
402  {
403  KToolInvocation::invokeMailer(QString(),
404  QString(),
405  QString(),
406  title,
407  text,
408  QString(),
409  QStringList(),
410  text);
411  }
412 }
413 
414 void MainWidget::importFeedList( const QDomDocument& doc )
415 {
416  std::auto_ptr<ImportFeedListCommand> cmd( new ImportFeedListCommand );
417  cmd->setParentWidget( this );
418  cmd->setFeedListDocument( doc );
419  cmd->setTargetList( m_feedList );
420  cmd.release()->start();
421 }
422 
423 void Akregator::MainWidget::setFeedList( const shared_ptr<FeedList>& list )
424 {
425  if ( list == m_feedList )
426  return;
427  const shared_ptr<FeedList> oldList = m_feedList;
428 
429  m_feedList = list;
430  if ( m_feedList ) {
431  connect( m_feedList.get(), SIGNAL(unreadCountChanged(int)),
432  this, SLOT(slotSetTotalUnread()) );
433  }
434 
435  slotSetTotalUnread();
436 
437  m_feedListManagementInterface->setFeedList( m_feedList );
438  Kernel::self()->setFeedList( m_feedList );
439  ProgressManager::self()->setFeedList( m_feedList );
440  m_selectionController->setFeedList( m_feedList );
441 
442  if ( oldList )
443  oldList->disconnect( this );
444 
445  slotDeleteExpiredArticles();
446 }
447 
448 void Akregator::MainWidget::deleteExpiredArticles( const shared_ptr<FeedList>& list )
449 {
450  if ( !list )
451  return;
452  ExpireItemsCommand* cmd = new ExpireItemsCommand( this );
453  cmd->setParentWidget( this );
454  cmd->setFeedList( list );
455  cmd->setFeeds( list->feedIds() );
456  cmd->start();
457 }
458 
459 void Akregator::MainWidget::slotDeleteExpiredArticles()
460 {
461  deleteExpiredArticles( m_feedList );
462 }
463 
464 QDomDocument Akregator::MainWidget::feedListToOPML()
465 {
466  QDomDocument dom;
467  if ( m_feedList ) {
468  dom = m_feedList->toOpml();
469  }
470  return dom;
471 }
472 
473 void Akregator::MainWidget::addFeedToGroup(const QString& url, const QString& groupName)
474 {
475  // Locate the group.
476  QList<TreeNode *> namedGroups = m_feedList->findByTitle( groupName );
477  Folder* group = 0;
478  foreach( TreeNode* const candidate, namedGroups ) {
479  if ( candidate->isGroup() ) {
480  group = static_cast<Folder*>( candidate );
481  break;
482  }
483  }
484 
485  if (!group)
486  {
487  Folder* g = new Folder( groupName );
488  m_feedList->allFeedsFolder()->appendChild(g);
489  group = g;
490  }
491 
492  // Invoke the Add Feed dialog with url filled in.
493  addFeed(url, 0, group, true);
494 }
495 
496 void Akregator::MainWidget::slotNormalView()
497 {
498  if (m_viewMode == NormalView)
499  return;
500 
501  if (m_viewMode == CombinedView)
502  {
503  m_articleListView->show();
504 
505  const Article article = m_selectionController->currentArticle();
506 
507  if (!article.isNull())
508  m_articleViewer->showArticle(article);
509  else
510  m_articleViewer->slotShowSummary( m_selectionController->selectedSubscription() );
511  }
512 
513  m_articleSplitter->setOrientation(Qt::Vertical);
514  m_viewMode = NormalView;
515 
516  Settings::setViewMode( m_viewMode );
517 }
518 
519 void Akregator::MainWidget::slotWidescreenView()
520 {
521  if (m_viewMode == WidescreenView)
522  return;
523 
524  if (m_viewMode == CombinedView)
525  {
526  m_articleListView->show();
527 
528  Article article = m_selectionController->currentArticle();
529 
530  if (!article.isNull())
531  m_articleViewer->showArticle(article);
532  else
533  m_articleViewer->slotShowSummary( m_selectionController->selectedSubscription() );
534  }
535 
536  m_articleSplitter->setOrientation(Qt::Horizontal);
537  m_viewMode = WidescreenView;
538 
539  Settings::setViewMode( m_viewMode );
540 }
541 
542 void Akregator::MainWidget::slotCombinedView()
543 {
544  if (m_viewMode == CombinedView)
545  return;
546 
547  m_articleListView->slotClear();
548  m_articleListView->hide();
549  m_viewMode = CombinedView;
550 
551  Settings::setViewMode( m_viewMode );
552 }
553 
554 void Akregator::MainWidget::slotMoveCurrentNodeUp()
555 {
556  TreeNode* current = m_selectionController->selectedSubscription();
557  if (!current)
558  return;
559  TreeNode* prev = current->prevSibling();
560  Folder* parent = current->parent();
561 
562  if (!prev || !parent)
563  return;
564 
565  parent->removeChild(prev);
566  parent->insertChild(prev, current);
567  m_feedListView->ensureNodeVisible(current);
568 }
569 
570 void Akregator::MainWidget::slotMoveCurrentNodeDown()
571 {
572  TreeNode* current = m_selectionController->selectedSubscription();
573  if (!current)
574  return;
575  TreeNode* next = current->nextSibling();
576  Folder* parent = current->parent();
577 
578  if (!next || !parent)
579  return;
580 
581  parent->removeChild(current);
582  parent->insertChild(current, next);
583  m_feedListView->ensureNodeVisible(current);
584 }
585 
586 void Akregator::MainWidget::slotMoveCurrentNodeLeft()
587 {
588  TreeNode* current = m_selectionController->selectedSubscription();
589  if (!current || !current->parent() || !current->parent()->parent())
590  return;
591 
592  Folder* parent = current->parent();
593  Folder* grandparent = current->parent()->parent();
594 
595  parent->removeChild(current);
596  grandparent->insertChild(current, parent);
597  m_feedListView->ensureNodeVisible(current);
598 }
599 
600 void Akregator::MainWidget::slotMoveCurrentNodeRight()
601 {
602  TreeNode* current = m_selectionController->selectedSubscription();
603  if (!current || !current->parent())
604  return;
605  TreeNode* prev = current->prevSibling();
606 
607  if ( prev && prev->isGroup() )
608  {
609  Folder* fg = static_cast<Folder*>(prev);
610  current->parent()->removeChild(current);
611  fg->appendChild(current);
612  m_feedListView->ensureNodeVisible(current);
613  }
614 }
615 
616 void Akregator::MainWidget::slotNodeSelected(TreeNode* node)
617 {
618  m_markReadTimer->stop();
619 
620  if (m_displayingAboutPage)
621  {
622  m_mainFrame->slotSetTitle(i18n("Articles"));
623  if (m_viewMode != CombinedView)
624  m_articleListView->show();
625  if (Settings::showQuickFilter())
626  m_searchBar->show();
627  m_displayingAboutPage = false;
628  }
629 
630  m_tabWidget->setCurrentWidget( m_mainFrame );
631  if ( Settings::resetQuickFilterOnNodeChange() )
632  m_searchBar->slotClearSearch();
633 
634  if (m_viewMode == CombinedView)
635  {
636  m_articleViewer->showNode(node);
637  }
638  else
639  {
640  m_articleViewer->slotShowSummary(node);
641  }
642 
643  if (node)
644  m_mainFrame->setWindowTitle(node->title());
645 
646  m_actionManager->slotNodeSelected(node);
647 }
648 
649 
650 void Akregator::MainWidget::slotFeedAdd()
651 {
652  Folder* group = 0;
653  if ( !m_selectionController->selectedSubscription() )
654  group = m_feedList->allFeedsFolder();
655  else
656  {
657  if ( m_selectionController->selectedSubscription()->isGroup())
658  group = static_cast<Folder*>( m_selectionController->selectedSubscription() );
659  else
660  group= m_selectionController->selectedSubscription()->parent();
661 
662  }
663 
664  TreeNode* const lastChild = !group->children().isEmpty() ? group->children().last() : 0;
665 
666  addFeed(QString::null, lastChild, group, false); //krazy:exclude=nullstrassign for old broken gcc
667 }
668 
669 void Akregator::MainWidget::addFeed(const QString& url, TreeNode *after, Folder* parent, bool autoExec)
670 {
671  CreateFeedCommand* cmd( new CreateFeedCommand( this ) );
672  cmd->setParentWidget( this );
673  cmd->setPosition( parent, after );
674  cmd->setRootFolder( m_feedList->allFeedsFolder() );
675  cmd->setAutoExecute( autoExec );
676  cmd->setUrl( url );
677  cmd->setSubscriptionListView( m_feedListView );
678  cmd->start();
679 }
680 
681 void Akregator::MainWidget::slotFeedAddGroup()
682 {
683  CreateFolderCommand* cmd = new CreateFolderCommand( this );
684  cmd->setParentWidget( this );
685  cmd->setSelectedSubscription( m_selectionController->selectedSubscription() );
686  cmd->setRootFolder( m_feedList->allFeedsFolder() );
687  cmd->setSubscriptionListView( m_feedListView );
688  cmd->start();
689 }
690 
691 void Akregator::MainWidget::slotFeedRemove()
692 {
693  TreeNode* selectedNode = m_selectionController->selectedSubscription();
694 
695  // don't delete root element! (safety valve)
696  if (!selectedNode || selectedNode == m_feedList->allFeedsFolder())
697  return;
698 
699  DeleteSubscriptionCommand* cmd = new DeleteSubscriptionCommand( this );
700  cmd->setParentWidget( this );
701  cmd->setSubscription( m_feedList, selectedNode->id() );
702  cmd->start();
703 }
704 
705 void Akregator::MainWidget::slotFeedModify()
706 {
707  TreeNode* const node = m_selectionController->selectedSubscription();
708  if ( !node )
709  return;
710  EditSubscriptionCommand* cmd = new EditSubscriptionCommand( this );
711  cmd->setParentWidget( this );
712  cmd->setSubscription( m_feedList, node->id() );
713  cmd->setSubscriptionListView( m_feedListView );
714  cmd->start();
715 }
716 
717 void Akregator::MainWidget::slotNextUnreadArticle()
718 {
719  ensureArticleTabVisible();
720  if (m_viewMode == CombinedView)
721  {
722  m_feedListView->slotNextUnreadFeed();
723  return;
724  }
725  TreeNode* sel = m_selectionController->selectedSubscription();
726  if (sel && sel->unread() > 0)
727  m_articleListView->slotNextUnreadArticle();
728  else
729  m_feedListView->slotNextUnreadFeed();
730 }
731 
732 void Akregator::MainWidget::slotPrevUnreadArticle()
733 {
734  ensureArticleTabVisible();
735  if (m_viewMode == CombinedView)
736  {
737  m_feedListView->slotPrevUnreadFeed();
738  return;
739  }
740  TreeNode* sel = m_selectionController->selectedSubscription();
741  if (sel && sel->unread() > 0)
742  m_articleListView->slotPreviousUnreadArticle();
743  else
744  m_feedListView->slotPrevUnreadFeed();
745 }
746 
747 void Akregator::MainWidget::slotMarkAllFeedsRead()
748 {
749  KJob* job = m_feedList->createMarkAsReadJob();
750  connect(job, SIGNAL(finished(KJob*)), m_selectionController, SLOT(forceFilterUpdate()) );
751  job->start();
752 }
753 
754 void Akregator::MainWidget::slotMarkAllRead()
755 {
756  if(!m_selectionController->selectedSubscription())
757  return;
758  KJob* job = m_selectionController->selectedSubscription()->createMarkAsReadJob();
759  connect(job, SIGNAL(finished(KJob*)), m_selectionController, SLOT(forceFilterUpdate()) );
760  job->start();
761 }
762 
763 void Akregator::MainWidget::slotSetTotalUnread()
764 {
765  emit signalUnreadCountChanged( m_feedList ? m_feedList->unread() : 0 );
766 }
767 
768 void Akregator::MainWidget::slotDoIntervalFetches()
769 {
770  if ( !m_feedList )
771  return;
772 #if 0
773  // the following solid check apparently doesn't work reliably and causes
774  // interval fetching not working although the user is actually online (but solid reports he's not
775  const Networking::Status status = Solid::Networking::status();
776  if ( status != Networking::Connected && status != Networking::Unknown )
777  return;
778 #endif
779  m_feedList->addToFetchQueue(Kernel::self()->fetchQueue(), true);
780 }
781 
782 void Akregator::MainWidget::slotFetchCurrentFeed()
783 {
784  if ( !m_selectionController->selectedSubscription())
785  return;
786  if(isNetworkAvailable())
787  m_selectionController->selectedSubscription()->slotAddToFetchQueue(Kernel::self()->fetchQueue());
788  else
789  m_mainFrame->slotSetStatusText(i18n("Networking is not available."));
790 }
791 
792 void Akregator::MainWidget::slotFetchAllFeeds()
793 {
794  if ( m_feedList && isNetworkAvailable() )
795  m_feedList->addToFetchQueue( Kernel::self()->fetchQueue() );
796  else if (m_feedList)
797  m_mainFrame->slotSetStatusText(i18n("Networking is not available."));
798 }
799 
800 void Akregator::MainWidget::slotFetchingStarted()
801 {
802  m_mainFrame->slotSetState(Frame::Started);
803  m_actionManager->action("feed_stop")->setEnabled(true);
804  m_mainFrame->slotSetStatusText(i18n("Fetching Feeds..."));
805 }
806 
807 void Akregator::MainWidget::slotFetchingStopped()
808 {
809  m_mainFrame->slotSetState(Frame::Completed);
810  m_actionManager->action("feed_stop")->setEnabled(false);
811  m_mainFrame->slotSetStatusText(QString());
812 }
813 
814 void Akregator::MainWidget::slotArticleSelected(const Akregator::Article& article)
815 {
816  if (m_viewMode == CombinedView)
817  return;
818 
819  m_markReadTimer->stop();
820 
821  assert( article.isNull() || article.feed() );
822 
823  QList<Article> articles = m_selectionController->selectedArticles();
824  emit signalArticlesSelected( articles );
825 
826  KToggleAction* const maai = qobject_cast<KToggleAction*>( m_actionManager->action( "article_set_status_important" ) );
827  assert( maai );
828  maai->setChecked( article.keep() );
829 
830  m_articleViewer->showArticle( article );
831  if (m_selectionController->selectedArticles().count() == 0) {
832  m_articleListView->setCurrentIndex(m_selectionController->currentArticleIndex());
833  }
834 
835  if ( article.isNull() || article.status() == Akregator::Read )
836  return;
837 
838  if ( !Settings::useMarkReadDelay() )
839  return;
840 
841  const int delay = Settings::markReadDelay();
842 
843  if ( delay > 0 )
844  {
845  m_markReadTimer->start( delay * 1000 );
846  }
847  else
848  {
849  Akregator::ArticleModifyJob* job = new Akregator::ArticleModifyJob;
850  const Akregator::ArticleId aid = { article.feed()->xmlUrl(), article.guid() };
851  job->setStatus( aid, Akregator::Read );
852  job->start();
853  }
854 }
855 
856 void Akregator::MainWidget::slotMouseButtonPressed(int button, const KUrl& url)
857 {
858  if (button != Qt::MidButton)
859  return;
860 
861  if (!url.isValid())
862  return;
863 
864  OpenUrlRequest req(url);
865 
866  switch (Settings::mMBBehaviour())
867  {
868  case Settings::EnumMMBBehaviour::OpenInExternalBrowser:
869  req.setOptions(OpenUrlRequest::ExternalBrowser);
870  break;
871  case Settings::EnumMMBBehaviour::OpenInBackground:
872  req.setOptions(OpenUrlRequest::NewTab);
873  req.setOpenInBackground(true);
874  break;
875  default:
876  req.setOptions(OpenUrlRequest::NewTab);
877  req.setOpenInBackground(false);
878  }
879 
880  Kernel::self()->frameManager()->slotOpenUrlRequest(req);
881 }
882 
883 void Akregator::MainWidget::slotOpenHomepage()
884 {
885  Feed* feed = dynamic_cast<Feed *>( m_selectionController->selectedSubscription() );
886 
887  if (!feed)
888  return;
889 
890  KUrl url(feed->htmlUrl());
891 
892  if (url.isValid())
893  {
894  OpenUrlRequest req(feed->htmlUrl());
895  req.setOptions(OpenUrlRequest::ExternalBrowser);
896  Kernel::self()->frameManager()->slotOpenUrlRequest(req);
897  }
898 }
899 
900 void Akregator::MainWidget::slotOpenSelectedArticlesInBrowser()
901 {
902  const QList<Article> articles = m_selectionController->selectedArticles();
903 
904  Q_FOREACH( const Akregator::Article& article, articles )
905  slotOpenArticleInBrowser( article );
906 }
907 
908 void Akregator::MainWidget::slotOpenArticleInBrowser(const Akregator::Article& article)
909 {
910  if (!article.isNull() && article.link().isValid())
911  {
912  OpenUrlRequest req(article.link());
913  req.setOptions(OpenUrlRequest::ExternalBrowser);
914  Kernel::self()->frameManager()->slotOpenUrlRequest(req);
915  }
916 }
917 
918 
919 void Akregator::MainWidget::openSelectedArticles( bool openInBackground )
920 {
921  const QList<Article> articles = m_selectionController->selectedArticles();
922 
923  Q_FOREACH( const Akregator::Article& article, articles )
924  {
925  const KUrl url = article.link();
926  if ( !url.isValid() )
927  continue;
928 
929  OpenUrlRequest req( url );
930  req.setOptions( OpenUrlRequest::NewTab );
931  if( openInBackground ) {
932  req.setOpenInBackground( true );
933  Kernel::self()->frameManager()->slotOpenUrlRequest( req, false /*don't use settings for open in background*/ );
934  } else {
935  Kernel::self()->frameManager()->slotOpenUrlRequest( req );
936  }
937  }
938 
939 }
940 
941 void Akregator::MainWidget::slotCopyLinkAddress()
942 {
943  const Article article = m_selectionController->currentArticle();
944 
945  if(article.isNull())
946  return;
947 
948  QString link;
949  if (article.link().isValid())
950  {
951  link = article.link().url();
952  QClipboard *cb = QApplication::clipboard();
953  cb->setText(link, QClipboard::Clipboard);
954  // don't set url to selection as it's a no-no according to a fd.o spec
955  //cb->setText(link, QClipboard::Selection);
956  }
957 }
958 
959 void Akregator::MainWidget::slotFeedUrlDropped(KUrl::List &urls, TreeNode* after, Folder* parent)
960 {
961  Q_FOREACH ( const KUrl& i, urls )
962  addFeed( i.prettyUrl(), after, parent, false );
963 }
964 
965 void Akregator::MainWidget::slotToggleShowQuickFilter()
966 {
967  if ( Settings::showQuickFilter() )
968  {
969  Settings::setShowQuickFilter(false);
970  m_searchBar->slotClearSearch();
971  m_searchBar->hide();
972  }
973  else
974  {
975  Settings::setShowQuickFilter(true);
976  if (!m_displayingAboutPage)
977  m_searchBar->show();
978  }
979 
980 }
981 
982 void Akregator::MainWidget::slotArticleDelete()
983 {
984 
985  if ( m_viewMode == CombinedView )
986  return;
987 
988  const QList<Article> articles = m_selectionController->selectedArticles();
989 
990  QString msg;
991  switch (articles.count())
992  {
993  case 0:
994  return;
995  case 1:
996  msg = i18n("<qt>Are you sure you want to delete article <b>%1</b>?</qt>", Qt::escape(articles.first().title()));
997  break;
998  default:
999  msg = i18np("<qt>Are you sure you want to delete the selected article?</qt>", "<qt>Are you sure you want to delete the %1 selected articles?</qt>", articles.count());
1000  }
1001 
1002  if ( KMessageBox::warningContinueCancel( this,
1003  msg, i18n( "Delete Article" ),
1004  KStandardGuiItem::del(),
1005  KStandardGuiItem::cancel(),
1006  "Disable delete article confirmation" ) != KMessageBox::Continue )
1007  return;
1008 
1009  TreeNode* const selected = m_selectionController->selectedSubscription();
1010 
1011  if ( selected )
1012  selected->setNotificationMode( false );
1013 
1014  Akregator::ArticleDeleteJob* job = new Akregator::ArticleDeleteJob;
1015  Q_FOREACH( const Akregator::Article& i, articles )
1016  {
1017  Feed* const feed = i.feed();
1018  if ( !feed )
1019  continue;
1020  const Akregator::ArticleId aid = { feed->xmlUrl(), i.guid() };
1021  job->appendArticleId( aid );
1022  }
1023 
1024  job->start();
1025 
1026  if ( selected )
1027  selected->setNotificationMode( true );
1028 }
1029 
1030 void Akregator::MainWidget::slotFramesChanged()
1031 {
1032  // We need to wait till the frame is fully loaded
1033  QMetaObject::invokeMethod( m_part, "slotAutoSave", Qt::QueuedConnection );
1034 }
1035 
1036 void Akregator::MainWidget::slotArticleToggleKeepFlag( bool )
1037 {
1038  const QList<Article> articles = m_selectionController->selectedArticles();
1039 
1040  if (articles.isEmpty())
1041  return;
1042 
1043  bool allFlagsSet = true;
1044  Q_FOREACH ( const Akregator::Article& i, articles )
1045  {
1046  allFlagsSet = allFlagsSet && i.keep();
1047  if ( !allFlagsSet )
1048  break;
1049  }
1050 
1051  Akregator::ArticleModifyJob* job = new Akregator::ArticleModifyJob;
1052  Q_FOREACH ( const Akregator::Article& i, articles )
1053  {
1054  const Akregator::ArticleId aid = { i.feed()->xmlUrl(), i.guid() };
1055  job->setKeep( aid, !allFlagsSet );
1056  }
1057  job->start();
1058 }
1059 
1060 namespace {
1061 
1062 void setSelectedArticleStatus( const Akregator::AbstractSelectionController* controller, int status )
1063 {
1064  const QList<Akregator::Article> articles = controller->selectedArticles();
1065 
1066  if (articles.isEmpty())
1067  return;
1068 
1069  Akregator::ArticleModifyJob* job = new Akregator::ArticleModifyJob;
1070  Q_FOREACH ( const Akregator::Article& i, articles )
1071  {
1072  const Akregator::ArticleId aid = { i.feed()->xmlUrl(), i.guid() };
1073  job->setStatus( aid, status );
1074  }
1075  job->start();
1076 }
1077 
1078 }
1079 
1080 void Akregator::MainWidget::slotSetSelectedArticleRead()
1081 {
1082  ::setSelectedArticleStatus( m_selectionController, Akregator::Read );
1083 }
1084 
1085 void Akregator::MainWidget::slotTextToSpeechRequest()
1086 {
1087 
1088  if (Kernel::self()->frameManager()->currentFrame() == m_mainFrame)
1089  {
1090  if (m_viewMode != CombinedView)
1091  {
1092  // in non-combined view, read selected articles
1093  SpeechClient::self()->slotSpeak(m_selectionController->selectedArticles());
1094  // TODO: if article viewer has a selection, read only the selected text?
1095  }
1096  else
1097  {
1098  if (m_selectionController->selectedSubscription())
1099  {
1100  //TODO: read articles in current node, respecting quick filter!
1101  }
1102  }
1103  }
1104  else
1105  {
1106  // TODO: read selected page viewer
1107  }
1108 }
1109 
1110 void Akregator::MainWidget::slotSetSelectedArticleUnread()
1111 {
1112  ::setSelectedArticleStatus( m_selectionController, Akregator::Unread );
1113 }
1114 
1115 void Akregator::MainWidget::slotSetSelectedArticleNew()
1116 {
1117  ::setSelectedArticleStatus( m_selectionController, Akregator::New );
1118 }
1119 
1120 void Akregator::MainWidget::slotSetCurrentArticleReadDelayed()
1121 {
1122  const Article article = m_selectionController->currentArticle();
1123 
1124  if (article.isNull())
1125  return;
1126 
1127  Akregator::ArticleModifyJob* const job = new Akregator::ArticleModifyJob;
1128  const Akregator::ArticleId aid = { article.feed()->xmlUrl(), article.guid() };
1129  job->setStatus( aid, Akregator::Read );
1130  job->start();
1131 }
1132 
1133 void Akregator::MainWidget::slotMouseOverInfo(const KFileItem& kifi)
1134 {
1135  m_mainFrame->slotSetStatusText( kifi.isNull() ? QString() : kifi.url().prettyUrl() );
1136 }
1137 
1138 void Akregator::MainWidget::readProperties(const KConfigGroup &config)
1139 {
1140  if ( !Settings::resetQuickFilterOnNodeChange() )
1141  {
1142  // read filter settings
1143  m_searchBar->slotSetText(config.readEntry("searchLine"));
1144  m_searchBar->slotSetStatus(config.readEntry("searchCombo").toInt());
1145  }
1146  // Reopen tabs
1147  QStringList childList = config.readEntry( QString::fromLatin1( "Children" ),
1148  QStringList() );
1149  Q_FOREACH( const QString& framePrefix, childList )
1150  {
1151  BrowserFrame* const frame = new BrowserFrame(m_tabWidget);
1152  frame->loadConfig( config, framePrefix + QLatin1Char( '_' ) );
1153 
1154  connect( m_part, SIGNAL(signalSettingsChanged()), frame, SLOT(slotPaletteOrFontChanged()));
1155  connect( m_tabWidget, SIGNAL(signalZoomInFrame(int)), frame, SLOT(slotZoomIn(int)));
1156  connect( m_tabWidget, SIGNAL(signalZoomOutFrame(int)), frame, SLOT(slotZoomOut(int)));
1157 
1158  Kernel::self()->frameManager()->slotAddFrame(frame);
1159 
1160  }
1161 }
1162 
1163 void Akregator::MainWidget::saveProperties(KConfigGroup & config)
1164 {
1165  // save filter settings
1166  config.writeEntry("searchLine", m_searchBar->text());
1167  config.writeEntry("searchCombo", m_searchBar->status());
1168 
1169  Kernel::self()->frameManager()->saveProperties(config);
1170 }
1171 
1172 void Akregator::MainWidget::ensureArticleTabVisible()
1173 {
1174  m_tabWidget->setCurrentWidget( m_mainFrame );
1175 }
1176 
1177 void MainWidget::slotReloadAllTabs()
1178 {
1179  this->m_tabWidget->slotReloadAllTabs();
1180 }
1181 
1182 
1183 bool MainWidget::isNetworkAvailable()
1184 {
1185  return m_networkAvailable;
1186 }
1187 
1188 void MainWidget::slotNetworkStatusChanged(Solid::Networking::Status status)
1189 {
1190  if(status==Solid::Networking::Connected || Solid::Networking::status() == Solid::Networking::Unknown)
1191  {
1192  m_networkAvailable=true;
1193  m_mainFrame->slotSetStatusText(i18n("Networking is available now."));
1194  this->slotFetchAllFeeds();
1195  }
1196  else if(Solid::Networking::Unconnected)
1197  {
1198  m_networkAvailable=false;
1199  m_mainFrame->slotSetStatusText(i18n("Networking is not available."));
1200  }
1201 }
1202 
1203 void Akregator::MainWidget::slotOpenSelectedArticles()
1204 {
1205  openSelectedArticles( false );
1206 }
1207 
1208 
1209 void Akregator::MainWidget::slotOpenSelectedArticlesInBackground()
1210 {
1211  openSelectedArticles( true );
1212 }
1213 
1214 
1215 #include "mainwidget.moc"
treenode.h
Akregator::DeleteSubscriptionCommand
Definition: deletesubscriptioncommand.h:38
Akregator::FrameManager::slotOpenUrlRequest
void slotOpenUrlRequest(Akregator::OpenUrlRequest &request, bool useOpenInBackgroundSetting=true)
Definition: framemanager.cpp:303
Akregator::Frame
Definition: frame.h:53
Akregator::ArticleModifyJob::setStatus
void setStatus(const ArticleId &id, int status)
Definition: articlejobs.cpp:98
Akregator::ArticleViewer
Definition: articleviewer.h:55
Akregator::BrowserFrame::loadConfig
void loadConfig(const KConfigGroup &config, const QString &prefix)
Load a frame from a config file for session management.
Definition: browserframe.cpp:435
Akregator::ActionManagerImpl::initTabWidget
void initTabWidget(TabWidget *tabWidget)
Definition: actionmanagerimpl.cpp:526
Akregator::ArticleModifyJob::start
void start()
Definition: articlejobs.cpp:108
Akregator::FeedListManagementInterface::setInstance
static void setInstance(FeedListManagementInterface *)
Definition: feedlistmanagementinterface.cpp:36
Akregator::MainWidget::saveProperties
void saveProperties(KConfigGroup &config)
Definition: mainwidget.cpp:1163
speechclient.h
types.h
Akregator::CreateFolderCommand::setRootFolder
void setRootFolder(Folder *rootFolder)
Definition: createfoldercommand.cpp:111
Akregator::SearchBar::slotSetStatus
void slotSetStatus(int status)
Definition: searchbar.cpp:149
Akregator::MainWidget::slotDoIntervalFetches
void slotDoIntervalFetches()
Definition: mainwidget.cpp:768
Akregator::MainWidget::slotFeedUrlDropped
void slotFeedUrlDropped(KUrl::List &urls, Akregator::TreeNode *after, Akregator::Folder *parent)
called when URLs are dropped into the tree view
Definition: mainwidget.cpp:959
openurlrequest.h
Akregator::MainWidget::saveSettings
void saveSettings()
saves settings.
Definition: mainwidget.cpp:342
Akregator::MainWidget::ensureArticleTabVisible
void ensureArticleTabVisible()
Definition: mainwidget.cpp:1172
Akregator::OpenUrlRequest
Definition: openurlrequest.h:42
Akregator::Frame::url
virtual KUrl url() const =0
returns the URL of the embedded part
Akregator::MainWidget::addFeed
void addFeed(const QString &url, TreeNode *after, Folder *parent, bool autoExec=true)
Definition: mainwidget.cpp:669
Akregator::FetchQueue::slotAbort
void slotAbort()
aborts currently fetching feeds and empties the queue
Definition: fetchqueue.cpp:55
feedlist.h
Akregator::MainWidget::slotFeedAdd
void slotFeedAdd()
adds a new feed to the feed tree
Definition: mainwidget.cpp:650
Akregator::CreateFeedCommand::setAutoExecute
void setAutoExecute(bool autoexec)
Definition: createfeedcommand.cpp:177
Akregator::MainWidget::slotFeedModify
void slotFeedModify()
calls the properties dialog for feeds, starts renaming for feed groups
Definition: mainwidget.cpp:705
articlelistview.h
Akregator::MainWidget::slotFeedAddGroup
void slotFeedAddGroup()
adds a feed group to the feed tree
Definition: mainwidget.cpp:681
Akregator::MainWidget::slotCombinedView
void slotCombinedView()
switches view mode to combined view
Definition: mainwidget.cpp:542
Akregator::FeedListManagementImpl
Definition: feedlist.h:59
Akregator::CreateFolderCommand::setSubscriptionListView
void setSubscriptionListView(SubscriptionListView *view)
Definition: createfoldercommand.cpp:101
Akregator::ArticleViewer::displayAboutPage
void displayAboutPage()
Definition: articleviewer.cpp:669
Akregator::MainWidget::slotMoveCurrentNodeLeft
void slotMoveCurrentNodeLeft()
Definition: mainwidget.cpp:586
Akregator::CreateFeedCommand::setPosition
void setPosition(Folder *parent, TreeNode *after)
Definition: createfeedcommand.cpp:171
articleviewer.h
Akregator::Article::link
KUrl link() const
Definition: article.cpp:447
kernel.h
Akregator::SelectionController
Definition: selectioncontroller.h:41
Akregator::MainWidget::~MainWidget
~MainWidget()
destructor.
Definition: mainwidget.cpp:95
Akregator::CreateFeedCommand::setSubscriptionListView
void setSubscriptionListView(SubscriptionListView *view)
Definition: createfeedcommand.cpp:156
Akregator::MainWidget::importFeedList
void importFeedList(const QDomDocument &doc)
Adds the feeds in doc to the "Imported Folder".
Definition: mainwidget.cpp:414
Akregator::Settings::useMarkReadDelay
static bool useMarkReadDelay()
Get Delay Mark Read.
Definition: akregatorconfig.h:885
Akregator::MainWidget::setFeedList
void setFeedList(const boost::shared_ptr< FeedList > &feedList)
Definition: mainwidget.cpp:423
Akregator::TreeNode::title
QString title() const
Get title of node.
Definition: treenode.cpp:87
QWidget
Akregator::ActionManagerImpl::initMainWidget
void initMainWidget(MainWidget *mainWidget)
Definition: actionmanagerimpl.cpp:198
articlejobs.h
Akregator::MainWidget::slotToggleShowQuickFilter
void slotToggleShowQuickFilter()
toggles the visibility of the filter bar
Definition: mainwidget.cpp:965
Akregator::OpenUrlRequest::setOpenInBackground
void setOpenInBackground(bool background)
Definition: openurlrequest.cpp:60
Akregator::SpeechClient::self
static SpeechClient * self()
Definition: speechclient.cpp:53
Akregator::MainWidget::slotCopyLinkAddress
void slotCopyLinkAddress()
copies the link of current article to clipboard
Definition: mainwidget.cpp:941
browserframe.h
Akregator::TreeNode::unread
virtual int unread() const =0
The unread count, returns the number of new/unread articles in the node (for groups: the accumulated ...
Akregator::MainWidget::slotMoveCurrentNodeDown
void slotMoveCurrentNodeDown()
Definition: mainwidget.cpp:570
Status
Status
Definition: akregatorstorageexporter.cpp:64
Akregator::MainWidget::slotSetSelectedArticleUnread
void slotSetSelectedArticleUnread()
marks the currently selected article as unread
Definition: mainwidget.cpp:1110
Akregator::Kernel::setFeedList
void setFeedList(const boost::shared_ptr< FeedList > &feedList)
Definition: kernel.cpp:88
Akregator::Settings::setShowQuickFilter
static void setShowQuickFilter(bool v)
Set Show Quick Filter.
Definition: akregatorconfig.h:39
Akregator::FolderExpansionHandler
Definition: subscriptionlistmodel.h:134
Akregator::Settings::mMBBehaviour
static int mMBBehaviour()
Get MMB Behaviour.
Definition: akregatorconfig.h:771
Akregator::CreateFolderCommand
Definition: createfoldercommand.h:36
Akregator::FrameManager::saveProperties
void saveProperties(KConfigGroup &config)
session management
Definition: framemanager.cpp:373
Akregator::MainWidget::slotSetCurrentArticleReadDelayed
void slotSetCurrentArticleReadDelayed()
marks the currenctly selected article as read after a user-set delay
Definition: mainwidget.cpp:1120
Akregator::MainWidget::slotOpenSelectedArticles
void slotOpenSelectedArticles()
opens current article in new tab, background/foreground depends on settings TODO: use selected instea...
Definition: mainwidget.cpp:1203
Akregator::AbstractSelectionController::selectedArticles
virtual QList< Akregator::Article > selectedArticles() const =0
Akregator::Kernel::frameManager
FrameManager * frameManager()
Definition: kernel.cpp:98
Akregator::Part
This is a RSS Aggregator "Part".
Definition: akregator_part.h:76
importfeedlistcommand.h
Akregator::MainWidget::sendArticle
void sendArticle(bool attach=false)
Definition: mainwidget.cpp:368
Akregator::Folder::removeChild
void removeChild(TreeNode *node)
remove node from children.
Definition: folder.cpp:249
Akregator::MainWidget::isNetworkAvailable
bool isNetworkAvailable()
Definition: mainwidget.cpp:1183
Akregator::ActionManagerImpl::initFrameManager
void initFrameManager(FrameManager *frameManager)
Definition: actionmanagerimpl.cpp:585
Akregator::MainWidget::slotMouseOverInfo
void slotMouseOverInfo(const KFileItem &kifi)
displays a URL in the status bar when the user moves the mouse over a link
Definition: mainwidget.cpp:1133
Akregator::CreateFolderCommand::setSelectedSubscription
void setSelectedSubscription(TreeNode *selected)
Definition: createfoldercommand.cpp:106
Akregator::AbstractSelectionController
Definition: abstractselectioncontroller.h:92
Akregator::MainWidget::slotMarkAllRead
void slotMarkAllRead()
marks all articles in the currently selected feed as read
Definition: mainwidget.cpp:754
Akregator::EditSubscriptionCommand
Definition: editsubscriptioncommand.h:37
Akregator::MainWidget::slotArticleToggleKeepFlag
void slotArticleToggleKeepFlag(bool enabled)
toggles the keep flag of the currently selected article
Definition: mainwidget.cpp:1036
Akregator::New
article was fetched in the last fetch of it's feed and not read yet.
Definition: types.h:33
Akregator::MainWidget::slotOpenHomepage
void slotOpenHomepage()
opens the homepage of the currently selected feed
Definition: mainwidget.cpp:883
feed.h
Akregator::ProgressManager::setFeedList
void setFeedList(const boost::shared_ptr< FeedList > &feedList)
sets the feed list to be managed
Definition: progressmanager.cpp:69
Akregator::SubscriptionListView
Definition: subscriptionlistview.h:39
createfeedcommand.h
Akregator::CreateFeedCommand::setUrl
void setUrl(const QString &url)
Definition: createfeedcommand.cpp:166
Akregator::CreateFeedCommand
Definition: createfeedcommand.h:37
Akregator::Settings::EnumMMBBehaviour::OpenInBackground
Definition: akregatorconfig.h:29
Akregator::TreeNode::parent
virtual const Folder * parent() const
Returns the parent node.
Definition: treenode.cpp:141
treenodevisitor.h
Akregator::FeedList
The model of a feed tree, represents an OPML document.
Definition: feedlist.h:77
Akregator::Settings::markReadDelay
static int markReadDelay()
Get Mark Read Delay.
Definition: akregatorconfig.h:904
Akregator::MainWidget::slotSetTotalUnread
void slotSetTotalUnread()
emits signalUnreadCountChanged(int)
Definition: mainwidget.cpp:763
Akregator::ArticleListView
Definition: articlelistview.h:90
Akregator::MainWidget::slotWidescreenView
void slotWidescreenView()
switches view mode to widescreen view
Definition: mainwidget.cpp:519
Akregator::EditSubscriptionCommand::setSubscriptionListView
void setSubscriptionListView(SubscriptionListView *view)
Definition: editsubscriptioncommand.cpp:133
Akregator::MainWidget::slotSetSelectedArticleRead
void slotSetSelectedArticleRead()
marks the currently selected article as read
Definition: mainwidget.cpp:1080
Akregator::Article::feed
Feed * feed() const
Definition: article.cpp:508
Akregator::MainWidget::slotTextToSpeechRequest
void slotTextToSpeechRequest()
reads the currently selected articles using KTTSD
Definition: mainwidget.cpp:1085
Akregator::EditSubscriptionCommand::setSubscription
void setSubscription(const boost::shared_ptr< FeedList > &feedList, int subId)
Definition: editsubscriptioncommand.cpp:112
Akregator::Article::isNull
bool isNull() const
Definition: article.cpp:253
Akregator::MainWidget::MainWidget
MainWidget(Akregator::Part *part, QWidget *parent, ActionManagerImpl *actionManager, const char *name)
constructor
Definition: mainwidget.cpp:104
Akregator::MainWidget::slotFetchingStopped
void slotFetchingStopped()
Definition: mainwidget.cpp:807
tabwidget.h
Akregator::Settings::setViewMode
static void setViewMode(int v)
Set View Mode.
Definition: akregatorconfig.h:96
Akregator::Command::setParentWidget
void setParentWidget(QWidget *parentWidget)
Definition: command.cpp:59
Akregator::Frame::slotSetStatusText
void slotSetStatusText(const QString &)
Definition: frame.cpp:63
Akregator::Article::title
QString title() const
Definition: article.cpp:374
Akregator::MainWidget::slotReloadAllTabs
void slotReloadAllTabs()
reloads all open tabs
Definition: mainwidget.cpp:1177
Akregator::MainWidget::slotOpenSelectedArticlesInBackground
void slotOpenSelectedArticlesInBackground()
Definition: mainwidget.cpp:1209
Akregator::ExpireItemsCommand::setFeedList
void setFeedList(const boost::weak_ptr< FeedList > &feedList)
Definition: expireitemscommand.cpp:113
Akregator::ActionManagerImpl
Akregator-specific implementation of the ActionManager interface.
Definition: actionmanagerimpl.h:50
akregatorconfig.h
Akregator::Frame::id
int id() const
Definition: frame.cpp:112
feedpropertiesdialog.h
akregator_part.h
Akregator::Frame::Started
Definition: frame.h:61
Akregator::Settings::viewMode
static int viewMode()
Get View Mode.
Definition: akregatorconfig.h:106
Akregator::Kernel::self
static Kernel * self()
Definition: kernel.cpp:40
Akregator::MainWidget::slotOnShutdown
void slotOnShutdown()
Definition: mainwidget.cpp:317
Akregator::ActionManagerImpl::initArticleListView
void initArticleListView(ArticleListView *articleList)
Definition: actionmanagerimpl.cpp:447
progressmanager.h
Akregator::MainFrame
Definition: frame.h:174
Akregator::Folder::appendChild
void appendChild(TreeNode *node)
inserts node as last child
Definition: folder.cpp:215
Akregator::Article::keep
bool keep() const
if true, the article should be kept even when expired
Definition: article.cpp:495
Akregator::ArticleModifyJob
Definition: articlejobs.h:86
Akregator::Read
article is read
Definition: types.h:32
subscriptionlistview.h
fetchqueue.h
editsubscriptioncommand.h
Akregator::MainWidget::readProperties
void readProperties(const KConfigGroup &config)
session management
Definition: mainwidget.cpp:1138
Akregator::Feed::xmlUrl
QString xmlUrl() const
returns the url of the actual feed source (rss/rdf/atom file)
Definition: feed.cpp:374
Akregator::Settings::showQuickFilter
static bool showQuickFilter()
Get Show Quick Filter.
Definition: akregatorconfig.h:49
Akregator::MainWidget::slotDeleteExpiredArticles
void slotDeleteExpiredArticles()
Definition: mainwidget.cpp:459
Akregator::ArticleDeleteJob::start
void start()
Definition: articlejobs.cpp:58
Akregator::Folder::children
QList< const TreeNode * > children() const
returns the (direct) children of this node.
Definition: folder.cpp:124
Akregator::TabWidget
Definition: tabwidget.h:38
Akregator::Frame::slotSetTitle
void slotSetTitle(const QString &)
Definition: frame.cpp:42
Akregator::ImportFeedListCommand
Definition: importfeedlistcommand.h:38
Akregator::Frame::Completed
Definition: frame.h:61
Akregator::Settings::EnumMMBBehaviour::OpenInExternalBrowser
Definition: akregatorconfig.h:29
Akregator::AbstractSelectionController::setFeedSelector
virtual void setFeedSelector(QAbstractItemView *feedSelector)=0
Akregator::MainWidget::slotOpenSelectedArticlesInBrowser
void slotOpenSelectedArticlesInBrowser()
opens the current article (currentItem) in external browser TODO: use selected instead of current...
Definition: mainwidget.cpp:900
Akregator::MainWidget::slotFeedRemove
void slotFeedRemove()
removes the currently selected feed (ask for confirmation)
Definition: mainwidget.cpp:691
Akregator::MainWidget::slotFetchAllFeeds
void slotFetchAllFeeds()
starts fetching of all feeds in the tree
Definition: mainwidget.cpp:792
Akregator::Settings::textFilter
static QString textFilter()
Get Text Filter.
Definition: akregatorconfig.h:87
Akregator::MainWidget::CombinedView
Definition: mainwidget.h:121
Akregator::Feed::htmlUrl
QString htmlUrl() const
returns the URL of the HTML page of this feed
Definition: feed.cpp:383
Akregator::TabWidget::slotReloadAllTabs
void slotReloadAllTabs()
Definition: tabwidget.cpp:418
Akregator::ArticleId
Definition: articlejobs.h:46
Akregator::MainWidget::slotArticleDelete
void slotArticleDelete()
deletes the currently selected article
Definition: mainwidget.cpp:982
Akregator::MainWidget::slotFetchingStarted
void slotFetchingStarted()
Definition: mainwidget.cpp:800
Akregator::SearchBar::slotSetText
void slotSetText(const QString &text)
Definition: searchbar.cpp:155
Akregator::Article::guid
QString guid() const
Definition: article.cpp:463
Akregator::MainWidget::slotMoveCurrentNodeUp
void slotMoveCurrentNodeUp()
Definition: mainwidget.cpp:554
Akregator::Settings::resetQuickFilterOnNodeChange
static bool resetQuickFilterOnNodeChange()
Get Reset Quick Filter On Node Change.
Definition: akregatorconfig.h:923
Akregator::OpenUrlRequest::ExternalBrowser
open in external browser
Definition: openurlrequest.h:54
Akregator::MainWidget::slotNetworkStatusChanged
void slotNetworkStatusChanged(Solid::Networking::Status status)
Definition: mainwidget.cpp:1188
Akregator::OpenUrlRequest::setOptions
void setOptions(Options options)
Definition: openurlrequest.cpp:99
Akregator::Frame::title
QString title() const
Definition: frame.cpp:141
Akregator::ExpireItemsCommand
Definition: expireitemscommand.h:38
selectioncontroller.h
Akregator::MainWidget::WidescreenView
Definition: mainwidget.h:120
Akregator::AbstractSelectionController::setArticleLister
virtual void setArticleLister(Akregator::ArticleLister *lister)=0
folder.h
Akregator::MainWidget::addFeedToGroup
void addFeedToGroup(const QString &url, const QString &group)
Add a feed to a group.
Definition: mainwidget.cpp:473
mainwidget.h
Akregator::MainWidget::slotNormalView
void slotNormalView()
switches view mode to normal view
Definition: mainwidget.cpp:496
Akregator::MainWidget::slotArticleSelected
void slotArticleSelected(const Akregator::Article &)
the article selection has changed
Definition: mainwidget.cpp:814
Akregator::Settings::splitter2Sizes
static QList< int > splitter2Sizes()
Get Sizes for second splitter.
Definition: akregatorconfig.h:144
Akregator::MainWidget::slotPrevUnreadArticle
void slotPrevUnreadArticle()
selects the previous unread article in the article list
Definition: mainwidget.cpp:732
Akregator::TreeNode::nextSibling
virtual const TreeNode * nextSibling() const
Get the next sibling.
Definition: treenode.cpp:112
Akregator::MainWidget::slotMoveCurrentNodeRight
void slotMoveCurrentNodeRight()
Definition: mainwidget.cpp:600
Akregator::MainWidget::slotMarkAllFeedsRead
void slotMarkAllFeedsRead()
marks all articles in all feeds in the tree as read
Definition: mainwidget.cpp:747
Akregator::MainWidget::slotFetchCurrentFeed
void slotFetchCurrentFeed()
fetches the currently selected feed
Definition: mainwidget.cpp:782
Akregator::CreateFeedCommand::setRootFolder
void setRootFolder(Folder *rootFolder)
Definition: createfeedcommand.cpp:161
Akregator::ArticleDeleteJob
Definition: articlejobs.h:67
Akregator::FrameManager::currentFrame
Frame * currentFrame() const
Definition: framemanager.cpp:69
Akregator::Unread
article wasn't read yet by the user
Definition: types.h:31
actionmanagerimpl.h
Akregator::TreeNode::isGroup
virtual bool isGroup() const =0
Helps the rest of the app to decide if node should be handled as group or not.
Akregator::Settings::statusFilter
static int statusFilter()
Get Status Filter.
Definition: akregatorconfig.h:68
Akregator::MainWidget::feedListToOPML
QDomDocument feedListToOPML()
Definition: mainwidget.cpp:464
Akregator::ActionManagerImpl::initArticleViewer
void initArticleViewer(ArticleViewer *articleViewer)
Definition: actionmanagerimpl.cpp:427
Akregator::Feed
represents a feed
Definition: feed.h:52
searchbar.h
Akregator::Folder
Represents a folder (containing feeds and/or other folders)
Definition: folder.h:44
Akregator::ArticleDeleteJob::appendArticleId
void appendArticleId(const Akregator::ArticleId &id)
Definition: articlejobs.cpp:52
Akregator::MainWidget::slotSetSelectedArticleNew
void slotSetSelectedArticleNew()
marks the currently selected article as new
Definition: mainwidget.cpp:1115
Akregator::Settings::setSplitter2Sizes
static void setSplitter2Sizes(const QList< int > &v)
Set Sizes for second splitter.
Definition: akregatorconfig.h:134
Akregator::DeleteSubscriptionCommand::setSubscription
void setSubscription(const boost::weak_ptr< FeedList > &feedList, int subId)
Definition: deletesubscriptioncommand.cpp:148
Akregator::TreeNode::prevSibling
virtual const TreeNode * prevSibling() const
Get the previous sibling.
Definition: treenode.cpp:132
Akregator::ProgressManager::self
static ProgressManager * self()
Definition: progressmanager.cpp:51
Akregator::ExpireItemsCommand::setFeeds
void setFeeds(const QVector< int > &feeds)
Definition: expireitemscommand.cpp:123
Akregator::MainWidget::slotFramesChanged
void slotFramesChanged()
Definition: mainwidget.cpp:1030
Akregator::Settings::setSplitter1Sizes
static void setSplitter1Sizes(const QList< int > &v)
Set Sizes for first splitter.
Definition: akregatorconfig.h:115
Akregator::Article
A proxy class for Syndication::ItemPtr with some additional methods to assist sorting.
Definition: article.h:61
Akregator::Command::start
void start()
Definition: command.cpp:64
Akregator::Article::status
int status() const
Definition: article.cpp:338
Akregator::FrameManager::slotAddFrame
void slotAddFrame(Frame *frame)
Definition: framemanager.cpp:74
subscriptionlistjobs.h
Akregator::OpenUrlRequest::NewTab
open in new tab
Definition: openurlrequest.h:53
notificationmanager.h
Akregator::ArticleViewer::part
KParts::ReadOnlyPart * part() const
Definition: articleviewer.cpp:158
Akregator::AbstractSelectionController::setFolderExpansionHandler
virtual void setFolderExpansionHandler(Akregator::FolderExpansionHandler *handler)=0
Akregator::MainWidget::slotMouseButtonPressed
void slotMouseButtonPressed(int button, const KUrl &)
special behaviour in article list view (TODO: move code there?)
Definition: mainwidget.cpp:856
Akregator::Settings::self
static Settings * self()
Definition: akregatorconfig.cpp:23
Akregator::MainWidget::slotRequestNewFrame
void slotRequestNewFrame(int &frameId)
Definition: mainwidget.cpp:355
Akregator::BrowserFrame
Definition: browserframe.h:49
createfoldercommand.h
framemanager.h
Akregator::SearchBar
Definition: searchbar.h:43
subscriptionlistmodel.h
Akregator::TreeNode
Abstract base class for all kind of elements in the feed tree, like feeds and feed groups (and search...
Definition: treenode.h:59
Akregator::TreeNode::id
virtual uint id() const
returns the ID of this node.
Definition: treenode.cpp:198
Akregator::Folder::insertChild
void insertChild(TreeNode *node, TreeNode *after)
inserts node as child after child node after.
Definition: folder.cpp:180
Akregator::ActionManagerImpl::initSubscriptionListView
void initSubscriptionListView(SubscriptionListView *subscriptionListView)
Definition: actionmanagerimpl.cpp:464
addfeeddialog.h
KJob
Akregator::ArticleModifyJob::setKeep
void setKeep(const ArticleId &id, bool keep)
Definition: articlejobs.cpp:103
Akregator::Settings::splitter1Sizes
static QList< int > splitter1Sizes()
Get Sizes for first splitter.
Definition: akregatorconfig.h:125
Akregator::SpeechClient::slotSpeak
void slotSpeak(const QString &text, const QString &language)
Definition: speechclient.cpp:74
Akregator::TreeNode::setNotificationMode
virtual void setNotificationMode(bool doNotify)
Definition: treenode.cpp:178
expireitemscommand.h
Akregator::MainWidget::slotOpenArticleInBrowser
void slotOpenArticleInBrowser(const Akregator::Article &article)
opens the link of an article in the external browser
Definition: mainwidget.cpp:908
QList< int >
deletesubscriptioncommand.h
Akregator::MainWidget::slotNodeSelected
void slotNodeSelected(Akregator::TreeNode *node)
selected tree node has changed
Definition: mainwidget.cpp:616
Akregator::MainWidget::slotNextUnreadArticle
void slotNextUnreadArticle()
selects the next unread article in the article list
Definition: mainwidget.cpp:717
Akregator::Kernel::fetchQueue
FetchQueue * fetchQueue()
Definition: kernel.cpp:93
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:58:14 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

akregator

Skip menu "akregator"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdepim API Reference

Skip menu "kdepim API Reference"
  • akonadi_next
  • akregator
  • blogilo
  • calendarsupport
  • console
  •   kabcclient
  •   konsolekalendar
  • kaddressbook
  • kalarm
  •   lib
  • kdgantt2
  • kjots
  • kleopatra
  • kmail
  • knode
  • knotes
  • kontact
  • korgac
  • korganizer
  • ktimetracker
  • libkdepim
  • libkleo
  • libkpgp
  • mailcommon
  • messagelist
  • messageviewer

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal