summaryrefslogtreecommitdiffstats
path: root/akregator/src/viewer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'akregator/src/viewer.cpp')
-rw-r--r--akregator/src/viewer.cpp336
1 files changed, 336 insertions, 0 deletions
diff --git a/akregator/src/viewer.cpp b/akregator/src/viewer.cpp
new file mode 100644
index 000000000..6490fb82a
--- /dev/null
+++ b/akregator/src/viewer.cpp
@@ -0,0 +1,336 @@
+/*
+ This file is part of Akregator.
+
+ Copyright (C) 2004 Teemu Rytilahti <tpr@d5k.net>
+ 2005 Frank Osterfeld <frank.osterfeld at kdemail.net>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+
+ As a special exception, permission is given to link this program
+ with any edition of Qt, and distribute the resulting executable,
+ without including the source code for Qt in the source distribution.
+*/
+
+#include <kaction.h>
+#include <kapplication.h>
+#include <kfiledialog.h>
+#include <khtmlview.h>
+#include <kiconloader.h>
+#include <klocale.h>
+#include <kmessagebox.h>
+#include <kpopupmenu.h>
+#include <kprocess.h>
+#include <krun.h>
+#include <kshell.h>
+#include <kurl.h>
+#include <kparts/browserextension.h>
+
+#include <qaccel.h>
+#include <qclipboard.h>
+#include <qpaintdevicemetrics.h>
+
+#include "viewer.h"
+#include "akregator_run.h"
+#include "akregatorconfig.h"
+
+namespace Akregator {
+
+Viewer::Viewer(QWidget *parent, const char *name)
+ : KHTMLPart(parent, name), m_url(0)
+{
+ setZoomFactor(100);
+ setMetaRefreshEnabled(true);
+ setDNDEnabled(true);
+ setAutoloadImages(true);
+ setStatusMessagesEnabled(true);
+
+ // change the cursor when loading stuff...
+ connect( this, SIGNAL(started(KIO::Job *)),
+ this, SLOT(slotStarted(KIO::Job *)));
+ connect( this, SIGNAL(completed()),
+ this, SLOT(slotCompleted()));
+
+ connect( browserExtension(), SIGNAL(popupMenu (KXMLGUIClient*, const QPoint&, const KURL&, const KParts::URLArgs&, KParts::BrowserExtension::PopupFlags, mode_t)), this, SLOT(slotPopupMenu(KXMLGUIClient*, const QPoint&, const KURL&, const KParts::URLArgs&, KParts::BrowserExtension::PopupFlags, mode_t)));
+
+ KStdAction::print(this, SLOT(slotPrint()), actionCollection(), "viewer_print");
+ KStdAction::copy(this, SLOT(slotCopy()), actionCollection(), "viewer_copy");
+
+ new KAction( i18n("&Increase Font Sizes"), "viewmag+", "Ctrl+Plus", this, SLOT(slotZoomIn()), actionCollection(), "incFontSizes" );
+ new KAction( i18n("&Decrease Font Sizes"), "viewmag-", "Ctrl+Minus", this, SLOT(slotZoomOut()), actionCollection(), "decFontSizes" );
+
+ connect(this, SIGNAL(selectionChanged()), this, SLOT(slotSelectionChanged()));
+
+ connect( browserExtension(), SIGNAL(openURLRequestDelayed(const KURL&, const KParts::URLArgs&)), this, SLOT(slotOpenURLRequest(const KURL&, const KParts::URLArgs& )) );
+
+ new KAction(i18n("Copy &Link Address"), "", 0,
+ this, SLOT(slotCopyLinkAddress()),
+ actionCollection(), "copylinkaddress");
+ new KAction(i18n("&Save Link As..."), "", 0,
+ this, SLOT(slotSaveLinkAs()),
+ actionCollection(), "savelinkas");
+}
+
+Viewer::~Viewer()
+{}
+
+bool Viewer::closeURL()
+{
+ emit browserExtension()->loadingProgress(-1);
+ emit canceled(QString::null);
+ return KHTMLPart::closeURL();
+}
+
+int Viewer::pointsToPixel(int pointSize) const
+{
+ const QPaintDeviceMetrics metrics(view());
+ return ( pointSize * metrics.logicalDpiY() + 36 ) / 72 ;
+}
+
+void Viewer::displayInExternalBrowser(const KURL &url, const QString &mimetype)
+{
+ if (!url.isValid()) return;
+ if (Settings::externalBrowserUseKdeDefault())
+ {
+ if (mimetype.isEmpty())
+ kapp->invokeBrowser(url.url(), "0");
+ else
+ KRun::runURL(url, mimetype, false, false);
+ }
+ else
+ {
+ QString cmd = Settings::externalBrowserCustomCommand();
+ QString urlStr = url.url();
+ cmd.replace(QRegExp("%u"), urlStr);
+ KProcess *proc = new KProcess;
+ QStringList cmdAndArgs = KShell::splitArgs(cmd);
+ *proc << cmdAndArgs;
+ proc->start(KProcess::DontCare);
+ delete proc;
+ }
+}
+
+void Viewer::slotOpenURLRequest(const KURL& /*url*/, const KParts::URLArgs& /*args*/)
+{
+
+}
+
+void Viewer::urlSelected(const QString &url, int button, int state, const QString &_target, KParts::URLArgs args)
+{
+ m_url = completeURL(url);
+ browserExtension()->setURLArgs(args);
+ if (button == LeftButton)
+ {
+ switch (Settings::lMBBehaviour())
+ {
+ case Settings::EnumLMBBehaviour::OpenInExternalBrowser:
+ slotOpenLinkInBrowser();
+ break;
+ case Settings::EnumLMBBehaviour::OpenInBackground:
+ slotOpenLinkInBackgroundTab();
+ break;
+ default:
+ slotOpenLinkInForegroundTab();
+ break;
+ }
+ return;
+ }
+ else if (button == MidButton)
+ {
+ switch (Settings::mMBBehaviour())
+ {
+ case Settings::EnumMMBBehaviour::OpenInExternalBrowser:
+ slotOpenLinkInBrowser();
+ break;
+ case Settings::EnumMMBBehaviour::OpenInBackground:
+ slotOpenLinkInBackgroundTab();
+ break;
+ default:
+ slotOpenLinkInForegroundTab();
+ break;
+ }
+ return;
+ }
+ KHTMLPart::urlSelected(url,button,state,_target,args);
+}
+
+void Viewer::slotPopupMenu(KXMLGUIClient*, const QPoint& p, const KURL& kurl, const KParts::URLArgs&, KParts::BrowserExtension::PopupFlags kpf, mode_t)
+{
+ const bool isLink = (kpf & (KParts::BrowserExtension::ShowNavigationItems | KParts::BrowserExtension::ShowTextSelectionItems)) == 0;
+ const bool isSelection = (kpf & KParts::BrowserExtension::ShowTextSelectionItems) != 0;
+
+ QString url = kurl.url();
+
+ m_url = url;
+ KPopupMenu popup;
+
+ if (isLink && !isSelection)
+ {
+ popup.insertItem(SmallIcon("tab_new"), i18n("Open Link in New &Tab"), this, SLOT(slotOpenLinkInForegroundTab()));
+ popup.insertItem(SmallIcon("window_new"), i18n("Open Link in External &Browser"), this, SLOT(slotOpenLinkInBrowser()));
+ popup.insertSeparator();
+ action("savelinkas")->plug(&popup);
+ action("copylinkaddress")->plug(&popup);
+ }
+ else
+ {
+ if (isSelection)
+ {
+ action("viewer_copy")->plug(&popup);
+ popup.insertSeparator();
+ }
+ action("viewer_print")->plug(&popup);
+ //KAction *ac = action("setEncoding");
+ //if (ac)
+ // ac->plug(&popup);
+ }
+ popup.exec(p);
+}
+
+// taken from KDevelop
+void Viewer::slotCopy()
+{
+ QString text = selectedText();
+ text.replace( QChar( 0xa0 ), ' ' );
+ QClipboard *cb = QApplication::clipboard();
+ disconnect( cb, SIGNAL( selectionChanged() ), this, SLOT( slotClearSelection() ) );
+ cb->setText(text);
+ connect( cb, SIGNAL( selectionChanged() ), this, SLOT( slotClearSelection() ) );
+}
+
+void Viewer::slotCopyLinkAddress()
+{
+ if(m_url.isEmpty()) return;
+ QClipboard *cb = QApplication::clipboard();
+ cb->setText(m_url.prettyURL(), QClipboard::Clipboard);
+ cb->setText(m_url.prettyURL(), QClipboard::Selection);
+}
+
+void Viewer::slotSelectionChanged()
+{
+ action("viewer_copy")->setEnabled(!selectedText().isEmpty());
+}
+
+void Viewer::slotOpenLinkInternal()
+{
+ openURL(m_url);
+}
+
+void Viewer::slotOpenLinkInForegroundTab()
+{
+ emit urlClicked(m_url, this, true, false);
+}
+
+void Viewer::slotOpenLinkInBackgroundTab()
+{
+ emit urlClicked(m_url, this, true, true);
+}
+
+void Viewer::slotOpenLinkInThisTab()
+{
+ emit urlClicked(m_url, this, false, false);
+}
+
+void Viewer::slotOpenLinkInBrowser()
+{
+ displayInExternalBrowser(m_url, QString::null);
+}
+
+void Viewer::slotSaveLinkAs()
+{
+ KURL tmp( m_url );
+
+ if ( tmp.fileName(false).isEmpty() )
+ tmp.setFileName( "index.html" );
+ KParts::BrowserRun::simpleSave(tmp, tmp.fileName());
+}
+
+void Viewer::slotStarted(KIO::Job *)
+{
+ widget()->setCursor( waitCursor );
+}
+
+void Viewer::slotCompleted()
+{
+ widget()->unsetCursor();
+}
+
+void Viewer::slotScrollUp()
+{
+ view()->scrollBy(0,-10);
+}
+
+void Viewer::slotScrollDown()
+{
+ view()->scrollBy(0,10);
+}
+
+void Viewer::slotZoomIn()
+{
+ int zf = zoomFactor();
+ if (zf < 100)
+ {
+ zf = zf - (zf % 20) + 20;
+ setZoomFactor(zf);
+ }
+ else
+ {
+ zf = zf - (zf % 50) + 50;
+ setZoomFactor(zf < 300 ? zf : 300);
+ }
+}
+
+void Viewer::slotZoomOut()
+{
+ int zf = zoomFactor();
+ if (zf <= 100)
+ {
+ zf = zf - (zf % 20) - 20;
+ setZoomFactor(zf > 20 ? zf : 20);
+ }
+ else
+ {
+ zf = zf - (zf % 50) - 50;
+ setZoomFactor(zf);
+ }
+}
+
+void Viewer::slotSetZoomFactor(int percent)
+{
+ setZoomFactor(percent);
+}
+
+// some code taken from KDevelop (lib/widgets/kdevhtmlpart.cpp)
+void Viewer::slotPrint( )
+{
+ view()->print();
+}
+
+
+void Viewer::setSafeMode()
+{
+ //setJScriptEnabled(false);
+ setJavaEnabled(false);
+ setMetaRefreshEnabled(false);
+ setPluginsEnabled(false);
+ setDNDEnabled(true);
+ setAutoloadImages(true);
+ setStatusMessagesEnabled(false);
+}
+
+} // namespace Akregator
+
+#include "viewer.moc"
+
+// vim: set et ts=4 sts=4 sw=4: