00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
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
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
00127 m_bookmarksView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
00128 m_bookmarksView->hide();
00129
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
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
00313 Plasma::DataEngine *engine = dataEngine( "favicons" );
00314 if (engine) {
00315
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
00351
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"