diff -r 000000000000 -r 1450b09d0cfd ginebra2/WebChromeItem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ginebra2/WebChromeItem.cpp Tue May 04 12:39:35 2010 +0300 @@ -0,0 +1,259 @@ +/* +* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: +* +*/ + + +#include "WebChromeItem.h" +#include "ChromeWidget.h" +#include "ChromeRenderer.h" +#include "ChromeDOM.h" +#include "WebChromeSnippet.h" +#ifndef NO_QSTM_GESTURE +#include "qstmgestureevent.h" +#endif +#include +#include +#include +#include +#include + +namespace GVA { +#ifndef NO_QSTM_GESTURE +using namespace qstmGesture; +#endif + WebChromeItem::WebChromeItem(const QRectF& ownerArea, ChromeWidget *chrome, const QWebElement & element, QGraphicsItem* parent) + : QGraphicsWidget(parent), + m_ownerArea(ownerArea), + m_chrome(chrome), + m_element(element), + m_painting(false) + { + + + // G1: Prevent hover events from passing through to the underlying widget. + //setAcceptHoverEvents(true); ? + + //setFocusPolicy(Qt::ClickFocus); + //setOpacity(0.50); + //Set preferred size so item will resize as part of anchor layout + setFlags(QGraphicsItem::ItemIsFocusable); + setPreferredSize(ownerArea.width(), ownerArea.height()); + //Also resize in case item is not part of anchor layout + resize(preferredSize()); +#ifndef NO_QSTM_GESTURE + grabGesture(QStm_Gesture::assignedType()); +#endif + //Use QGraphicsScene cached rendering NB: This might degrade rendering quality for some animation transforms + setCacheMode(QGraphicsItem::ItemCoordinateCache); + } + + WebChromeItem::~WebChromeItem() + { + + } + + void WebChromeItem::init(WebChromeSnippet * snippet) + { + setCachedHandlers(chrome()->dom()->getCachedHandlers(snippet->elementId(), ownerArea())); + + //QObject::connect( + // renderer(), + // SIGNAL(chromeRepainted(const QRectF&)), + // this, + // SLOT(repaintFromChrome(const QRectF&))/*, Qt::QueuedConnection*/); + + + //When chrome is resized owner areas for snippets may change + //NB: Maybe this needs to be done on chromeRepainted too? + QObject::connect( + renderer(), + SIGNAL(chromeResized()), + snippet, + SLOT(updateOwnerArea())); + + + QObject::connect( + this, + SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)), + snippet, + SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *))); + } + + QGraphicsScene * WebChromeItem::scene() + { + return m_chrome->getScene(); + } + + ChromeRenderer * WebChromeItem::renderer() + { + return m_chrome->renderer(); + } + + void WebChromeItem::setOwnerArea(const QRectF& ownerArea) + { + m_ownerArea = ownerArea; + //Set preferred size so item will resize as part of anchor layout + setPreferredSize(ownerArea.width(), ownerArea.height()); + //Also resize in case item is not part of anchor layout + resize(preferredSize()); + } + + //NB: Not used. Updates now come from renderer directly + void WebChromeItem::repaintFromChrome(const QRectF & rect) // slot + { + QPainter painter; + Q_UNUSED(rect) + qDebug() << "WebChromeItem::repaintFromChrome: dirtyRect: " << rect << " ownerArea: " << m_ownerArea << " elemGeom: " << m_element.geometry(); + // Update if this is our rect + if(rect.intersects(m_ownerArea)) + update(); + } + + // NB: For now we only handle onclick (actually mouseUp). Fix this + // NB: Modify for multiple cached handlers: mouse click, long press + // and support handlers not executed in js engine. + + void WebChromeItem::cachedHandlerEvent(QGraphicsSceneMouseEvent * ev) + { + for(int i = 0; i < m_handlers.size(); i++){ + const CachedHandler & handler = m_handlers.at(i); + if(handler.rect().contains(ev->pos())){ + qDebug() << "Invoking cached handler: " << handler.script(); + //m_chrome->evalWithEngineContext(handler.script()); + handler.invoke(); + return; + } + } + } + + void WebChromeItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget) + { + Q_UNUSED(opt) + Q_UNUSED(widget) + //For debugging + //painter->fillRect(QRectF(0,0, m_ownerArea.width(), m_ownerArea.height()), Qt::yellow); + qDebug() << " WebChromeItem::paint: " << m_element.attribute("id"); + m_painting = true; + m_element.render(painter); + m_painting = false; + } + + + void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev) + { + + // qDebug() << "ChromeRenderer::contextMenuEvent"; + ev->setAccepted(true); + //Signal context menu event + emit contextMenu(ev); + } + + void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev) + { + + forwardMouseEvent(QEvent::MouseButtonDblClick, ev); + } + + void WebChromeItem::grabFocus() + { + setFocusProxy(m_chrome->renderer()); + setFocus(); + } + + void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev) + { + //On mouse press, first invoke any cached handlers. + cachedHandlerEvent(ev); + //Then do normal mouse press handling + setFocus(); + setFocusProxy(m_chrome->renderer()); + forwardMouseEvent(QEvent::MouseButtonPress, ev); + } + + void WebChromeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * ev) + { + forwardMouseEvent(QEvent::MouseButtonRelease, ev); +#if defined __SYMBIAN32__ +// FIXME Remove this, it will be fixed Qt 4.6.3 ? + if (ev->button() == Qt::LeftButton) { + QPoint p = QPoint(int(m_ownerArea.x()), int(m_ownerArea.y())) + ev->pos().toPoint(); + QWebFrame* frame = m_chrome->renderer()->page()->mainFrame(); + QWebHitTestResult htr = frame->hitTestContent(p); + if (htr.isContentEditable()) { + QEvent vkbEvent(QEvent::RequestSoftwareInputPanel); + QList views = m_chrome->renderer()->scene()->views(); + QWidget* view = qobject_cast(views.value(0)); + if (view) + QApplication::sendEvent(view, &vkbEvent); + } + } +#endif + } + + + void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev) + { + forwardMouseEvent(QEvent::MouseMove, ev); + } + + + void WebChromeItem::forwardMouseEvent(QEvent::Type type, QGraphicsSceneMouseEvent *ev) { + + emit mouseEvent(type); + // m_chrome->renderer()->setFocus(); + QMouseEvent shiftedEv( type, QPoint(int(m_ownerArea.x()), int(m_ownerArea.y()))+ev->pos().toPoint(), + ev->button(), ev->buttons(), ev->modifiers() ); + //qDebug() << "m_ownerArea: " << m_ownerArea << "ev->pos(): " << ev->pos() << + // "shiftedEv.pos(): " << shiftedEv.pos(); + QApplication::sendEvent(m_chrome->renderer()->page(),&shiftedEv); + } + + void WebChromeItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event ) { + // Translate to a mouse move event. + QMouseEvent shiftedEv( QEvent::MouseMove, QPoint(int(m_ownerArea.x()), int(m_ownerArea.y()))+event->pos().toPoint(), + Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QApplication::sendEvent(m_chrome->renderer(), &shiftedEv); + } + /* + void WebChromeItem::keyPressEvent ( QKeyEvent * event ) { + qDebug() << "WebChromeItem: keyPressEvent " << event->type(); + QApplication::sendEvent(m_chrome->renderer(), event); + } + + void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) { + qDebug() << "WebChromeItem: keyReleaseEvent " << event->type(); + QApplication::sendEvent(m_chrome->renderer(), event); + } + */ + + bool WebChromeItem::event(QEvent* event) + { +#ifndef NO_QSTM_GESTURE + if (event->type() == QEvent::Gesture) { + QStm_Gesture* gesture = getQStmGesture(event); + if (gesture) { + QStm_GestureType gtype = gesture->getGestureStmType(); + if (gtype == QStmTouchGestureType || gtype == QStmReleaseGestureType) { + gesture->sendMouseEvents(); + return true; + } + } + } +#endif + return QGraphicsWidget::event(event); + } + +} // endof namespace GVA