• 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
framemanager.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 "framemanager.h"
26 #include "akregatorconfig.h"
27 #include "frame.h"
28 #include "actionmanager.h"
29 #include "browserrun.h"
30 #include "browserframe.h"
31 #include "openurlrequest.h"
32 
33 #include <kaction.h>
34 #include <KCharMacroExpander>
35 #include <kprocess.h>
36 #include <kshell.h>
37 #include <kconfiggroup.h>
38 #include <ktoolinvocation.h>
39 #include <kparts/event.h>
40 
41 #include <QtCore/QStringList>
42 #include <QtGui/QApplication>
43 
44 namespace Akregator {
45 
46 static void setPartGuiActive(KParts::ReadOnlyPart* part, bool active)
47 {
48  if (!part)
49  return;
50  // When this event is sent to a KPart, the KPart StatusBarExtension shows or
51  // hides its items
52  KParts::GUIActivateEvent ev(active);
53  QApplication::sendEvent(part, &ev);
54 }
55 
56 FrameManager::FrameManager(QWidget* mainWin, QObject* parent) : QObject(parent), m_mainWin(mainWin), m_currentFrame(0)
57 {
58 }
59 
60 FrameManager::~FrameManager()
61 {
62 }
63 
64 void FrameManager::setMainWindow(QWidget* mainWin)
65 {
66  m_mainWin = mainWin;
67 }
68 
69 Frame* FrameManager::currentFrame() const
70 {
71  return m_currentFrame;
72 }
73 
74 void FrameManager::slotAddFrame(Frame* frame)
75 {
76  m_frames.insert(frame->id(), frame);
77 
78  connect(frame, SIGNAL(signalCanceled(Akregator::Frame*,QString)), this, SLOT(slotSetCanceled(Akregator::Frame*,QString)) );
79  connect(frame, SIGNAL(signalStarted(Akregator::Frame*)), this, SLOT(slotSetStarted(Akregator::Frame*)) );
80  connect(frame, SIGNAL(signalCaptionChanged(Akregator::Frame*,QString)), this, SLOT(slotSetCaption(Akregator::Frame*,QString)));
81  connect(frame, SIGNAL(signalLoadingProgress(Akregator::Frame*,int)), this, SLOT(slotSetProgress(Akregator::Frame*,int)));
82  connect(frame, SIGNAL(signalCompleted(Akregator::Frame*)), this, SLOT(slotSetCompleted(Akregator::Frame*)));
83  connect(frame, SIGNAL(signalTitleChanged(Akregator::Frame*,QString)), this, SLOT(slotSetTitle(Akregator::Frame*,QString)) );
84  connect(frame, SIGNAL(signalStatusText(Akregator::Frame*,QString)), this, SLOT(slotSetStatusText(Akregator::Frame*,QString))
85 );
86 
87  connect(frame, SIGNAL(signalOpenUrlRequest(Akregator::OpenUrlRequest&)), this, SLOT(slotOpenUrlRequest(Akregator::OpenUrlRequest&)) );
88 
89  connect(frame, SIGNAL(signalCanGoBackToggled(Akregator::Frame*,bool)), this, SLOT(slotCanGoBackToggled(Akregator::Frame*,bool)) );
90  connect(frame, SIGNAL(signalCanGoForwardToggled(Akregator::Frame*,bool)), this, SLOT(slotCanGoForwardToggled(Akregator::Frame*,bool)) );
91  connect(frame, SIGNAL(signalIsReloadableToggled(Akregator::Frame*,bool)), this, SLOT(slotIsReloadableToggled(Akregator::Frame*,bool))
92 );
93 
94  connect(frame, SIGNAL(signalIsLoadingToggled(Akregator::Frame*,bool)), this, SLOT(slotIsLoadingToggled(Akregator::Frame*,bool)) );
95 
96  setPartGuiActive(frame->part(), false);
97 
98  emit signalFrameAdded(frame);
99 
100  if (m_frames.count() == 1)
101  slotChangeFrame(frame->id());
102 
103 }
104 
105 void FrameManager::slotRemoveFrame(int id)
106 {
107  Frame* frame = m_frames.value(id);
108 
109  if (!frame)
110  return;
111  if (!frame->isRemovable())
112  return;
113  frame->disconnect( this );
114 
115  if (m_currentFrame == frame)
116  {
117  slotChangeFrame(-1);
118  }
119 
120  m_frames.insert(id, 0);
121  m_frames.remove(id);
122  emit signalFrameRemoved(id);
123  delete frame;
124 }
125 
126 Frame* FrameManager::findFrameById(int id) const
127 {
128  return m_frames.value(id);
129 }
130 
131 void FrameManager::slotChangeFrame(int frameId)
132 {
133  Frame* frame = m_frames.value(frameId);
134  if (frame == m_currentFrame)
135  return;
136 
137  Frame* oldFrame = m_currentFrame;
138  m_currentFrame = frame;
139 
140  if (oldFrame)
141  setPartGuiActive(oldFrame->part(), false);
142 
143  if (frame)
144  {
145  setPartGuiActive(frame->part(), true);
146  slotCanGoBackToggled(frame, frame->canGoBack());
147  slotCanGoForwardToggled(frame, frame->canGoForward());
148  slotIsReloadableToggled(frame, frame->isReloadable());
149  slotIsLoadingToggled(frame, frame->isLoading());
150 
151  // TODO: handle removable flag
152 
153  switch (frame->state())
154  {
155  case Frame::Started:
156  emit signalStarted();
157  break;
158  case Frame::Canceled:
159  emit signalCanceled(QString::null); //krazy:exclude=nullstrassign for old broken gcc
160  break;
161  case Frame::Idle:
162  case Frame::Completed:
163  default:
164  emit signalCompleted();
165  }
166 
167  emit signalCaptionChanged(frame->caption());
168  emit signalTitleChanged(frame->title());
169  emit signalLoadingProgress( frame->progress());
170  emit signalStatusText( frame->statusText());
171  }
172  else
173  {
174  emit signalCompleted();
175  emit signalCaptionChanged(QString::null); //krazy:exclude=nullstrassign for old broken gcc
176  emit signalTitleChanged(QString::null); //krazy:exclude=nullstrassign for old broken gcc
177  emit signalLoadingProgress(100);
178  emit signalStatusText(QString::null); //krazy:exclude=nullstrassign for old broken gcc
179  }
180 
181  emit signalCurrentFrameChanged(oldFrame, frame);
182 }
183 
184 void FrameManager::slotSetStarted(Frame* frame)
185 {
186  if (frame == m_currentFrame)
187  emit signalStarted();
188 }
189 
190 void FrameManager::slotSetCanceled(Frame* frame, const QString& reason)
191 {
192  if (frame == m_currentFrame)
193  emit signalCanceled(reason);
194 }
195 
196 void FrameManager::slotSetCompleted(Frame* frame)
197 {
198  if (frame == m_currentFrame)
199  emit signalCompleted();
200 }
201 
202 void FrameManager::slotSetProgress(Frame* frame, int progress)
203 {
204  if (frame == m_currentFrame)
205  emit signalLoadingProgress(progress);
206 }
207 
208 void FrameManager::slotSetIconChanged(Frame* frame, const QIcon& icon)
209 {
210  if (frame != m_currentFrame)
211  return;
212  emit signalIconChanged(icon);
213 }
214 
215 void FrameManager::slotSetCaption(Frame* frame, const QString& caption)
216 {
217  if (frame == m_currentFrame)
218  emit signalCaptionChanged(caption);
219 }
220 
221 void FrameManager::slotSetTitle(Frame* frame, const QString& title)
222 {
223  if (frame == m_currentFrame)
224  emit signalTitleChanged(title);
225 }
226 
227 void FrameManager::slotCanGoBackToggled(Frame* frame, bool enabled)
228 {
229  if (frame == m_currentFrame)
230  ActionManager::getInstance()->action("browser_back")->setEnabled(enabled);
231 }
232 
233 void FrameManager::slotCanGoForwardToggled(Frame* frame, bool enabled)
234 {
235  if (frame == m_currentFrame)
236  ActionManager::getInstance()->action("browser_forward")->setEnabled(enabled);
237 }
238 
239 void FrameManager::slotIsReloadableToggled(Frame* frame, bool enabled)
240 {
241  if (frame == m_currentFrame)
242  ActionManager::getInstance()->action("browser_reload")->setEnabled(enabled);
243 }
244 
245 void FrameManager::slotIsLoadingToggled(Frame* frame, bool enabled)
246 {
247  if (frame == m_currentFrame)
248  ActionManager::getInstance()->action("browser_stop")->setEnabled(enabled);
249 }
250 
251 void FrameManager::slotSetStatusText(Frame* frame, const QString& statusText)
252 {
253  if (frame == m_currentFrame)
254  emit signalStatusText(statusText);
255 }
256 
257 void FrameManager::openUrl(OpenUrlRequest& request)
258 {
259  if (request.browserArgs().newTab() || request.browserArgs().forcesNewWindow() || request.options() == OpenUrlRequest::NewTab)
260  {
261  int newFrameId = -1;
262  emit signalRequestNewFrame(newFrameId);
263  request.setFrameId(newFrameId);
264  }
265 
266  if (m_frames.contains(request.frameId()))
267  {
268  Frame* frame = m_frames.value(request.frameId());
269  if (frame->openUrl(request))
270  request.setWasHandled(true);
271  request.setPart(frame->part());
272  }
273 
274  if (!request.openInBackground())
275  emit signalSelectFrame(request.frameId());
276 }
277 
278 void FrameManager::openInExternalBrowser(const OpenUrlRequest& request)
279 {
280  KUrl url = request.url();
281  if (!url.isValid())
282  return;
283 
284  if (!Settings::externalBrowserUseKdeDefault())
285  {
286  QHash<QChar,QString> map;
287  map.insert(QLatin1Char('u'), url.url());
288  const QString cmd = KMacroExpander::expandMacrosShellQuote(Settings::externalBrowserCustomCommand(), map);
289  const QStringList args = KShell::splitArgs(cmd);
290  if (!args.isEmpty())
291  {
292  KProcess::startDetached(args);
293  return;
294  }
295  }
296 
297  if (request.args().mimeType().isEmpty())
298  KToolInvocation::self()->invokeBrowser(url.url(), "0");
299  else
300  KRun::runUrl(url, request.args().mimeType(), 0 /*window*/, false, false);
301 }
302 
303 void FrameManager::slotOpenUrlRequest(OpenUrlRequest& request, bool useOpenInBackgroundSetting )
304 {
305  kDebug() <<"FrameManager::slotOpenUrlRequest():" << request.debugInfo();
306 
307  if (request.options() == OpenUrlRequest::ExternalBrowser)
308  {
309  openInExternalBrowser(request);
310  return;
311  }
312 
313  if( useOpenInBackgroundSetting ) {
314  // Honour user's preference for foreground/background tabs
315  if (request.options() == OpenUrlRequest::NewTab ||
316  request.browserArgs().newTab())
317  {
318  request.setOpenInBackground(Settings::lMBBehaviour() ==
319  Settings::EnumLMBBehaviour::OpenInBackground);
320  }
321  }
322 
323  // if no service type is set, determine it using BrowserRun.
324  if (request.args().mimeType().isEmpty())
325  {
326  BrowserRun* run = new BrowserRun(request, m_mainWin);
327  connect(run, SIGNAL(signalFoundMimeType(Akregator::OpenUrlRequest&)),
328  this, SLOT(openUrl(Akregator::OpenUrlRequest&)) );
329  }
330  else // serviceType is already set, so we open the page synchronously.
331  {
332  openUrl(request);
333  }
334 
335 }
336 
337 void FrameManager::slotBrowserBackAboutToShow()
338 {
339  if (m_currentFrame)
340  m_currentFrame->slotHistoryBackAboutToShow();
341 }
342 
343 void FrameManager::slotBrowserForwardAboutToShow()
344 {
345  if (m_currentFrame)
346  m_currentFrame->slotHistoryForwardAboutToShow();
347 }
348 
349 void FrameManager::slotBrowserBack()
350 {
351  if (m_currentFrame)
352  m_currentFrame->slotHistoryBack();
353 }
354 
355 void FrameManager::slotBrowserForward()
356 {
357  if (m_currentFrame)
358  m_currentFrame->slotHistoryForward();
359 }
360 
361 void FrameManager::slotBrowserReload()
362 {
363  if (m_currentFrame)
364  m_currentFrame->slotReload();
365 }
366 
367 void FrameManager::slotBrowserStop()
368 {
369  if (m_currentFrame)
370  m_currentFrame->slotStop();
371 }
372 
373 void FrameManager::saveProperties(KConfigGroup & config)
374 {
375  //write children
376  QStringList strlst;
377  QString newPrefix;
378  QHash<int, Frame*>::const_iterator i;
379  for (i = m_frames.constBegin(); i != m_frames.constEnd(); ++i)
380  {
381  // No need to save the main frame
382  if(i.value() && qobject_cast<BrowserFrame *>(i.value()))
383  {
384 
385  newPrefix = QLatin1Char('T') + QString::number(i.key());
386  strlst.append( newPrefix );
387  newPrefix.append( QLatin1Char( '_' ) );
388  i.value()->saveConfig( config, newPrefix );
389  }
390  }
391 
392  config.writeEntry( QString::fromLatin1( "Children" ), strlst );
393  config.writeEntry( QString::fromLatin1( "activeChildIndex" ),
394  m_frames.key(m_currentFrame) );
395 }
396 
397 } // namespace Akregator
398 
399 
Akregator::FrameManager::slotOpenUrlRequest
void slotOpenUrlRequest(Akregator::OpenUrlRequest &request, bool useOpenInBackgroundSetting=true)
Definition: framemanager.cpp:303
Akregator::Frame
Definition: frame.h:53
QWidget
QString::append
QString & append(QChar ch)
Akregator::Frame::statusText
QString statusText() const
Definition: frame.cpp:151
Akregator::FrameManager::slotChangeFrame
void slotChangeFrame(int frameId)
Definition: framemanager.cpp:131
QHash::insert
iterator insert(const Key &key, const T &value)
Akregator::FrameManager::signalCompleted
void signalCompleted()
openurlrequest.h
Akregator::OpenUrlRequest
Definition: openurlrequest.h:42
Akregator::Frame::isRemovable
bool isRemovable() const
Returns whether the frame can be removed from Akregator (via detach or close tab etc.) Usually all tabs but the main tab can be removed.
Definition: frame.cpp:122
Akregator::FrameManager::signalRequestNewFrame
void signalRequestNewFrame(int &id)
Akregator::OpenUrlRequest::setOpenInBackground
void setOpenInBackground(bool background)
Definition: openurlrequest.cpp:60
browserframe.h
Akregator::OpenUrlRequest::debugInfo
QString debugInfo() const
Definition: openurlrequest.cpp:114
Akregator::FrameManager::signalSelectFrame
void signalSelectFrame(int id)
Akregator::FrameManager::saveProperties
void saveProperties(KConfigGroup &config)
session management
Definition: framemanager.cpp:373
Akregator::FrameManager::signalTitleChanged
void signalTitleChanged(const QString &)
actionmanager.h
Akregator::setPartGuiActive
static void setPartGuiActive(KParts::ReadOnlyPart *part, bool active)
Definition: framemanager.cpp:46
QObject::disconnect
bool disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)
Akregator::OpenUrlRequest::options
Options options() const
Definition: openurlrequest.cpp:86
Akregator::ActionManager::action
virtual QAction * action(const char *name)=0
Akregator::FrameManager::slotBrowserStop
void slotBrowserStop()
Definition: framemanager.cpp:367
Akregator::FrameManager::~FrameManager
~FrameManager()
Definition: framemanager.cpp:60
QString::number
QString number(int n, int base)
Akregator::FrameManager::signalLoadingProgress
void signalLoadingProgress(int)
QList::append
void append(const T &value)
Akregator::FrameManager::slotBrowserForwardAboutToShow
void slotBrowserForwardAboutToShow()
Definition: framemanager.cpp:343
Akregator::FrameManager::slotBrowserForward
void slotBrowserForward()
Definition: framemanager.cpp:355
QHash
Definition: feedlist.h:41
QObject
Akregator::Frame::isLoading
virtual bool isLoading() const
returns whether the embedded part is loading a website.
Definition: frame.cpp:51
Akregator::Frame::id
int id() const
Definition: frame.cpp:112
frame.h
browserrun.h
Akregator::Frame::Started
Definition: frame.h:61
QList::isEmpty
bool isEmpty() const
Akregator::Frame::part
virtual KParts::ReadOnlyPart * part() const =0
QCoreApplication::sendEvent
bool sendEvent(QObject *receiver, QEvent *event)
Akregator::Frame::progress
int progress() const
Definition: frame.cpp:205
Akregator::FrameManager::findFrameById
Frame * findFrameById(int id) const
Definition: framemanager.cpp:126
Akregator::OpenUrlRequest::args
KParts::OpenUrlArguments args() const
Definition: openurlrequest.cpp:65
Akregator::Frame::Completed
Definition: frame.h:61
QString
QtConcurrent::map
QFuture< void > map(Sequence &sequence, MapFunction function)
Akregator::FrameManager::signalCurrentFrameChanged
void signalCurrentFrameChanged(Akregator::Frame *deactivated, Akregator::Frame *activated)
emitted when the active frame is switched
QStringList
Akregator::OpenUrlRequest::ExternalBrowser
open in external browser
Definition: openurlrequest.h:54
Akregator::Frame::title
QString title() const
Definition: frame.cpp:141
Akregator::Frame::Idle
Definition: frame.h:61
QLatin1Char
Akregator::Frame::canGoForward
virtual bool canGoForward() const
returns whether it is possible to go forward in the history
Definition: frame.h:89
Akregator::FrameManager::signalStarted
void signalStarted()
Akregator::BrowserRun
Definition: browserrun.h:35
QHash::const_iterator
Akregator::FrameManager::signalFrameRemoved
void signalFrameRemoved(int id)
Akregator::FrameManager::slotRemoveFrame
void slotRemoveFrame(int frameId)
Definition: framemanager.cpp:105
Akregator::FrameManager::signalCaptionChanged
void signalCaptionChanged(const QString &)
Akregator::FrameManager::slotBrowserBackAboutToShow
void slotBrowserBackAboutToShow()
Definition: framemanager.cpp:337
Akregator::FrameManager::currentFrame
Frame * currentFrame() const
Definition: framemanager.cpp:69
Akregator::FrameManager::setMainWindow
void setMainWindow(QWidget *mainWin)
Definition: framemanager.cpp:64
Akregator::Frame::isReloadable
virtual bool isReloadable() const
returns whether the shown content can be reloaded
Definition: frame.h:98
Akregator::FrameManager::signalStatusText
void signalStatusText(const QString &)
Akregator::ActionManager::getInstance
static ActionManager * getInstance()
Definition: actionmanager.cpp:35
Akregator::Frame::caption
QString caption() const
Definition: frame.cpp:146
Akregator::Frame::canGoBack
virtual bool canGoBack() const
returns whether it is possible to go back in the history
Definition: frame.h:94
Akregator::Frame::state
State state() const
Definition: frame.cpp:136
Akregator::FrameManager::slotBrowserReload
void slotBrowserReload()
Definition: framemanager.cpp:361
QString::fromLatin1
QString fromLatin1(const char *str, int size)
Akregator::FrameManager::slotAddFrame
void slotAddFrame(Frame *frame)
Definition: framemanager.cpp:74
Akregator::OpenUrlRequest::NewTab
open in new tab
Definition: openurlrequest.h:53
Akregator::FrameManager::signalCanceled
void signalCanceled(const QString &)
Akregator::FrameManager::slotBrowserBack
void slotBrowserBack()
Definition: framemanager.cpp:349
Akregator::BrowserFrame
Definition: browserframe.h:49
Akregator::Frame::Canceled
Definition: frame.h:61
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
framemanager.h
Akregator::FrameManager::FrameManager
FrameManager(QWidget *mainWin=0, QObject *parent=0)
Definition: framemanager.cpp:56
Akregator::OpenUrlRequest::browserArgs
KParts::BrowserArguments browserArgs() const
Definition: openurlrequest.cpp:76
QAction::setEnabled
void setEnabled(bool)
Akregator::FrameManager::signalFrameAdded
void signalFrameAdded(Akregator::Frame *)
QIcon
Akregator::FrameManager::signalIconChanged
void signalIconChanged(const QIcon &)
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