diff -r 0f2326c2a325 -r 1c3b8676e58c ginebra2/WebChromeItem.cpp --- a/ginebra2/WebChromeItem.cpp Wed Jun 23 17:59:43 2010 +0300 +++ b/ginebra2/WebChromeItem.cpp Tue Jul 06 14:03:49 2010 +0300 @@ -1,23 +1,23 @@ /* -* 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: -* -*/ + * 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" @@ -33,217 +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) - : ChromeItem(NULL, 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())); +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: 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())){ - qDebug() << "Invoking cached handler: " << handler.script(); - //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())) { + //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() - { +void WebChromeItem::grabFocus() +{ //setFocusProxy(m_chrome->renderer()); setFocus(); - } +} - void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev) - { +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) - { +void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev) +{ forwardMouseEvent(QEvent::MouseMove, ev); - } +} - - void WebChromeItem::forwardMouseEvent(QEvent::Type type, QGraphicsSceneMouseEvent *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() << + 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); - } + QApplication::sendEvent(m_chrome->renderer()->page(), &shiftedEv); +} - void WebChromeItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event ) { +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); - } + /* + 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 ) { - qDebug() << "WebChromeItem: keyReleaseEvent " << event->type(); - QApplication::sendEvent(m_chrome->renderer(), event); - } - */ + void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) { + QApplication::sendEvent(m_chrome->renderer(), event); + } + */ - bool WebChromeItem::event(QEvent* 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; - } - } - } + 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); - } + return QGraphicsWidget::event(event); +} } // endof namespace GVA