summaryrefslogtreecommitdiff
path: root/kwebapp/rekonqview.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kwebapp/rekonqview.cpp')
-rw-r--r--kwebapp/rekonqview.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/kwebapp/rekonqview.cpp b/kwebapp/rekonqview.cpp
new file mode 100644
index 00000000..b737bc11
--- /dev/null
+++ b/kwebapp/rekonqview.cpp
@@ -0,0 +1,270 @@
+/* ============================================================
+*
+* This file is a part of the rekonq project
+*
+* Copyright (C) 2012 by Andrea Diamantini <adjam7 at gmail dot com>
+*
+*
+* 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) version 3 or any later version
+* accepted by the membership of KDE e.V. (or its successor approved
+* by the membership of KDE e.V.), which shall act as a proxy
+* defined in Section 14 of version 3 of the license.
+*
+* 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, see <http://www.gnu.org/licenses/>.
+*
+* ============================================================ */
+
+
+// Self Includes
+#include "rekonqview.h"
+#include "rekonqview.moc"
+
+// Local Includes
+#include "walletbar.h"
+#include "webpage.h"
+
+// KDE Includes
+#include <KWebWallet>
+#include <KStandardShortcut>
+#include <KMenu>
+#include <KActionMenu>
+#include <KWebView>
+#include <KDebug>
+#include <KMessageBox>
+#include <KRun>
+#include <klocalizedstring.h>
+#include <KSharedConfig>
+#include <KConfigGroup>
+
+// Qt Includes
+#include <QVBoxLayout>
+#include <QWebElement>
+#include <QWebFrame>
+#include <QByteArray>
+#include <QDataStream>
+#include <QLabel>
+#include <QTimer>
+#include <QTextDocument>
+#include <QStyle>
+
+
+RekonqView::RekonqView(QWidget *parent)
+ : QWidget(parent)
+ , m_webView(0)
+ , m_popup(new QLabel(this))
+ , m_hidePopupTimer(new QTimer(this))
+
+{
+ setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ QVBoxLayout *l = new QVBoxLayout(this);
+ l->setMargin(0);
+ l->setSpacing(0);
+
+ l->addWidget(view());
+ view()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+
+ // fix focus handling
+ setFocusProxy(view());
+
+ KWebWallet *wallet = page()->wallet();
+
+ if (wallet)
+ {
+ connect(wallet, SIGNAL(saveFormDataRequested(QString, QUrl)),
+ this, SLOT(createWalletBar(QString, QUrl)));
+ }
+
+ connect(page(), SIGNAL(linkHovered(QString, QString, QString)), this, SLOT(notifyMessage(QString)));
+
+ // setting popup notification
+ m_popup->setAutoFillBackground(true);
+ m_popup->setMargin(4);
+ m_popup->raise();
+ m_popup->hide();
+
+ connect(m_hidePopupTimer, SIGNAL(timeout()), m_popup, SLOT(hide()));
+
+ // signal && slots
+ connect(view(), SIGNAL(iconChanged()), this, SLOT(setIcon()));
+ connect(view(), SIGNAL(titleChanged(QString)), this, SLOT(setTitle(QString)));
+
+}
+
+
+RekonqView::~RekonqView()
+{
+ m_walletBar.clear();
+
+ delete m_webView;
+}
+
+
+WebView *RekonqView::view()
+{
+ if (!m_webView)
+ {
+ m_webView = new WebView(this);
+ }
+ return m_webView;
+}
+
+
+WebPage *RekonqView::page()
+{
+ return view()->page();
+}
+
+
+KUrl RekonqView::url()
+{
+// if (page() && page()->isOnRekonqPage())
+// {
+// return page()->loadingUrl();
+// }
+
+ return view()->url();
+}
+
+
+void RekonqView::setTitle(const QString &t)
+{
+ setWindowTitle(t);
+}
+
+
+void RekonqView::setIcon()
+{
+ setWindowIcon(view()->icon());
+}
+
+
+void RekonqView::createWalletBar(const QString &key, const QUrl &url)
+{
+ // check if the url is in the wallet blacklist
+ QString urlString = url.toString();
+
+ KSharedConfig::Ptr config = KSharedConfig::openConfig("rekonqrc", KConfig::SimpleConfig, "config");
+ KConfigGroup group1(config, "misc");
+ QStringList blackList = group1.readEntry("walletBlackList", QStringList());
+ if (blackList.contains(urlString))
+ return;
+
+ KWebWallet *wallet = page()->wallet();
+
+ KConfigGroup group2(config, "Privacy");
+ bool passwordSavingEnabled = group2.readEntry("passwordSavingEnabled", false);
+
+ if (!passwordSavingEnabled)
+ {
+ wallet->rejectSaveFormDataRequest(key);
+ return;
+ }
+
+ if (m_walletBar.isNull())
+ {
+ m_walletBar = new WalletBar(this);
+ m_walletBar.data()->onSaveFormData(key, url);
+ qobject_cast<QVBoxLayout *>(layout())->insertWidget(0, m_walletBar.data());
+ m_walletBar.data()->animatedShow();
+ }
+ else
+ {
+ disconnect(wallet);
+ qobject_cast<QVBoxLayout *>(layout())->insertWidget(0, m_walletBar.data());
+ m_walletBar.data()->animatedShow();
+ }
+
+ connect(m_walletBar.data(), SIGNAL(saveFormDataAccepted(QString)),
+ wallet, SLOT(acceptSaveFormDataRequest(QString)), Qt::UniqueConnection);
+ connect(m_walletBar.data(), SIGNAL(saveFormDataRejected(QString)),
+ wallet, SLOT(rejectSaveFormDataRequest(QString)), Qt::UniqueConnection);
+}
+
+
+bool RekonqView::hasRSSInfo()
+{
+ QWebElementCollection col = page()->mainFrame()->findAllElements("link[type=\"application/rss+xml\"]");
+ col.append(page()->mainFrame()->findAllElements("link[type=\"application/atom+xml\"]"));
+ if (col.count() != 0)
+ return true;
+
+ return false;
+}
+
+
+void RekonqView::loadUrl(const KUrl& url)
+{
+ if (url.isEmpty())
+ return;
+
+ if (!url.isValid())
+ {
+ KMessageBox::error(0, i18n("Malformed URL:\n%1", url.url(KUrl::RemoveTrailingSlash)));
+ return;
+ }
+
+ view()->load(url);
+}
+
+
+void RekonqView::notifyMessage(const QString &msg)
+{
+ // deleting popus if empty msgs
+ if (msg.isEmpty())
+ {
+ m_hidePopupTimer->start(250);
+ return;
+ }
+
+ m_hidePopupTimer->stop();
+ m_hidePopupTimer->start(500);
+
+ QString msgToShow = Qt::escape(msg);
+
+ const int margin = 4;
+ const int halfWidth = width() / 2;
+
+ // Set Popup size
+ QFontMetrics fm = m_popup->fontMetrics();
+ QSize labelSize(fm.width(msgToShow) + 2 * margin, fm.height() + 2 * margin);
+
+ if (labelSize.width() > halfWidth)
+ labelSize.setWidth(halfWidth);
+
+ m_popup->setFixedSize(labelSize);
+ m_popup->setText(fm.elidedText(msgToShow, Qt::ElideMiddle, labelSize.width() - 2 * margin));
+
+ // NOTE: while currentFrame should NEVER be null
+ // we are checking here its existence cause of bug:264187
+ if (!page() || !page()->currentFrame())
+ return;
+
+ const bool horizontalScrollbarIsVisible = page()->currentFrame()->scrollBarMaximum(Qt::Horizontal);
+ const bool verticalScrollbarIsVisible = page()->currentFrame()->scrollBarMaximum(Qt::Vertical);
+ const bool actionBarsVisible = false; //FIXME m_findBar->isVisible() || m_zoomBar->isVisible();
+
+ const int scrollbarExtent = style()->pixelMetric(QStyle::PM_ScrollBarExtent);
+ const int hScrollbarSize = horizontalScrollbarIsVisible ? scrollbarExtent : 0;
+ const int vScrollbarSize = verticalScrollbarIsVisible ? scrollbarExtent : 0;
+
+ const QPoint mousePos = mapFromGlobal(QCursor::pos());
+ const QPoint bottomPoint = geometry().bottomLeft();
+
+ int y = bottomPoint.y() + 1 - 2 * m_popup->height() - hScrollbarSize; // +1 because bottom() returns top() + height() - 1, see QRect doku
+ int x = QRect(QPoint(0, y), labelSize).contains(mousePos) || actionBarsVisible
+ ? width() - labelSize.width() - vScrollbarSize
+ : 0;
+
+ m_popup->move(x, y);
+ m_popup->show();
+}