ginebra2/ContentViews/ScrollableWebContentView.h
author hgs
Fri, 15 Oct 2010 17:30:59 -0400
changeset 16 3c88a81ff781
parent 9 b39122337a00
permissions -rw-r--r--
201041
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
3
hgs
parents:
diff changeset
     1
/*
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
hgs
parents:
diff changeset
     3
* All rights reserved.
hgs
parents:
diff changeset
     4
*
hgs
parents:
diff changeset
     5
* This program is free software: you can redistribute it and/or modify
hgs
parents:
diff changeset
     6
* it under the terms of the GNU Lesser General Public License as published by
hgs
parents:
diff changeset
     7
* the Free Software Foundation, version 2.1 of the License.
hgs
parents:
diff changeset
     8
*
hgs
parents:
diff changeset
     9
* This program is distributed in the hope that it will be useful,
hgs
parents:
diff changeset
    10
* but WITHOUT ANY WARRANTY; without even the implied warranty of
hgs
parents:
diff changeset
    11
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
hgs
parents:
diff changeset
    12
* GNU Lesser General Public License for more details.
hgs
parents:
diff changeset
    13
*
hgs
parents:
diff changeset
    14
* You should have received a copy of the GNU Lesser General Public License
hgs
parents:
diff changeset
    15
* along with this program.  If not,
hgs
parents:
diff changeset
    16
* see "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html/".
hgs
parents:
diff changeset
    17
*
hgs
parents:
diff changeset
    18
* Description:
hgs
parents:
diff changeset
    19
*
hgs
parents:
diff changeset
    20
*/
hgs
parents:
diff changeset
    21
hgs
parents:
diff changeset
    22
#ifndef ScrollableWebContentView_h
hgs
parents:
diff changeset
    23
#define ScrollableWebContentView_h
hgs
parents:
diff changeset
    24
hgs
parents:
diff changeset
    25
#include "Gestures/GestureEvent.h"
hgs
parents:
diff changeset
    26
#include "Gestures/GestureListener.h"
hgs
parents:
diff changeset
    27
#include "Gestures/GestureRecognizer.h"
hgs
parents:
diff changeset
    28
#include "ScrollableViewBase.h"
16
hgs
parents: 9
diff changeset
    29
#include "webpagedata.h"
3
hgs
parents:
diff changeset
    30
#include <QPropertyAnimation>
hgs
parents:
diff changeset
    31
#include <QTimer>
16
hgs
parents: 9
diff changeset
    32
#include <QWebHitTestResult>
hgs
parents: 9
diff changeset
    33
#include "uitimer.h"
3
hgs
parents:
diff changeset
    34
16
hgs
parents: 9
diff changeset
    35
class QStm_Gesture;
hgs
parents: 9
diff changeset
    36
class QWebPage;
3
hgs
parents:
diff changeset
    37
hgs
parents:
diff changeset
    38
namespace GVA {
hgs
parents:
diff changeset
    39
16
hgs
parents: 9
diff changeset
    40
hgs
parents: 9
diff changeset
    41
#define ZOOM_ANIM_TIME    300
hgs
parents: 9
diff changeset
    42
3
hgs
parents:
diff changeset
    43
class ViewportMetaData;
16
hgs
parents: 9
diff changeset
    44
class WebView;
hgs
parents: 9
diff changeset
    45
class ScrollHelper;
3
hgs
parents:
diff changeset
    46
hgs
parents:
diff changeset
    47
class ScrollableWebContentView : public ScrollableViewBase, protected GestureListener {
hgs
parents:
diff changeset
    48
    Q_OBJECT
hgs
parents:
diff changeset
    49
public:
16
hgs
parents: 9
diff changeset
    50
    ScrollableWebContentView(WebView* scrolledWidget, QGraphicsItem* parent = 0);
3
hgs
parents:
diff changeset
    51
    ~ScrollableWebContentView();
hgs
parents:
diff changeset
    52
16
hgs
parents: 9
diff changeset
    53
    WebView* webView() const;
hgs
parents: 9
diff changeset
    54
    void stepZoom(bool zoomIn);
hgs
parents: 9
diff changeset
    55
    void toggleZoom(bool zoomIn);
hgs
parents: 9
diff changeset
    56
    WebPageData pageDataFromViewportInfo();
hgs
parents: 9
diff changeset
    57
    void setPageDataToViewportInfo(const WebPageData& data);
hgs
parents: 9
diff changeset
    58
    WebPageData defaultZoomData();
3
hgs
parents:
diff changeset
    59
    void updatePreferredContentSize();
hgs
parents:
diff changeset
    60
    void setSuperPage();
16
hgs
parents: 9
diff changeset
    61
    bool isOrientationChanged(QSizeF oldSize, QSizeF newSize);
hgs
parents: 9
diff changeset
    62
    bool isChangedToLandscape(QSizeF oldSize, QSizeF newSize);
hgs
parents: 9
diff changeset
    63
    bool isChangedToPortrait(QSizeF oldSize, QSizeF newSize);
hgs
parents: 9
diff changeset
    64
    qreal zoomScale() const;
hgs
parents: 9
diff changeset
    65
    void setZoomScale(qreal value, bool immediateCommit = false);
hgs
parents: 9
diff changeset
    66
    Q_PROPERTY(qreal zoom READ zoomScale WRITE setZoomScale)
hgs
parents: 9
diff changeset
    67
hgs
parents: 9
diff changeset
    68
    // viewableRect is in page coordinates
hgs
parents: 9
diff changeset
    69
    QRectF viewableRect();
hgs
parents: 9
diff changeset
    70
    void setViewableRect(const QRectF& rect);
hgs
parents: 9
diff changeset
    71
    Q_PROPERTY(QRectF viewableRect READ viewableRect WRITE setViewableRect)
3
hgs
parents:
diff changeset
    72
16
hgs
parents: 9
diff changeset
    73
    // page scroll position in page coordiantes
hgs
parents: 9
diff changeset
    74
    void scrollPageTo(const QPointF& pos) { if(m_isScrolling) setScrollPosition((pos * zoomScale()).toPoint()) ; }
hgs
parents: 9
diff changeset
    75
    QPointF pageScrollPos() const { return scrollPosition() / zoomScale(); }
hgs
parents: 9
diff changeset
    76
    Q_PROPERTY(QPointF pageScrollPosition READ pageScrollPos WRITE scrollPageTo)
hgs
parents: 9
diff changeset
    77
hgs
parents: 9
diff changeset
    78
    Q_PROPERTY(QPoint widgetScrollPosition READ scrollPosition WRITE setScrollPosition)
hgs
parents: 9
diff changeset
    79
    Q_PROPERTY(QPoint maxScrollPosition READ maximumScrollPosition);
hgs
parents: 9
diff changeset
    80
hgs
parents: 9
diff changeset
    81
    bool event(QEvent * e);
hgs
parents: 9
diff changeset
    82
    bool eventFilter(QObject* o, QEvent* e);
hgs
parents: 9
diff changeset
    83
    bool isSuperPage() { return m_isSuperPage; }
hgs
parents: 9
diff changeset
    84
    void setPage(QWebPage* page);
hgs
parents: 9
diff changeset
    85
    
hgs
parents: 9
diff changeset
    86
    void setGesturesEnabled(bool value); 
hgs
parents: 9
diff changeset
    87
    bool gesturesEnabled();
hgs
parents: 9
diff changeset
    88
    
hgs
parents: 9
diff changeset
    89
    // fill empty areas with white
hgs
parents: 9
diff changeset
    90
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
hgs
parents: 9
diff changeset
    91
    
3
hgs
parents:
diff changeset
    92
Q_SIGNALS:
16
hgs
parents: 9
diff changeset
    93
    void contextEventObject(QWebHitTestResult* hitTest, QPointF position);
hgs
parents: 9
diff changeset
    94
    void updateZoomActions(bool enableZoomIn, bool enableZoomOut);
hgs
parents: 9
diff changeset
    95
    void scaleChanged(qreal scale);
hgs
parents: 9
diff changeset
    96
    void viewPortChanged();
9
hgs
parents: 3
diff changeset
    97
    void mouseEvent(QEvent::Type type);
16
hgs
parents: 9
diff changeset
    98
    void contentViewMouseEvent(QEvent::Type type);
3
hgs
parents:
diff changeset
    99
hgs
parents:
diff changeset
   100
public Q_SLOTS:
hgs
parents:
diff changeset
   101
    void reset();
hgs
parents:
diff changeset
   102
    void contentsSizeChanged(const QSize&);
16
hgs
parents: 9
diff changeset
   103
    void pageLoadStarted();
hgs
parents: 9
diff changeset
   104
    void pageLoadProgress(int);
3
hgs
parents:
diff changeset
   105
    void pageLoadFinished(bool);
16
hgs
parents: 9
diff changeset
   106
    void touchDownCallback();
hgs
parents: 9
diff changeset
   107
    void hoverCallback();
hgs
parents: 9
diff changeset
   108
    
3
hgs
parents:
diff changeset
   109
protected:
hgs
parents:
diff changeset
   110
    bool sceneEventFilter(QGraphicsItem*, QEvent*);
16
hgs
parents: 9
diff changeset
   111
    void updateViewportMetaDataFromPageTag();
hgs
parents: 9
diff changeset
   112
    QSizeF parentSize() const;
3
hgs
parents:
diff changeset
   113
hgs
parents:
diff changeset
   114
    //From GestureListener
hgs
parents:
diff changeset
   115
    void handleGesture(GestureEvent*);
hgs
parents:
diff changeset
   116
hgs
parents:
diff changeset
   117
    //Helpers
hgs
parents:
diff changeset
   118
    void handlePress(GestureEvent*);
hgs
parents:
diff changeset
   119
    void handleRelease(GestureEvent*);
hgs
parents:
diff changeset
   120
    void handleFlick(GestureEvent*);
hgs
parents:
diff changeset
   121
    void handleDoubleTap(GestureEvent*);
hgs
parents:
diff changeset
   122
    void handlePan(GestureEvent*);
hgs
parents:
diff changeset
   123
    void handleLongTap(GestureEvent*);
hgs
parents:
diff changeset
   124
hgs
parents:
diff changeset
   125
    void setViewportWidgetGeometry(const QRectF& r);
16
hgs
parents: 9
diff changeset
   126
    QRectF validateViewportRect(const QRectF& rect); // rect in page coordinates
hgs
parents: 9
diff changeset
   127
hgs
parents: 9
diff changeset
   128
//    void startZoomAnimToItemHotspot(const QPointF& hotspot, const QPointF& viewTargetHotspot, qreal scale, QRectF target = QRectF()); // OBS
3
hgs
parents:
diff changeset
   129
    bool isZoomedIn() const;
16
hgs
parents: 9
diff changeset
   130
    bool isZooming();
3
hgs
parents:
diff changeset
   131
hgs
parents:
diff changeset
   132
    //To handle kinetic scroller state changes
hgs
parents:
diff changeset
   133
    void stateChanged(KineticScrollable::State oldState, KineticScrollable::State newState);
16
hgs
parents: 9
diff changeset
   134
    void zoomToHotSpot(const QPointF& viewportHotSpot, const qreal destScale);
hgs
parents: 9
diff changeset
   135
    void startZoomAnimationToHotSpot(const QPointF& viewportHotSpot, const qreal destScale, int animTime = ZOOM_ANIM_TIME);
hgs
parents: 9
diff changeset
   136
    void startZoomAnimation(const QRectF& destViewRect, int animTime = ZOOM_ANIM_TIME); // destViewRect in page coordinates
3
hgs
parents:
diff changeset
   137
    void stopZoomAnimation();
hgs
parents:
diff changeset
   138
    void updateZoomEndRect();
hgs
parents:
diff changeset
   139
    void resizeEvent(QGraphicsSceneResizeEvent* event);
hgs
parents:
diff changeset
   140
    void adjustViewportSize(QSizeF oldSize, QSizeF newSize);
16
hgs
parents: 9
diff changeset
   141
    void sendEventToWebKit(QEvent::Type type, const QPointF& scenePos, bool select = false);
hgs
parents: 9
diff changeset
   142
    QRectF findZoomableRectForPoint(const QPointF& point); // point in view coordinates, returns rect in page coordinates
hgs
parents: 9
diff changeset
   143
    void notifyZoomActions(qreal newScale);
hgs
parents: 9
diff changeset
   144
    void startScrollAnimation(QPointF& scrollPos, QPointF& targetPos, 
hgs
parents: 9
diff changeset
   145
                              int duration, QEasingCurve::Type& easingCurveType);
hgs
parents: 9
diff changeset
   146
3
hgs
parents:
diff changeset
   147
   
hgs
parents:
diff changeset
   148
protected Q_SLOTS:
hgs
parents:
diff changeset
   149
    void zoomAnimationStateChanged(QAbstractAnimation::State newState, QAbstractAnimation::State);
16
hgs
parents: 9
diff changeset
   150
    void enableContentUpdates();
hgs
parents: 9
diff changeset
   151
    void disableContentUpdates();
hgs
parents: 9
diff changeset
   152
    void commitZoom();
hgs
parents: 9
diff changeset
   153
    void stopScrolling();
3
hgs
parents:
diff changeset
   154
hgs
parents:
diff changeset
   155
private:
16
hgs
parents: 9
diff changeset
   156
    void zoomAtPoint(QPointF touchPoint);
hgs
parents: 9
diff changeset
   157
    bool handleQStmGesture(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   158
    bool doTouch(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   159
    bool doTap(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   160
    bool doMaybeTap(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   161
    bool doPan(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   162
    bool doFlick(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   163
    bool doDoubleTap(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   164
    bool doPinch(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   165
    bool doLongPress(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   166
    bool doRelease(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   167
    bool doLeftRight(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   168
    bool doUpDown(QStm_Gesture* gesture);
hgs
parents: 9
diff changeset
   169
    qreal calcScale(int origDistance, QPointF p1, QPointF p2);
hgs
parents: 9
diff changeset
   170
    qreal calcDistance(QPointF pt1, QPointF pt2);
hgs
parents: 9
diff changeset
   171
    QPointF calcCenter(QPointF pt1, QPointF pt2);
hgs
parents: 9
diff changeset
   172
    int zoomAnimationTime(bool zoomIn, qreal targetScale);
hgs
parents: 9
diff changeset
   173
    QRectF viewportRectInPageCoord(const QPointF& viewportHotSpot, 
hgs
parents: 9
diff changeset
   174
                                   const qreal destScale);
hgs
parents: 9
diff changeset
   175
    void dehighlightWebElement();
hgs
parents: 9
diff changeset
   176
    void initScrollHelper();
hgs
parents: 9
diff changeset
   177
    QWebHitTestResult  hitTest(const QPointF& scenePos);
hgs
parents: 9
diff changeset
   178
    bool toggleInputMethod(bool on);
hgs
parents: 9
diff changeset
   179
    bool toggleVkb();
hgs
parents: 9
diff changeset
   180
    bool inputMethodEnabled();
hgs
parents: 9
diff changeset
   181
    
hgs
parents: 9
diff changeset
   182
private:
3
hgs
parents:
diff changeset
   183
    QRectF m_animationEndRect;
hgs
parents:
diff changeset
   184
    QPropertyAnimation* m_zoomAnimator;          //Animates zooming transitions
hgs
parents:
diff changeset
   185
    ViewportMetaData* m_viewportMetaData;
hgs
parents:
diff changeset
   186
    QTimer m_tileUpdateEnableTimer;
16
hgs
parents: 9
diff changeset
   187
    QTimer m_zoomCommitTimer;
hgs
parents: 9
diff changeset
   188
    int m_pinchStartDistance;
hgs
parents: 9
diff changeset
   189
    qreal m_pinchStartScale;
hgs
parents: 9
diff changeset
   190
    bool m_isSuperPage;
hgs
parents: 9
diff changeset
   191
    bool m_gesturesEnabled;    // bookmarks and history need this
hgs
parents: 9
diff changeset
   192
    UiTimer* m_touchDownTimer;
hgs
parents: 9
diff changeset
   193
    UiTimer* m_hoverTimer;
hgs
parents: 9
diff changeset
   194
    QPointF  m_touchDownPos;
hgs
parents: 9
diff changeset
   195
    QTime    m_pinchFinishTime;
hgs
parents: 9
diff changeset
   196
    bool     m_isScrolling;
hgs
parents: 9
diff changeset
   197
    bool     m_isLoading;
hgs
parents: 9
diff changeset
   198
hgs
parents: 9
diff changeset
   199
    ScrollHelper*   m_scrollHelper;
hgs
parents: 9
diff changeset
   200
    
hgs
parents: 9
diff changeset
   201
    GestureRecognizer m_gestureRecognizer;
hgs
parents: 9
diff changeset
   202
    QTimer            m_viewportMetadataResetTimer;
hgs
parents: 9
diff changeset
   203
    QWebHitTestResult m_hitTest;
hgs
parents: 9
diff changeset
   204
    bool              m_isInputOn;
hgs
parents: 9
diff changeset
   205
    bool              m_ignoreNextRelease;
3
hgs
parents:
diff changeset
   206
}; //ScrollableWebContentView
hgs
parents:
diff changeset
   207
hgs
parents:
diff changeset
   208
} //namespace GVA
hgs
parents:
diff changeset
   209
hgs
parents:
diff changeset
   210
#endif //ScrollableWebContentView_h