00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <QtCore/QUrl>
00021 #include <QtGui/QGraphicsSceneContextMenuEvent>
00022 #include <QtGui/QGraphicsSceneDragDropEvent>
00023 #include <QtGui/QGraphicsSceneMouseEvent>
00024 #include <QtGui/QGraphicsSceneWheelEvent>
00025 #include <QtGui/QKeyEvent>
00026 #include <QtGui/QStyleOptionGraphicsItem>
00027 #include <QtWebKit/QWebFrame>
00028 #include <QtWebKit/QWebPage>
00029
00030 #include <KDE/KDebug>
00031
00032 #include "plasma/widgets/webcontent.h"
00033
00034 namespace Plasma
00035 {
00036
00037 class WebContentPrivate
00038 {
00039 public:
00040 WebContentPrivate(WebContent *parent)
00041 : q(parent)
00042 {
00043 }
00044
00045 void loadingFinished(bool success);
00046
00047 WebContent *q;
00048 QWebPage *page;
00049 bool loaded;
00050 };
00051
00052 WebContent::WebContent(QGraphicsItem *parent)
00053 : QGraphicsWidget(parent),
00054 d(new WebContentPrivate(this))
00055 {
00056 d->page = 0;
00057 d->loaded = false;
00058 setPage(new QWebPage(this));
00059 }
00060
00061 WebContent::~WebContent()
00062 {
00063 delete d;
00064 }
00065
00066 void WebContent::setUrl(const QUrl &url)
00067 {
00068 d->loaded = false;
00069 if (d->page) {
00070 d->page->mainFrame()->load(url);
00071 }
00072 }
00073
00074 void WebContent::setHtml(const QByteArray &html, const QUrl &baseUrl)
00075 {
00076 d->loaded = false;
00077 if (d->page) {
00078 d->page->mainFrame()->setContent(html, QString(), baseUrl);
00079 }
00080 }
00081
00082 void WebContent::setHtml(const QString &html, const QUrl &baseUrl)
00083 {
00084 d->loaded = false;
00085 if (d->page) {
00086 d->page->mainFrame()->setHtml(html, baseUrl);
00087 }
00088 }
00089
00090 QRectF WebContent::geometry() const
00091 {
00092 if (d->loaded && d->page) {
00093 return d->page->mainFrame()->geometry();
00094 }
00095
00096 return QGraphicsWidget::geometry();
00097 }
00098
00099 void WebContent::setPage(QWebPage *page)
00100 {
00101 if (page == d->page) {
00102 return;
00103 }
00104
00105 if (d->page && d->page->parent() == this) {
00106 delete d->page;
00107 }
00108
00109 d->page = page;
00110
00111 if (d->page) {
00112 connect(d->page, SIGNAL(loadProgress(int)), this, SIGNAL(loadProgress(int)));
00113 connect(d->page, SIGNAL(loadFinished(bool)), this, SLOT(loadingFinished(bool)));
00114 }
00115 }
00116
00117 QWebPage* WebContent::page() const
00118 {
00119 return d->page;
00120 }
00121
00122 QWebFrame* WebContent::mainFrame() const
00123 {
00124 return d->page ? d->page->mainFrame() : 0;
00125 }
00126
00127 void WebContent::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
00128 {
00129 Q_UNUSED(widget)
00130
00131 if (d->loaded && d->page) {
00132
00133 d->page->mainFrame()->render(painter, option->rect);
00134 }
00135 }
00136
00137 void WebContent::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
00138 {
00139 if (!d->page) {
00140 QGraphicsWidget::mouseMoveEvent(event);
00141 return;
00142 }
00143
00144 QMouseEvent me(QEvent::MouseMove, event->pos().toPoint(), event->button(),
00145 event->buttons(), event->modifiers());
00146 d->page->event(&me);
00147 if (me.isAccepted()) {
00148 event->accept();
00149 }
00150 }
00151
00152 void WebContent::mousePressEvent(QGraphicsSceneMouseEvent *event)
00153 {
00154 if (!d->page) {
00155 QGraphicsWidget::mousePressEvent(event);
00156 return;
00157 }
00158
00159 QMouseEvent me(QEvent::MouseButtonPress, event->pos().toPoint(), event->button(),
00160 event->buttons(), event->modifiers());
00161 d->page->event(&me);
00162 if (me.isAccepted()) {
00163 event->accept();
00164 }
00165 }
00166
00167 void WebContent::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event)
00168 {
00169 if (!d->page) {
00170 QGraphicsWidget::mouseDoubleClickEvent(event);
00171 return;
00172 }
00173
00174 QMouseEvent me(QEvent::MouseButtonDblClick, event->pos().toPoint(), event->button(),
00175 event->buttons(), event->modifiers());
00176 d->page->event(&me);
00177 if (me.isAccepted()) {
00178 event->accept();
00179 }
00180 }
00181
00182 void WebContent::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
00183 {
00184 if (!d->page) {
00185 QGraphicsWidget::mouseReleaseEvent(event);
00186 return;
00187 }
00188
00189 QMouseEvent me(QEvent::MouseButtonRelease, event->pos().toPoint(), event->button(),
00190 event->buttons(), event->modifiers());
00191 d->page->event(&me);
00192 if (me.isAccepted()) {
00193 event->accept();
00194 }
00195 }
00196
00197 void WebContent::contextMenuEvent(QGraphicsSceneContextMenuEvent *event)
00198 {
00199 if (!d->page) {
00200 QGraphicsWidget::contextMenuEvent(event);
00201 return;
00202 }
00203
00204 QContextMenuEvent ce(static_cast<QContextMenuEvent::Reason>(event->reason()),
00205 event->pos().toPoint(), event->screenPos());
00206 d->page->event(&ce);
00207 if (ce.isAccepted()) {
00208 event->accept();
00209 }
00210 }
00211
00212 void WebContent::wheelEvent(QGraphicsSceneWheelEvent *event)
00213 {
00214 if (!d->page) {
00215 QGraphicsWidget::wheelEvent(event);
00216 return;
00217 }
00218
00219 QWheelEvent we(event->pos().toPoint(), event->delta(), event->buttons(),
00220 event->modifiers(), event->orientation());
00221
00222 d->page->event(&we);
00223
00224 if (we.isAccepted()) {
00225 event->accept();
00226 } else {
00227 QGraphicsWidget::wheelEvent(event);
00228 }
00229 }
00230
00231 void WebContent::keyPressEvent(QKeyEvent * event)
00232 {
00233 if (!d->page) {
00234 QGraphicsWidget::keyPressEvent(event);
00235 return;
00236 }
00237
00238 d->page->event(event);
00239
00240 if (!event->isAccepted()) {
00241 QGraphicsWidget::keyPressEvent(event);
00242 }
00243 }
00244
00245 void WebContent::keyReleaseEvent(QKeyEvent * event)
00246 {
00247 if (!d->page) {
00248 QGraphicsWidget::keyReleaseEvent(event);
00249 return;
00250 }
00251
00252 d->page->event(event);
00253
00254 if (!event->isAccepted()) {
00255 QGraphicsWidget::keyPressEvent(event);
00256 }
00257 }
00258
00259 void WebContent::focusInEvent(QFocusEvent * event)
00260 {
00261 if (d->page) {
00262 d->page->event(event);
00263 }
00264
00265 QGraphicsWidget::focusInEvent(event);
00266 }
00267
00268 void WebContent::focusOutEvent(QFocusEvent * event)
00269 {
00270 if (d->page) {
00271 d->page->event(event);
00272 }
00273
00274 QGraphicsWidget::focusOutEvent(event);
00275 }
00276
00277 void WebContent::dragEnterEvent(QGraphicsSceneDragDropEvent * event)
00278 {
00279 if (!d->page) {
00280 QGraphicsWidget::dragEnterEvent(event);
00281 return;
00282 }
00283
00284 QDragEnterEvent de(event->pos().toPoint(), event->possibleActions(), event->mimeData(),
00285 event->buttons(), event->modifiers());
00286 d->page->event(&de);
00287
00288 if (de.isAccepted()) {
00289 event->accept();
00290 }
00291 }
00292
00293 void WebContent::dragLeaveEvent(QGraphicsSceneDragDropEvent * event)
00294 {
00295 if (!d->page) {
00296 QGraphicsWidget::dragLeaveEvent(event);
00297 return;
00298 }
00299
00300 QDragLeaveEvent de;
00301 d->page->event(&de);
00302
00303 if (de.isAccepted()) {
00304 event->accept();
00305 }
00306 }
00307
00308 void WebContent::dragMoveEvent(QGraphicsSceneDragDropEvent * event)
00309 {
00310 if (!d->page) {
00311 QGraphicsWidget::dragMoveEvent(event);
00312 return;
00313 }
00314
00315
00316
00317 QDragMoveEvent de(event->pos().toPoint(), event->possibleActions(), event->mimeData(),
00318 event->buttons(), event->modifiers());
00319 d->page->event(&de);
00320
00321 if (de.isAccepted()) {
00322 event->accept();
00323 }
00324 }
00325
00326 void WebContent::dropEvent(QGraphicsSceneDragDropEvent * event)
00327 {
00328 if (!d->page) {
00329 QGraphicsWidget::dropEvent(event);
00330 return;
00331 }
00332
00333 QDragMoveEvent de(event->pos().toPoint(), event->possibleActions(), event->mimeData(),
00334 event->buttons(), event->modifiers());
00335 d->page->event(&de);
00336
00337 if (de.isAccepted()) {
00338 event->accept();
00339 }
00340 }
00341
00342 void WebContent::setGeometry(const QRectF &geometry)
00343 {
00344 QGraphicsWidget::setGeometry(geometry);
00345 d->page->setViewportSize(geometry.size().toSize());
00346 }
00347
00348 void WebContentPrivate::loadingFinished(bool success)
00349 {
00350 loaded = success;
00351 emit q->loadFinished(success);
00352 }
00353
00354 }
00355
00356 #include "webcontent.moc"
00357