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