webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp
branchRCL_3
changeset 37 ac77f89b1d9e
parent 36 c711bdda59f4
child 38 4917f9bf7995
equal deleted inserted replaced
36:c711bdda59f4 37:ac77f89b1d9e
    31 #include "WebCursor.h"
    31 #include "WebCursor.h"
    32 #include "WebPopupDrawer.h"
    32 #include "WebPopupDrawer.h"
    33 #include "WebFormFillPopup.h"
    33 #include "WebFormFillPopup.h"
    34 #include "WebPageScrollHandler.h"
    34 #include "WebPageScrollHandler.h"
    35 #include "WebFepTextEditor.h"
    35 #include "WebFepTextEditor.h"
    36 #include "WebCoreFrameBridge.h"
       
    37 #include "StaticObjectsContainer.h"
       
    38 #include "PluginSkin.h"
    36 #include "PluginSkin.h"
    39 #include "WebUtil.h"
    37 #include "WebUtil.h"
    40 #include "Element.h"
       
    41 #include "Document.h"
       
    42 #include "Frame.h"
       
    43 #include "FrameView.h"
       
    44 #include "EventHandler.h"
       
    45 #include "EventNames.h"
       
    46 #include "HitTestResult.h"
       
    47 #include "MouseEvent.h"
       
    48 #include "WebPageFullScreenHandler.h"
    38 #include "WebPageFullScreenHandler.h"
    49 #include "PluginSkin.h"
       
    50 #include "PluginWin.h"
    39 #include "PluginWin.h"
    51 #include "WebFrameBridge.h"
    40 #include "WebFrameBridge.h"
    52 #include "Page.h"
    41 #include "Page.h"
    53 #include "Chrome.h"
    42 #include "Chrome.h"
    54 #include "ChromeClient.h"
    43 #include "ChromeClient.h"
    59 #include "WebGestureInterface.h"
    48 #include "WebGestureInterface.h"
    60 #include "WebPagePinchZoomHandler.h"
    49 #include "WebPagePinchZoomHandler.h"
    61 #include "WebScrollingDeceleratorGH.h"
    50 #include "WebScrollingDeceleratorGH.h"
    62 
    51 
    63 #include "WebKitLogger.h"
    52 #include "WebKitLogger.h"
    64 using namespace WebCore;
    53 
    65 using namespace EventNames;
       
    66 
       
    67 static const int KMinScrollAndTapInterval = 200000;				// 200 ms
       
    68 static const int KDoubleTapMinActivationInterval = 100000;     // 100 ms
       
    69 static const int KDoubleTapMaxActivationInterval = 500000;     // 500 ms
       
    70 static const int KDoubleTapIdleInterval = 700000;			// 700 ms, to prevent triple-tap effects
       
    71 #define IS_NAVIGATION_NONE      (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone)
    54 #define IS_NAVIGATION_NONE      (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone)
    72 #define IS_TABBED_NAVIGATION    (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed)
    55 #define IS_TABBED_NAVIGATION    (m_webview->brCtl()->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed)
    73 
    56 
    74 //-----------------------------------------------------------------------------
    57 //-----------------------------------------------------------------------------
    75 // WebPointerEventHandler::NewL
    58 // WebPointerEventHandler::NewL
    88 //-----------------------------------------------------------------------------
    71 //-----------------------------------------------------------------------------
    89 WebPointerEventHandler::WebPointerEventHandler(WebView* view)
    72 WebPointerEventHandler::WebPointerEventHandler(WebView* view)
    90     : m_webview(view),
    73     : m_webview(view),
    91       m_isHighlighted(false),
    74       m_isHighlighted(false),
    92       m_highlightedNode(NULL),
    75       m_highlightedNode(NULL),
    93       m_buttonDownTimer( this, &WebPointerEventHandler::buttonDownTimerCB ),
       
    94       m_ignoreTap(false),
    76       m_ignoreTap(false),
    95       m_gestureInterface(NULL)
    77       m_gestureInterface(NULL)
    96 {
    78 {
    97 }
    79 }
    98 
    80 
   100 // WebPointerEventHandler::~WebPointerEventHandler
    82 // WebPointerEventHandler::~WebPointerEventHandler
   101 //-----------------------------------------------------------------------------
    83 //-----------------------------------------------------------------------------
   102 WebPointerEventHandler::~WebPointerEventHandler()
    84 WebPointerEventHandler::~WebPointerEventHandler()
   103 {
    85 {
   104    delete m_gestureInterface;
    86    delete m_gestureInterface;
   105     delete m_waiter;
       
   106 }
    87 }
   107 
    88 
   108 //-----------------------------------------------------------------------------
    89 //-----------------------------------------------------------------------------
   109 // WebPointerEventHandler::ConstructL
    90 // WebPointerEventHandler::ConstructL
   110 //-----------------------------------------------------------------------------
    91 //-----------------------------------------------------------------------------
   113 #ifdef BRDO_USE_GESTURE_HELPER
    94 #ifdef BRDO_USE_GESTURE_HELPER
   114   m_gestureInterface = WebGestureInterface::NewL(m_webview);
    95   m_gestureInterface = WebGestureInterface::NewL(m_webview);
   115 #else
    96 #else
   116   m_gestureInterface = NULL;
    97   m_gestureInterface = NULL;
   117 #endif
    98 #endif
   118   m_waiter = new(ELeave) CActiveSchedulerWait();
       
   119 }
    99 }
   120 
   100 
   121 
   101 
   122 // ======================================================================
   102 // ======================================================================
   123 // WebPointerEventHandler::HandleGestureEventL
   103 // WebPointerEventHandler::HandleGestureEventL
   182 
   162 
   183         case stmGesture::EGestureUidRelease:
   163         case stmGesture::EGestureUidRelease:
   184         {
   164         {
   185             m_ignoreTap = false;
   165             m_ignoreTap = false;
   186             handleTouchUp(aGesture);
   166             handleTouchUp(aGesture);
       
   167             m_webview->setScrolling(false);
   187             break;
   168             break;
   188         }
   169         }
   189 
   170 
   190         case stmGesture::EGestureUidPan:
   171         case stmGesture::EGestureUidPan:
   191         {
   172         {
       
   173             if(!m_webview->isScrolling())
       
   174                 m_webview->setScrolling(true);
   192             handleMove(aGesture);
   175             handleMove(aGesture);
   193             break;
   176             break;
   194         }
   177         }
   195         case stmGesture::EGestureUidFlick:
   178         case stmGesture::EGestureUidFlick:
   196         {
   179         {
   224 // ======================================================================
   207 // ======================================================================
   225 // WebPointerEventHandler::handleTap
   208 // WebPointerEventHandler::handleTap
   226 // ======================================================================
   209 // ======================================================================
   227 void WebPointerEventHandler::handleTapL(const TStmGestureEvent& aGesture)
   210 void WebPointerEventHandler::handleTapL(const TStmGestureEvent& aGesture)
   228 {
   211 {
   229     m_buttonDownTimer.stop();
       
   230     m_lastTapEvent = m_currentEvent;
   212     m_lastTapEvent = m_currentEvent;
   231     if(!m_webview->inPageViewMode()){
   213     if(!m_webview->inPageViewMode()){
   232     	doTapL();
   214     	doTapL();
   233     }
   215     }
   234 }
   216 }
   258     PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();
   240     PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();
   259     PluginSkin* pluginToActivate = pluginHandler->pluginToActivate();
   241     PluginSkin* pluginToActivate = pluginHandler->pluginToActivate();
   260     m_buttonDownEvent = m_currentEvent;
   242     m_buttonDownEvent = m_currentEvent;
   261     m_highlightPos = aGesture.CurrentPos();
   243     m_highlightPos = aGesture.CurrentPos();
   262 
   244 
   263     if ( !m_buttonDownTimer.isActive() && !m_webview->inPageViewMode()){
       
   264         m_buttonDownTimer.startOneShot(0.1f);
       
   265     }
       
   266 
   245 
   267     if (!IS_NAVIGATION_NONE) {
   246     if (!IS_NAVIGATION_NONE) {
   268         m_webview->pageScrollHandler()->handleTouchDownGH(aGesture);
   247         m_webview->pageScrollHandler()->handleTouchDownGH(aGesture);
   269     }
   248     }
   270 
   249 
   277             else {
   256             else {
   278                 plugin->pluginWin()->HandlePointerEventL(m_buttonDownEvent);
   257                 plugin->pluginWin()->HandlePointerEventL(m_buttonDownEvent);
   279             }
   258             }
   280         }
   259         }
   281     }
   260     }
   282 
   261     
   283     /*
   262     doTouchDownL();
   284      * After introducing "link selection" pointer down action is done in
       
   285      * buttondown timer callback. When "down" gesture event is arrived we start
       
   286      * timer end exit, so gesture helper is ready to deliver next gesture event.
       
   287      * Meanwhile the processing of the first gesture event hasn't been finished yet.
       
   288      * The gesture helper doesn't "know" about our plans to handle the event inside
       
   289      * timer callback and only way for us to "tell" about this is to stop RunL()
       
   290      * of CGestureEventSender (HandleGestureL() is inside it) and finish buttondown
       
   291      * timer callback first.
       
   292      */
       
   293     if ( m_buttonDownTimer.isActive()){
       
   294         m_waiter->Start();
       
   295     }
       
   296 }
   263 }
   297 
   264 
   298 // ======================================================================
   265 // ======================================================================
   299 // WebPointerEventHandler::handleTouchUp
   266 // WebPointerEventHandler::handleTouchUp
   300 // ======================================================================
   267 // ======================================================================
   316 {
   283 {
   317     TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType();
   284     TBrCtlDefs::TBrCtlElementType elType = m_webview->focusedElementType();
   318     TPoint curPos =  aGesture.CurrentPos();
   285     TPoint curPos =  aGesture.CurrentPos();
   319     PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();
   286     PluginHandler* pluginHandler = WebCore::StaticObjectsContainer::instance()->pluginHandler();
   320     pluginHandler->setPluginToActivate(NULL);
   287     pluginHandler->setPluginToActivate(NULL);
   321     m_buttonDownTimer.stop();
   288 
   322     if (IS_NAVIGATION_NONE) {
   289     if (IS_NAVIGATION_NONE) {
   323         Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame();
   290         Frame* frm = m_webview->page()->focusController()->focusedOrMainFrame();
   324         m_webview->sendMouseEventToEngine(TPointerEvent::EMove, curPos, frm);
   291         m_webview->sendMouseEventToEngine(TPointerEvent::EMove, curPos, frm);
   325     }
   292     }
   326     else {
   293     else {
   376 
   343 
   377     if (!canDehighlight(aPoint)) return;
   344     if (!canDehighlight(aPoint)) return;
   378 
   345 
   379     dehighlight();
   346     dehighlight();
   380 }
   347 }
   381 
       
   382 //-----------------------------------------------------------------------------
       
   383 // WebPointerEventHandler::checkForEventListener
       
   384 //-----------------------------------------------------------------------------
       
   385 bool WebPointerEventHandler::checkForEventListener(WebCore::Node* node)
       
   386 {
       
   387     EventTargetNode* etnfound = NULL;
       
   388     for (Node* np = node; np; np = np->parentNode()) {
       
   389         //check for a mouseover event listener
       
   390         if (np->isEventTargetNode()) {
       
   391             if (m_webview->page()->chrome()->client()->elementVisibilityChanged()) {
       
   392                 return true;
       
   393             }
       
   394         }
       
   395     }
       
   396     return false;
       
   397 }
       
   398 
       
   399 
   348 
   400 //-----------------------------------------------------------------------------
   349 //-----------------------------------------------------------------------------
   401 // WebPointerEventHandler::highlitableElement
   350 // WebPointerEventHandler::highlitableElement
   402 //-----------------------------------------------------------------------------
   351 //-----------------------------------------------------------------------------
   403 TBrCtlDefs::TBrCtlElementType WebPointerEventHandler::highlitableElement()
   352 TBrCtlDefs::TBrCtlElementType WebPointerEventHandler::highlitableElement()
   582 
   531 
   583 
   532 
   584 //-----------------------------------------------------------------------------
   533 //-----------------------------------------------------------------------------
   585 // WebPointerEventHandler::buttonDownTimerCallback
   534 // WebPointerEventHandler::buttonDownTimerCallback
   586 //-----------------------------------------------------------------------------
   535 //-----------------------------------------------------------------------------
   587 void WebPointerEventHandler::buttonDownTimerCB(Timer<WebPointerEventHandler>* t)
   536 void WebPointerEventHandler::doTouchDownL()
   588 {
   537 {
   589     m_buttonDownTimer.stop();
       
   590 
       
   591     Frame* coreFrame = core(m_webview->mainFrame());
   538     Frame* coreFrame = core(m_webview->mainFrame());
   592     TPointerEvent event;
   539     TPointerEvent event;
   593     
   540     
   594     TBrCtlDefs::TBrCtlElementType elType = highlitableElement();
   541     TBrCtlDefs::TBrCtlElementType elType = highlitableElement();
   595 
   542 
   605      * wouldn't do anything and setEditable won't be called.
   552      * wouldn't do anything and setEditable won't be called.
   606      * So we are setting focused node to NULL here and let mouse event handler
   553      * So we are setting focused node to NULL here and let mouse event handler
   607      * set it through FocuseController::setFocusedNode()
   554      * set it through FocuseController::setFocusedNode()
   608      */
   555      */
   609     if (IS_TABBED_NAVIGATION &&
   556     if (IS_TABBED_NAVIGATION &&
   610         elType == TBrCtlDefs::EElementInputBox ||
   557        (elType == TBrCtlDefs::EElementInputBox || elType == TBrCtlDefs::EElementTextAreaBox)) {
   611         elType == TBrCtlDefs::EElementTextAreaBox) {
   558            coreFrame->document()->setFocusedNode(NULL);
   612         coreFrame->document()->setFocusedNode(NULL);
       
   613     }
   559     }
   614 
   560 
   615     if (!IS_NAVIGATION_NONE) {
   561     if (!IS_NAVIGATION_NONE) {
   616 		m_webview->sendMouseEventToEngine(TPointerEvent::EMove, m_highlightPos, coreFrame);
   562 		m_webview->sendMouseEventToEngine(TPointerEvent::EMove, m_highlightPos, coreFrame);
   617     } 
   563     } 
   618     else {
   564     else {
   619         m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Down, m_highlightPos, coreFrame);
   565         m_webview->sendMouseEventToEngine(TPointerEvent::EButton1Down, m_highlightPos, coreFrame);
   620     }
   566     }
   621 
   567 
   622     if (m_waiter->IsStarted()) {
       
   623         m_waiter->AsyncStop();
       
   624     }
       
   625 }
   568 }
   626 
   569 
   627 
   570 
   628 //-----------------------------------------------------------------------------
   571 //-----------------------------------------------------------------------------
   629 // WebPointerEventHandler::updateCursor
   572 // WebPointerEventHandler::updateCursor