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