diff -r b0dd75e285d2 -r 0954f5dd2cd0 ginebra2/WebChromeItem.cpp --- a/ginebra2/WebChromeItem.cpp Fri May 14 15:40:36 2010 +0300 +++ b/ginebra2/WebChromeItem.cpp Tue Jun 29 00:46:29 2010 -0400 @@ -1,20 +1,23 @@ /* -* 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: -* -*/ - + * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). + * All rights reserved. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, version 2.1 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 Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this program. If not, + * see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/". + * + * Description: + * + */ #include "WebChromeItem.h" #include "ChromeWidget.h" @@ -30,230 +33,195 @@ #include #include -namespace GVA { +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 +WebChromeItem::WebChromeItem(ChromeWidget *chrome, const QWebElement & element, QGraphicsItem* parent) : + ChromeItem(NULL, parent) + , m_chrome(chrome) + , m_element(element) + , m_painting(false) +{ setFlags(QGraphicsItem::ItemIsFocusable); - setPreferredSize(ownerArea.width(), ownerArea.height()); - //Also resize in case item is not part of anchor layout - resize(preferredSize()); + //Adjust the element size to match the element rectangle + updateSizes(); #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() - { - - } +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*/); - +void WebChromeItem::init(WebChromeSnippet * snippet) +{ + //TODO: revisit this, don't use owner area + //setCachedHandlers(chrome()->dom()->getCachedHandlers(snippet->elementId(), ownerArea())); + m_snippet = snippet; //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(renderer(), SIGNAL(chromeResized()), snippet, SLOT(updateOwnerArea())); - QObject::connect( - this, - SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)), - snippet, - SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *))); - } + QObject::connect(this, SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)), snippet, + SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *))); +} - QGraphicsScene * WebChromeItem::scene() - { - return m_chrome->getScene(); - } +QGraphicsScene * WebChromeItem::scene() +{ + return m_chrome->layout()->scene(); +} - ChromeRenderer * WebChromeItem::renderer() - { +ChromeRenderer * WebChromeItem::renderer() +{ return m_chrome->renderer(); - } +} - void WebChromeItem::setOwnerArea(const QRectF& ownerArea) - { - m_ownerArea = ownerArea; +//Adjust size to match the element rectangle +void WebChromeItem::updateSizes() +{ //Set preferred size so item will resize as part of anchor layout - setPreferredSize(ownerArea.width(), ownerArea.height()); + setPreferredSize(m_element.geometry().width(), m_element.geometry().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. - // 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())) { + //m_chrome->evalWithEngineContext(handler.script()); + handler.invoke(); + return; + } + } +} - 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) - { +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; - } - + ChromeItem::paint(painter, opt, widget); +} - void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev) - { - - // qDebug() << "ChromeRenderer::contextMenuEvent"; +void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev) +{ ev->setAccepted(true); //Signal context menu event emit contextMenu(ev); - } +} - void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev) - { - +void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev) +{ forwardMouseEvent(QEvent::MouseButtonDblClick, ev); - } - - void WebChromeItem::grabFocus() - { - setFocusProxy(m_chrome->renderer()); +} + +void WebChromeItem::grabFocus() +{ + //setFocusProxy(m_chrome->renderer()); setFocus(); - } +} - void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev) - { - //On mouse press, first invoke any cached handlers. +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()); + // setFocusProxy(m_chrome->renderer()); forwardMouseEvent(QEvent::MouseButtonPress, ev); - } - - void WebChromeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * 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); + // FIXME Remove this, it will be fixed Qt 4.6.3 ? + /* + if (ev->button() == Qt::LeftButton) { + QRectF elementRectangle = m_element.geometry(); + QPoint p = QPoint(int(elementRectangle.x()), int(elementRectangle.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); + QRectF elementRectangle = m_element.geometry(); + QMouseEvent shiftedEv(type, QPoint(int(elementRectangle.x()), int(elementRectangle.y())) + + ev->pos().toPoint(), ev->button(), ev->buttons(), ev->modifiers()); + //qDebug() << "elementRectangle: " << elementRectangle << "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. + /* + QRectF elementRectangle = m_element.geometry(); + QMouseEvent shiftedEv( QEvent::MouseMove, QPoint(int(elementRectangle.x()), int(elementRectangle.y()))+event->pos().toPoint(), + Qt::NoButton, Qt::NoButton, Qt::NoModifier); + QApplication::sendEvent(m_chrome->renderer(), &shiftedEv); */ +} +/* + void WebChromeItem::keyPressEvent ( QKeyEvent * event ) { + QApplication::sendEvent(m_chrome->renderer(), event); + } + + void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) { + 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 - } - - - void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev) - { - forwardMouseEvent(QEvent::MouseMove, ev); - } + return QGraphicsWidget::event(event); +} - - 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