ginebra2/GWebTouchNavigation.h
changeset 0 1450b09d0cfd
child 3 0954f5dd2cd0
child 5 0f2326c2a325
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ginebra2/GWebTouchNavigation.h	Tue May 04 12:39:35 2010 +0300
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+/* Temporary implementation of WebTouchNavigation until gestures are ready. */
+
+#ifndef WEBTOUCHNAVIGATION_H
+#define WEBTOUCHNAVIGATION_H
+
+#include <QTime>
+#include <qobject.h>
+#include <qpoint.h>
+#include <qevent.h>
+#include <qobject.h>
+#include <qtimeline.h>
+#include <qwebframe.h>
+#include <qwebelement.h>
+#include <QWebPage>
+#include "wrtBrowserDefs.h"
+
+
+class QWebFrame;
+class QWebPage;
+class QTimer;
+
+namespace GVA
+{
+    class GWebContentViewWidget;
+    class ChromeWidget;
+
+    enum Direction
+    {
+        DOWN,           // SOUTH 
+        UP,             // NORTH 
+        RIGHT,          // EAST
+        LEFT,           // WEST
+        BOTTOMRIGHT,    // SOUTHEAST 
+        BOTTOMLEFT,     // SOUTHWEST
+        TOPLEFT,        // NORTHWEST
+        TOPRIGHT        // NORTHEAST
+    };
+    
+    enum PanDirection {
+        HorizontalPan,
+        VerticalPan,
+        RandomPan 
+    };
+
+    class DragPoint
+    {
+    public:
+        QPoint iPoint;
+        QTime  iTime;
+    };
+
+    class GWebTouchNavigation : public QObject
+    {
+    Q_OBJECT
+    public:
+        GWebTouchNavigation(QWebPage* webPage, GWebContentViewWidget* view);
+        virtual ~GWebTouchNavigation();
+        void install();
+        void uninstall();
+        void setPage( QWebPage * page);
+        bool enabled() const { return m_enabled; }
+        void setEnabled(bool value) { m_enabled = value; }
+        void setChromeWidget(ChromeWidget* chrome) { m_chrome = chrome;}
+
+    signals:
+        void longPressEvent();// mouse long press signal    
+        void focusElementChanged(wrtBrowserDefs::BrowserElementType &);// mouse long press signal
+        void pageScrollPositionZero();
+        
+        /// Sent when this object starts panning/scrolling the page.  Can be useful for
+        /// cancelling things like long-press timers which otherwise wouldn't get
+        /// mouse-move events.
+        void startingPanGesture(int directionHint);
+        void mouseEvent(QEvent::Type type);
+
+    protected slots:
+        void scrollToEdge();
+		void doubleClickTimerExpired();
+		void timerControl();// local slot for controlling timer
+		void pan();
+		void kineticScroll();
+		void BlockFocusChanged(QPoint pt);
+		void onLoadStarted(); 
+		void onLoadFinished(bool ok);
+    protected:
+        bool eventFilter(QObject *object, QEvent *event);
+        void mousePressEvent(const QPoint& pos);
+        void mouseMoveEvent(const QPoint& pos, const QPoint& diff);
+        void mouseReleaseEvent(const QPoint& pos);
+        void mouseDoubleClickEvent(const QPoint& pos);
+        QWebFrame* getNextScrollableFrame(const QPoint& pos);
+        void scrollFrame(const QPoint& diff);
+  
+        void startScrollTimer();
+        void updateFlickScrollDistance();
+        bool isFlick() ;
+        QPoint speed() ;
+        QPoint currentPos();
+        QPoint previousPos();
+        qreal dragTime() const;
+        Direction findDirectionWithAngle(const QPoint& diff);
+        bool isNear(qreal aAngleUnderTest, qreal aMinAngle, qreal aMaxAngle);
+        qreal findAngle(const int& xDelta,const int& yDelta);
+        int roundOff(qreal num);
+        QRect findEnclosingBlock(QMouseEvent* ev);
+        QWebHitTestResult getHitTestResult(QMouseEvent* ev);
+        void calculateActualScrollDistance();
+        void setNewScrollDistance(QPoint blockCanvasPoint, int thresholdCheckVal);
+		void handleMousePressEvent(QMouseEvent* ev);
+		void handleMouseReleaseEvent(QMouseEvent* ev);
+        void handleDoubleClickEvent(QMouseEvent* ev);
+		
+        
+	private:
+		void highlightableElement(QMouseEvent* ev);
+		QWebElement getClosestAnchorElement(QMouseEvent* ev);
+		bool traverseNextNode(QWebElement parentNode,QWebElement& nextNode);
+	    
+		void handleHighlightChange(QMouseEvent* ev);
+		bool canDehighlight(QMouseEvent* ev);
+		void dehighlight(QMouseEvent* ev);
+		void getFocusedElement();
+		void startTimer();
+        void stopTimer();
+
+        
+        void stopScrolling();        
+        void startPanGesture(PanDirection);
+        void panBy(const QPointF& delta);
+        void scrollCurrentFrame (int dx, int dy);
+        void setCurrentFrameScrollPosition (QPoint& pos);
+
+        Qt::KeyboardModifier getEventModifier(const QPoint& pos);
+        
+    private:
+        QWebPage* m_webPage;
+        GWebContentViewWidget* m_view;
+        QWebFrame* m_frame;
+        ChromeWidget* m_chrome;
+        bool m_scrolled;
+        QPoint m_touchPosition;
+        QPointF m_scrollDistance;  
+        QPointF m_actualScrollDistance;
+        QPointF m_prevPoint;
+        QList<DragPoint> m_dragPoints;
+        Direction m_flickDirection;
+        QTime m_lastMoveEventTime;
+		QTimer* m_doubleClickTimer;
+        QMouseEvent *m_pressEvent;
+        QMouseEvent *m_releaseEvent;
+        QPoint m_focusedBlockPt;	
+		QWebElement m_anchorElement;
+		QPoint m_higlightedPos;
+		bool m_ishighlighted;
+		int m_offset;
+		QTimer* m_longPressTimer;// long press timer
+		QPoint m_initialSpeed;		
+		qreal m_finalzoomfactor;
+		QTimer* m_scrollTimer;
+		QPoint  m_scrollDelta;
+		QTimer* m_kineticTimer;
+		QPointF m_kineticSpeed;
+		QTime   m_actualTime;
+		int     m_kineticScrollTime;
+		QPoint  m_initialScrollPos;	
+		bool m_isPanning;
+        QTime m_delayedPressMoment;
+        QPointF m_dragStartPos;
+        PanDirection m_panDirection;
+        QPointF m_panModeResidue;		
+        bool m_enabled;
+        
+    bool m_isLoading;    
+    };
+
+}
+
+#endif