• 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
browserframe.cpp
Go to the documentation of this file.
1 /*
2  This file is part of Akregator.
3 
4  Copyright (C) 2005 Frank Osterfeld <osterfeld@kde.org>
5 
6  This program is free software; you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation; either version 2 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program; if not, write to the Free Software
18  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 
20  As a special exception, permission is given to link this program
21  with any edition of Qt, and distribute the resulting executable,
22  without including the source code for Qt in the source distribution.
23 */
24 
25 #include "browserframe.h"
26 #include "browserframe_p.h"
27 #include "actionmanager.h"
28 #include "actions.h"
29 #include "openurlrequest.h"
30 #include "utils/temporaryvalue.h"
31 
32 #include <QAction>
33 #include <QList>
34 #include <QPoint>
35 #include <QPointer>
36 #include <QString>
37 #include <QWidget>
38 
39 #include <kaction.h>
40 #include <kdebug.h>
41 #include <klibloader.h>
42 #include <KMenu>
43 #include <kmimetypetrader.h>
44 #include <ktoolbarpopupaction.h>
45 #include <kurl.h>
46 #include <kxmlguiclient.h>
47 #include <kparts/browserextension.h>
48 #include <kparts/part.h>
49 #include <khtml_part.h>
50 
51 #include <cassert>
52 
53 using namespace KParts;
54 using namespace Akregator;
55 
56 BrowserFrame::BrowserFrame(QWidget* parent) : Frame(parent), d( new Private( this ) )
57 {
58 }
59 
60 BrowserFrame::~BrowserFrame()
61 {
62  delete d;
63 }
64 
65 KUrl BrowserFrame::url() const
66 {
67  return d->part ? d->part->url() : KUrl();
68 }
69 
70 bool BrowserFrame::canGoForward() const
71 {
72  return !d->history.isEmpty() && d->current != d->history.end()-1 && d->current != d->history.end();
73 }
74 
75 bool BrowserFrame::canGoBack() const
76 {
77  return !d->history.isEmpty() && d->current != d->history.begin();
78 }
79 
80 void BrowserFrame::slotOpenUrlNotify()
81 {
82  // TODO: inform the world that a new url was opened
83 }
84 
85 void BrowserFrame::slotSetLocationBarUrl(const QString& /*url*/)
86 {
87  // TODO: use this to update URLs for dragging (like tab drag etc.)
88 }
89 
90 void BrowserFrame::slotSetIconUrl(const KUrl& url )
91 {
92  FeedIconManager::self()->removeListener( this );
93  FeedIconManager::self()->addListener( url, this );
94 }
95 
96 void BrowserFrame::setFavicon( const QIcon& icon )
97 {
98  emit signalIconChanged( this, icon );
99 }
100 
101 void BrowserFrame::slotSpeedProgress(int /*bytesPerSecond*/)
102 {
103 }
104 
105 namespace {
106 
107 static OpenUrlRequest requestFromSender( QObject* sender, int id )
108 {
109  QAction* const action = qobject_cast<QAction*>( sender );
110  assert( action );
111  const KUrl url = action->data().value<KUrl>();
112  OpenUrlRequest req;
113  req.setFrameId( id );
114  req.setUrl( url );
115  return req;
116 }
117 
118 }
119 
120 void BrowserFrame::slotOpenLinkInBrowser()
121 {
122  OpenUrlRequest req = requestFromSender( sender(), id() );
123  req.setOptions( OpenUrlRequest::ExternalBrowser );
124  emit signalOpenUrlRequest( req );
125 }
126 
127 void BrowserFrame::slotOpenLinkInNewTab()
128 {
129  OpenUrlRequest req = requestFromSender( sender(), id() );
130  req.setOptions( OpenUrlRequest::NewTab );
131  emit signalOpenUrlRequest( req );
132 }
133 
134 bool BrowserFrame::hasZoom() const
135 {
136  return qobject_cast<KHTMLPart *>( d->part ) != 0;
137 }
138 
139 void BrowserFrame::slotZoomIn(int zoomid)
140 {
141  if ( zoomid != id() )
142  return;
143 
144  if ( !d->part )
145  return;
146 
147  if ( KHTMLPart * const khtml_part = qobject_cast<KHTMLPart *>( d->part ) ) {
148  int zf = khtml_part->fontScaleFactor();
149  if (zf < 100) {
150  zf = zf - (zf % 20) + 20;
151  khtml_part->setFontScaleFactor(zf);
152  } else {
153  zf = zf - (zf % 50) + 50;
154  khtml_part->setFontScaleFactor(zf < 300 ? zf : 300);
155  }
156  }
157 }
158 
159 void BrowserFrame::slotZoomOut(int zoomid)
160 {
161  if ( zoomid != id() )
162  return;
163 
164  if ( !d->part )
165  return;
166 
167  if ( KHTMLPart * const khtml_part = qobject_cast<KHTMLPart *>( d->part ) ) {
168  int zf = khtml_part->fontScaleFactor();
169  if (zf <= 100) {
170  zf = zf - (zf % 20) - 20;
171  khtml_part->setFontScaleFactor(zf > 20 ? zf : 20);
172  } else {
173  zf = zf - (zf % 50) - 50;
174  khtml_part->setFontScaleFactor(zf);
175  }
176  }
177 }
178 
179 int BrowserFrame::getZoomFactor() const
180 {
181  if ( KHTMLPart * const khtml_part = qobject_cast<KHTMLPart *>( d->part ) )
182  return khtml_part->fontScaleFactor();
183 
184  return -1;
185 }
186 
187 void BrowserFrame::setZoomFactor( int zf )
188 {
189  if (KHTMLPart* const khtml_part = qobject_cast<KHTMLPart *>( d->part ) )
190  khtml_part->setFontScaleFactor( zf );
191 }
192 
193 namespace {
194 
195 enum SeparatorOption {
196  ShowSeparatorIfNotEmpty,
197  NoSeparator
198 };
199 
200 void addActionsToMenu( QMenu* menu, const QList<QAction*> actions, SeparatorOption option )
201 {
202  if ( !actions.isEmpty() && option != NoSeparator )
203  menu->addSeparator();
204  Q_FOREACH( QAction* const i, actions )
205  menu->addAction( i );
206 }
207 
208 }
209 
210 void BrowserFrame::slotPopupMenu(
211  const QPoint& global,
212  const KUrl& url,
213  mode_t mode,
214  const OpenUrlArguments& args,
215  const BrowserArguments& browserArgs,
216  BrowserExtension::PopupFlags flags,
217  const KParts::BrowserExtension::ActionGroupMap& actionGroups )
218 {
219  Q_UNUSED( mode )
220  Q_UNUSED( args )
221  Q_UNUSED( browserArgs )
222 
223  const bool showReload = (flags & BrowserExtension::ShowReload) != 0;
224  const bool showNavigationItems = (flags & BrowserExtension::ShowNavigationItems) != 0;
225  const bool isLink = (flags & BrowserExtension:: IsLink) != 0;
226  const bool isSelection = (flags & BrowserExtension::ShowTextSelectionItems) != 0;
227 
228  bool isFirst = true;
229 
230  QPointer<KMenu> popup( new KMenu() );
231 
232  if (showNavigationItems)
233  {
234  popup->addAction( ActionManager::getInstance()->action( "browser_back" ) );
235  popup->addAction( ActionManager::getInstance()->action( "browser_forward" ) );
236  isFirst = false;
237  }
238  if (showReload)
239  {
240  popup->addAction( ActionManager::getInstance()->action( "browser_reload" ) );
241  isFirst = false;
242  }
243 
244 #define addSeparatorIfNotFirst() if ( !isFirst ) popup->addSeparator(); isFirst = false;
245 
246  if (isLink)
247  {
248  addSeparatorIfNotFirst();
249  popup->addAction( createOpenLinkInNewTabAction( url, this, SLOT(slotOpenLinkInNewTab()), popup ) );
250  popup->addAction( createOpenLinkInExternalBrowserAction( url, this, SLOT(slotOpenLinkInBrowser()), popup ) );
251  addActionsToMenu( popup, actionGroups.value( QLatin1String("linkactions") ), ShowSeparatorIfNotEmpty );
252  }
253 
254  if (isSelection)
255  {
256  addSeparatorIfNotFirst();
257  addActionsToMenu( popup, actionGroups.value( QLatin1String("editactions") ), NoSeparator );
258  }
259 
260  if (hasZoom())
261  {
262  addSeparatorIfNotFirst();
263  popup->addAction( ActionManager::getInstance()->action("inc_font_sizes") );
264  popup->addAction( ActionManager::getInstance()->action("dec_font_sizes") );
265  }
266 
267  addSeparatorIfNotFirst();
268  addActionsToMenu( popup, actionGroups.value( QLatin1String("part") ), NoSeparator );
269 
270  popup->exec( global );
271  delete popup;
272 }
273 
274 void BrowserFrame::slotOpenUrlRequestDelayed(const KUrl& url, const OpenUrlArguments& args, const BrowserArguments& browserArgs)
275 {
276  OpenUrlRequest req;
277 
278  req.setFrameId(id());
279  req.setUrl(url);
280  req.setArgs(args);
281  req.setBrowserArgs(browserArgs);
282 
283  emit signalOpenUrlRequest(req);
284 }
285 
286 void BrowserFrame::slotCreateNewWindow(const KUrl& url,
287  const OpenUrlArguments& args,
288  const BrowserArguments& browserArgs,
289  const WindowArgs& /*windowArgs*/,
290  ReadOnlyPart** part)
291 {
292  OpenUrlRequest req;
293  req.setFrameId(id());
294  req.setUrl(url);
295  req.setArgs(args);
296  req.setBrowserArgs(browserArgs);
297  req.setOptions(OpenUrlRequest::NewTab);
298 
299  emit signalOpenUrlRequest(req);
300  if ( part )
301  *part = req.part();
302 }
303 
304 bool BrowserFrame::openUrl(const OpenUrlRequest& request)
305 {
306  const QString serviceType = request.args().mimeType();
307 
308  if ( serviceType.isEmpty() )
309  return false;
310 
311  d->updateHistoryEntry();
312 
313  kDebug() << "serviceType: " << serviceType;
314  if ( !d->loadPartForMimetype( serviceType ) )
315  return false;
316 
317  assert( d->part );
318  d->part->setArguments( request.args() );
319 
320  if ( !request.url().isValid() )
321  return false;
322 
323  if ( !d->part->openUrl( request.url() ) )
324  return false;
325 
326  d->appendHistoryEntry( request.url() );
327  d->updateHistoryEntry();
328  return true;
329 }
330 
331 ReadOnlyPart* BrowserFrame::part() const
332 {
333  return d->part;
334 }
335 
336 void BrowserFrame::slotHistoryBackAboutToShow()
337 {
338  QAction* ba = ActionManager::getInstance()->action("browser_back");
339  QMenu* popup = static_cast<KToolBarPopupAction*>(ba)->menu();
340  popup->clear();
341 
342  if (!canGoBack())
343  return;
344 
345 
346  QList<Private::HistoryEntry>::Iterator it = d->current-1;
347 
348  int i = 0;
349  while( i < 10)
350  {
351  if ( it == d->history.begin() )
352  {
353  popup->addAction(new Private::HistoryAction(it, popup, d));
354  return;
355  }
356 
357  popup->addAction(new Private::HistoryAction(it, popup, d));
358  ++i;
359  --it;
360  }
361 }
362 
363 void BrowserFrame::slotHistoryForwardAboutToShow()
364 {
365  QAction* fw = ActionManager::getInstance()->action("browser_forward");
366  QMenu* popup = qobject_cast<KToolBarPopupAction*>(fw)->menu();
367  popup->clear();
368 
369  if (!canGoForward())
370  return;
371 
372  QList<Private::HistoryEntry>::Iterator it = d->current+1;
373 
374  int i = 0;
375  while( i < 10)
376  {
377  if ( it == d->history.end()-1 )
378  {
379  popup->addAction( new Private::HistoryAction(it, popup, d));
380  return;
381  }
382 
383  popup->addAction(new Private::HistoryAction(it, popup, d));
384  ++i;
385  ++it;
386  }
387 }
388 
389 void BrowserFrame::slotHistoryForward()
390 {
391  if (canGoForward())
392  d->restoreHistoryEntry(d->current+1);
393 }
394 
395 void BrowserFrame::slotHistoryBack()
396 {
397  if (canGoBack())
398  d->restoreHistoryEntry(d->current-1);
399 }
400 
401 void BrowserFrame::slotReload()
402 {
403  TemporaryValue<bool> lock( d->lockHistory, true );
404 
405  OpenUrlRequest req(url());
406  KParts::OpenUrlArguments args;
407  args.setMimeType(d->mimetype);
408  req.setArgs(args);
409  openUrl(req);
410 }
411 
412 void BrowserFrame::slotStop()
413 {
414  if (d->part)
415  d->part->closeUrl();
416  Frame::slotStop();
417 }
418 
419 void BrowserFrame::slotPaletteOrFontChanged()
420 {
421 }
422 
423 bool BrowserFrame::isReloadable() const
424 {
425  return true;
426 }
427 
428 bool BrowserFrame::isLoading() const
429 {
430  return d->isLoading;
431 }
432 
433 
434 void BrowserFrame::loadConfig( const KConfigGroup& config, const QString& prefix)
435 {
436  const QString url = config.readEntry( QString::fromLatin1( "url" ).prepend( prefix ), QString() );
437  const QString mimetype = config.readEntry( QString::fromLatin1( "mimetype" ).prepend( prefix ), QString() );
438  const int zf = config.readEntry( QString::fromLatin1( "zoom" ).prepend( prefix ), 100 );
439  OpenUrlRequest req(url);
440  KParts::OpenUrlArguments args;
441  args.setMimeType(mimetype);
442  req.setArgs(args);
443  openUrl(req);
444  setZoomFactor( zf );
445 }
446 
447 void BrowserFrame::saveConfig( KConfigGroup& config, const QString& prefix)
448 {
449  config.writeEntry( QString::fromLatin1( "url" ).prepend( prefix ), url().url() );
450  config.writeEntry( QString::fromLatin1( "mimetype" ).prepend( prefix ), d->mimetype );
451  config.writeEntry( QString::fromLatin1( "zoom" ).prepend( prefix ), getZoomFactor() );
452 }
453 
Akregator::Frame
Definition: frame.h:53
Akregator::BrowserFrame::loadConfig
void loadConfig(const KConfigGroup &config, const QString &prefix)
Load a frame from a config file for session management.
Definition: browserframe.cpp:434
Akregator::BrowserFrame::slotPaletteOrFontChanged
void slotPaletteOrFontChanged()
Definition: browserframe.cpp:419
Akregator::BrowserFrame::Private::loadPartForMimetype
bool loadPartForMimetype(const QString &mimetype)
QWidget
openurlrequest.h
Akregator::OpenUrlRequest
Definition: openurlrequest.h:42
Akregator::BrowserFrame::slotZoomIn
void slotZoomIn(int)
Definition: browserframe.cpp:139
Akregator::FeedIconManager::removeListener
void removeListener(FaviconListener *listener)
Definition: feediconmanager.cpp:134
Akregator::Frame::signalIconChanged
void signalIconChanged(Akregator::Frame *, const QIcon &icon)
Akregator::BrowserFrame::slotReload
void slotReload()
Definition: browserframe.cpp:401
QObject::sender
QObject * sender() const
QAction::data
QVariant data() const
actions.h
QMenu::addAction
void addAction(QAction *action)
QPointer
Akregator::BrowserFrame::canGoForward
bool canGoForward() const
returns whether it is possible to go forward in the history
Definition: browserframe.cpp:70
browserframe.h
KHTMLPart
Akregator::OpenUrlRequest::url
KUrl url() const
Definition: openurlrequest.cpp:46
Akregator::BrowserFrame::slotZoomOut
void slotZoomOut(int)
Definition: browserframe.cpp:159
QVariant::value
T value() const
QPoint
actionmanager.h
Akregator::Frame::slotStop
virtual void slotStop()
Definition: frame.cpp:168
Akregator::BrowserFrame::slotOpenLinkInBrowser
void slotOpenLinkInBrowser()
Definition: browserframe.cpp:120
Akregator::ActionManager::action
virtual QAction * action(const char *name)=0
Akregator::BrowserFrame::hasZoom
bool hasZoom() const
Definition: browserframe.cpp:134
SeparatorOption
SeparatorOption
Definition: browserframe.cpp:195
Akregator::BrowserFrame::Private::lockHistory
bool lockHistory
Definition: browserframe_p.h:72
Akregator::BrowserFrame::canGoBack
bool canGoBack() const
returns whether it is possible to go back in the history
Definition: browserframe.cpp:75
QMenu::clear
void clear()
Akregator::BrowserFrame::slotStop
void slotStop()
Definition: browserframe.cpp:412
Akregator::OpenUrlRequest::setFrameId
void setFrameId(int frameId)
Definition: openurlrequest.cpp:41
Akregator::BrowserFrame::Private
Definition: browserframe_p.h:54
Akregator::Frame::signalOpenUrlRequest
void signalOpenUrlRequest(Akregator::OpenUrlRequest &request)
Akregator::BrowserFrame::slotHistoryForwardAboutToShow
void slotHistoryForwardAboutToShow()
Definition: browserframe.cpp:363
Akregator::BrowserFrame::slotHistoryForward
void slotHistoryForward()
Definition: browserframe.cpp:389
addSeparatorIfNotFirst
#define addSeparatorIfNotFirst()
Akregator::OpenUrlRequest::setUrl
void setUrl(const KUrl &url)
Definition: openurlrequest.cpp:51
QObject
QList::isEmpty
bool isEmpty() const
QString::isEmpty
bool isEmpty() const
Akregator::BrowserFrame::~BrowserFrame
~BrowserFrame()
Definition: browserframe.cpp:60
Akregator::OpenUrlRequest::part
KParts::ReadOnlyPart * part() const
The part that was created for a "NewTab" request.
Definition: openurlrequest.cpp:109
Akregator::BrowserFrame::slotHistoryBackAboutToShow
void slotHistoryBackAboutToShow()
Definition: browserframe.cpp:336
Akregator::BrowserExtension
Definition: akregator_part.h:61
Akregator::OpenUrlRequest::setArgs
void setArgs(const KParts::OpenUrlArguments &args)
Definition: openurlrequest.cpp:70
Akregator::BrowserFrame::Private::history
QList< HistoryEntry > history
Definition: browserframe_p.h:65
Akregator::OpenUrlRequest::args
KParts::OpenUrlArguments args() const
Definition: openurlrequest.cpp:65
Akregator::BrowserFrame::Private::restoreHistoryEntry
void restoreHistoryEntry(const QList< HistoryEntry >::Iterator &entry)
QMenu::addSeparator
QAction * addSeparator()
QString
QList
Definition: article.h:41
browserframe_p.h
Akregator::BrowserFrame::Private::mimetype
QString mimetype
Definition: browserframe_p.h:75
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::OpenUrlRequest::setOptions
void setOptions(Options options)
Definition: openurlrequest.cpp:99
QMenu
Akregator::BrowserFrame::Private::appendHistoryEntry
void appendHistoryEntry(const KUrl &url)
Akregator::BrowserFrame::Private::current
QList< HistoryEntry >::Iterator current
Definition: browserframe_p.h:68
Akregator::BrowserFrame::saveConfig
void saveConfig(KConfigGroup &config, const QString &prefix)
Save a frame to a config file for session management.
Definition: browserframe.cpp:447
Akregator::createOpenLinkInExternalBrowserAction
AKREGATOR_EXPORT QAction * createOpenLinkInExternalBrowserAction(const KUrl &url, QObject *receiver=0, const char *slot=0, QObject *parent=0)
Definition: actions.cpp:42
Akregator::BrowserFrame::Private::HistoryAction
Definition: browserframe_p.h:122
Akregator::createOpenLinkInNewTabAction
AKREGATOR_EXPORT QAction * createOpenLinkInNewTabAction(const KUrl &url, QObject *receiver=0, const char *slot=0, QObject *parent=0)
Definition: actions.cpp:33
Akregator::BrowserFrame::part
KParts::ReadOnlyPart * part() const
Definition: browserframe.cpp:331
Akregator::ActionManager::getInstance
static ActionManager * getInstance()
Definition: actionmanager.cpp:35
QLatin1String
Akregator::BrowserFrame::Private::part
QPointer< KParts::ReadOnlyPart > part
Definition: browserframe_p.h:69
Akregator::BrowserFrame::getZoomFactor
int getZoomFactor() const
Definition: browserframe.cpp:179
QAction
Akregator::BrowserFrame::isLoading
bool isLoading() const
returns whether the embedded part is loading a website.
Definition: browserframe.cpp:428
Akregator::BrowserFrame::Private::isLoading
bool isLoading
Definition: browserframe_p.h:73
Akregator::BrowserFrame::slotHistoryBack
void slotHistoryBack()
Definition: browserframe.cpp:395
Akregator::FeedIconManager::addListener
void addListener(const KUrl &url, FaviconListener *listener)
Definition: feediconmanager.cpp:123
QString::fromLatin1
QString fromLatin1(const char *str, int size)
Akregator::OpenUrlRequest::NewTab
open in new tab
Definition: openurlrequest.h:53
Akregator::BrowserFrame::setZoomFactor
void setZoomFactor(int)
Definition: browserframe.cpp:187
Akregator::BrowserFrame::setFavicon
void setFavicon(const QIcon &icon)
Definition: browserframe.cpp:96
Akregator::BrowserFrame::openUrl
bool openUrl(const OpenUrlRequest &request)
Definition: browserframe.cpp:304
Akregator::BrowserFrame
Definition: browserframe.h:49
temporaryvalue.h
Akregator::TemporaryValue
Definition: temporaryvalue.h:30
Akregator::BrowserFrame::url
KUrl url() const
returns the URL of the embedded part
Definition: browserframe.cpp:65
Akregator::BrowserFrame::isReloadable
bool isReloadable() const
returns whether the shown content can be reloaded
Definition: browserframe.cpp:423
Akregator::BrowserFrame::Private::updateHistoryEntry
void updateHistoryEntry()
Akregator::FeedIconManager::self
static FeedIconManager * self()
Definition: feediconmanager.cpp:115
QIcon
Akregator::BrowserFrame::slotOpenLinkInNewTab
void slotOpenLinkInNewTab()
Definition: browserframe.cpp:127
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