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

akregator

  • sources
  • kde-4.14
  • kdepim
  • akregator
  • src
articleviewer.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Akregator.
3 
4  Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
5  2005 Frank Osterfeld <osterfeld@kde.org>
6 
7  This program is free software; you can redistribute it and/or modify
8  it under the terms of the GNU General Public License as published by
9  the Free Software Foundation; either version 2 of the License, or
10  (at your option) any later version.
11 
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  GNU General Public License for more details.
16 
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 
21  As a special exception, permission is given to link this program
22  with any edition of Qt, and distribute the resulting executable,
23  without including the source code for Qt in the source distribution.
24 */
25 
26 #include "articleviewer.h"
27 #include "akregatorconfig.h"
28 #include "aboutdata.h"
29 #include "actionmanager.h"
30 #include "actions.h"
31 #include "article.h"
32 #include "articleformatter.h"
33 #include "articlejobs.h"
34 #include "articlematcher.h"
35 #include "feed.h"
36 #include "folder.h"
37 #include "treenode.h"
38 #include "utils.h"
39 #include "openurlrequest.h"
40 
41 #include "kdepim-version.h"
42 
43 #include <kpimutils/kfileio.h>
44 
45 #include <kaction.h>
46 #include <kactioncollection.h>
47 #include <kapplication.h>
48 #include <kfiledialog.h>
49 #include <khtmlview.h>
50 #include <kicon.h>
51 #include <kiconloader.h>
52 #include <klocale.h>
53 #include <kmenu.h>
54 #include <kmessagebox.h>
55 #include <krun.h>
56 #include <kshell.h>
57 #include <kstandarddirs.h>
58 #include <kstandardaction.h>
59 #include <ktoolinvocation.h>
60 #include <kurl.h>
61 #include <kglobalsettings.h>
62 #include <kparts/browserextension.h>
63 #include <kparts/browserrun.h>
64 
65 #include <QClipboard>
66 #include <QGridLayout>
67 
68 #ifndef Q_MOC_RUN
69 #include <boost/bind.hpp>
70 #endif
71 
72 #include <memory>
73 #include <cassert>
74 
75 using namespace boost;
76 using namespace Akregator;
77 using namespace Akregator::Filters;
78 
79 namespace Akregator {
80 
81 ArticleViewer::ArticleViewer(QWidget *parent)
82  : QWidget(parent),
83  m_url(0),
84  m_htmlFooter(),
85  m_currentText(),
86  m_imageDir( KUrl::fromPath( KGlobal::dirs()->saveLocation("cache", "akregator/Media/" ) ) ),
87  m_node(0),
88  m_viewMode(NormalView),
89  m_part( new ArticleViewerPart( this ) ),
90  m_normalViewFormatter( new DefaultNormalViewFormatter( m_imageDir, m_part->view() ) ),
91  m_combinedViewFormatter( new DefaultCombinedViewFormatter( m_imageDir, m_part->view() ) )
92 {
93  QGridLayout* layout = new QGridLayout(this);
94  layout->setMargin(0);
95  layout->addWidget(m_part->widget(), 0, 0);
96 
97  setFocusProxy( m_part->widget() );
98 
99  m_part->setFontScaleFactor(100);
100  m_part->setZoomFactor(100);
101  m_part->setJScriptEnabled(false);
102  m_part->setJavaEnabled(false);
103  m_part->setMetaRefreshEnabled(false);
104  m_part->setPluginsEnabled(false);
105  m_part->setDNDEnabled(true);
106  m_part->setAutoloadImages(true);
107  m_part->setStatusMessagesEnabled(false);
108  m_part->view()->setAttribute(Qt::WA_InputMethodEnabled, true); //workaround to fix 216878
109  m_part->view()->setFrameStyle( QFrame::StyledPanel|QFrame::Sunken );
110 
111  // change the cursor when loading stuff...
112  connect( m_part, SIGNAL(started(KIO::Job*)),
113  this, SLOT(slotStarted(KIO::Job*)));
114  connect( m_part, SIGNAL(completed()),
115  this, SLOT(slotCompleted()));
116 
117  KParts::BrowserExtension* ext = m_part->browserExtension();
118  connect(ext, SIGNAL(popupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags,KParts::BrowserExtension::ActionGroupMap)),
119  this, SLOT(slotPopupMenu(QPoint,KUrl,mode_t,KParts::OpenUrlArguments,KParts::BrowserArguments,KParts::BrowserExtension::PopupFlags))); // ActionGroupMap argument removed, unused by slot
120 
121  connect( ext, SIGNAL(openUrlRequestDelayed(KUrl,KParts::OpenUrlArguments,KParts::BrowserArguments)),
122  this, SLOT(slotOpenUrlRequestDelayed(KUrl,KParts::OpenUrlArguments,KParts::BrowserArguments)) );
123 
124  connect(ext, SIGNAL(createNewWindow(KUrl,
125  KParts::OpenUrlArguments,
126  KParts::BrowserArguments,
127  KParts::WindowArgs,
128  KParts::ReadOnlyPart**)),
129  this, SLOT(slotCreateNewWindow(KUrl,
130  KParts::OpenUrlArguments,
131  KParts::BrowserArguments,
132  KParts::WindowArgs,
133  KParts::ReadOnlyPart**)));
134 
135  KAction* action = 0;
136 
137  action = m_part->actionCollection()->addAction("copylinkaddress");
138  action->setText(i18n("Copy &Link Address"));
139  connect(action, SIGNAL(triggered(bool)), SLOT(slotCopyLinkAddress()));
140 
141  action = m_part->actionCollection()->addAction("savelinkas");
142  action->setText(i18n("&Save Link As..."));
143  connect(action, SIGNAL(triggered(bool)), SLOT(slotSaveLinkAs()));
144 
145  updateCss();
146 
147  connect(this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()));
148 
149  connect(KGlobalSettings::self(), SIGNAL(kdisplayPaletteChanged()), this, SLOT(slotPaletteOrFontChanged()) );
150  connect(KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()), this, SLOT(slotPaletteOrFontChanged()) );
151 
152  m_htmlFooter = "</body></html>";
153 }
154 
155 ArticleViewer::~ArticleViewer()
156 {
157 }
158 
159 KParts::ReadOnlyPart* ArticleViewer::part() const
160 {
161  return m_part;
162 }
163 
164 int ArticleViewer::pointsToPixel(int pointSize) const
165 {
166  return ( pointSize * m_part->view()->logicalDpiY() + 36 ) / 72 ;
167 }
168 
169 void ArticleViewer::slotOpenUrlRequestDelayed(const KUrl& url, const KParts::OpenUrlArguments& args, const KParts::BrowserArguments& browserArgs)
170 {
171  OpenUrlRequest req(url);
172  req.setArgs(args);
173  req.setBrowserArgs(browserArgs);
174  if (req.options() == OpenUrlRequest::None) // no explicit new window,
175  req.setOptions(OpenUrlRequest::NewTab); // so must open new tab
176 
177  if (m_part->button() == Qt::LeftButton)
178  {
179  switch (Settings::lMBBehaviour())
180  {
181  case Settings::EnumLMBBehaviour::OpenInExternalBrowser:
182  req.setOptions(OpenUrlRequest::ExternalBrowser);
183  break;
184  case Settings::EnumLMBBehaviour::OpenInBackground:
185  req.setOpenInBackground(true);
186  break;
187  default:
188  break;
189  }
190  }
191  else if (m_part->button() == Qt::MidButton)
192  {
193  switch (Settings::mMBBehaviour())
194  {
195  case Settings::EnumMMBBehaviour::OpenInExternalBrowser:
196  req.setOptions(OpenUrlRequest::ExternalBrowser);
197  break;
198  case Settings::EnumMMBBehaviour::OpenInBackground:
199  req.setOpenInBackground(true);
200  break;
201  default:
202  break;
203  }
204  }
205 
206  emit signalOpenUrlRequest(req);
207 }
208 
209 void ArticleViewer::slotCreateNewWindow(const KUrl& url,
210  const KParts::OpenUrlArguments& args,
211  const KParts::BrowserArguments& browserArgs,
212  const KParts::WindowArgs& /*windowArgs*/,
213  KParts::ReadOnlyPart** part)
214 {
215  OpenUrlRequest req;
216  req.setUrl(url);
217  req.setArgs(args);
218  req.setBrowserArgs(browserArgs);
219  req.setOptions(OpenUrlRequest::NewTab);
220 
221  emit signalOpenUrlRequest(req);
222  if ( part )
223  *part = req.part();
224 }
225 
226 void ArticleViewer::slotPopupMenu(const QPoint& p, const KUrl& kurl, mode_t, const KParts::OpenUrlArguments&, const KParts::BrowserArguments&, KParts::BrowserExtension::PopupFlags kpf)
227 {
228  const bool isLink = (kpf & KParts::BrowserExtension::ShowNavigationItems) == 0; // ## why not use kpf & IsLink ?
229  const bool isSelection = (kpf & KParts::BrowserExtension::ShowTextSelectionItems) != 0;
230 
231  QString url = kurl.url();
232 
233  m_url = url;
234  KMenu popup;
235 
236  if (isLink && !isSelection)
237  {
238  popup.addAction( createOpenLinkInNewTabAction( kurl, this, SLOT(slotOpenLinkInForegroundTab()), &popup ) );
239  popup.addAction( createOpenLinkInExternalBrowserAction( kurl, this, SLOT(slotOpenLinkInBrowser()), &popup ) );
240  popup.addSeparator();
241  popup.addAction( m_part->action("savelinkas") );
242  popup.addAction( m_part->action("copylinkaddress") );
243  }
244  else
245  {
246  if (isSelection)
247  {
248  popup.addAction( ActionManager::getInstance()->action("viewer_copy") );
249  popup.addSeparator();
250  }
251  popup.addAction( ActionManager::getInstance()->action("viewer_print") );
252  //KAction *ac = action("setEncoding");
253  //if (ac)
254  // ac->plug(&popup);
255  popup.addSeparator();
256  popup.addAction( ActionManager::getInstance()->action("inc_font_sizes") );
257  popup.addAction( ActionManager::getInstance()->action("dec_font_sizes") );
258  }
259  popup.exec(p);
260 }
261 
262 // taken from KDevelop
263 void ArticleViewer::slotCopy()
264 {
265  QString text = m_part->selectedText();
266  text.replace( QChar( 0xa0 ), ' ' );
267  QClipboard* const cb = QApplication::clipboard();
268  assert( cb );
269  cb->setText( text, QClipboard::Clipboard );
270 }
271 
272 void ArticleViewer::slotCopyLinkAddress()
273 {
274  if(m_url.isEmpty()) return;
275  QClipboard *cb = QApplication::clipboard();
276  cb->setText(m_url.prettyUrl(), QClipboard::Clipboard);
277  // don't set url to selection as it's a no-no according to a fd.o spec
278  // which spec? Nobody seems to care (tested Firefox (3.5.10) Konqueror,and KMail (4.2.3)), so I re-enable the following line unless someone gives
279  // a good reason to remove it again (bug 183022) --Frank
280  cb->setText(m_url.prettyUrl(), QClipboard::Selection);
281 }
282 
283 void ArticleViewer::slotSelectionChanged()
284 {
285  ActionManager::getInstance()->action("viewer_copy")->setEnabled(!m_part->selectedText().isEmpty());
286 }
287 
288 void ArticleViewer::slotOpenLinkInternal()
289 {
290  openUrl(m_url);
291 }
292 
293 void ArticleViewer::slotOpenLinkInForegroundTab()
294 {
295  OpenUrlRequest req(m_url);
296  req.setOptions(OpenUrlRequest::NewTab);
297  emit signalOpenUrlRequest(req);
298 }
299 
300 void ArticleViewer::slotOpenLinkInBackgroundTab()
301 {
302  OpenUrlRequest req(m_url);
303  req.setOptions(OpenUrlRequest::NewTab);
304  req.setOpenInBackground(true);
305  emit signalOpenUrlRequest(req);
306 }
307 
308 void ArticleViewer::slotOpenLinkInBrowser()
309 {
310  OpenUrlRequest req(m_url);
311  req.setOptions(OpenUrlRequest::ExternalBrowser);
312  emit signalOpenUrlRequest(req);
313 }
314 
315 void ArticleViewer::slotSaveLinkAs()
316 {
317  KUrl tmp( m_url );
318 
319  if ( tmp.fileName(KUrl::ObeyTrailingSlash).isEmpty() )
320  tmp.setFileName( "index.html" );
321  KParts::BrowserRun::simpleSave(tmp, tmp.fileName());
322 }
323 
324 void ArticleViewer::slotStarted(KIO::Job* job)
325 {
326  m_part->widget()->setCursor( Qt::WaitCursor );
327  emit started(job);
328 }
329 
330 void ArticleViewer::slotCompleted()
331 {
332  m_part->widget()->unsetCursor();
333  emit completed();
334 }
335 
336 void ArticleViewer::slotZoomIn(int id)
337 {
338  if (id != 0)
339  return;
340 
341  int zf = m_part->fontScaleFactor();
342  if (zf < 100)
343  {
344  zf = zf - (zf % 20) + 20;
345  m_part->setFontScaleFactor(zf);
346  }
347  else
348  {
349  zf = zf - (zf % 50) + 50;
350  m_part->setFontScaleFactor(zf < 300 ? zf : 300);
351  }
352 }
353 
354 void ArticleViewer::slotZoomOut(int id)
355 {
356  if (id != 0)
357  return;
358 
359  int zf = m_part->fontScaleFactor();
360  if (zf <= 100)
361  {
362  zf = zf - (zf % 20) - 20;
363  m_part->setFontScaleFactor(zf > 20 ? zf : 20);
364  }
365  else
366  {
367  zf = zf - (zf % 50) - 50;
368  m_part->setFontScaleFactor(zf);
369  }
370 }
371 
372 void ArticleViewer::slotSetZoomFactor(int percent)
373 {
374  m_part->setFontScaleFactor(percent);
375 }
376 
377 // some code taken from KDevelop (lib/widgets/kdevhtmlpart.cpp)
378 void ArticleViewer::slotPrint( )
379 {
380  m_part->view()->print();
381 }
382 
383 
384 
385 void ArticleViewer::connectToNode(TreeNode* node)
386 {
387  if (node)
388  {
389  if (m_viewMode == CombinedView)
390  {
391  connect( node, SIGNAL(signalChanged(Akregator::TreeNode*)), this, SLOT(slotUpdateCombinedView()) );
392  connect( node, SIGNAL(signalArticlesAdded(Akregator::TreeNode*,QList<Akregator::Article>)), this, SLOT(slotArticlesAdded(Akregator::TreeNode*,QList<Akregator::Article>)));
393  connect( node, SIGNAL(signalArticlesRemoved(Akregator::TreeNode*,QList<Akregator::Article>)), this, SLOT(slotArticlesRemoved(Akregator::TreeNode*,QList<Akregator::Article>)));
394  connect( node, SIGNAL(signalArticlesUpdated(Akregator::TreeNode*,QList<Akregator::Article>)), this, SLOT(slotArticlesUpdated(Akregator::TreeNode*,QList<Akregator::Article>)));
395  }
396  if (m_viewMode == SummaryView)
397  connect( node, SIGNAL(signalChanged(Akregator::TreeNode*)), this, SLOT(slotShowSummary(Akregator::TreeNode*)) );
398 
399  connect( node, SIGNAL(signalDestroyed(Akregator::TreeNode*)), this, SLOT(slotClear()) );
400  }
401 }
402 
403 void ArticleViewer::disconnectFromNode(TreeNode* node)
404 {
405  if (node)
406  node->disconnect( this );
407 }
408 
409 void ArticleViewer::renderContent(const QString& text)
410 {
411  m_part->closeUrl();
412  m_currentText = text;
413  beginWriting();
414  //kDebug() << text;
415  m_part->write(text);
416  endWriting();
417 }
418 
419 void ArticleViewer::beginWriting()
420 {
421  QString head = QString("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n <html><head><title>.</title>");
422 
423  if (m_viewMode == CombinedView)
424  head += m_combinedModeCSS;
425  else
426  head += m_normalModeCSS;
427 
428  head += "</style></head><body>";
429  m_part->view()->setContentsPos(0,0);
430 
431  //pass link to the KHTMLPart to make relative links work
432  //add a bogus query item to distinguish from m_link
433  //fixes the Complete Story link if the url has an anchor (e.g. #reqRSS) in it
434  //See bug 177754
435 
436  KUrl url(m_link);
437  url.addQueryItem("akregatorPreviewMode", "true");
438  m_part->begin(url);
439  m_part->write(head);
440 }
441 
442 void ArticleViewer::endWriting()
443 {
444  m_part->write(m_htmlFooter);
445  //kDebug() << m_htmlFooter;
446  m_part->end();
447 }
448 
449 
450 void ArticleViewer::slotShowSummary(TreeNode* node)
451 {
452  m_viewMode = SummaryView;
453 
454  if (!node)
455  {
456  slotClear();
457  return;
458  }
459 
460  if (node != m_node)
461  {
462  disconnectFromNode(m_node);
463  connectToNode(node);
464  m_node = node;
465  }
466 
467  QString summary = m_normalViewFormatter->formatSummary(node);
468  m_link.clear();
469  renderContent(summary);
470 
471  setArticleActionsEnabled(false);
472 }
473 
474 void ArticleViewer::showArticle( const Akregator::Article& article )
475 {
476  if ( article.isNull() || article.isDeleted() )
477  {
478  slotClear();
479  return;
480  }
481 
482  m_viewMode = NormalView;
483  disconnectFromNode(m_node);
484  m_article = article;
485  m_node = 0;
486  m_link = article.link();
487  if (article.feed()->loadLinkedWebsite())
488  {
489  openUrl(article.link());
490  }
491  else
492  {
493  renderContent( m_normalViewFormatter->formatArticle(article, ArticleFormatter::ShowIcon) );
494  }
495 
496  setArticleActionsEnabled(true);
497 }
498 
499 bool ArticleViewer::openUrl(const KUrl& url)
500 {
501  if (!m_article.isNull() && m_article.feed()->loadLinkedWebsite())
502  {
503  return m_part->openUrl(url);
504  }
505  else
506  {
507  reload();
508  return true;
509  }
510 }
511 
512 void ArticleViewer::setFilters(const std::vector< shared_ptr<const AbstractMatcher> >& filters )
513 {
514  if ( filters == m_filters )
515  return;
516 
517  m_filters = filters;
518 
519  slotUpdateCombinedView();
520 }
521 
522 void ArticleViewer::slotUpdateCombinedView()
523 {
524  if (m_viewMode != CombinedView)
525  return;
526 
527  if (!m_node)
528  return slotClear();
529 
530 
531  QString text;
532 
533  int num = 0;
534  QTime spent;
535  spent.start();
536 
537  const std::vector< shared_ptr<const AbstractMatcher> >::const_iterator filterEnd = m_filters.end();
538 
539  Q_FOREACH( const Article& i, m_articles )
540  {
541  if ( i.isDeleted() )
542  continue;
543 
544  if ( std::find_if( m_filters.begin(), m_filters.end(), !bind( &AbstractMatcher::matches, _1, i ) ) != filterEnd )
545  continue;
546 
547  text += "<p><div class=\"article\">"+m_combinedViewFormatter->formatArticle( i, ArticleFormatter::NoIcon)+"</div><p>";
548  ++num;
549  }
550 
551  kDebug() <<"Combined view rendering: (" << num <<" articles):" <<"generating HTML:" << spent.elapsed() <<"ms";
552  renderContent(text);
553  kDebug() <<"HTML rendering:" << spent.elapsed() <<"ms";
554 }
555 
556 void ArticleViewer::slotArticlesUpdated(TreeNode* /*node*/, const QList<Article>& /*list*/)
557 {
558  if (m_viewMode == CombinedView) {
559  //TODO
560  slotUpdateCombinedView();
561  }
562 }
563 
564 void ArticleViewer::slotArticlesAdded(TreeNode* /*node*/, const QList<Article>& list)
565 {
566  if (m_viewMode == CombinedView) {
567  //TODO sort list, then merge
568  m_articles << list;
569  std::sort( m_articles.begin(), m_articles.end() );
570  slotUpdateCombinedView();
571  }
572 }
573 
574 void ArticleViewer::slotArticlesRemoved(TreeNode* /*node*/, const QList<Article>& list )
575 {
576  Q_UNUSED(list)
577 
578  if (m_viewMode == CombinedView) {
579  //TODO
580  slotUpdateCombinedView();
581  }
582 }
583 
584 void ArticleViewer::slotClear()
585 {
586  disconnectFromNode(m_node);
587  m_node = 0;
588  m_article = Article();
589  m_articles.clear();
590 
591  renderContent(QString());
592 }
593 
594 void ArticleViewer::showNode(TreeNode* node)
595 {
596  m_viewMode = CombinedView;
597 
598  if (node != m_node)
599  disconnectFromNode(m_node);
600 
601  connectToNode(node);
602 
603  m_articles.clear();
604  m_article = Article();
605  m_node = node;
606 
607  delete m_listJob;
608 
609  m_listJob = node->createListJob();
610  connect( m_listJob, SIGNAL(finished(KJob*)), this, SLOT(slotArticlesListed(KJob*)));
611  m_listJob->start();
612 
613 
614 
615  slotUpdateCombinedView();
616 }
617 
618 void ArticleViewer::slotArticlesListed( KJob* job ) {
619  assert( job );
620  assert( job == m_listJob );
621 
622  TreeNode* node = m_listJob->node();
623 
624  if ( job->error() || !node ) {
625  if ( !node )
626  kWarning() << "Node to be listed is already deleted";
627  else
628  kWarning() << job->errorText();
629  slotUpdateCombinedView();
630  return;
631  }
632 
633  m_articles = m_listJob->articles();
634  std::sort( m_articles.begin(), m_articles.end() );
635 
636  if (node && !m_articles.isEmpty())
637  m_link = m_articles.first().link();
638  else
639  m_link = KUrl();
640 
641  slotUpdateCombinedView();
642 }
643 
644 void ArticleViewer::keyPressEvent(QKeyEvent* e)
645 {
646  e->ignore();
647 }
648 
649 void ArticleViewer::slotPaletteOrFontChanged()
650 {
651  updateCss();
652  reload();
653 }
654 
655 void ArticleViewer::reload()
656 {
657  beginWriting();
658  m_part->write(m_currentText);
659  endWriting();
660 }
661 
662 QSize ArticleViewer::sizeHint() const
663 {
664  // Increase height a bit so that we can (roughly) read 25 lines of text
665  QSize sh = QWidget::sizeHint();
666  sh.setHeight(qMax(sh.height(), 25 * fontMetrics().height()));
667  return sh;
668 }
669 
670 void ArticleViewer::displayAboutPage()
671 {
672  QString location = KStandardDirs::locate("data", "akregator/about/main.html");
673 
674  m_part->begin(KUrl::fromPath( location ));
675  QString info =
676  i18nc("%1: Akregator version; %2: homepage URL; "
677  "--- end of comment ---",
678  "<h2 style='margin-top: 0px;'>Welcome to Akregator %1</h2>"
679  "<p>Akregator is a KDE news feed reader. "
680  "Feed readers provide a convenient way to browse different kinds of "
681  "content, including news, blogs, and other content from online sites. "
682  "Instead of checking all your favorite web sites manually for updates, "
683  "Akregator collects the content for you.</p>"
684  "<p>For more information about using Akregator, check the "
685  "<a href=\"%2\">Akregator website</a>. If you do not want to see this page "
686  "anymore, <a href=\"config:/disable_introduction\">click here</a>.</p>"
687  "<p>We hope that you will enjoy Akregator.</p>\n"
688  "<p>Thank you,</p>\n"
689  "<p style='margin-bottom: 0px'>&nbsp; &nbsp; The Akregator Team</p>\n",
690  KDEPIM_VERSION,
691  "http://akregator.kde.org/"); // Akregator homepage URL
692 
693  QString fontSize = QString::number( pointsToPixel( Settings::mediumFontSize() ));
694  QString appTitle = i18n("Akregator");
695  QString catchPhrase = ""; //not enough space for a catch phrase at default window size i18n("Part of the Kontact Suite");
696  QString quickDescription = i18n("A KDE news feed reader.");
697 
698  QString content = KPIMUtils::kFileToByteArray(location);
699 
700  QString infocss = KStandardDirs::locate( "data", "kdeui/about/kde_infopage.css" );
701  QString rtl = kapp->isRightToLeft() ? QString("@import \"%1\";" ).arg( KStandardDirs::locate( "data", "kdeui/about/kde_infopage_rtl.css" )) : QString();
702 
703  m_part->write( content.arg( infocss, rtl, fontSize, appTitle, catchPhrase, quickDescription, info ) );
704  m_part->end();
705 }
706 
707 ArticleViewerPart::ArticleViewerPart(QWidget* parent) : KHTMLPart(parent),
708  m_button(-1)
709 {
710  setXMLFile(KStandardDirs::locate("data", "akregator/articleviewer.rc"), true);
711 }
712 
713 int ArticleViewerPart::button() const
714 {
715  return m_button;
716 }
717 
718 bool ArticleViewerPart::closeUrl()
719 {
720  emit browserExtension()->loadingProgress(-1);
721  emit canceled(QString());
722  return KHTMLPart::closeUrl();
723 }
724 
725 bool ArticleViewerPart::urlSelected(const QString &url, int button, int state, const QString &_target,
726  const KParts::OpenUrlArguments& args,
727  const KParts::BrowserArguments& browserArgs)
728 {
729  m_button = button;
730  if(url == "config:/disable_introduction")
731  {
732  KGuiItem yesButton(KStandardGuiItem::yes());
733  yesButton.setText(i18n("Disable"));
734  KGuiItem noButton(KStandardGuiItem::no());
735  noButton.setText(i18n("Keep Enabled"));
736  if(KMessageBox::questionYesNo( widget(), i18n("Are you sure you want to disable this introduction page?"), i18n("Disable Introduction Page"), yesButton, noButton) == KMessageBox::Yes)
737  {
738  KConfigGroup conf(Settings::self()->config(), "General");
739  conf.writeEntry("Disable Introduction", "true");
740  conf.sync();
741  return true;
742  }
743 
744  return false;
745  }
746  else
747  return KHTMLPart::urlSelected(url,button,state,_target,args,browserArgs);
748 }
749 
750 void ArticleViewer::updateCss()
751 {
752  m_normalModeCSS = m_normalViewFormatter->getCss();
753  m_combinedModeCSS = m_combinedViewFormatter->getCss();
754 }
755 
756 void ArticleViewer::setNormalViewFormatter( const shared_ptr<ArticleFormatter>& formatter )
757 {
758  assert( formatter );
759  m_normalViewFormatter = formatter;
760  m_normalViewFormatter->setPaintDevice(m_part->view());
761 }
762 
763 void ArticleViewer::setCombinedViewFormatter( const shared_ptr<ArticleFormatter>& formatter )
764 {
765  assert( formatter );
766  m_combinedViewFormatter = formatter;
767  m_combinedViewFormatter->setPaintDevice(m_part->view());
768 }
769 
770 void ArticleViewer::setArticleActionsEnabled(bool enabled)
771 {
772  ActionManager::getInstance()->setArticleActionsEnabled(enabled);
773 }
774 
775 } // namespace Akregator
776 
777 
QWidget::layout
QLayout * layout() const
treenode.h
articlematcher.h
Akregator::ArticleViewer::slotCreateNewWindow
void slotCreateNewWindow(const KUrl &url, const KParts::OpenUrlArguments &args, const KParts::BrowserArguments &browserArgs, const KParts::WindowArgs &windowArgs, KParts::ReadOnlyPart **part)
Definition: articleviewer.cpp:209
QWidget
QSize::setHeight
void setHeight(int height)
Akregator::ArticleViewer::slotShowSummary
void slotShowSummary(Akregator::TreeNode *node)
Definition: articleviewer.cpp:450
Akregator::ArticleFormatter::ShowIcon
Definition: articleformatter.h:44
Akregator::ArticleViewerPart::button
int button() const
Definition: articleviewer.cpp:713
openurlrequest.h
Akregator::OpenUrlRequest
Definition: openurlrequest.h:42
Akregator::ArticleViewer::slotPrint
void slotPrint()
Definition: articleviewer.cpp:378
Akregator::ArticleViewer::slotOpenLinkInBrowser
void slotOpenLinkInBrowser()
Opens m_url in external viewer, eg.
Definition: articleviewer.cpp:308
Akregator::ArticleViewer::slotCopy
void slotCopy()
Copies currently selected text to clipboard.
Definition: articleviewer.cpp:263
QGridLayout::addWidget
void addWidget(QWidget *widget, int row, int column, QFlags< Qt::AlignmentFlag > alignment)
Akregator::OpenUrlRequest::None
no explicit options, use default
Definition: openurlrequest.h:52
Akregator::ArticleViewer::displayAboutPage
void displayAboutPage()
Definition: articleviewer.cpp:670
articleviewer.h
Akregator::Article::link
KUrl link() const
Definition: article.cpp:447
QChar
actions.h
Akregator::ArticleViewer::slotOpenLinkInternal
void slotOpenLinkInternal()
Opens m_url inside this viewer.
Definition: articleviewer.cpp:288
articlejobs.h
Akregator::OpenUrlRequest::setOpenInBackground
void setOpenInBackground(bool background)
Definition: openurlrequest.cpp:60
Akregator::TreeNode::createListJob
ArticleListJob * createListJob()
Definition: treenode.cpp:238
Akregator::ArticleViewer::showArticle
void showArticle(const Article &article)
Definition: articleviewer.cpp:474
KHTMLPart
QGridLayout
QPoint
actionmanager.h
Akregator::ArticleViewer::~ArticleViewer
~ArticleViewer()
Definition: articleviewer.cpp:155
Akregator::ArticleViewer::openUrl
bool openUrl(const KUrl &url)
Definition: articleviewer.cpp:499
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
QTime
Akregator::OpenUrlRequest::options
Options options() const
Definition: openurlrequest.cpp:86
feed.h
Akregator::ActionManager::action
virtual QAction * action(const char *name)=0
Akregator::ArticleViewer::completed
void completed()
QClipboard
Akregator::ArticleViewer::signalOpenUrlRequest
void signalOpenUrlRequest(Akregator::OpenUrlRequest &)
This gets emitted when url gets clicked.
utils.h
Akregator::ArticleViewer::slotStarted
void slotStarted(KIO::Job *)
This changes cursor to wait cursor.
Definition: articleviewer.cpp:324
Akregator::Article::feed
Feed * feed() const
Definition: article.cpp:508
QString::isRightToLeft
bool isRightToLeft() const
QTime::elapsed
int elapsed() const
Akregator::ArticleViewer::slotCopyLinkAddress
void slotCopyLinkAddress()
Copies current link to clipboard.
Definition: articleviewer.cpp:272
Akregator::Article::isNull
bool isNull() const
Definition: article.cpp:253
QString::number
QString number(int n, int base)
Akregator::ArticleViewer::selectionChanged
void selectionChanged()
QEvent::ignore
void ignore()
Akregator::ArticleViewer::setCombinedViewFormatter
void setCombinedViewFormatter(const boost::shared_ptr< ArticleFormatter > &formatter)
Definition: articleviewer.cpp:763
Akregator::ArticleViewer::slotArticlesUpdated
void slotArticlesUpdated(Akregator::TreeNode *node, const QList< Akregator::Article > &list)
Definition: articleviewer.cpp:556
QApplication::clipboard
QClipboard * clipboard()
Akregator::ArticleViewer::reload
void reload()
Repaints the view.
Definition: articleviewer.cpp:655
Akregator::OpenUrlRequest::setUrl
void setUrl(const KUrl &url)
Definition: openurlrequest.cpp:51
Akregator::ArticleViewer::slotOpenLinkInBackgroundTab
void slotOpenLinkInBackgroundTab()
Opens m_url in background tab.
Definition: articleviewer.cpp:300
QWidget::setFocusProxy
void setFocusProxy(QWidget *w)
Akregator::ArticleViewerPart::urlSelected
bool urlSelected(const QString &url, int button, int state, const QString &_target, const KParts::OpenUrlArguments &args=KParts::OpenUrlArguments(), const KParts::BrowserArguments &browserArgs=KParts::BrowserArguments())
reimplemented to get the mouse button
Definition: articleviewer.cpp:725
aboutdata.h
Akregator::ArticleViewer::slotArticlesListed
void slotArticlesListed(KJob *job)
Definition: articleviewer.cpp:618
Akregator::OpenUrlRequest::part
KParts::ReadOnlyPart * part() const
The part that was created for a "NewTab" request.
Definition: openurlrequest.cpp:109
Akregator::OpenUrlRequest::setArgs
void setArgs(const KParts::OpenUrlArguments &args)
Definition: openurlrequest.cpp:70
QString
QList< Akregator::Article >
article.h
Akregator::Article::isDeleted
bool isDeleted() const
Definition: article.cpp:279
QLayout::setMargin
void setMargin(int margin)
Akregator::OpenUrlRequest::setBrowserArgs
void setBrowserArgs(const KParts::BrowserArguments &args)
Definition: openurlrequest.cpp:81
Akregator::OpenUrlRequest::ExternalBrowser
open in external browser
Definition: openurlrequest.h:54
Akregator::ArticleViewer::slotSelectionChanged
void slotSelectionChanged()
Definition: articleviewer.cpp:283
Akregator::OpenUrlRequest::setOptions
void setOptions(Options options)
Definition: openurlrequest.cpp:99
QSize
Akregator::ArticleViewer::setNormalViewFormatter
void setNormalViewFormatter(const boost::shared_ptr< ArticleFormatter > &formatter)
Definition: articleviewer.cpp:756
QWidget::sizeHint
virtual QSize sizeHint() const
folder.h
Akregator::ArticleViewerPart
Definition: articleviewer.h:215
Akregator::ArticleViewer::slotCompleted
void slotCompleted()
This reverts cursor back to normal one.
Definition: articleviewer.cpp:330
Akregator::ArticleViewer::slotSetZoomFactor
void slotSetZoomFactor(int percent)
Definition: articleviewer.cpp:372
Akregator::createOpenLinkInExternalBrowserAction
AKREGATOR_EXPORT QAction * createOpenLinkInExternalBrowserAction(const KUrl &url, QObject *receiver=0, const char *slot=0, QObject *parent=0)
Definition: actions.cpp:42
Akregator::ArticleViewerPart::closeUrl
bool closeUrl()
Definition: articleviewer.cpp:718
Akregator::Feed::loadLinkedWebsite
bool loadLinkedWebsite() const
Definition: feed.cpp:365
QString::replace
QString & replace(int position, int n, QChar after)
QKeyEvent
Akregator::ArticleViewer::showNode
void showNode(Akregator::TreeNode *node)
Shows the articles of the tree node node (combined view).
Definition: articleviewer.cpp:594
Akregator::createOpenLinkInNewTabAction
AKREGATOR_EXPORT QAction * createOpenLinkInNewTabAction(const KUrl &url, QObject *receiver=0, const char *slot=0, QObject *parent=0)
Definition: actions.cpp:33
QWidget::fontMetrics
QFontMetrics fontMetrics() const
Akregator::ActionManager::getInstance
static ActionManager * getInstance()
Definition: actionmanager.cpp:35
Akregator::ArticleViewer::sizeHint
QSize sizeHint() const
Definition: articleviewer.cpp:662
Akregator::ArticleViewer::slotOpenLinkInForegroundTab
void slotOpenLinkInForegroundTab()
Opens m_url in foreground tab.
Definition: articleviewer.cpp:293
articleformatter.h
QFontMetrics::height
int height() const
QSize::height
int height() const
Akregator::DefaultCombinedViewFormatter
Definition: articleformatter.h:90
Akregator::ArticleViewer::pointsToPixel
int pointsToPixel(int points) const
Definition: articleviewer.cpp:164
Akregator::ArticleViewer::slotUpdateCombinedView
void slotUpdateCombinedView()
Update view if combined view mode is set.
Definition: articleviewer.cpp:522
Akregator::ArticleViewer::slotClear
void slotClear()
Clears the canvas and disconnects from the currently observed node (if in combined view mode)...
Definition: articleviewer.cpp:584
Akregator::ArticleViewer::slotPaletteOrFontChanged
void slotPaletteOrFontChanged()
Definition: articleviewer.cpp:649
Akregator::Article
A proxy class for Syndication::ItemPtr with some additional methods to assist sorting.
Definition: article.h:63
QTime::start
void start()
Akregator::OpenUrlRequest::NewTab
open in new tab
Definition: openurlrequest.h:53
QClipboard::setText
void setText(const QString &text, Mode mode)
Akregator::ArticleViewer::slotSaveLinkAs
void slotSaveLinkAs()
Definition: articleviewer.cpp:315
Akregator::ArticleViewer::started
void started(KIO::Job *)
Akregator::DefaultNormalViewFormatter
Definition: articleformatter.h:69
Akregator::ArticleViewer::part
KParts::ReadOnlyPart * part() const
Definition: articleviewer.cpp:159
Akregator::ArticleViewer::setFilters
void setFilters(const std::vector< boost::shared_ptr< const Akregator::Filters::AbstractMatcher > > &filters)
Set filters which will be used if the viewer is in combined view mode.
Definition: articleviewer.cpp:512
Akregator::ArticleViewer::slotPopupMenu
void slotPopupMenu(const QPoint &, const KUrl &, mode_t, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &, KParts::BrowserExtension::PopupFlags)
Definition: articleviewer.cpp:226
Akregator::ArticleFormatter::NoIcon
Definition: articleformatter.h:43
Akregator::ArticleViewerPart::ArticleViewerPart
ArticleViewerPart(QWidget *parent)
Definition: articleviewer.cpp:707
Akregator::ActionManager::setArticleActionsEnabled
virtual void setArticleActionsEnabled(bool enabled)=0
Akregator::ArticleViewer::slotArticlesRemoved
void slotArticlesRemoved(Akregator::TreeNode *node, const QList< Akregator::Article > &list)
Definition: articleviewer.cpp:574
Akregator::ArticleViewer::slotZoomIn
void slotZoomIn(int)
Definition: articleviewer.cpp:336
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Akregator::ArticleViewer::slotArticlesAdded
void slotArticlesAdded(Akregator::TreeNode *node, const QList< Akregator::Article > &list)
Definition: articleviewer.cpp:564
Akregator::ArticleViewer::slotOpenUrlRequestDelayed
void slotOpenUrlRequestDelayed(const KUrl &, const KParts::OpenUrlArguments &, const KParts::BrowserArguments &)
Definition: articleviewer.cpp:169
Akregator::ArticleViewer::slotZoomOut
void slotZoomOut(int)
Definition: articleviewer.cpp:354
Akregator::TreeNode
Abstract base class for all kind of elements in the feed tree, like feeds and feed groups (and search...
Definition: treenode.h:58
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
m_url
QString m_url
Definition: article.cpp:128
KJob
QAction::setEnabled
void setEnabled(bool)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:34:00 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
  • pimprint

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