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) { |