webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp
changeset 65 5bfc169077b2
parent 42 d39add9822e2
equal deleted inserted replaced
42:d39add9822e2 65:5bfc169077b2
    15 *
    15 *
    16 */
    16 */
    17 
    17 
    18 
    18 
    19 // INCLUDE FILES
    19 // INCLUDE FILES
    20 #include <browser_platform_variant.hrh>
    20 #include <Browser_platform_variant.hrh>
    21 #include <../bidi.h>
    21 #include <../bidi.h>
    22 #include "WebPageScrollHandler.h"
    22 #include "WebPageScrollHandler.h"
    23 #include "BrCtl.h"
    23 #include "BrCtl.h"
    24 #include "WebFrame.h"
    24 #include "WebFrame.h"
    25 #include "WebFrameView.h"
    25 #include "WebFrameView.h"
    35 #include "RenderObject.h"
    35 #include "RenderObject.h"
    36 #include "WebScrollingDeceleratorGH.h"
    36 #include "WebScrollingDeceleratorGH.h"
    37 
    37 
    38 #include "WebKitLogger.h"
    38 #include "WebKitLogger.h"
    39 using namespace WebCore;
    39 using namespace WebCore;
       
    40 using namespace RT_GestureHelper;
    40 // constants
    41 // constants
    41 const int KPageOverviewScrollPeriodic = 20 * 1000; // Update frequently for faster, smoother scrolling
    42 const int KPageOverviewScrollPeriodic = 20 * 1000; // Update frequently for faster, smoother scrolling
    42 const int KMicroInterval = 300000;
    43 const int KMicroInterval = 300000;
    43 const int KPageOverviewScrollStart = 1000;
    44 const int KPageOverviewScrollStart = 1000;
    44 const int KCancelDecelerationTimeout = 200000; //Decelerate only if flicked KCancelDecelerationTimeout microsec after last drag event.
    45 const int KCancelDecelerationTimeout = 200000; //Decelerate only if flicked KCancelDecelerationTimeout microsec after last drag event.
   369         if (m_scrollableView.m_scrollingElement) {
   370         if (m_scrollableView.m_scrollingElement) {
   370             bool shouldScrollVertically = false;
   371             bool shouldScrollVertically = false;
   371             bool shouldScrollHorizontally = false;
   372             bool shouldScrollHorizontally = false;
   372             WebFrame* frame = kit(m_scrollableView.m_scrollingElement->document()->frame());
   373             WebFrame* frame = kit(m_scrollableView.m_scrollingElement->document()->frame());
   373             RenderObject* render = m_scrollableView.m_scrollingElement->renderer();
   374             RenderObject* render = m_scrollableView.m_scrollingElement->renderer();
   374             if(render) //check if render exits before using it
   375             __ASSERT_DEBUG(render->isScrollable(), User::Panic(_L(""), KErrGeneral));
   375                 {
   376             if (aScrollDelta.iY)
   376                 __ASSERT_DEBUG(render->isScrollable(), User::Panic(_L(""), KErrGeneral));
   377                 shouldScrollVertically = !render->scroll(ScrollDown, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iY / 100);
   377                 if (aScrollDelta.iY)
   378             if (aScrollDelta.iX)
   378                   shouldScrollVertically = !render->scroll(ScrollDown, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iY / 100);
   379                 shouldScrollHorizontally = !render->scroll(ScrollRight, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iX / 100);
   379                 if (aScrollDelta.iX)
   380 
   380                   shouldScrollHorizontally = !render->scroll(ScrollRight, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iX / 100);
       
   381                 }
       
   382             TPoint scrollPos = frame->frameView()->contentPos();
   381             TPoint scrollPos = frame->frameView()->contentPos();
   383             TPoint newscrollDelta = frame->frameView()->toDocCoords(aScrollDelta);
   382             TPoint newscrollDelta = frame->frameView()->toDocCoords(aScrollDelta);
   384             m_currentNormalizedPosition +=  newscrollDelta;     
   383             m_currentNormalizedPosition +=  newscrollDelta;     
   385 
   384 
   386             if (shouldScrollHorizontally) {
   385             if (shouldScrollHorizontally) {
   558     TPoint pt = frame->frameView()->viewCoordsInFrameCoords(aNewPosition);
   557     TPoint pt = frame->frameView()->viewCoordsInFrameCoords(aNewPosition);
   559     Element* e = core(frame)->document()->elementFromPoint(pt.iX, pt.iY);
   558     Element* e = core(frame)->document()->elementFromPoint(pt.iX, pt.iY);
   560     Element* currElement = NULL;
   559     Element* currElement = NULL;
   561     if(!e) return NULL;
   560     if(!e) return NULL;
   562     RenderObject* render = e->renderer();
   561     RenderObject* render = e->renderer();
   563     if(render) {
   562     if (render && render->isScrollable()) {
   564         RenderLayer* layer = render->enclosingLayer();
   563         RenderLayer* layer = render->enclosingLayer();
   565         Element* parent = e;
   564         Element* parent = e;
   566 
   565         currElement = e;
   567         if (e->isControl()) {
   566         while (!currElement->isControl() && parent && parent->renderer() && parent->renderer()->enclosingLayer() == layer) {
   568             if (render->isScrollable()) {
   567             currElement = parent;
   569             currElement = e;
   568             Node* pn = parent;
   570             }
   569             do {
   571         }
   570                 pn = pn->parent();
   572         else {
   571             } while (pn && !pn->isElementNode());
   573             while (parent && parent->renderer()) {
   572             parent = static_cast<Element*>(pn);
   574                 if (parent->renderer()->isScrollable()) {
       
   575                     currElement = parent;
       
   576                     break;
       
   577                     }
       
   578                 parent = static_cast<Element*>(parent->parent());
       
   579                 }
       
   580         }
   573         }
   581         if (currElement) {
   574         if (currElement) {
   582             //check for current element which is scrollable
       
   583             currElement->ref();
   575             currElement->ref();
   584             m_scrollableView.m_scrollingElement = currElement;
   576             m_scrollableView.m_scrollingElement = currElement; 
   585             m_scrollableView.m_frameView = NULL;
   577             m_scrollableView.m_frameView = NULL;
   586             return true;
   578             return true;
   587             }
   579         }
   588         }
   580     }
   589     return false;
   581     return false;
   590 }
   582 }
   591 
   583 
   592 
   584 
   593 void WebPageScrollHandler::scrollPageOverviewGH()
   585 void WebPageScrollHandler::scrollPageOverviewGH()
   602     m_webView->mainFrame()->frameView()->scrollTo(TPoint(xInDoc, yInDoc));    
   594     m_webView->mainFrame()->frameView()->scrollTo(TPoint(xInDoc, yInDoc));    
   603 
   595 
   604 }
   596 }
   605 
   597 
   606 
   598 
   607 void WebPageScrollHandler::handleScrollingGH(const TStmGestureEvent& aGesture)
   599 void WebPageScrollHandler::handleScrollingGH(const TGestureEvent& aEvent)
   608 {   
   600 {   
   609     TPoint newPos = aGesture.CurrentPos();
   601     TPoint newPos = aEvent.CurrentPos();
   610     m_currentPosition = newPos;
   602     m_currentPosition = newPos;
   611     if (m_webView->inPageViewMode()) {
   603     if (m_webView->inPageViewMode()) {
   612         if (!m_pageOverviewScrollPeriodic->IsActive()){
   604         if (!m_pageOverviewScrollPeriodic->IsActive()){
   613             m_pageOverviewScrollPeriodic->Start( 0, KPageOverviewScrollPeriodic, 
   605             m_pageOverviewScrollPeriodic->Start( 0, KPageOverviewScrollPeriodic, 
   614                                                 TCallBack(&pageOverviewScrollCallback, this));
   606                                                 TCallBack(&pageOverviewScrollCallback, this));
   620         setupScrolling(newPos);    
   612         setupScrolling(newPos);    
   621     }
   613     }
   622 }
   614 }
   623 
   615 
   624 
   616 
   625 void WebPageScrollHandler::handleTouchDownGH(const TStmGestureEvent& aGesture)
   617 void WebPageScrollHandler::handleTouchDownGH(const TGestureEvent& aEvent)
   626 {
   618 {
   627     TPoint newPos = aGesture.CurrentPos();
   619     TPoint newPos = aEvent.CurrentPos();
   628     m_lastMoveEventTime = 0; 
   620     m_lastMoveEventTime = 0; 
   629     m_lastPosition = newPos;
   621     m_lastPosition = newPos;
   630     m_currentPosition = newPos;
   622     m_currentPosition = newPos;
   631     m_webView->setViewIsScrolling(false);      
   623     m_webView->setViewIsScrolling(false);      
   632     m_webView->toggleRepaintTimer(true);
   624     m_webView->toggleRepaintTimer(true);
   637     m_scrollableView.m_scrollingElement = NULL;
   629     m_scrollableView.m_scrollingElement = NULL;
   638     m_scrollableView.m_frameView = NULL;
   630     m_scrollableView.m_frameView = NULL;
   639 }
   631 }
   640 
   632 
   641 
   633 
   642 void WebPageScrollHandler::handleTouchUpGH(const TStmGestureEvent& aGesture)
   634 void WebPageScrollHandler::handleTouchUpGH(const TGestureEvent& aEvent)
   643 {
   635 {
   644     bool decelDoesScrollbars = false;
   636     bool decelDoesScrollbars = false;
   645     TPoint newPos = aGesture.CurrentPos();
   637     TPoint newPos = aEvent.CurrentPos();
   646 
   638 
   647     if (m_webView->inPageViewMode()) {
   639     if (m_webView->inPageViewMode()) {
   648         if (m_pageOverviewScrollPeriodic->IsActive()){ 
   640         if (m_pageOverviewScrollPeriodic->IsActive()){ 
   649             m_pageOverviewScrollPeriodic->Cancel();
   641             m_pageOverviewScrollPeriodic->Cancel();
   650         }
   642         }
   654         m_webView->toggleRepaintTimer(true);
   646         m_webView->toggleRepaintTimer(true);
   655     }
   647     }
   656     else {
   648     else {
   657         m_scrollTimer->Cancel();
   649         m_scrollTimer->Cancel();
   658         m_lastPosition = TPoint(0, 0);
   650         m_lastPosition = TPoint(0, 0);
   659         decelDoesScrollbars = startDeceleration(aGesture);
   651         decelDoesScrollbars = startDeceleration(aEvent);
   660                     
   652                     
   661         if (m_webView->viewIsScrolling()) {
   653         if (m_webView->viewIsScrolling()) {
   662             Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame();
   654             Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame();
   663             frame->bridge()->sendScrollEvent();                            
   655             frame->bridge()->sendScrollEvent();                            
   664         }
   656         }
   672         m_lastMoveEventTime = 0;
   664         m_lastMoveEventTime = 0;
   673     }
   665     }
   674 }
   666 }
   675 
   667 
   676 
   668 
   677 bool WebPageScrollHandler::startDeceleration(const TStmGestureEvent& aGesture)
   669 bool WebPageScrollHandler::startDeceleration(const TGestureEvent& aEvent)
   678 {
   670 {
   679     bool started = false;
   671     bool started = false;
   680     TRealPoint gstSpeed = aGesture.Speed();
   672     TRealPoint gstSpeed = aEvent.Speed();
   681     if (Abs(gstSpeed.iX / gstSpeed.iY) <= KTanOfThresholdAngle) {
   673     if (Abs(gstSpeed.iX / gstSpeed.iY) <= KTanOfThresholdAngle) {
   682        gstSpeed.iX = 0;
   674        gstSpeed.iX = 0;
   683     }
   675     }
   684     
   676     
   685     if (Abs(gstSpeed.iY / gstSpeed.iX) <= KTanOfThresholdAngle) { 
   677     if (Abs(gstSpeed.iY / gstSpeed.iX) <= KTanOfThresholdAngle) {