ginebra2/WebChromeItem.cpp
branchGCC_SURGE
changeset 8 2e16851ffecd
parent 6 1c3b8676e58c
equal deleted inserted replaced
2:bf4420e9fa4d 8:2e16851ffecd
     1 /*
     1 /*
     2 * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
     2  * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3 * All rights reserved.
     3  * All rights reserved.
     4 * This component and the accompanying materials are made available
     4  *
     5 * under the terms of "Eclipse Public License v1.0"
     5  * This program is free software: you can redistribute it and/or modify
     6 * which accompanies this distribution, and is available
     6  * it under the terms of the GNU Lesser General Public License as published by
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7  * the Free Software Foundation, version 2.1 of the License.
     8 *
     8  *
     9 * Initial Contributors:
     9  * This program is distributed in the hope that it will be useful,
    10 * Nokia Corporation - initial contribution.
    10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    11 *
    11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    12 * Contributors:
    12  * GNU Lesser General Public License for more details.
    13 *
    13  *
    14 * Description: 
    14  * You should have received a copy of the GNU Lesser General Public License
    15 *
    15  * along with this program.  If not,
    16 */
    16  * see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
    17 
    17  *
       
    18  * Description:
       
    19  *
       
    20  */
    18 
    21 
    19 #include "WebChromeItem.h"
    22 #include "WebChromeItem.h"
    20 #include "ChromeWidget.h"
    23 #include "ChromeWidget.h"
    21 #include "ChromeRenderer.h"
    24 #include "ChromeRenderer.h"
    22 #include "ChromeDOM.h"
    25 #include "ChromeDOM.h"
    28 #include <QWebHitTestResult>
    31 #include <QWebHitTestResult>
    29 #include <QWebFrame>
    32 #include <QWebFrame>
    30 #include <QGraphicsView>
    33 #include <QGraphicsView>
    31 #include <QDebug>
    34 #include <QDebug>
    32 
    35 
    33 namespace GVA {
    36 namespace GVA
       
    37 {
    34 #ifndef NO_QSTM_GESTURE
    38 #ifndef NO_QSTM_GESTURE
    35 using namespace qstmGesture;
    39 using namespace qstmGesture;
    36 #endif
    40 #endif
    37   WebChromeItem::WebChromeItem(const QRectF& ownerArea, ChromeWidget *chrome, const QWebElement & element, QGraphicsItem* parent)
    41 WebChromeItem::WebChromeItem(ChromeWidget *chrome, const QWebElement & element, QGraphicsItem* parent) :
    38     : QGraphicsWidget(parent),
    42     ChromeItem(NULL, parent)
    39       m_ownerArea(ownerArea),
    43     , m_chrome(chrome)
    40       m_chrome(chrome),
    44     , m_element(element)
    41       m_element(element),
    45     , m_painting(false)
    42       m_painting(false)
    46 {
    43   {
    47     setFlags(QGraphicsItem::ItemIsFocusable);
    44 
    48     //Adjust the element size to match the element rectangle
    45     
    49     updateSizes();
    46     // G1: Prevent hover events from passing through to the underlying widget.
    50 #ifndef NO_QSTM_GESTURE
    47     //setAcceptHoverEvents(true); ?
    51     grabGesture(QStm_Gesture::assignedType());
    48 
    52 #endif
    49     //setFocusPolicy(Qt::ClickFocus);
    53     //Use QGraphicsScene cached rendering NB: This might degrade rendering quality for some animation transforms
    50     //setOpacity(0.50);
    54     setCacheMode(QGraphicsItem::ItemCoordinateCache);
       
    55 }
       
    56 
       
    57 WebChromeItem::~WebChromeItem()
       
    58 {
       
    59 
       
    60 }
       
    61 
       
    62 void WebChromeItem::init(WebChromeSnippet * snippet)
       
    63 {
       
    64     //TODO: revisit this, don't use owner area
       
    65     //setCachedHandlers(chrome()->dom()->getCachedHandlers(snippet->elementId(), ownerArea()));
       
    66     m_snippet = snippet;
       
    67 
       
    68     //When chrome is resized owner areas for snippets may change
       
    69     //NB: Maybe this needs to be done on chromeRepainted too?
       
    70 
       
    71     QObject::connect(renderer(), SIGNAL(chromeResized()), snippet, SLOT(updateOwnerArea()));
       
    72 
       
    73     QObject::connect(this, SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)), snippet,
       
    74         SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *)));
       
    75 }
       
    76 
       
    77 QGraphicsScene * WebChromeItem::scene()
       
    78 {
       
    79   return m_chrome->layout()->scene();
       
    80 }
       
    81 
       
    82 ChromeRenderer * WebChromeItem::renderer()
       
    83 {
       
    84     return m_chrome->renderer();
       
    85 }
       
    86 
       
    87 //Adjust size to match the element rectangle
       
    88 void WebChromeItem::updateSizes()
       
    89 {
    51     //Set preferred size so item will resize as part of anchor layout
    90     //Set preferred size so item will resize as part of anchor layout
    52     setFlags(QGraphicsItem::ItemIsFocusable);
    91     setPreferredSize(m_element.geometry().width(), m_element.geometry().height());
    53     setPreferredSize(ownerArea.width(), ownerArea.height());
       
    54     //Also resize in case item is not part of anchor layout
    92     //Also resize in case item is not part of anchor layout
    55     resize(preferredSize());
    93     resize(preferredSize());
    56 #ifndef NO_QSTM_GESTURE
    94 }
    57     grabGesture(QStm_Gesture::assignedType());
    95 
    58 #endif
    96 // NB: For now we only handle onclick (actually mouseUp). Fix this
    59     //Use QGraphicsScene cached rendering NB: This might degrade rendering quality for some animation transforms
    97 // NB: Modify for multiple cached handlers: mouse click, long press
    60     setCacheMode(QGraphicsItem::ItemCoordinateCache);
    98 // and support handlers not executed in js engine.
    61   }
    99 
    62 
   100 void WebChromeItem::cachedHandlerEvent(QGraphicsSceneMouseEvent * ev)
    63   WebChromeItem::~WebChromeItem()
   101 {
    64   {
   102     for (int i = 0; i < m_handlers.size(); i++) {
    65 
   103         const CachedHandler & handler = m_handlers.at(i);
    66   }
   104         if (handler.rect().contains(ev->pos())) {
    67 
   105             //m_chrome->evalWithEngineContext(handler.script());
    68   void WebChromeItem::init(WebChromeSnippet * snippet)
   106             handler.invoke();
    69   {
   107             return;
    70     setCachedHandlers(chrome()->dom()->getCachedHandlers(snippet->elementId(), ownerArea()));
   108         }
    71 
       
    72     //QObject::connect(
       
    73     //        renderer(),
       
    74     //        SIGNAL(chromeRepainted(const QRectF&)),
       
    75     //        this,
       
    76     //        SLOT(repaintFromChrome(const QRectF&))/*, Qt::QueuedConnection*/);
       
    77   
       
    78 
       
    79     //When chrome is resized owner areas for snippets may change
       
    80     //NB: Maybe this needs to be done on chromeRepainted too?
       
    81     QObject::connect(
       
    82             renderer(),
       
    83             SIGNAL(chromeResized()),
       
    84             snippet,
       
    85             SLOT(updateOwnerArea()));
       
    86 
       
    87 
       
    88     QObject::connect(
       
    89             this,
       
    90             SIGNAL(contextMenu(QGraphicsSceneContextMenuEvent *)),
       
    91             snippet,
       
    92             SLOT(onContextMenuEvent(QGraphicsSceneContextMenuEvent *)));
       
    93   }
       
    94 
       
    95   QGraphicsScene * WebChromeItem::scene()
       
    96   {
       
    97     return m_chrome->getScene();
       
    98   }
       
    99 
       
   100   ChromeRenderer * WebChromeItem::renderer()
       
   101   {
       
   102     return m_chrome->renderer();
       
   103   }
       
   104 
       
   105   void WebChromeItem::setOwnerArea(const QRectF& ownerArea)
       
   106   {
       
   107     m_ownerArea = ownerArea;
       
   108     //Set preferred size so item will resize as part of anchor layout
       
   109     setPreferredSize(ownerArea.width(), ownerArea.height());
       
   110     //Also resize in case item is not part of anchor layout
       
   111     resize(preferredSize());
       
   112   }
       
   113 
       
   114   //NB: Not used. Updates now come from renderer directly
       
   115   void WebChromeItem::repaintFromChrome(const QRectF & rect) // slot
       
   116   {
       
   117     QPainter painter;
       
   118     Q_UNUSED(rect)
       
   119     qDebug() << "WebChromeItem::repaintFromChrome: dirtyRect: " << rect << " ownerArea: " << m_ownerArea << " elemGeom: " << m_element.geometry();
       
   120     // Update if this is our rect
       
   121       if(rect.intersects(m_ownerArea))
       
   122        update();
       
   123   }
       
   124 
       
   125   // NB: For now we only handle onclick (actually mouseUp). Fix this
       
   126   // NB: Modify for multiple cached handlers: mouse click, long press
       
   127   // and support handlers not executed in js engine.
       
   128 
       
   129   void WebChromeItem::cachedHandlerEvent(QGraphicsSceneMouseEvent * ev)
       
   130   {
       
   131     for(int i = 0; i < m_handlers.size(); i++){
       
   132      const CachedHandler & handler = m_handlers.at(i);
       
   133       if(handler.rect().contains(ev->pos())){
       
   134 	qDebug() << "Invoking cached handler: " << handler.script();
       
   135         //m_chrome->evalWithEngineContext(handler.script());
       
   136 	handler.invoke();
       
   137         return;
       
   138       }
       
   139     }
   109     }
   140   }
   110 }
   141 
   111 
   142   void WebChromeItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget)
   112 void WebChromeItem::paint(QPainter* painter, const QStyleOptionGraphicsItem* opt, QWidget* widget)
   143   {
   113 {
   144     Q_UNUSED(opt)
   114     Q_UNUSED(opt)
   145     Q_UNUSED(widget)
   115     Q_UNUSED(widget)
   146       //For debugging
   116 
   147     //painter->fillRect(QRectF(0,0, m_ownerArea.width(), m_ownerArea.height()), Qt::yellow);
       
   148     qDebug() << " WebChromeItem::paint: " << m_element.attribute("id"); 
       
   149     m_painting = true;
   117     m_painting = true;
   150     m_element.render(painter);
   118     m_element.render(painter);
   151     m_painting = false;
   119     m_painting = false;
   152   }
   120     ChromeItem::paint(painter, opt, widget);
   153  
   121 }
   154 
   122 
   155   void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev)
   123 void WebChromeItem::contextMenuEvent(QGraphicsSceneContextMenuEvent * ev)
   156   {
   124 {
   157 
       
   158     // qDebug() << "ChromeRenderer::contextMenuEvent";
       
   159     ev->setAccepted(true);
   125     ev->setAccepted(true);
   160     //Signal context menu event
   126     //Signal context menu event
   161     emit contextMenu(ev);
   127     emit contextMenu(ev);
   162   }
   128 }
   163 
   129 
   164   void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev)
   130 void WebChromeItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent * ev)
   165   {
   131 {
   166     
       
   167     forwardMouseEvent(QEvent::MouseButtonDblClick, ev);
   132     forwardMouseEvent(QEvent::MouseButtonDblClick, ev);
   168   }
   133 }
   169   
   134 
   170   void WebChromeItem::grabFocus()
   135 void WebChromeItem::grabFocus()
   171   {
   136 {
   172     setFocusProxy(m_chrome->renderer());
   137     //setFocusProxy(m_chrome->renderer());
   173     setFocus();
   138     setFocus();
   174   }
   139 }
   175 
   140 
   176   void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev)
   141 void WebChromeItem::mousePressEvent(QGraphicsSceneMouseEvent * ev)
   177   {
   142 {
   178     //On mouse press, first invoke any cached handlers. 
   143     //On mouse press, first invoke any cached handlers.
   179     cachedHandlerEvent(ev);
   144     cachedHandlerEvent(ev);
   180     //Then do normal mouse press handling
   145     //Then do normal mouse press handling
   181     setFocus();
   146     setFocus();
   182     setFocusProxy(m_chrome->renderer());
   147     // setFocusProxy(m_chrome->renderer());
   183     forwardMouseEvent(QEvent::MouseButtonPress, ev);
   148     forwardMouseEvent(QEvent::MouseButtonPress, ev);
   184   }
   149 }
   185   
   150 
   186   void WebChromeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * ev)
   151 void WebChromeItem::mouseReleaseEvent(QGraphicsSceneMouseEvent * ev)
   187   {
   152 {
   188     forwardMouseEvent(QEvent::MouseButtonRelease, ev);
   153     forwardMouseEvent(QEvent::MouseButtonRelease, ev);
   189 #if defined __SYMBIAN32__
   154 #if defined __SYMBIAN32__
   190 // FIXME Remove this, it will be fixed Qt 4.6.3 ? 
   155     // FIXME Remove this, it will be fixed Qt 4.6.3 ?
   191     if (ev->button() == Qt::LeftButton) {
   156     /*   
   192         QPoint p = QPoint(int(m_ownerArea.x()), int(m_ownerArea.y())) + ev->pos().toPoint();
   157      if (ev->button() == Qt::LeftButton) {
   193         QWebFrame* frame = m_chrome->renderer()->page()->mainFrame();
   158      QRectF elementRectangle = m_element.geometry();
   194         QWebHitTestResult htr = frame->hitTestContent(p);
   159      QPoint p = QPoint(int(elementRectangle.x()), int(elementRectangle.y())) + ev->pos().toPoint();
   195         if (htr.isContentEditable()) {
   160      QWebFrame* frame = m_chrome->renderer()->page()->mainFrame();
   196             QEvent vkbEvent(QEvent::RequestSoftwareInputPanel);
   161      QWebHitTestResult htr = frame->hitTestContent(p);
   197             QList<QGraphicsView*> views = m_chrome->renderer()->scene()->views();
   162      if (htr.isContentEditable()) {
   198             QWidget* view = qobject_cast<QWidget*>(views.value(0));
   163      QEvent vkbEvent(QEvent::RequestSoftwareInputPanel);
   199             if (view)
   164      QList<QGraphicsView*> views = m_chrome->renderer()->scene()->views();
   200               QApplication::sendEvent(view, &vkbEvent);
   165      QWidget* view = qobject_cast<QWidget*>(views.value(0));
       
   166      if (view)
       
   167      QApplication::sendEvent(view, &vkbEvent);
       
   168      }
       
   169      }
       
   170      */
       
   171 #endif
       
   172 }
       
   173 
       
   174 void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev)
       
   175 {
       
   176     forwardMouseEvent(QEvent::MouseMove, ev);
       
   177 }
       
   178 
       
   179 void WebChromeItem::forwardMouseEvent(QEvent::Type type, QGraphicsSceneMouseEvent *ev)
       
   180 {
       
   181 
       
   182     emit mouseEvent(type);
       
   183     QRectF elementRectangle = m_element.geometry();
       
   184     QMouseEvent shiftedEv(type, QPoint(int(elementRectangle.x()), int(elementRectangle.y()))
       
   185         + ev->pos().toPoint(), ev->button(), ev->buttons(), ev->modifiers());
       
   186     //qDebug() << "elementRectangle: " << elementRectangle << "ev->pos(): " << ev->pos() <<
       
   187     //      "shiftedEv.pos(): " << shiftedEv.pos();
       
   188     QApplication::sendEvent(m_chrome->renderer()->page(), &shiftedEv);
       
   189 }
       
   190 
       
   191 void WebChromeItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event)
       
   192 {
       
   193     // Translate to a mouse move event.
       
   194     /*
       
   195      QRectF elementRectangle = m_element.geometry(); 
       
   196      QMouseEvent shiftedEv( QEvent::MouseMove, QPoint(int(elementRectangle.x()), int(elementRectangle.y()))+event->pos().toPoint(),
       
   197      Qt::NoButton, Qt::NoButton, Qt::NoModifier);
       
   198      QApplication::sendEvent(m_chrome->renderer(), &shiftedEv); */
       
   199 }
       
   200 /*
       
   201  void WebChromeItem::keyPressEvent ( QKeyEvent * event ) {
       
   202  QApplication::sendEvent(m_chrome->renderer(), event);
       
   203  }
       
   204 
       
   205  void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) {
       
   206  QApplication::sendEvent(m_chrome->renderer(), event);
       
   207  }
       
   208  */
       
   209 
       
   210 bool WebChromeItem::event(QEvent* event)
       
   211 {
       
   212 #ifndef NO_QSTM_GESTURE
       
   213     if (event->type() == QEvent::Gesture) {
       
   214         QStm_Gesture* gesture = getQStmGesture(event);
       
   215         if (gesture) {
       
   216             QStm_GestureType gtype = gesture->getGestureStmType();
       
   217             if (gtype == QStmTouchGestureType || gtype == QStmReleaseGestureType) {
       
   218                 gesture->sendMouseEvents();
       
   219                 return true;
       
   220             }
   201         }
   221         }
   202     }
   222     }
   203 #endif
   223 #endif
   204   }
   224     return QGraphicsWidget::event(event);
   205 
   225 }
   206   
   226 
   207   void WebChromeItem::mouseMoveEvent(QGraphicsSceneMouseEvent * ev)
       
   208   {
       
   209     forwardMouseEvent(QEvent::MouseMove, ev);
       
   210   }
       
   211 
       
   212   
       
   213   void WebChromeItem::forwardMouseEvent(QEvent::Type type, QGraphicsSceneMouseEvent *ev) {
       
   214    
       
   215     emit mouseEvent(type);
       
   216     // m_chrome->renderer()->setFocus();
       
   217     QMouseEvent shiftedEv( type, QPoint(int(m_ownerArea.x()), int(m_ownerArea.y()))+ev->pos().toPoint(),
       
   218 			   ev->button(), ev->buttons(), ev->modifiers() );
       
   219     //qDebug() << "m_ownerArea: " << m_ownerArea << "ev->pos(): " << ev->pos() << 
       
   220     //		"shiftedEv.pos(): " << shiftedEv.pos();
       
   221     QApplication::sendEvent(m_chrome->renderer()->page(),&shiftedEv);
       
   222   }
       
   223   
       
   224   void WebChromeItem::hoverMoveEvent(QGraphicsSceneHoverEvent *event ) {
       
   225     // Translate to a mouse move event.
       
   226     QMouseEvent shiftedEv( QEvent::MouseMove, QPoint(int(m_ownerArea.x()), int(m_ownerArea.y()))+event->pos().toPoint(),
       
   227 			   Qt::NoButton, Qt::NoButton, Qt::NoModifier);
       
   228     QApplication::sendEvent(m_chrome->renderer(), &shiftedEv);
       
   229   }
       
   230   /* 
       
   231   void WebChromeItem::keyPressEvent ( QKeyEvent * event ) {
       
   232     qDebug() << "WebChromeItem: keyPressEvent " << event->type();
       
   233     QApplication::sendEvent(m_chrome->renderer(), event);
       
   234   }
       
   235   
       
   236   void WebChromeItem::keyReleaseEvent ( QKeyEvent * event ) {
       
   237     qDebug() << "WebChromeItem: keyReleaseEvent " << event->type();
       
   238     QApplication::sendEvent(m_chrome->renderer(), event);
       
   239   }
       
   240   */
       
   241   
       
   242   bool WebChromeItem::event(QEvent* event)
       
   243   {
       
   244 #ifndef NO_QSTM_GESTURE
       
   245 	  if (event->type() == QEvent::Gesture) {
       
   246 	      QStm_Gesture* gesture = getQStmGesture(event);
       
   247 	      if (gesture) {
       
   248 	          QStm_GestureType gtype = gesture->getGestureStmType();
       
   249 	      	  if (gtype == QStmTouchGestureType || gtype == QStmReleaseGestureType) {
       
   250 	      		  gesture->sendMouseEvents();
       
   251 	              return true;
       
   252 	          }  
       
   253 	      }
       
   254 	  }
       
   255 #endif
       
   256 	  return QGraphicsWidget::event(event);
       
   257   }
       
   258   
       
   259 } // endof namespace GVA
   227 } // endof namespace GVA