• Skip to content
  • Skip to link menu
KDE 4.2 API Reference
  • KDE API Reference
  • API Reference
  • Sitemap
  • Contact Us
 

Applets

webbrowser.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2008 Marco Martin <notmart@gmail.com>                   *
00003  *                                                                         *
00004  *   This program is free software; you can redistribute it and/or modify  *
00005  *   it under the terms of the GNU General Public License as published by  *
00006  *   the Free Software Foundation; either version 2 of the License, or     *
00007  *   (at your option) any later version.                                   *
00008  *                                                                         *
00009  *   This program is distributed in the hope that it will be useful,       *
00010  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00011  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00012  *   GNU General Public License for more details.                          *
00013  *                                                                         *
00014  *   You should have received a copy of the GNU General Public License     *
00015  *   along with this program; if not, write to the                         *
00016  *   Free Software Foundation, Inc.,                                       *
00017  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA .        *
00018  ***************************************************************************/
00019 
00020 #include "webbrowser.h"
00021 
00022 #include <limits.h>
00023 
00024 #include <QGraphicsLinearLayout>
00025 #include <QGraphicsProxyWidget>
00026 #include <QGraphicsSceneMouseEvent>
00027 #include <QStandardItemModel>
00028 #include <QModelIndex>
00029 #include <QAction>
00030 #include <QTimer>
00031 #include <QTreeView>
00032 #include <QWebPage>
00033 #include <QWebFrame>
00034 #include <QWebHistory>
00035 
00036 #include <KIcon>
00037 #include <KCompletion>
00038 #include <KBookmarkManager>
00039 #include <KIconLoader>
00040 #include <KUrlPixmapProvider>
00041 #include <KUriFilter>
00042 #include <KMessageBox>
00043 #include <KConfigDialog>
00044 #include <KHistoryComboBox>
00045 
00046 #include <Plasma/IconWidget>
00047 #include <Plasma/LineEdit>
00048 #include <Plasma/Meter>
00049 #include <Plasma/WebView>
00050 #include <Plasma/TreeView>
00051 #include <Plasma/Slider>
00052 
00053 #include "historycombobox.h"
00054 #include "bookmarksdelegate.h"
00055 #include "bookmarkitem.h"
00056 
00057 WebBrowser::WebBrowser(QObject *parent, const QVariantList &args)
00058         : Plasma::PopupApplet(parent, args),
00059           m_browser(0),
00060           m_verticalScrollValue(0),
00061           m_horizontalScrollValue(0),
00062           m_completion(0),
00063           m_bookmarkManager(0),
00064           m_bookmarkModel(0),
00065           m_autoRefreshTimer(0),
00066           m_graphicsWidget(0),
00067           m_historyCombo(0)
00068 {
00069     setHasConfigurationInterface(true);
00070     setAspectRatioMode(Plasma::IgnoreAspectRatio);
00071 
00072     m_layout = 0;
00073     resize(500,500);
00074     if (args.count() > 0) {
00075         m_url = KUrl(args.value(0).toString());
00076     }
00077     setPopupIcon("konqueror");
00078 }
00079 
00080 QGraphicsWidget *WebBrowser::graphicsWidget()
00081 {
00082     if (m_graphicsWidget) {
00083         return m_graphicsWidget;
00084     }
00085 
00086     KConfigGroup cg = config();
00087 
00088 
00089     m_layout = new QGraphicsLinearLayout(Qt::Vertical);
00090     m_toolbarLayout = new QGraphicsLinearLayout(Qt::Horizontal);
00091     m_statusbarLayout = new QGraphicsLinearLayout(Qt::Horizontal);
00092 
00093     m_back = addTool("go-previous", m_toolbarLayout);
00094     m_forward = addTool("go-next", m_toolbarLayout);
00095 
00096     m_historyCombo = new Plasma::HistoryComboBox(this);
00097     m_historyCombo->setZValue(999);
00098     m_historyCombo->setDuplicatesEnabled(false);
00099     m_pixmapProvider = new KUrlPixmapProvider;
00100     m_historyCombo->nativeWidget()->setPixmapProvider(m_pixmapProvider);
00101 
00102     m_toolbarLayout->addItem(m_historyCombo);
00103     m_go = addTool("go-jump-locationbar", m_toolbarLayout);
00104     m_goAction = m_go->action();
00105     m_reloadAction = new QAction(KIcon("view-refresh"), QString(), this);
00106 
00107     m_layout->addItem(m_toolbarLayout);
00108 
00109 
00110     m_browser = new Plasma::WebView(this);
00111     m_browser->setPreferredSize(400, 400);
00112     m_browser->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
00113 
00114 
00115     m_layout->addItem(m_browser);
00116 
00117     //bookmarks
00118     m_bookmarkManager = KBookmarkManager::userBookmarksManager();
00119     connect(m_bookmarkManager, SIGNAL(changed(const QString, const QString)), this, SLOT(bookmarksModelInit()));
00120     bookmarksModelInit();
00121 
00122     m_bookmarksView = new Plasma::TreeView(this);
00123     m_bookmarksView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
00124     m_bookmarksView->setModel(m_bookmarkModel);
00125     m_bookmarksView->nativeWidget()->setHeaderHidden(true);
00126     //m_bookmarksView->nativeWidget()->viewport()->setAutoFillBackground(false);
00127     m_bookmarksView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
00128     m_bookmarksView->hide();
00129     //FIXME: this is probably a Qt bug, QGraphicslayout always behaves as the hidden element is present, unlike QLayouts
00130     m_bookmarksView->setMaximumHeight(0);
00131     m_layout->addItem(m_bookmarksView);
00132 
00133     m_bookmarksDelegate = new BookmarksDelegate(this);
00134     m_bookmarksView->nativeWidget()->setItemDelegate(m_bookmarksDelegate);
00135 
00136     connect(m_bookmarksDelegate, SIGNAL(destroyBookmark(const QModelIndex &)), this, SLOT(removeBookmark(const QModelIndex &)));
00137 
00138     m_layout->addItem(m_statusbarLayout);
00139 
00140     m_addBookmark = addTool("bookmark-new", m_statusbarLayout);
00141     m_addBookmarkAction = m_addBookmark->action();
00142     m_removeBookmarkAction = new QAction(KIcon("list-remove"), QString(), this);
00143     m_organizeBookmarks = addTool("bookmarks-organize", m_statusbarLayout);
00144 
00145 
00146     m_progress = new Plasma::Meter(this);
00147     m_progress->setMeterType(Plasma::Meter::BarMeterHorizontal);
00148     m_progress->setMinimum(0);
00149     m_progress->setMaximum(100);
00150     m_statusbarLayout->addItem(m_progress);
00151     m_stop = addTool("process-stop", m_statusbarLayout);
00152 
00153     m_zoom = new Plasma::Slider(this);
00154     m_zoom->setMaximum(100);
00155     m_zoom->setMinimum(0);
00156     m_zoom->setValue(50);
00157     m_zoom->setOrientation(Qt::Horizontal);
00158     m_zoom->hide();
00159     m_zoom->setMaximumWidth(0);
00160     m_statusbarLayout->addItem(m_zoom);
00161     connect(m_zoom, SIGNAL(valueChanged(int)), this, SLOT(zoom(int)));
00162 
00163     if (!m_url.isValid()) {
00164         m_url = KUrl(cg.readEntry("Url", "http://www.kde.org"));
00165         m_verticalScrollValue = cg.readEntry("VerticalScrollValue", 0);
00166         m_horizontalScrollValue = cg.readEntry("HorizontalScrollValue", 0);
00167     }
00168     m_browser->setUrl(m_url);
00169     m_browser->update();
00170 
00171     m_autoRefresh = cg.readEntry("autoRefresh", false);
00172     m_autoRefreshInterval = qMax(2, cg.readEntry("autoRefreshInterval", 5));
00173 
00174     if (m_autoRefresh) {
00175         m_autoRefreshTimer = new QTimer(this);
00176         m_autoRefreshTimer->start(m_autoRefreshInterval*60*1000);
00177         connect(m_autoRefreshTimer, SIGNAL(timeout()), this, SLOT(reload()));
00178     }
00179 
00180     connect(m_back->action(), SIGNAL(triggered()), this, SLOT(back()));
00181     connect(m_forward->action(), SIGNAL(triggered()), this, SLOT(forward()));
00182     connect(m_reloadAction, SIGNAL(triggered()), this, SLOT(reload()));
00183     connect(m_goAction, SIGNAL(triggered()), this, SLOT(returnPressed()));
00184     connect(m_stop->action(), SIGNAL(triggered()), m_browser->page()->action(QWebPage::Stop), SLOT(trigger()));
00185 
00186     connect(m_historyCombo, SIGNAL(returnPressed()), this, SLOT(returnPressed()));
00187     connect(m_historyCombo, SIGNAL(activated(int)), this, SLOT(returnPressed()));
00188     connect(m_historyCombo, SIGNAL(activated(const QString&)), this, SLOT(comboTextChanged(const QString&)));
00189     connect(m_browser->page()->mainFrame(), SIGNAL(urlChanged(const QUrl &)), this, SLOT(urlChanged(const QUrl &)));
00190     connect(m_browser, SIGNAL(loadProgress(int)), this, SLOT(loadProgress(int)));
00191 
00192     connect(m_addBookmarkAction, SIGNAL(triggered()), this, SLOT(addBookmark()));
00193     connect(m_removeBookmarkAction, SIGNAL(triggered()), this, SLOT(removeBookmark()));
00194     connect(m_organizeBookmarks->action(), SIGNAL(triggered()), this, SLOT(bookmarksToggle()));
00195     connect(m_bookmarksView->nativeWidget(), SIGNAL(clicked(const QModelIndex &)), this, SLOT(bookmarkClicked(const QModelIndex &)));
00196 
00197     //Autocompletion stuff
00198     m_completion = new KCompletion();
00199     m_historyCombo->nativeWidget()->setCompletionObject(m_completion);
00200 
00201     QStringList list = cg.readEntry("History list", QStringList());
00202     m_historyCombo->setHistoryItems(list);
00203 
00204     m_graphicsWidget = new QGraphicsWidget(this);
00205     m_graphicsWidget->setLayout(m_layout);
00206 
00207     m_back->setEnabled(m_browser->page()->history()->canGoBack());
00208     m_forward->setEnabled(m_browser->page()->history()->canGoForward());
00209 
00210 
00211     return m_graphicsWidget;
00212 }
00213 
00214 WebBrowser::~WebBrowser()
00215 {
00216     delete m_completion;
00217     delete m_bookmarkManager;
00218     delete m_bookmarkModel;
00219 }
00220 
00221 Plasma::IconWidget *WebBrowser::addTool(const QString &iconString, QGraphicsLinearLayout *layout)
00222 {
00223     Plasma::IconWidget *icon = new Plasma::IconWidget(this);
00224     QAction *action = new QAction(KIcon(iconString), QString(), this);
00225     icon->setAction(action);
00226     icon->setPreferredSize(icon->sizeFromIconSize(IconSize(KIconLoader::Toolbar)));
00227     layout->addItem(icon);
00228 
00229     return icon;
00230 }
00231 
00232 void WebBrowser::bookmarksModelInit()
00233 {
00234     if (m_bookmarkModel) {
00235         m_bookmarkModel->clear();
00236     } else {
00237         m_bookmarkModel = new QStandardItemModel;
00238     }
00239 
00240     fillGroup(0, m_bookmarkManager->root());
00241 }
00242 
00243 void WebBrowser::fillGroup(BookmarkItem *parentItem, const KBookmarkGroup &group)
00244 {
00245     KBookmark it = group.first();
00246 
00247     while (!it.isNull()) {
00248         BookmarkItem *bookmarkItem = new BookmarkItem(it);
00249         bookmarkItem->setEditable(false);
00250 
00251         if (it.isGroup()) {
00252             KBookmarkGroup grp = it.toGroup();
00253             fillGroup( bookmarkItem, grp );
00254 
00255         }
00256 
00257         if (parentItem) {
00258             parentItem->appendRow(bookmarkItem);
00259         } else {
00260             m_bookmarkModel->appendRow(bookmarkItem);
00261         }
00262 
00263         it = m_bookmarkManager->root().next(it);
00264     }
00265 }
00266 
00267 void WebBrowser::saveState(KConfigGroup &cg) const
00268 {
00269     cg.writeEntry("Url", m_url.prettyUrl());
00270 
00271     if (m_historyCombo) {
00272         const QStringList list = m_historyCombo->historyItems();
00273         cg.writeEntry("History list", list);
00274     }
00275 
00276     if (m_browser) {
00277         cg.writeEntry("VerticalScrollValue", m_browser->page()->mainFrame()->scrollBarValue(Qt::Vertical));
00278         cg.writeEntry("HorizontalScrollValue", m_browser->page()->mainFrame()->scrollBarValue(Qt::Horizontal));
00279     }
00280 }
00281 
00282 void WebBrowser::back()
00283 {
00284     m_browser->page()->history()->back();
00285 }
00286 
00287 void WebBrowser::forward()
00288 {
00289     m_browser->page()->history()->forward();
00290 }
00291 
00292 void WebBrowser::reload()
00293 {
00294     m_browser->setUrl(m_url);
00295 }
00296 
00297 void WebBrowser::returnPressed()
00298 {
00299     KUrl url(m_historyCombo->currentText());
00300 
00301 
00302     KUriFilter::self()->filterUri( url );
00303 
00304     m_verticalScrollValue = 0;
00305     m_horizontalScrollValue = 0;
00306     m_browser->setUrl(url);
00307 }
00308 
00309 
00310 void WebBrowser::urlChanged(const QUrl &url)
00311 {
00312     //ask for a favicon
00313     Plasma::DataEngine *engine = dataEngine( "favicons" );
00314     if (engine) {
00315         //engine->disconnectSource( url.toString(), this );
00316         engine->connectSource( url.toString(), this );
00317 
00318         engine->query( url.toString() );
00319     }
00320 
00321     m_url = KUrl(url);
00322 
00323     if (m_bookmarkModel->match(m_bookmarkModel->index(0,0), BookmarkItem::UrlRole, m_url.prettyUrl()).isEmpty()) {
00324         m_addBookmark->setAction(m_addBookmarkAction);
00325     } else {
00326         m_addBookmark->setAction(m_removeBookmarkAction);
00327     }
00328 
00329     m_historyCombo->addToHistory(m_url.prettyUrl());
00330     m_historyCombo->nativeWidget()->setCurrentIndex(0);
00331 
00332     m_go->setAction(m_reloadAction);
00333 
00334     KConfigGroup cg = config();
00335     saveState(cg);
00336 
00337     m_back->setEnabled(m_browser->page()->history()->canGoBack());
00338     m_forward->setEnabled(m_browser->page()->history()->canGoForward());    
00339 }
00340 
00341 void WebBrowser::comboTextChanged(const QString &string)
00342 {
00343     Q_UNUSED(string)
00344 
00345     m_go->setAction(m_goAction);
00346 }
00347 
00348 void WebBrowser::dataUpdated( const QString &source, const Plasma::DataEngine::Data &data )
00349 {
00350     //TODO: find a way to update bookmarks and history combobox here, at the moment the data engine
00351     // is only used to save the icon files
00352     if (source == m_historyCombo->currentText()) {
00353         QPixmap favicon(QPixmap::fromImage(data["Icon"].value<QImage>()));
00354         m_historyCombo->nativeWidget()->setItemIcon(m_historyCombo->nativeWidget()->currentIndex(), QIcon(favicon));
00355         setPopupIcon(QIcon(favicon));
00356     }
00357 }
00358 
00359 void WebBrowser::addBookmark()
00360 {
00361     KBookmark bookmark = m_bookmarkManager->root().addBookmark(m_browser->page()->mainFrame()->title(), m_url);
00362     m_bookmarkManager->save();
00363 
00364     BookmarkItem *bookmarkItem = new BookmarkItem(bookmark);
00365     m_bookmarkModel->appendRow(bookmarkItem);
00366 
00367     m_addBookmark->setAction(m_removeBookmarkAction);
00368 }
00369 
00370 void WebBrowser::removeBookmark(const QModelIndex &index)
00371 {
00372     BookmarkItem *item = dynamic_cast<BookmarkItem *>(m_bookmarkModel->itemFromIndex(index));
00373 
00374     if (item) {
00375         KBookmark bookmark = item->bookmark();
00376 
00377         const QString text(i18nc("@info", "Do you really want to remove the bookmark to %1?", bookmark.url().host()));
00378         const bool del = KMessageBox::warningContinueCancel(0,
00379                                                             text,
00380                                                             QString(),
00381                                                             KGuiItem(i18nc("@action:button", "Delete Bookmark"))
00382                                                             ) == KMessageBox::Continue;
00383 
00384         if (!del) {
00385             return;
00386         }
00387 
00388         bookmark.parentGroup().deleteBookmark(bookmark);
00389         m_bookmarkManager->save();
00390     }
00391 
00392     if (item && item->parent()) {
00393         item->parent()->removeRow(index.row());
00394     } else {
00395         m_bookmarkModel->removeRow(index.row());
00396     }
00397 
00398 }
00399 
00400 void WebBrowser::removeBookmark()
00401 {
00402     QModelIndexList list = m_bookmarkModel->match(m_bookmarkModel->index(0,0), BookmarkItem::UrlRole, m_url.prettyUrl());
00403 
00404     if (!list.isEmpty()) {
00405         removeBookmark(list.first());
00406     }
00407 
00408     m_addBookmark->setAction(m_addBookmarkAction);
00409 }
00410 
00411 void WebBrowser::bookmarksToggle()
00412 {
00413     if (m_bookmarksView->isVisible()) {
00414         m_bookmarksView->hide();
00415         m_bookmarksView->setMaximumHeight(0);
00416         m_browser->show();
00417         m_browser->setMaximumHeight(INT_MAX);
00418     } else {
00419         m_bookmarksView->show();
00420         m_bookmarksView->setMaximumHeight(INT_MAX);
00421         m_browser->hide();
00422         m_browser->setMaximumHeight(0);
00423     }
00424 }
00425 
00426 void WebBrowser::bookmarkClicked(const QModelIndex &index)
00427 {
00428     QStandardItem *item = m_bookmarkModel->itemFromIndex(index);
00429 
00430     if (item) {
00431         KUrl url(item->data(BookmarkItem::UrlRole).value<QString>());
00432 
00433         if (url.isValid()) {
00434             m_browser->setUrl(url);
00435             bookmarksToggle();
00436         }
00437     }
00438 }
00439 
00440 void WebBrowser::zoom(int value)
00441 {
00442     m_browser->mainFrame()->setTextSizeMultiplier((qreal)0.2 + ((qreal)value/(qreal)50));
00443 }
00444 
00445 void WebBrowser::loadProgress(int progress)
00446 {
00447     m_progress->setValue(progress);
00448     m_progress->update();
00449 
00450     if (progress == 100) {
00451         m_progress->setMaximumWidth(0);
00452         m_progress->hide();
00453         m_stop->hide();
00454         m_stop->setMaximumWidth(0);
00455         m_zoom->show();
00456         m_zoom->setMaximumWidth(INT_MAX);
00457         m_statusbarLayout->invalidate();
00458 
00459         m_browser->page()->mainFrame()->setScrollBarValue(Qt::Vertical, m_verticalScrollValue);
00460         m_browser->page()->mainFrame()->setScrollBarValue(Qt::Horizontal, m_horizontalScrollValue);
00461     } else {
00462         m_progress->show();
00463         m_stop->show();
00464         m_stop->setMaximumWidth(INT_MAX);
00465         m_progress->setMaximumWidth(INT_MAX);
00466         m_zoom->setMaximumWidth(0);
00467         m_zoom->hide();
00468         m_statusbarLayout->invalidate();
00469     }
00470 }
00471 
00472 void WebBrowser::createConfigurationInterface(KConfigDialog *parent)
00473 {
00474     QWidget *widget = new QWidget();
00475     ui.setupUi(widget);
00476     parent->addPage(widget, i18n("General"), icon());
00477     connect(parent, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
00478     connect(parent, SIGNAL(okClicked()), this, SLOT(configAccepted()));
00479 
00480     ui.autoRefresh->setChecked(m_autoRefresh);
00481     ui.autoRefreshInterval->setValue(m_autoRefreshInterval);
00482 }
00483 
00484 void WebBrowser::configAccepted()
00485 {
00486     KConfigGroup cg = config();
00487 
00488     m_autoRefresh = ui.autoRefresh->isChecked();
00489     m_autoRefreshInterval = ui.autoRefreshInterval->value();
00490 
00491     cg.writeEntry("autoRefresh", m_autoRefresh);
00492     cg.writeEntry("autoRefreshInterval", m_autoRefreshInterval);
00493 
00494     if (m_autoRefresh) {
00495         if (!m_autoRefreshTimer) {
00496             m_autoRefreshTimer = new QTimer(this);
00497             connect(m_autoRefreshTimer, SIGNAL(timeout()), this, SLOT(reload()));
00498         }
00499 
00500         m_autoRefreshTimer->start(m_autoRefreshInterval*60*1000);
00501     } else {
00502         delete m_autoRefreshTimer;
00503         m_autoRefreshTimer = 0;
00504     }
00505 
00506     emit configNeedsSaving();
00507 }
00508 
00509 #include "webbrowser.moc"

Applets

Skip menu "Applets"
  • Main Page
  • Namespace List
  • Class Hierarchy
  • Alphabetical List
  • Class List
  • File List
  • Namespace Members
  • Class Members

API Reference

Skip menu "API Reference"
  • KWin
  •   KWin Libraries
  • Libraries
  •   libkworkspace
  •   libsolidcontrol
  •   libtaskmanager
  • Plasma
  •   Animators
  •   Applets
  •   Engines
  • Solid Modules
Generated for API Reference by doxygen 1.5.7
This website is maintained by Adriaan de Groot and Allen Winter.
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal