ginebra2/ContentViews/ScrollableWebContentView.cpp
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
#include "ScrollableWebContentView.h"
hgs
parents:
diff changeset
    23
#include "Kinetics/KineticScroller.h"
hgs
parents:
diff changeset
    24
#include "ScrollableViewBase.h"
hgs
parents:
diff changeset
    25
#include "ViewportMetaDataParser.h"
16
hgs
parents: 9
diff changeset
    26
#include "WebView.h"
hgs
parents: 9
diff changeset
    27
#include "qstmgestureevent.h"
hgs
parents: 9
diff changeset
    28
#include "qstmfilelogger.h"
hgs
parents: 9
diff changeset
    29
#include "bedrockprovisioning.h"
hgs
parents: 9
diff changeset
    30
#include "ScrollHelper.h"
3
hgs
parents:
diff changeset
    31
hgs
parents:
diff changeset
    32
#include <QApplication>
hgs
parents:
diff changeset
    33
#include <QGraphicsScene>
hgs
parents:
diff changeset
    34
#include <QGraphicsSceneMouseEvent>
hgs
parents:
diff changeset
    35
#include <QGraphicsWebView>
16
hgs
parents: 9
diff changeset
    36
#include <QStyleOptionGraphicsItem>
3
hgs
parents:
diff changeset
    37
#include <QWebElement>
hgs
parents:
diff changeset
    38
#include <QWebHitTestResult>
16
hgs
parents: 9
diff changeset
    39
#include <QWebPage>
hgs
parents: 9
diff changeset
    40
#include <QWebHistory>
hgs
parents: 9
diff changeset
    41
#include <QInputContext>
3
hgs
parents:
diff changeset
    42
16
hgs
parents: 9
diff changeset
    43
#include "Gestures/GestureRecognizer.h"
hgs
parents: 9
diff changeset
    44
#ifdef ORBIT_UI
hgs
parents: 9
diff changeset
    45
#include <hbinputmethod.h>
hgs
parents: 9
diff changeset
    46
#endif // ORBIT_UI
hgs
parents: 9
diff changeset
    47
hgs
parents: 9
diff changeset
    48
namespace GVA {
3
hgs
parents:
diff changeset
    49
//Kinetic scroll constants
hgs
parents:
diff changeset
    50
static const int ScrollsPerSecond = 30;
hgs
parents:
diff changeset
    51
static const int MinimumScrollVelocity = 10;
hgs
parents:
diff changeset
    52
static const qreal AxisLockThreshold = .8;
hgs
parents:
diff changeset
    53
hgs
parents:
diff changeset
    54
//Zooming constants
16
hgs
parents: 9
diff changeset
    55
const int ZoomAnimationDuration = 600;   //ms. Zooming transition duration
hgs
parents: 9
diff changeset
    56
const int MaxZoomAnimationDuration = 2000;   //ms. Zooming transition duration
3
hgs
parents:
diff changeset
    57
static const qreal ZoomStep = .5;               //Incremental zoom step
16
hgs
parents: 9
diff changeset
    58
#ifdef Q_WS_MAEMO_5
hgs
parents: 9
diff changeset
    59
const int TileUpdateEnableDelay = 10;         //Wait duration before tiling updates are enabled.
hgs
parents: 9
diff changeset
    60
#else
hgs
parents: 9
diff changeset
    61
const int TileUpdateEnableDelay = 150;         //Wait duration before tiling updates are enabled.
hgs
parents: 9
diff changeset
    62
#endif
hgs
parents: 9
diff changeset
    63
static const int MinDoubleClickZoomTargetWidth = 100;     //Target block width for applying double tap zoom
hgs
parents: 9
diff changeset
    64
static const int ZoomCommitDuration = 60;                //Timeout before commiting zoom
hgs
parents: 9
diff changeset
    65
static const qreal ZoomableContentMinWidth = 300.;
3
hgs
parents:
diff changeset
    66
16
hgs
parents: 9
diff changeset
    67
static const qreal InvalidCoord = 1e10;
hgs
parents: 9
diff changeset
    68
static const int TouchDownTimeout = 200;
hgs
parents: 9
diff changeset
    69
static const int HoverTimeout = 100;
3
hgs
parents:
diff changeset
    70
16
hgs
parents: 9
diff changeset
    71
#undef USE_KINETIC_SCROLLER
hgs
parents: 9
diff changeset
    72
using namespace qstmGesture;
hgs
parents: 9
diff changeset
    73
hgs
parents: 9
diff changeset
    74
ScrollableWebContentView::ScrollableWebContentView(WebView* scrolledWidget, QGraphicsItem* parent)
3
hgs
parents:
diff changeset
    75
    : ScrollableViewBase(parent)
hgs
parents:
diff changeset
    76
    , m_gestureRecognizer(this)
16
hgs
parents: 9
diff changeset
    77
    , m_isInputOn(false)
hgs
parents: 9
diff changeset
    78
    , m_ignoreNextRelease(false)
3
hgs
parents:
diff changeset
    79
{
hgs
parents:
diff changeset
    80
    m_viewportMetaData = new ViewportMetaData();
hgs
parents:
diff changeset
    81
16
hgs
parents: 9
diff changeset
    82
    scrolledWidget->installEventFilter(this);
hgs
parents: 9
diff changeset
    83
    
3
hgs
parents:
diff changeset
    84
    //Kinetic scroller settings
hgs
parents:
diff changeset
    85
    //Sets the number of scrolls (frames) per second to sps.
hgs
parents:
diff changeset
    86
    m_kineticScroller->setScrollsPerSecond(ScrollsPerSecond);
hgs
parents:
diff changeset
    87
    //For elastic scroll in page edges
hgs
parents:
diff changeset
    88
    m_kineticScroller->setOvershootPolicy(KineticScroller::OvershootWhenScrollable);
hgs
parents:
diff changeset
    89
16
hgs
parents: 9
diff changeset
    90
    setWidget(scrolledWidget);
hgs
parents: 9
diff changeset
    91
hgs
parents: 9
diff changeset
    92
    m_tileUpdateEnableTimer.setSingleShot(true);
hgs
parents: 9
diff changeset
    93
    connect(&m_tileUpdateEnableTimer, SIGNAL(timeout()), this, SLOT(enableContentUpdates()));
hgs
parents: 9
diff changeset
    94
    m_zoomCommitTimer.setSingleShot(true);
hgs
parents: 9
diff changeset
    95
    connect(&m_zoomCommitTimer, SIGNAL(timeout()),this,SLOT(commitZoom()));
hgs
parents: 9
diff changeset
    96
hgs
parents: 9
diff changeset
    97
    //Setup zooming animator
hgs
parents: 9
diff changeset
    98
    m_zoomAnimator = new QPropertyAnimation(this, "viewableRect");
hgs
parents: 9
diff changeset
    99
    //m_zoomAnimator->setDuration(ZoomAnimationDuration);
hgs
parents: 9
diff changeset
   100
    connect(m_zoomAnimator, SIGNAL(stateChanged(QAbstractAnimation::State,QAbstractAnimation::State)), 
hgs
parents: 9
diff changeset
   101
            this, SLOT(zoomAnimationStateChanged(QAbstractAnimation::State,QAbstractAnimation::State)));
hgs
parents: 9
diff changeset
   102
    
hgs
parents: 9
diff changeset
   103
    m_isSuperPage = false;
hgs
parents: 9
diff changeset
   104
    m_gesturesEnabled = true;
hgs
parents: 9
diff changeset
   105
    m_isLoading = false;
hgs
parents: 9
diff changeset
   106
    m_touchDownTimer = UiTimer::New();
hgs
parents: 9
diff changeset
   107
    m_touchDownTimer->setTimerCallback((char*)"touchDownCallback");
hgs
parents: 9
diff changeset
   108
    
hgs
parents: 9
diff changeset
   109
    m_hoverTimer = UiTimer::New();
hgs
parents: 9
diff changeset
   110
    m_hoverTimer->setTimerCallback((char*)"hoverCallback");
hgs
parents: 9
diff changeset
   111
        
hgs
parents: 9
diff changeset
   112
    m_touchDownTimer->setPriority(150);
hgs
parents: 9
diff changeset
   113
    m_pinchFinishTime = QTime::currentTime();
hgs
parents: 9
diff changeset
   114
    // ScrollHelper
hgs
parents: 9
diff changeset
   115
    m_scrollHelper = new ScrollHelper(this);
hgs
parents: 9
diff changeset
   116
    initScrollHelper();
hgs
parents: 9
diff changeset
   117
        
3
hgs
parents:
diff changeset
   118
    //Gesture settings
hgs
parents:
diff changeset
   119
    //For detecting scroll direction
hgs
parents:
diff changeset
   120
    m_gestureRecognizer.setAxisLockThreshold(AxisLockThreshold);
hgs
parents:
diff changeset
   121
    //To enable touch and drag scrolling
hgs
parents:
diff changeset
   122
    m_gestureRecognizer.setMinimumVelocity(MinimumScrollVelocity);
hgs
parents:
diff changeset
   123
16
hgs
parents: 9
diff changeset
   124
    grabGesture(QStm_Gesture::assignedType());
hgs
parents: 9
diff changeset
   125
    connect(this, SIGNAL(viewScrolled(QPoint&, QPoint&)), scrolledWidget, SLOT(viewScrolled(QPoint&, QPoint&)));
hgs
parents: 9
diff changeset
   126
    installEventFilter(this);
hgs
parents: 9
diff changeset
   127
}
3
hgs
parents:
diff changeset
   128
16
hgs
parents: 9
diff changeset
   129
void ScrollableWebContentView::initScrollHelper()
hgs
parents: 9
diff changeset
   130
{
hgs
parents: 9
diff changeset
   131
    qreal decel = BedrockSettings->value("KineticDeceleration").toDouble();
hgs
parents: 9
diff changeset
   132
    m_scrollHelper->setDeceleration(decel);
3
hgs
parents:
diff changeset
   133
16
hgs
parents: 9
diff changeset
   134
    qreal maxFlickKoef = BedrockSettings->value("MaxFlickInViewportUnits").toDouble();
hgs
parents: 9
diff changeset
   135
    qreal minFlickKoef = BedrockSettings->value("MinFlickInViewportUnits").toDouble();
hgs
parents: 9
diff changeset
   136
    qreal midFlickKoef = BedrockSettings->value("MidFlickInViewportUnits").toDouble();
hgs
parents: 9
diff changeset
   137
    m_scrollHelper->setFlickLimits(minFlickKoef, midFlickKoef, maxFlickKoef);
3
hgs
parents:
diff changeset
   138
16
hgs
parents: 9
diff changeset
   139
    qreal maxFlickSpeed = BedrockSettings->value("MaxFlickSpeed").toDouble();
hgs
parents: 9
diff changeset
   140
    qreal minFlickSpeed = BedrockSettings->value("MinFlickSpeed").toDouble();
hgs
parents: 9
diff changeset
   141
    qreal midFlickSpeed = BedrockSettings->value("MidFlickSpeed").toDouble();
hgs
parents: 9
diff changeset
   142
    m_scrollHelper->setFlickSpeedLimits(minFlickSpeed, midFlickSpeed, maxFlickSpeed);
hgs
parents: 9
diff changeset
   143
hgs
parents: 9
diff changeset
   144
    int maxFlickDuration = BedrockSettings->value("MaxFlickDuration").toInt();
hgs
parents: 9
diff changeset
   145
    int minFlickDuration = BedrockSettings->value("MinFlickDuration").toInt();
hgs
parents: 9
diff changeset
   146
    int midFlickDuration = BedrockSettings->value("MidFlickDuration").toInt();
hgs
parents: 9
diff changeset
   147
    m_scrollHelper->setFlickDurationLimits(minFlickDuration, midFlickDuration, maxFlickDuration);
hgs
parents: 9
diff changeset
   148
    
hgs
parents: 9
diff changeset
   149
    connect(m_scrollHelper, SIGNAL(scrollFinished()), this, SLOT(stopScrolling()));
9
hgs
parents: 3
diff changeset
   150
    
hgs
parents: 3
diff changeset
   151
    m_gesturesEnabled = true;
3
hgs
parents:
diff changeset
   152
}
hgs
parents:
diff changeset
   153
hgs
parents:
diff changeset
   154
ScrollableWebContentView::~ScrollableWebContentView()
hgs
parents:
diff changeset
   155
{
hgs
parents:
diff changeset
   156
    delete m_viewportMetaData;
hgs
parents:
diff changeset
   157
    if(m_zoomAnimator) {
hgs
parents:
diff changeset
   158
        m_zoomAnimator->stop();
hgs
parents:
diff changeset
   159
        delete m_zoomAnimator;
hgs
parents:
diff changeset
   160
    }
16
hgs
parents: 9
diff changeset
   161
    
hgs
parents: 9
diff changeset
   162
    m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
   163
    delete m_touchDownTimer;
hgs
parents: 9
diff changeset
   164
    
hgs
parents: 9
diff changeset
   165
    m_hoverTimer->stop();
hgs
parents: 9
diff changeset
   166
    delete m_hoverTimer;
hgs
parents: 9
diff changeset
   167
3
hgs
parents:
diff changeset
   168
}
hgs
parents:
diff changeset
   169
16
hgs
parents: 9
diff changeset
   170
void ScrollableWebContentView::stepZoom(bool zoomIn)
3
hgs
parents:
diff changeset
   171
{
hgs
parents:
diff changeset
   172
    //If viewport metadata has user scalable false.
hgs
parents:
diff changeset
   173
    //Do not zoom.
hgs
parents:
diff changeset
   174
    if (!m_viewportMetaData->m_userScalable)
hgs
parents:
diff changeset
   175
        return;
hgs
parents:
diff changeset
   176
16
hgs
parents: 9
diff changeset
   177
    if (isZooming()) {
hgs
parents: 9
diff changeset
   178
        stopZoomAnimation();
hgs
parents: 9
diff changeset
   179
        return;
hgs
parents: 9
diff changeset
   180
    }
hgs
parents: 9
diff changeset
   181
    
3
hgs
parents:
diff changeset
   182
    qreal scale = 1;
hgs
parents:
diff changeset
   183
    scale += ZoomStep;
hgs
parents:
diff changeset
   184
hgs
parents:
diff changeset
   185
    if (!zoomIn)
hgs
parents:
diff changeset
   186
        scale = 1/scale;
hgs
parents:
diff changeset
   187
16
hgs
parents: 9
diff changeset
   188
    qreal curScale =  scrollWidget()->scale();
hgs
parents: 9
diff changeset
   189
    qreal destScale = curScale * scale;
3
hgs
parents:
diff changeset
   190
16
hgs
parents: 9
diff changeset
   191
    if (zoomIn && (destScale > m_viewportMetaData->m_maximumScale))
hgs
parents: 9
diff changeset
   192
        destScale = m_viewportMetaData->m_maximumScale;
hgs
parents: 9
diff changeset
   193
    else if (!zoomIn && (destScale < m_viewportMetaData->m_minimumScale))
hgs
parents: 9
diff changeset
   194
        destScale = m_viewportMetaData->m_minimumScale;
3
hgs
parents:
diff changeset
   195
16
hgs
parents: 9
diff changeset
   196
    if(destScale == curScale)
3
hgs
parents:
diff changeset
   197
        return;
hgs
parents:
diff changeset
   198
hgs
parents:
diff changeset
   199
    //Screen center
16
hgs
parents: 9
diff changeset
   200
    //QPointF zoomHotSpot(size().width()/2, size().height()/2); //center zoom looks ugly in some cases
hgs
parents: 9
diff changeset
   201
    QPointF zoomHotSpot(0, 0);
hgs
parents: 9
diff changeset
   202
    
hgs
parents: 9
diff changeset
   203
    startZoomAnimationToHotSpot(zoomHotSpot, destScale);
hgs
parents: 9
diff changeset
   204
}
hgs
parents: 9
diff changeset
   205
hgs
parents: 9
diff changeset
   206
hgs
parents: 9
diff changeset
   207
int ScrollableWebContentView::zoomAnimationTime(bool zoomIn, qreal targetScale)
hgs
parents: 9
diff changeset
   208
{
hgs
parents: 9
diff changeset
   209
    qreal curScale = zoomScale(); 
hgs
parents: 9
diff changeset
   210
    qreal scaleRatio = zoomIn ? (targetScale / curScale) :
hgs
parents: 9
diff changeset
   211
                            1.2 * (curScale / targetScale);
hgs
parents: 9
diff changeset
   212
    qreal fullScaleRatio = (m_viewportMetaData->m_maximumScale / m_viewportMetaData->m_minimumScale);
hgs
parents: 9
diff changeset
   213
    return MaxZoomAnimationDuration * scaleRatio / fullScaleRatio;
hgs
parents: 9
diff changeset
   214
}
hgs
parents: 9
diff changeset
   215
hgs
parents: 9
diff changeset
   216
void ScrollableWebContentView::toggleZoom(bool zoomIn)
hgs
parents: 9
diff changeset
   217
{
hgs
parents: 9
diff changeset
   218
    m_scrollHelper->stopScrollNoSignal();
hgs
parents: 9
diff changeset
   219
    if (isZooming()) {
hgs
parents: 9
diff changeset
   220
        stopZoomAnimation();
hgs
parents: 9
diff changeset
   221
        commitZoom();
hgs
parents: 9
diff changeset
   222
        return;
hgs
parents: 9
diff changeset
   223
    }
hgs
parents: 9
diff changeset
   224
    qreal scale = zoomIn ? m_viewportMetaData->m_maximumScale : m_viewportMetaData->m_minimumScale;
hgs
parents: 9
diff changeset
   225
    int t = zoomAnimationTime(zoomIn, scale);
hgs
parents: 9
diff changeset
   226
    QPointF zoomHotSpot(0, 0);
hgs
parents: 9
diff changeset
   227
    startZoomAnimationToHotSpot(zoomHotSpot, scale, t);
hgs
parents: 9
diff changeset
   228
}
hgs
parents: 9
diff changeset
   229
hgs
parents: 9
diff changeset
   230
QRectF ScrollableWebContentView::viewportRectInPageCoord(const QPointF& viewportHotSpot, 
hgs
parents: 9
diff changeset
   231
                                                         const qreal destScale)
hgs
parents: 9
diff changeset
   232
{
hgs
parents: 9
diff changeset
   233
    QSizeF vpSize = size();
hgs
parents: 9
diff changeset
   234
    QSizeF contentSize = webView()->size();
hgs
parents: 9
diff changeset
   235
    QSizeF scaleVpSize(vpSize.width() / destScale, vpSize.height() / destScale);
hgs
parents: 9
diff changeset
   236
    QPointF contentHotSpot = webView()->mapFromParent(viewportHotSpot);
hgs
parents: 9
diff changeset
   237
    QPointF scaledHotSpot = viewportHotSpot / destScale; 
hgs
parents: 9
diff changeset
   238
    QRectF destViewRect( contentHotSpot - scaledHotSpot, scaleVpSize);
hgs
parents: 9
diff changeset
   239
    return destViewRect;
3
hgs
parents:
diff changeset
   240
}
hgs
parents:
diff changeset
   241
16
hgs
parents: 9
diff changeset
   242
void ScrollableWebContentView::startZoomAnimationToHotSpot(const QPointF& viewportHotSpot, 
hgs
parents: 9
diff changeset
   243
                                                           const qreal destScale, int animTime)
3
hgs
parents:
diff changeset
   244
{
16
hgs
parents: 9
diff changeset
   245
    QRectF destViewRect = viewportRectInPageCoord(viewportHotSpot, destScale);
hgs
parents: 9
diff changeset
   246
    startZoomAnimation(destViewRect, animTime);
hgs
parents: 9
diff changeset
   247
}
3
hgs
parents:
diff changeset
   248
16
hgs
parents: 9
diff changeset
   249
void ScrollableWebContentView::zoomToHotSpot(const QPointF& viewportHotSpot, const qreal destScale)
hgs
parents: 9
diff changeset
   250
{
hgs
parents: 9
diff changeset
   251
    QRectF destViewRect = viewportRectInPageCoord(viewportHotSpot, destScale);
hgs
parents: 9
diff changeset
   252
    destViewRect = validateViewportRect(destViewRect);
hgs
parents: 9
diff changeset
   253
    setViewableRect(destViewRect);
3
hgs
parents:
diff changeset
   254
}
hgs
parents:
diff changeset
   255
16
hgs
parents: 9
diff changeset
   256
WebPageData ScrollableWebContentView::pageDataFromViewportInfo()
3
hgs
parents:
diff changeset
   257
{
16
hgs
parents: 9
diff changeset
   258
    if(!m_viewportMetaData->m_isValid) return WebPageData();
hgs
parents: 9
diff changeset
   259
hgs
parents: 9
diff changeset
   260
    // No viewport data saving or restoring for superpages
hgs
parents: 9
diff changeset
   261
    if(isSuperPage()) return WebPageData();
hgs
parents: 9
diff changeset
   262
hgs
parents: 9
diff changeset
   263
    // invalidate viewport meta data after saving to history
hgs
parents: 9
diff changeset
   264
    // cannot do it earlier because loadStarted event comes earlier than save to history
hgs
parents: 9
diff changeset
   265
    if(m_isLoading)
hgs
parents: 9
diff changeset
   266
        m_viewportMetaData->m_isValid = false;
hgs
parents: 9
diff changeset
   267
hgs
parents: 9
diff changeset
   268
    bool fitToScreen = qFuzzyCompare(m_viewportMetaData->m_width / webView()->size().width(), zoomScale());
hgs
parents: 9
diff changeset
   269
hgs
parents: 9
diff changeset
   270
    return WebPageData(m_viewportMetaData->m_maximumScale, m_viewportMetaData->m_minimumScale,
hgs
parents: 9
diff changeset
   271
                       m_viewportMetaData->m_userScalable, m_viewportMetaData->m_initialScale,
hgs
parents: 9
diff changeset
   272
                       geometry(), webView()->geometry(), scrollWidget()->scale(), size(),
hgs
parents: 9
diff changeset
   273
                       m_viewportMetaData->m_specifiedData.m_width, m_viewportMetaData->m_specifiedData.m_height,
hgs
parents: 9
diff changeset
   274
                       fitToScreen);
hgs
parents: 9
diff changeset
   275
}
hgs
parents: 9
diff changeset
   276
hgs
parents: 9
diff changeset
   277
QSizeF ScrollableWebContentView::parentSize() const
hgs
parents: 9
diff changeset
   278
{
hgs
parents: 9
diff changeset
   279
    return static_cast<QGraphicsWidget*>(parentItem())->size();
hgs
parents: 9
diff changeset
   280
}
hgs
parents: 9
diff changeset
   281
hgs
parents: 9
diff changeset
   282
void ScrollableWebContentView::setPageDataToViewportInfo(const WebPageData& data)
hgs
parents: 9
diff changeset
   283
{
hgs
parents: 9
diff changeset
   284
    if(!data.isValid()) return;
hgs
parents: 9
diff changeset
   285
hgs
parents: 9
diff changeset
   286
    // No viewport data saving or restoring for superpages
hgs
parents: 9
diff changeset
   287
    if(isSuperPage()) return;
hgs
parents: 9
diff changeset
   288
3
hgs
parents:
diff changeset
   289
    m_viewportMetaData->m_initialScale = data.initialScale;
hgs
parents:
diff changeset
   290
    m_viewportMetaData->m_minimumScale = data.minScale;
hgs
parents:
diff changeset
   291
    m_viewportMetaData->m_maximumScale = data.maxScale;
hgs
parents:
diff changeset
   292
    m_viewportMetaData->m_userScalable = data.userScalable;
16
hgs
parents: 9
diff changeset
   293
    m_viewportMetaData->m_specifiedData.m_width = data.specifiedWidth;
hgs
parents: 9
diff changeset
   294
    m_viewportMetaData->m_specifiedData.m_height = data.specifiedHeight;
3
hgs
parents:
diff changeset
   295
    m_viewportMetaData->m_isValid = true;
16
hgs
parents: 9
diff changeset
   296
    m_viewportMetaData->m_width = data.viewportSize.width();
hgs
parents: 9
diff changeset
   297
    m_viewportMetaData->m_height = data.viewportSize.height();
3
hgs
parents:
diff changeset
   298
16
hgs
parents: 9
diff changeset
   299
hgs
parents: 9
diff changeset
   300
    if(m_viewportMetaData->m_width < 0 ||
hgs
parents: 9
diff changeset
   301
       m_viewportMetaData->m_width < 0) {
hgs
parents: 9
diff changeset
   302
        m_viewportMetaData->m_isValid = false;
hgs
parents: 9
diff changeset
   303
        reset();
hgs
parents: 9
diff changeset
   304
        return;
hgs
parents: 9
diff changeset
   305
    }
hgs
parents: 9
diff changeset
   306
hgs
parents: 9
diff changeset
   307
    QSizeF newSize = parentSize();
hgs
parents: 9
diff changeset
   308
    if(newSize.isEmpty())
hgs
parents: 9
diff changeset
   309
        newSize = data.viewportSize;
hgs
parents: 9
diff changeset
   310
hgs
parents: 9
diff changeset
   311
    disableContentUpdates();
hgs
parents: 9
diff changeset
   312
    //    updateViewportMetaDataFromPageTag();
hgs
parents: 9
diff changeset
   313
hgs
parents: 9
diff changeset
   314
hgs
parents: 9
diff changeset
   315
    QSizeF vpSz(m_viewportMetaData->m_width, m_viewportMetaData->m_height);
hgs
parents: 9
diff changeset
   316
    if(vpSz.isEmpty())
hgs
parents: 9
diff changeset
   317
        vpSz = newSize;
hgs
parents: 9
diff changeset
   318
hgs
parents: 9
diff changeset
   319
    // sometimes on load from history webpage doesn't resize webView
hgs
parents: 9
diff changeset
   320
    // set correct size of webView here
hgs
parents: 9
diff changeset
   321
    webView()->setGeometry(QRectF( QPointF(0, 0),
hgs
parents: 9
diff changeset
   322
                                   QSizeF(webView()->page()->mainFrame()->contentsSize())));
hgs
parents: 9
diff changeset
   323
hgs
parents: 9
diff changeset
   324
    qreal sc = data.scale; //qBound(m_viewportMetaData->m_minimumScale,data.scale,m_viewportMetaData->m_maximumScale);
hgs
parents: 9
diff changeset
   325
    webView()->setScale(sc);
3
hgs
parents:
diff changeset
   326
16
hgs
parents: 9
diff changeset
   327
//    qreal fitToScreenScale = data.viewportSize.width() / webView()->size().width();
hgs
parents: 9
diff changeset
   328
//    bool isFitToScreen = qFuzzyCompare(zoomScale(), fitToScreenScale);
hgs
parents: 9
diff changeset
   329
    adjustViewportSize(data.viewportSize, newSize);
hgs
parents: 9
diff changeset
   330
    m_viewportMetaData->adjustZoomValues(webView()->size());
hgs
parents: 9
diff changeset
   331
    if(data.fitToScreen && newSize.width() != vpSz.width()) {
hgs
parents: 9
diff changeset
   332
        qreal fitToScreenScale = size().width() / webView()->size().width();
hgs
parents: 9
diff changeset
   333
        fitToScreenScale = qBound(m_viewportMetaData->m_minimumScale,
hgs
parents: 9
diff changeset
   334
                                  fitToScreenScale,m_viewportMetaData->m_minimumScale);
hgs
parents: 9
diff changeset
   335
        webView()->setScale(fitToScreenScale);
hgs
parents: 9
diff changeset
   336
    }
hgs
parents: 9
diff changeset
   337
//    else
hgs
parents: 9
diff changeset
   338
//       updatePreferredContentSize();
hgs
parents: 9
diff changeset
   339
hgs
parents: 9
diff changeset
   340
    if (newSize.width() != m_viewportMetaData->m_width ||
hgs
parents: 9
diff changeset
   341
        newSize.height() != m_viewportMetaData->m_height) {
hgs
parents: 9
diff changeset
   342
        //setGeometry(0, 0, m_viewportMetaData->m_width, m_viewportMetaData->m_height);
hgs
parents: 9
diff changeset
   343
        m_scrollHelper->setViewportSize(size());
hgs
parents: 9
diff changeset
   344
    }
hgs
parents: 9
diff changeset
   345
3
hgs
parents:
diff changeset
   346
16
hgs
parents: 9
diff changeset
   347
    if (data.webViewRect.isValid()) {
hgs
parents: 9
diff changeset
   348
        QPointF webViewPos = data.webViewRect.topLeft();
hgs
parents: 9
diff changeset
   349
        qreal newSc = webView()->scale(); // might be adjust by fitToScreen
hgs
parents: 9
diff changeset
   350
        webViewPos = webViewPos / sc * newSc; // recalc pos if scale changed by fitToScreen
hgs
parents: 9
diff changeset
   351
        QSizeF ss = webView()->size() * newSc;
hgs
parents: 9
diff changeset
   352
        if(!ss.isEmpty()) {
hgs
parents: 9
diff changeset
   353
            webViewPos.setX(qBound((qreal)m_viewportMetaData->m_width - (qreal)ss.width(), (qreal)webViewPos.x(), (qreal)0.0));
hgs
parents: 9
diff changeset
   354
            webViewPos.setY(qBound((qreal)m_viewportMetaData->m_height - (qreal)ss.height(), (qreal)webViewPos.y(), (qreal)0.0));
hgs
parents: 9
diff changeset
   355
            if(ss.width() < m_viewportMetaData->m_width) webViewPos.setX(0);
hgs
parents: 9
diff changeset
   356
            if(ss.height() < m_viewportMetaData->m_height) webViewPos.setY(0);
hgs
parents: 9
diff changeset
   357
        }
hgs
parents: 9
diff changeset
   358
        setScrollWidgetPos(webViewPos);
hgs
parents: 9
diff changeset
   359
    }
hgs
parents: 9
diff changeset
   360
    enableContentUpdates();
hgs
parents: 9
diff changeset
   361
//    updatePreferredContentSize();
hgs
parents: 9
diff changeset
   362
    
hgs
parents: 9
diff changeset
   363
hgs
parents: 9
diff changeset
   364
    // emit scrolled event to hide/show url bar
hgs
parents: 9
diff changeset
   365
hgs
parents: 9
diff changeset
   366
    QPoint p(0, 0);
hgs
parents: 9
diff changeset
   367
    if(!m_isLoading) {
hgs
parents: 9
diff changeset
   368
        p = scrollPosition();
hgs
parents: 9
diff changeset
   369
    }
hgs
parents: 9
diff changeset
   370
    QPoint d(0, 0);
hgs
parents: 9
diff changeset
   371
    emit viewScrolled(p, d);
hgs
parents: 9
diff changeset
   372
3
hgs
parents:
diff changeset
   373
}
hgs
parents:
diff changeset
   374
16
hgs
parents: 9
diff changeset
   375
WebPageData ScrollableWebContentView::defaultZoomData()
3
hgs
parents:
diff changeset
   376
{
16
hgs
parents: 9
diff changeset
   377
    WebPageData data;
3
hgs
parents:
diff changeset
   378
16
hgs
parents: 9
diff changeset
   379
    data.magic = 0;
3
hgs
parents:
diff changeset
   380
    data.initialScale = m_viewportMetaData->m_initialScale;
hgs
parents:
diff changeset
   381
    data.minScale = m_viewportMetaData->m_minimumScale;
hgs
parents:
diff changeset
   382
    data.maxScale = m_viewportMetaData->m_maximumScale;
hgs
parents:
diff changeset
   383
    data.userScalable = m_viewportMetaData->m_userScalable;
hgs
parents:
diff changeset
   384
hgs
parents:
diff changeset
   385
    data.scale = 1.0;
16
hgs
parents: 9
diff changeset
   386
    data.rect = rect();
hgs
parents: 9
diff changeset
   387
    data.webViewRect = webView()->rect();
hgs
parents: 9
diff changeset
   388
    data.viewportSize = QSizeF(m_viewportMetaData->m_width, m_viewportMetaData->m_height);
3
hgs
parents:
diff changeset
   389
hgs
parents:
diff changeset
   390
    return data;
hgs
parents:
diff changeset
   391
}
hgs
parents:
diff changeset
   392
hgs
parents:
diff changeset
   393
void ScrollableWebContentView::updatePreferredContentSize()
hgs
parents:
diff changeset
   394
{
16
hgs
parents: 9
diff changeset
   395
#ifdef VIEWPORT_ALWAYS_ALLOW_ZOOMING
hgs
parents: 9
diff changeset
   396
    // Don't call updatePreferredContentSize() if we've over-ridden user-scalable because it
hgs
parents: 9
diff changeset
   397
    // resets the content size and zoom factor.
hgs
parents: 9
diff changeset
   398
    if(m_viewportMetaData->m_userScalableOverRidden)
hgs
parents: 9
diff changeset
   399
        return;
hgs
parents: 9
diff changeset
   400
#endif
hgs
parents: 9
diff changeset
   401
    QSize s = m_viewportMetaData->getSpecifiedSize();
hgs
parents: 9
diff changeset
   402
/*    if (!isSuperPage()) {
hgs
parents: 9
diff changeset
   403
        prefferedHeight = qMax(m_viewportMetaData->m_width, m_viewportMetaData->m_height);
hgs
parents: 9
diff changeset
   404
        prefferedWidth = m_viewportMetaData->m_width;        
hgs
parents: 9
diff changeset
   405
        if(m_viewportMetaData->m_width * 1.5 < prefferedHeight) {
hgs
parents: 9
diff changeset
   406
            // If the screen sides ratio is less than 3:2, than vertical width is
hgs
parents: 9
diff changeset
   407
            // too narrow for normal page layout, but setting preffered width to the biggest side
hgs
parents: 9
diff changeset
   408
            // makes page too scaled. Because of this set the page to the average of 2 viewport sides.
hgs
parents: 9
diff changeset
   409
            prefferedWidth = (m_viewportMetaData->m_width + prefferedHeight) / 2;
hgs
parents: 9
diff changeset
   410
        }
hgs
parents: 9
diff changeset
   411
    }
hgs
parents: 9
diff changeset
   412
hgs
parents: 9
diff changeset
   413
//    if(m_viewportMetaData->m_specifiedData.)
hgs
parents: 9
diff changeset
   414
*/
hgs
parents: 9
diff changeset
   415
    webView()->page()->setPreferredContentsSize(s);
hgs
parents: 9
diff changeset
   416
}
hgs
parents: 9
diff changeset
   417
                                                                                                                                                                                                                                                                
hgs
parents: 9
diff changeset
   418
void ScrollableWebContentView::setPage(QWebPage* page)
hgs
parents: 9
diff changeset
   419
{
hgs
parents: 9
diff changeset
   420
    m_isSuperPage = false;
hgs
parents: 9
diff changeset
   421
    m_gesturesEnabled = true;
hgs
parents: 9
diff changeset
   422
    webView()->setPage(page);
3
hgs
parents:
diff changeset
   423
}
hgs
parents:
diff changeset
   424
hgs
parents:
diff changeset
   425
void ScrollableWebContentView::setSuperPage()
hgs
parents:
diff changeset
   426
{
16
hgs
parents: 9
diff changeset
   427
    m_isSuperPage = true;
3
hgs
parents:
diff changeset
   428
    m_viewportMetaData->m_initialScale = 1.;
hgs
parents:
diff changeset
   429
    m_viewportMetaData->m_minimumScale = 1.;
hgs
parents:
diff changeset
   430
    m_viewportMetaData->m_maximumScale = 1.;
hgs
parents:
diff changeset
   431
    m_viewportMetaData->m_specifiedData.m_width = "device-width";
hgs
parents:
diff changeset
   432
    m_viewportMetaData->m_specifiedData.m_height = "device-height";
hgs
parents:
diff changeset
   433
    m_viewportMetaData->m_userScalable = false;
hgs
parents:
diff changeset
   434
16
hgs
parents: 9
diff changeset
   435
    disableContentUpdates();
hgs
parents: 9
diff changeset
   436
    webView()->setScale(1.);
hgs
parents: 9
diff changeset
   437
    //QSize contentSize = (webView()->size() * zoomScale()).toSize();
hgs
parents: 9
diff changeset
   438
    //QRect webViewRect(0, 0, size().width(), contentSize.height());
hgs
parents: 9
diff changeset
   439
    //webView()->setGeometry(webViewRect);
hgs
parents: 9
diff changeset
   440
    setScrollWidgetPos(QPointF(0, 0));
3
hgs
parents:
diff changeset
   441
hgs
parents:
diff changeset
   442
    m_viewportMetaData->m_width = size().width();
hgs
parents:
diff changeset
   443
    m_viewportMetaData->m_height = size().height();
hgs
parents:
diff changeset
   444
    m_viewportMetaData->m_isValid = true;
16
hgs
parents: 9
diff changeset
   445
    enableContentUpdates();
hgs
parents: 9
diff changeset
   446
#ifdef VIEWPORT_ALWAYS_ALLOW_ZOOMING
hgs
parents: 9
diff changeset
   447
    updatePreferredContentSize();
hgs
parents: 9
diff changeset
   448
    //viewportWidget()->updatePreferredContentSize(QSize(m_viewportMetaData->m_width
hgs
parents: 9
diff changeset
   449
     //                                                  , m_viewportMetaData->m_height));
hgs
parents: 9
diff changeset
   450
#else
hgs
parents: 9
diff changeset
   451
    updatePreferredContentSize();
hgs
parents: 9
diff changeset
   452
#endif
hgs
parents: 9
diff changeset
   453
}
3
hgs
parents:
diff changeset
   454
16
hgs
parents: 9
diff changeset
   455
void ScrollableWebContentView::updateViewportMetaDataFromPageTag()
hgs
parents: 9
diff changeset
   456
{
hgs
parents: 9
diff changeset
   457
    QWebPage* page = webView()->page();
hgs
parents: 9
diff changeset
   458
    if (!page)
hgs
parents: 9
diff changeset
   459
        return;
hgs
parents: 9
diff changeset
   460
hgs
parents: 9
diff changeset
   461
    QWebFrame* frame = page->mainFrame();
hgs
parents: 9
diff changeset
   462
    QMap<QString, QString> metaData = frame->metaData();
hgs
parents: 9
diff changeset
   463
    QString viewportTag = metaData.value("viewport");
hgs
parents: 9
diff changeset
   464
hgs
parents: 9
diff changeset
   465
    QRect clientRect = geometry().toAlignedRect();
hgs
parents: 9
diff changeset
   466
    ViewportMetaDataParser parser(clientRect);
hgs
parents: 9
diff changeset
   467
    parser.parse(viewportTag, *m_viewportMetaData);
hgs
parents: 9
diff changeset
   468
hgs
parents: 9
diff changeset
   469
    m_viewportMetaData->adjustZoomValues(webView()->size());
3
hgs
parents:
diff changeset
   470
}
hgs
parents:
diff changeset
   471
hgs
parents:
diff changeset
   472
void ScrollableWebContentView::reset()
hgs
parents:
diff changeset
   473
{
hgs
parents:
diff changeset
   474
    // TODO: INVESTIGATE: In the case of multiple windows loading pages simultaneously, it is possible
hgs
parents:
diff changeset
   475
    // to be calling this slot on a signal from a frame that is not
hgs
parents:
diff changeset
   476
    // the frame of the page saved here. It might be better to use 'sender' instead of
hgs
parents:
diff changeset
   477
    // page->mainFrame() to get the metaData so that we use the meta data of the corresponding
hgs
parents:
diff changeset
   478
    // frame
hgs
parents:
diff changeset
   479
16
hgs
parents: 9
diff changeset
   480
    QWebPage* page = webView()->page();
3
hgs
parents:
diff changeset
   481
    if (!page)
hgs
parents:
diff changeset
   482
        return;
16
hgs
parents: 9
diff changeset
   483
//    if(m_viewportMetaData->m_isValid) return;
3
hgs
parents:
diff changeset
   484
hgs
parents:
diff changeset
   485
    //Initialize viewport metadata
hgs
parents:
diff changeset
   486
    m_viewportMetaData->reset();
hgs
parents:
diff changeset
   487
16
hgs
parents: 9
diff changeset
   488
    disableContentUpdates();
hgs
parents: 9
diff changeset
   489
hgs
parents: 9
diff changeset
   490
    webView()->setScale(1);
hgs
parents: 9
diff changeset
   491
hgs
parents: 9
diff changeset
   492
    // sometimes on load from history webpage doesn't resize webView
hgs
parents: 9
diff changeset
   493
    // set correct size of webView here
hgs
parents: 9
diff changeset
   494
    webView()->setGeometry(QRectF( QPointF(0, 0),
hgs
parents: 9
diff changeset
   495
                                   QSizeF(webView()->page()->mainFrame()->contentsSize())));
hgs
parents: 9
diff changeset
   496
hgs
parents: 9
diff changeset
   497
    updateViewportMetaDataFromPageTag();
hgs
parents: 9
diff changeset
   498
hgs
parents: 9
diff changeset
   499
    //setViewportWidgetGeometry(QRectF(QPointF(),
hgs
parents: 9
diff changeset
   500
    //                                 QSize(m_viewportMetaData->m_width, m_viewportMetaData->m_height)));
3
hgs
parents:
diff changeset
   501
16
hgs
parents: 9
diff changeset
   502
    static const QPoint nullP(0,0);
hgs
parents: 9
diff changeset
   503
    setScrollPosition(nullP,nullP);
hgs
parents: 9
diff changeset
   504
hgs
parents: 9
diff changeset
   505
    QSizeF sz(m_viewportMetaData->m_width, m_viewportMetaData->m_height);
hgs
parents: 9
diff changeset
   506
    adjustViewportSize(sz, size());
3
hgs
parents:
diff changeset
   507
16
hgs
parents: 9
diff changeset
   508
    qreal initScale = m_viewportMetaData->m_initialScale > 0 ? m_viewportMetaData->m_initialScale :
hgs
parents: 9
diff changeset
   509
                      m_viewportMetaData->m_width / webView()->size().width();
hgs
parents: 9
diff changeset
   510
    // m_viewportMetaData->m_initialScale = m_viewportMetaData->m_width / webView()->size().width();
hgs
parents: 9
diff changeset
   511
    webView()->setScale(initScale);
hgs
parents: 9
diff changeset
   512
hgs
parents: 9
diff changeset
   513
    enableContentUpdates();
hgs
parents: 9
diff changeset
   514
hgs
parents: 9
diff changeset
   515
    m_scrollHelper->setViewportSize(size());
hgs
parents: 9
diff changeset
   516
hgs
parents: 9
diff changeset
   517
    // Update corrected viewport data back to webpage metadata
hgs
parents: 9
diff changeset
   518
    emit viewPortChanged();
3
hgs
parents:
diff changeset
   519
}
hgs
parents:
diff changeset
   520
hgs
parents:
diff changeset
   521
void ScrollableWebContentView::contentsSizeChanged(const QSize& newContentSize)
hgs
parents:
diff changeset
   522
{
16
hgs
parents: 9
diff changeset
   523
    m_viewportMetaData->adjustZoomValues(newContentSize);
hgs
parents: 9
diff changeset
   524
    qreal sc = zoomScale();
hgs
parents: 9
diff changeset
   525
    sc = qBound(m_viewportMetaData->m_minimumScale, sc, m_viewportMetaData->m_maximumScale);
hgs
parents: 9
diff changeset
   526
    if(!qFuzzyCompare(sc, zoomScale()))
hgs
parents: 9
diff changeset
   527
        webView()->setScale(sc);
hgs
parents: 9
diff changeset
   528
    emit viewPortChanged();
hgs
parents: 9
diff changeset
   529
}
hgs
parents: 9
diff changeset
   530
hgs
parents: 9
diff changeset
   531
void ScrollableWebContentView::pageLoadStarted()
hgs
parents: 9
diff changeset
   532
{
hgs
parents: 9
diff changeset
   533
    m_isLoading = true;
hgs
parents: 9
diff changeset
   534
//    m_viewportMetaData->m_isValid = false;
hgs
parents: 9
diff changeset
   535
}
hgs
parents: 9
diff changeset
   536
hgs
parents: 9
diff changeset
   537
void ScrollableWebContentView::pageLoadProgress(int progress)
hgs
parents: 9
diff changeset
   538
{
3
hgs
parents:
diff changeset
   539
}
hgs
parents:
diff changeset
   540
hgs
parents:
diff changeset
   541
void ScrollableWebContentView::pageLoadFinished(bool ok)
hgs
parents:
diff changeset
   542
{
hgs
parents:
diff changeset
   543
    Q_UNUSED(ok);
16
hgs
parents: 9
diff changeset
   544
    m_isLoading = false;
hgs
parents: 9
diff changeset
   545
    if(!m_viewportMetaData->m_isValid)
hgs
parents: 9
diff changeset
   546
        m_viewportMetadataResetTimer.singleShot(0,this,SLOT(reset()));
hgs
parents: 9
diff changeset
   547
    else {
hgs
parents: 9
diff changeset
   548
        QSize contentSize = scrollWidget()->size().toSize();
hgs
parents: 9
diff changeset
   549
        m_viewportMetaData->adjustZoomValues(contentSize);
hgs
parents: 9
diff changeset
   550
    }
hgs
parents: 9
diff changeset
   551
hgs
parents: 9
diff changeset
   552
    // report scroll position to hide url bar if necessary
hgs
parents: 9
diff changeset
   553
    QPoint p = scrollPosition();
hgs
parents: 9
diff changeset
   554
    QPoint d(0, 0);
hgs
parents: 9
diff changeset
   555
    emit viewScrolled(p, d);
hgs
parents: 9
diff changeset
   556
    
hgs
parents: 9
diff changeset
   557
    webView()->update(); // invalidate the view to force tiles update
hgs
parents: 9
diff changeset
   558
}
hgs
parents: 9
diff changeset
   559
hgs
parents: 9
diff changeset
   560
hgs
parents: 9
diff changeset
   561
void ScrollableWebContentView::zoomAtPoint(QPointF touchPoint)
hgs
parents: 9
diff changeset
   562
{
hgs
parents: 9
diff changeset
   563
    QRectF target;
hgs
parents: 9
diff changeset
   564
hgs
parents: 9
diff changeset
   565
    //Get the focusable element rect from current touch position
hgs
parents: 9
diff changeset
   566
    if(isZoomedIn()) {
hgs
parents: 9
diff changeset
   567
        startZoomAnimationToHotSpot(touchPoint,size().width() / webView()->size().width());
hgs
parents: 9
diff changeset
   568
        return;
hgs
parents: 9
diff changeset
   569
    }
hgs
parents: 9
diff changeset
   570
hgs
parents: 9
diff changeset
   571
    //Pass all events to recognizer
hgs
parents: 9
diff changeset
   572
    QRectF zoomRect = findZoomableRectForPoint(touchPoint);
hgs
parents: 9
diff changeset
   573
hgs
parents: 9
diff changeset
   574
    if (!zoomRect.isValid()) {
hgs
parents: 9
diff changeset
   575
        //FIX ME: Add an event ignore animation
hgs
parents: 9
diff changeset
   576
        return;
hgs
parents: 9
diff changeset
   577
    }
hgs
parents: 9
diff changeset
   578
hgs
parents: 9
diff changeset
   579
    startZoomAnimation(zoomRect);
hgs
parents: 9
diff changeset
   580
}
hgs
parents: 9
diff changeset
   581
hgs
parents: 9
diff changeset
   582
hgs
parents: 9
diff changeset
   583
void ScrollableWebContentView::setViewportWidgetGeometry(const QRectF& r)
hgs
parents: 9
diff changeset
   584
{
hgs
parents: 9
diff changeset
   585
    if(r != geometry()) {
hgs
parents: 9
diff changeset
   586
        setGeometry(r);
hgs
parents: 9
diff changeset
   587
        emit viewPortChanged();
hgs
parents: 9
diff changeset
   588
    }
hgs
parents: 9
diff changeset
   589
}
hgs
parents: 9
diff changeset
   590
hgs
parents: 9
diff changeset
   591
hgs
parents: 9
diff changeset
   592
bool ScrollableWebContentView::isZoomedIn() const
hgs
parents: 9
diff changeset
   593
{
hgs
parents: 9
diff changeset
   594
    qreal vpWidth = size().width();
hgs
parents: 9
diff changeset
   595
    qreal scaledContentWidth = scrollWidget()->size().width() * zoomScale(); 
hgs
parents: 9
diff changeset
   596
    qreal diff = scaledContentWidth - vpWidth; 
hgs
parents: 9
diff changeset
   597
    return  diff > 0.01f;
hgs
parents: 9
diff changeset
   598
}
hgs
parents: 9
diff changeset
   599
hgs
parents: 9
diff changeset
   600
void ScrollableWebContentView::stateChanged(KineticScrollable::State oldState,
hgs
parents: 9
diff changeset
   601
                                            KineticScrollable::State newState)
hgs
parents: 9
diff changeset
   602
{
hgs
parents: 9
diff changeset
   603
    ScrollableViewBase::stateChanged(oldState, newState);
hgs
parents: 9
diff changeset
   604
hgs
parents: 9
diff changeset
   605
    switch(newState) {
hgs
parents: 9
diff changeset
   606
        case KineticScrollable::Pushing :
hgs
parents: 9
diff changeset
   607
        case KineticScrollable::AutoScrolling :
hgs
parents: 9
diff changeset
   608
            m_tileUpdateEnableTimer.stop();
hgs
parents: 9
diff changeset
   609
            //disableContentUpdates();
hgs
parents: 9
diff changeset
   610
        break;
hgs
parents: 9
diff changeset
   611
        case KineticScrollable::Inactive :
hgs
parents: 9
diff changeset
   612
            m_tileUpdateEnableTimer.start(TileUpdateEnableDelay);
hgs
parents: 9
diff changeset
   613
        break;
hgs
parents: 9
diff changeset
   614
    }
hgs
parents: 9
diff changeset
   615
}
hgs
parents: 9
diff changeset
   616
hgs
parents: 9
diff changeset
   617
QRectF ScrollableWebContentView::validateViewportRect(const QRectF& rect)
hgs
parents: 9
diff changeset
   618
{
hgs
parents: 9
diff changeset
   619
    QRectF ret(rect);
hgs
parents: 9
diff changeset
   620
hgs
parents: 9
diff changeset
   621
    if(ret.right() > webView()->size().width())
hgs
parents: 9
diff changeset
   622
        ret.moveLeft(webView()->size().width() - ret.width());
hgs
parents: 9
diff changeset
   623
    if(ret.bottom() > webView()->size().height())
hgs
parents: 9
diff changeset
   624
        ret.moveTop(webView()->size().height() - ret.height());
hgs
parents: 9
diff changeset
   625
    if(ret.x() < 0) ret.moveLeft(0);
hgs
parents: 9
diff changeset
   626
    if(ret.y() < 0) ret.moveTop(0);
hgs
parents: 9
diff changeset
   627
//    if(ret.width() > webView()->size().width()) ret.setWidth(webView()->size().width());
hgs
parents: 9
diff changeset
   628
    if(ret.width() > webView()->size().width())
hgs
parents: 9
diff changeset
   629
        ret.moveLeft(0); // do not center! ret.moveLeft(webView()->size().width() / 2 - ret.width() / 2);
hgs
parents: 9
diff changeset
   630
    if(ret.height() > webView()->size().height())
hgs
parents: 9
diff changeset
   631
        ret.moveTop(0); // do not center! ret.moveTop(webView()->size().height() / 2 - ret.height() / 2);
hgs
parents: 9
diff changeset
   632
hgs
parents: 9
diff changeset
   633
    return ret;
hgs
parents: 9
diff changeset
   634
}
hgs
parents: 9
diff changeset
   635
hgs
parents: 9
diff changeset
   636
QRectF ScrollableWebContentView::viewableRect()
hgs
parents: 9
diff changeset
   637
{
hgs
parents: 9
diff changeset
   638
    return webView()->mapRectFromParent(geometry());
hgs
parents: 9
diff changeset
   639
}
hgs
parents: 9
diff changeset
   640
hgs
parents: 9
diff changeset
   641
void ScrollableWebContentView::setViewableRect(const QRectF& rect)
hgs
parents: 9
diff changeset
   642
{
hgs
parents: 9
diff changeset
   643
    qreal scale = size().width() / rect.width(); 
hgs
parents: 9
diff changeset
   644
    qstmDebug() << "setViewableRect: rect: " << rect << ", scale: " << scale << "\n";
hgs
parents: 9
diff changeset
   645
    setZoomScale(scale, false);
hgs
parents: 9
diff changeset
   646
    m_isScrolling = true;
hgs
parents: 9
diff changeset
   647
    scrollPageTo(rect.topLeft());
hgs
parents: 9
diff changeset
   648
    m_isScrolling = false;
hgs
parents: 9
diff changeset
   649
}
hgs
parents: 9
diff changeset
   650
hgs
parents: 9
diff changeset
   651
void ScrollableWebContentView::startZoomAnimation(const QRectF& destViewRect, int animTime)
hgs
parents: 9
diff changeset
   652
{
hgs
parents: 9
diff changeset
   653
    if (webView()->geometry().isValid()) {
hgs
parents: 9
diff changeset
   654
        m_zoomAnimator->setDuration(animTime);
hgs
parents: 9
diff changeset
   655
        m_zoomAnimator->setStartValue(webView()->mapRectFromParent(geometry()));
hgs
parents: 9
diff changeset
   656
        m_animationEndRect = validateViewportRect(destViewRect);
hgs
parents: 9
diff changeset
   657
        m_zoomAnimator->setEndValue(m_animationEndRect);
hgs
parents: 9
diff changeset
   658
        m_zoomAnimator->start();
hgs
parents: 9
diff changeset
   659
    }
hgs
parents: 9
diff changeset
   660
}
hgs
parents: 9
diff changeset
   661
hgs
parents: 9
diff changeset
   662
void ScrollableWebContentView::stopZoomAnimation()
hgs
parents: 9
diff changeset
   663
{
hgs
parents: 9
diff changeset
   664
    m_zoomAnimator->stop();
hgs
parents: 9
diff changeset
   665
}
hgs
parents: 9
diff changeset
   666
hgs
parents: 9
diff changeset
   667
void ScrollableWebContentView::zoomAnimationStateChanged(QAbstractAnimation::State newState,QAbstractAnimation::State)
hgs
parents: 9
diff changeset
   668
{
hgs
parents: 9
diff changeset
   669
    switch (newState) {
hgs
parents: 9
diff changeset
   670
    case QAbstractAnimation::Stopped:
hgs
parents: 9
diff changeset
   671
        commitZoom();
hgs
parents: 9
diff changeset
   672
        break;
hgs
parents: 9
diff changeset
   673
    case QAbstractAnimation::Running:
hgs
parents: 9
diff changeset
   674
        disableContentUpdates();
hgs
parents: 9
diff changeset
   675
        break;
hgs
parents: 9
diff changeset
   676
    default:
hgs
parents: 9
diff changeset
   677
        break;
hgs
parents: 9
diff changeset
   678
    }
hgs
parents: 9
diff changeset
   679
}
hgs
parents: 9
diff changeset
   680
hgs
parents: 9
diff changeset
   681
void ScrollableWebContentView::resizeEvent(QGraphicsSceneResizeEvent* event)
hgs
parents: 9
diff changeset
   682
{
hgs
parents: 9
diff changeset
   683
    //Ignore resize when chrome is being still setup
hgs
parents: 9
diff changeset
   684
    if (event->oldSize().width()) {
hgs
parents: 9
diff changeset
   685
hgs
parents: 9
diff changeset
   686
        qreal fitToScreenScale = event->oldSize().width() / webView()->size().width();
hgs
parents: 9
diff changeset
   687
        bool isFitToScreen = qFuzzyCompare(zoomScale(), fitToScreenScale);
hgs
parents: 9
diff changeset
   688
        QGraphicsWidget::resizeEvent(event);
hgs
parents: 9
diff changeset
   689
        adjustViewportSize(event->oldSize(), event->newSize());
hgs
parents: 9
diff changeset
   690
        if (isFitToScreen && !isSuperPage()) {
hgs
parents: 9
diff changeset
   691
            QPointF docViewTopLeft(webView()->mapFromParent(QPointF(0,0)));
hgs
parents: 9
diff changeset
   692
            fitToScreenScale = size().width() / webView()->size().width();
hgs
parents: 9
diff changeset
   693
            zoomToHotSpot(docViewTopLeft, fitToScreenScale);
hgs
parents: 9
diff changeset
   694
            m_zoomCommitTimer.start(ZoomCommitDuration);
hgs
parents: 9
diff changeset
   695
        } else {
hgs
parents: 9
diff changeset
   696
            QRectF viewRect = mapRectToItem(webView(), QRectF(QPointF(0,0), size()));
hgs
parents: 9
diff changeset
   697
            QRectF validRect = validateViewportRect(viewRect);
hgs
parents: 9
diff changeset
   698
            if(validRect != viewRect)
hgs
parents: 9
diff changeset
   699
                setViewableRect(validRect);
hgs
parents: 9
diff changeset
   700
        }
hgs
parents: 9
diff changeset
   701
        m_scrollHelper->setViewportSize(size());
hgs
parents: 9
diff changeset
   702
    }
hgs
parents: 9
diff changeset
   703
hgs
parents: 9
diff changeset
   704
#ifdef OWN_BACKING_STORE
hgs
parents: 9
diff changeset
   705
    webView()->viewportUpdated();
hgs
parents: 9
diff changeset
   706
#endif // OWN_BACKING_STORE
hgs
parents: 9
diff changeset
   707
}
hgs
parents: 9
diff changeset
   708
hgs
parents: 9
diff changeset
   709
bool  ScrollableWebContentView::isChangedToPortrait(QSizeF oldSize, QSizeF newSize)
hgs
parents: 9
diff changeset
   710
{
hgs
parents: 9
diff changeset
   711
    return (oldSize.width() > oldSize.height()) && 
hgs
parents: 9
diff changeset
   712
           (newSize.width() < newSize.height());
hgs
parents: 9
diff changeset
   713
}
hgs
parents: 9
diff changeset
   714
hgs
parents: 9
diff changeset
   715
bool  ScrollableWebContentView::isChangedToLandscape(QSizeF oldSize, QSizeF newSize)
hgs
parents: 9
diff changeset
   716
{
hgs
parents: 9
diff changeset
   717
    return (oldSize.width() < oldSize.height()) && 
hgs
parents: 9
diff changeset
   718
           (newSize.width() > newSize.height());
hgs
parents: 9
diff changeset
   719
    emit mouseEvent(QEvent::GraphicsSceneMouseRelease);
hgs
parents: 9
diff changeset
   720
}
hgs
parents: 9
diff changeset
   721
hgs
parents: 9
diff changeset
   722
bool ScrollableWebContentView::isOrientationChanged(QSizeF oldSize, QSizeF newSize)
hgs
parents: 9
diff changeset
   723
{
hgs
parents: 9
diff changeset
   724
    return isChangedToPortrait(oldSize, newSize) || 
hgs
parents: 9
diff changeset
   725
           isChangedToLandscape(oldSize, newSize);
hgs
parents: 9
diff changeset
   726
}
hgs
parents: 9
diff changeset
   727
hgs
parents: 9
diff changeset
   728
hgs
parents: 9
diff changeset
   729
void ScrollableWebContentView::adjustViewportSize(QSizeF oldSize, QSizeF newSize)
hgs
parents: 9
diff changeset
   730
{
hgs
parents: 9
diff changeset
   731
    if(newSize.isNull()) return;
hgs
parents: 9
diff changeset
   732
hgs
parents: 9
diff changeset
   733
    if (isOrientationChanged(oldSize, newSize)) {
hgs
parents: 9
diff changeset
   734
        m_viewportMetaData->orientationChanged(oldSize);
hgs
parents: 9
diff changeset
   735
    }
hgs
parents: 9
diff changeset
   736
    m_viewportMetaData->adjustViewportData(newSize);
hgs
parents: 9
diff changeset
   737
    updatePreferredContentSize();
hgs
parents: 9
diff changeset
   738
    return;    
hgs
parents: 9
diff changeset
   739
}
hgs
parents: 9
diff changeset
   740
hgs
parents: 9
diff changeset
   741
void ScrollableWebContentView::sendEventToWebKit(QEvent::Type type, const QPointF& scenePos, bool select)
hgs
parents: 9
diff changeset
   742
{
hgs
parents: 9
diff changeset
   743
    QGraphicsSceneMouseEvent event(type);
hgs
parents: 9
diff changeset
   744
    qstmSetGraphicsSceneMouseEvent(scenePos, webView(), event, select);
hgs
parents: 9
diff changeset
   745
    webView()->page()->event(&event);
hgs
parents: 9
diff changeset
   746
}
hgs
parents: 9
diff changeset
   747
hgs
parents: 9
diff changeset
   748
void ScrollableWebContentView::disableContentUpdates()
hgs
parents: 9
diff changeset
   749
{
hgs
parents: 9
diff changeset
   750
    if (m_zoomCommitTimer.isActive()) {
hgs
parents: 9
diff changeset
   751
        m_zoomCommitTimer.stop();
hgs
parents: 9
diff changeset
   752
    }
hgs
parents: 9
diff changeset
   753
    webView()->setTiledBackingStoreFrozen(true);
hgs
parents: 9
diff changeset
   754
}
hgs
parents: 9
diff changeset
   755
hgs
parents: 9
diff changeset
   756
void ScrollableWebContentView::enableContentUpdates()
hgs
parents: 9
diff changeset
   757
{
hgs
parents: 9
diff changeset
   758
    webView()->setTiledBackingStoreFrozen(false);
hgs
parents: 9
diff changeset
   759
}
hgs
parents: 9
diff changeset
   760
hgs
parents: 9
diff changeset
   761
void ScrollableWebContentView::commitZoom()
hgs
parents: 9
diff changeset
   762
{         
hgs
parents: 9
diff changeset
   763
    m_zoomCommitTimer.stop();
hgs
parents: 9
diff changeset
   764
    notifyZoomActions(zoomScale());
hgs
parents: 9
diff changeset
   765
    enableContentUpdates();
hgs
parents: 9
diff changeset
   766
    emit scaleChanged(zoomScale());
hgs
parents: 9
diff changeset
   767
}
hgs
parents: 9
diff changeset
   768
hgs
parents: 9
diff changeset
   769
WebView* ScrollableWebContentView::webView() const
hgs
parents: 9
diff changeset
   770
{
hgs
parents: 9
diff changeset
   771
    return static_cast<WebView*>(scrollWidget());
hgs
parents: 9
diff changeset
   772
}
hgs
parents: 9
diff changeset
   773
hgs
parents: 9
diff changeset
   774
void ScrollableWebContentView::setZoomScale(qreal value, bool immediateCommit)
hgs
parents: 9
diff changeset
   775
{
hgs
parents: 9
diff changeset
   776
    value = qBound(m_viewportMetaData->m_minimumScale, value, m_viewportMetaData->m_maximumScale);
hgs
parents: 9
diff changeset
   777
    qreal curZoomScale = zoomScale();
hgs
parents: 9
diff changeset
   778
hgs
parents: 9
diff changeset
   779
    if (qFuzzyCompare(value, curZoomScale)) {
hgs
parents: 9
diff changeset
   780
        notifyZoomActions(curZoomScale);
hgs
parents: 9
diff changeset
   781
        return;
hgs
parents: 9
diff changeset
   782
    }
hgs
parents: 9
diff changeset
   783
hgs
parents: 9
diff changeset
   784
    if (!immediateCommit)
hgs
parents: 9
diff changeset
   785
        disableContentUpdates();
hgs
parents: 9
diff changeset
   786
hgs
parents: 9
diff changeset
   787
    webView()->setScale(value);
hgs
parents: 9
diff changeset
   788
hgs
parents: 9
diff changeset
   789
    if (immediateCommit)
hgs
parents: 9
diff changeset
   790
        commitZoom();
hgs
parents: 9
diff changeset
   791
//    else
hgs
parents: 9
diff changeset
   792
//        m_zoomCommitTimer.start(ZoomCommitDuration);
hgs
parents: 9
diff changeset
   793
}
hgs
parents: 9
diff changeset
   794
hgs
parents: 9
diff changeset
   795
qreal ScrollableWebContentView::zoomScale() const
hgs
parents: 9
diff changeset
   796
{
hgs
parents: 9
diff changeset
   797
    if (!webView())
hgs
parents: 9
diff changeset
   798
        return 1.;
hgs
parents: 9
diff changeset
   799
hgs
parents: 9
diff changeset
   800
    return webView()->scale();
hgs
parents: 9
diff changeset
   801
}
hgs
parents: 9
diff changeset
   802
hgs
parents: 9
diff changeset
   803
QRectF ScrollableWebContentView::findZoomableRectForPoint(const QPointF& point)
hgs
parents: 9
diff changeset
   804
{
hgs
parents: 9
diff changeset
   805
    QPointF zoomPoint = webView()->mapFromParent(point);
hgs
parents: 9
diff changeset
   806
hgs
parents: 9
diff changeset
   807
    QWebHitTestResult hitResult = webView()->page()->mainFrame()->hitTestContent(zoomPoint.toPoint());
hgs
parents: 9
diff changeset
   808
    QWebElement targetElement = hitResult.enclosingBlockElement();
hgs
parents: 9
diff changeset
   809
hgs
parents: 9
diff changeset
   810
    while (!targetElement.isNull() && targetElement.geometry().width() < MinDoubleClickZoomTargetWidth)
hgs
parents: 9
diff changeset
   811
        targetElement = targetElement.parent();
hgs
parents: 9
diff changeset
   812
hgs
parents: 9
diff changeset
   813
    if (!targetElement.isNull()) {
hgs
parents: 9
diff changeset
   814
        QRectF elementRect = targetElement.geometry();
hgs
parents: 9
diff changeset
   815
        qreal overMinWidth = elementRect.width() - ZoomableContentMinWidth;
hgs
parents: 9
diff changeset
   816
        if (overMinWidth < 0)
hgs
parents: 9
diff changeset
   817
            elementRect.adjust(overMinWidth / 2, 0, -overMinWidth / 2, 0);
hgs
parents: 9
diff changeset
   818
        qreal destScale = size().width() / elementRect.width();
hgs
parents: 9
diff changeset
   819
        QPointF rectPoint(elementRect.x(),zoomPoint.y() - point.y() / destScale);
hgs
parents: 9
diff changeset
   820
        return QRectF(rectPoint, elementRect.size());
hgs
parents: 9
diff changeset
   821
    }
hgs
parents: 9
diff changeset
   822
    return QRectF();
hgs
parents: 9
diff changeset
   823
}
hgs
parents: 9
diff changeset
   824
hgs
parents: 9
diff changeset
   825
void ScrollableWebContentView::notifyZoomActions(qreal newScale)
hgs
parents: 9
diff changeset
   826
{
hgs
parents: 9
diff changeset
   827
    bool enableZoomIn = false;
hgs
parents: 9
diff changeset
   828
    bool enableZoomOut = false;
hgs
parents: 9
diff changeset
   829
hgs
parents: 9
diff changeset
   830
    if (m_viewportMetaData->m_userScalable) {
hgs
parents: 9
diff changeset
   831
hgs
parents: 9
diff changeset
   832
        if (newScale > m_viewportMetaData->m_minimumScale)
hgs
parents: 9
diff changeset
   833
            enableZoomOut = true;
hgs
parents: 9
diff changeset
   834
        else
hgs
parents: 9
diff changeset
   835
            enableZoomOut = false;
hgs
parents: 9
diff changeset
   836
hgs
parents: 9
diff changeset
   837
        if (newScale < m_viewportMetaData->m_maximumScale)
hgs
parents: 9
diff changeset
   838
            enableZoomIn = true;
hgs
parents: 9
diff changeset
   839
        else
hgs
parents: 9
diff changeset
   840
            enableZoomIn = false;
hgs
parents: 9
diff changeset
   841
    }
hgs
parents: 9
diff changeset
   842
hgs
parents: 9
diff changeset
   843
    emit updateZoomActions(enableZoomIn, enableZoomOut);
hgs
parents: 9
diff changeset
   844
}
hgs
parents: 9
diff changeset
   845
hgs
parents: 9
diff changeset
   846
hgs
parents: 9
diff changeset
   847
hgs
parents: 9
diff changeset
   848
bool ScrollableWebContentView::eventFilter(QObject* o, QEvent* e)
hgs
parents: 9
diff changeset
   849
{
hgs
parents: 9
diff changeset
   850
    if (o != scrollWidget()) return false;
hgs
parents: 9
diff changeset
   851
    bool ret = false;
hgs
parents: 9
diff changeset
   852
hgs
parents: 9
diff changeset
   853
    if (m_gesturesEnabled) {
hgs
parents: 9
diff changeset
   854
            ret = QStm_GestureEventFilter::instance()->eventFilter(o, e);
hgs
parents: 9
diff changeset
   855
        }
hgs
parents: 9
diff changeset
   856
hgs
parents: 9
diff changeset
   857
    // Superpages should never receive contextmenu events
hgs
parents: 9
diff changeset
   858
    if (isSuperPage() && (e->type() == QEvent::GraphicsSceneContextMenu || e->type() == QEvent::ContextMenu))
hgs
parents: 9
diff changeset
   859
        ret = true;
hgs
parents: 9
diff changeset
   860
    
hgs
parents: 9
diff changeset
   861
    return ret;
hgs
parents: 9
diff changeset
   862
}
hgs
parents: 9
diff changeset
   863
hgs
parents: 9
diff changeset
   864
bool ScrollableWebContentView::event(QEvent * e) 
hgs
parents: 9
diff changeset
   865
{
hgs
parents: 9
diff changeset
   866
    if (e->type() == QEvent::Gesture && m_gesturesEnabled) {
hgs
parents: 9
diff changeset
   867
          QStm_Gesture* gesture = getQStmGesture(e);
hgs
parents: 9
diff changeset
   868
          if (gesture) {
hgs
parents: 9
diff changeset
   869
              bool ret = handleQStmGesture(gesture);
hgs
parents: 9
diff changeset
   870
              if (gesture->getGestureStmType() == QStmTouchGestureType)
hgs
parents: 9
diff changeset
   871
                  e->accept();
hgs
parents: 9
diff changeset
   872
              return ret;
hgs
parents: 9
diff changeset
   873
          }
hgs
parents: 9
diff changeset
   874
    }
hgs
parents: 9
diff changeset
   875
    return QGraphicsWidget::event(e);
hgs
parents: 9
diff changeset
   876
}
hgs
parents: 9
diff changeset
   877
hgs
parents: 9
diff changeset
   878
hgs
parents: 9
diff changeset
   879
hgs
parents: 9
diff changeset
   880
bool  ScrollableWebContentView::handleQStmGesture(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
   881
{
hgs
parents: 9
diff changeset
   882
#ifdef OWN_BACKING_STORE
hgs
parents: 9
diff changeset
   883
    // Signal tiling to minimize tile update activity while user does something
hgs
parents: 9
diff changeset
   884
    webView()->userActivity();
hgs
parents: 9
diff changeset
   885
#endif
hgs
parents: 9
diff changeset
   886
    QStm_GestureType type = gesture->getGestureStmType();
hgs
parents: 9
diff changeset
   887
    bool ret = false;
hgs
parents: 9
diff changeset
   888
    switch (type) {
hgs
parents: 9
diff changeset
   889
        case QStmTapGestureType:
hgs
parents: 9
diff changeset
   890
        {
hgs
parents: 9
diff changeset
   891
            ret = doTap(gesture);
hgs
parents: 9
diff changeset
   892
            break;
hgs
parents: 9
diff changeset
   893
        }
hgs
parents: 9
diff changeset
   894
hgs
parents: 9
diff changeset
   895
        case QStmMaybeTapGestureType:
hgs
parents: 9
diff changeset
   896
        {
hgs
parents: 9
diff changeset
   897
            ret = doMaybeTap(gesture);
hgs
parents: 9
diff changeset
   898
            break;
hgs
parents: 9
diff changeset
   899
        }
3
hgs
parents:
diff changeset
   900
16
hgs
parents: 9
diff changeset
   901
        case QStmReleaseGestureType:
hgs
parents: 9
diff changeset
   902
        {
hgs
parents: 9
diff changeset
   903
            ret = doRelease(gesture);
hgs
parents: 9
diff changeset
   904
            break;
hgs
parents: 9
diff changeset
   905
        }
hgs
parents: 9
diff changeset
   906
        case QStmLeftRightGestureType:
hgs
parents: 9
diff changeset
   907
        {
hgs
parents: 9
diff changeset
   908
            ret = doLeftRight(gesture);
hgs
parents: 9
diff changeset
   909
            break;
hgs
parents: 9
diff changeset
   910
        }
hgs
parents: 9
diff changeset
   911
        case QStmUpDownGestureType:
hgs
parents: 9
diff changeset
   912
        {
hgs
parents: 9
diff changeset
   913
            ret = doUpDown(gesture);
hgs
parents: 9
diff changeset
   914
            break;
hgs
parents: 9
diff changeset
   915
        }
hgs
parents: 9
diff changeset
   916
        case QStmPanGestureType:
hgs
parents: 9
diff changeset
   917
        {
hgs
parents: 9
diff changeset
   918
            ret = doPan(gesture);
hgs
parents: 9
diff changeset
   919
            break;
hgs
parents: 9
diff changeset
   920
        }
hgs
parents: 9
diff changeset
   921
        case QStmFlickGestureType:
hgs
parents: 9
diff changeset
   922
        {
hgs
parents: 9
diff changeset
   923
            ret = doFlick(gesture);
hgs
parents: 9
diff changeset
   924
            break;
hgs
parents: 9
diff changeset
   925
        }
hgs
parents: 9
diff changeset
   926
        case QStmDoubleTapGestureType:
hgs
parents: 9
diff changeset
   927
        {
hgs
parents: 9
diff changeset
   928
            ret = doDoubleTap(gesture);
hgs
parents: 9
diff changeset
   929
            break;
hgs
parents: 9
diff changeset
   930
        }
hgs
parents: 9
diff changeset
   931
        case QStmTouchGestureType:
hgs
parents: 9
diff changeset
   932
        {
hgs
parents: 9
diff changeset
   933
            ret = doTouch(gesture);
hgs
parents: 9
diff changeset
   934
            break;
hgs
parents: 9
diff changeset
   935
        }
hgs
parents: 9
diff changeset
   936
        case QStmPinchGestureType:
hgs
parents: 9
diff changeset
   937
        {
hgs
parents: 9
diff changeset
   938
            ret = doPinch(gesture);  
hgs
parents: 9
diff changeset
   939
            break;
hgs
parents: 9
diff changeset
   940
        }
hgs
parents: 9
diff changeset
   941
        case QStmLongPressGestureType:
hgs
parents: 9
diff changeset
   942
        {
hgs
parents: 9
diff changeset
   943
            ret = doLongPress(gesture);
hgs
parents: 9
diff changeset
   944
            break;
hgs
parents: 9
diff changeset
   945
        }
hgs
parents: 9
diff changeset
   946
        
hgs
parents: 9
diff changeset
   947
        default: 
hgs
parents: 9
diff changeset
   948
        {
hgs
parents: 9
diff changeset
   949
            ret = true;
hgs
parents: 9
diff changeset
   950
        }
hgs
parents: 9
diff changeset
   951
    }
hgs
parents: 9
diff changeset
   952
    
hgs
parents: 9
diff changeset
   953
    return ret;
hgs
parents: 9
diff changeset
   954
}
hgs
parents: 9
diff changeset
   955
hgs
parents: 9
diff changeset
   956
QWebHitTestResult  ScrollableWebContentView::hitTest(const QPointF& scenePos)
hgs
parents: 9
diff changeset
   957
{
hgs
parents: 9
diff changeset
   958
    QPointF contextPt = webView()->mapFromScene(scenePos);
hgs
parents: 9
diff changeset
   959
    QWebPage* page = webView()->page();
hgs
parents: 9
diff changeset
   960
    return page->currentFrame()->hitTestContent(contextPt.toPoint()); 
hgs
parents: 9
diff changeset
   961
}
hgs
parents: 9
diff changeset
   962
hgs
parents: 9
diff changeset
   963
hgs
parents: 9
diff changeset
   964
hgs
parents: 9
diff changeset
   965
bool ScrollableWebContentView::toggleVkb()
hgs
parents: 9
diff changeset
   966
{
hgs
parents: 9
diff changeset
   967
    bool inputEnabled = false;
hgs
parents: 9
diff changeset
   968
    QInputContext *ic = qApp->inputContext();
hgs
parents: 9
diff changeset
   969
    if (m_hitTest.isContentEditable()) {
hgs
parents: 9
diff changeset
   970
        QEvent sipe(QEvent::RequestSoftwareInputPanel);
hgs
parents: 9
diff changeset
   971
        ic->filterEvent(&sipe);
hgs
parents: 9
diff changeset
   972
        inputEnabled = true;
hgs
parents: 9
diff changeset
   973
    }
hgs
parents: 9
diff changeset
   974
    else {
hgs
parents: 9
diff changeset
   975
        QEvent sipe(QEvent::CloseSoftwareInputPanel);
hgs
parents: 9
diff changeset
   976
        ic->filterEvent(&sipe);
hgs
parents: 9
diff changeset
   977
hgs
parents: 9
diff changeset
   978
    }
hgs
parents: 9
diff changeset
   979
    m_isInputOn = inputEnabled;
hgs
parents: 9
diff changeset
   980
    return inputEnabled;
hgs
parents: 9
diff changeset
   981
}
hgs
parents: 9
diff changeset
   982
hgs
parents: 9
diff changeset
   983
bool  ScrollableWebContentView::toggleInputMethod(bool on)
hgs
parents: 9
diff changeset
   984
{
hgs
parents: 9
diff changeset
   985
    QGraphicsView* gv = qstmGetGraphicsView(webView());
hgs
parents: 9
diff changeset
   986
    bool oldInputEnabled = false;
hgs
parents: 9
diff changeset
   987
    if (gv != NULL) {
hgs
parents: 9
diff changeset
   988
        gv->testAttribute(Qt::WA_InputMethodEnabled);
hgs
parents: 9
diff changeset
   989
        gv->setAttribute(Qt::WA_InputMethodEnabled, on);
hgs
parents: 9
diff changeset
   990
    }
hgs
parents: 9
diff changeset
   991
    m_isInputOn = on;
hgs
parents: 9
diff changeset
   992
    return oldInputEnabled;
hgs
parents: 9
diff changeset
   993
}
hgs
parents: 9
diff changeset
   994
hgs
parents: 9
diff changeset
   995
bool  ScrollableWebContentView::inputMethodEnabled()
hgs
parents: 9
diff changeset
   996
{
hgs
parents: 9
diff changeset
   997
#ifdef ORBIT_UI
hgs
parents: 9
diff changeset
   998
    HbInputMethod* im = HbInputMethod::activeInputMethod();
hgs
parents: 9
diff changeset
   999
    
hgs
parents: 9
diff changeset
  1000
    QGraphicsView* gv = qstmGetGraphicsView(webView());
hgs
parents: 9
diff changeset
  1001
    bool enabled = false;
hgs
parents: 9
diff changeset
  1002
    if (gv) {
hgs
parents: 9
diff changeset
  1003
        enabled = gv->testAttribute(Qt::WA_InputMethodEnabled);
hgs
parents: 9
diff changeset
  1004
    }
hgs
parents: 9
diff changeset
  1005
    return enabled; 
hgs
parents: 9
diff changeset
  1006
#else
hgs
parents: 9
diff changeset
  1007
    return false;
hgs
parents: 9
diff changeset
  1008
#endif // ORBIT_UI
hgs
parents: 9
diff changeset
  1009
}
hgs
parents: 9
diff changeset
  1010
hgs
parents: 9
diff changeset
  1011
bool  ScrollableWebContentView::doLongPress(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1012
{
hgs
parents: 9
diff changeset
  1013
    bool willHandle = m_gesturesEnabled && !isSuperPage();
hgs
parents: 9
diff changeset
  1014
    if (willHandle) {
hgs
parents: 9
diff changeset
  1015
//        QWebPage* page = webView()->page();
hgs
parents: 9
diff changeset
  1016
        QPoint gpos = gesture->position();
hgs
parents: 9
diff changeset
  1017
        QPointF pos = qstmMapToScene(gpos, this);
hgs
parents: 9
diff changeset
  1018
//        QPointF contextPt = webView()->mapFromScene(pos);
hgs
parents: 9
diff changeset
  1019
        //QWebHitTestResult result = page->currentFrame()->hitTestContent(contextPt.toPoint());
hgs
parents: 9
diff changeset
  1020
    //Notify context menu observers
hgs
parents: 9
diff changeset
  1021
        emit contextEventObject(&m_hitTest, pos);
hgs
parents: 9
diff changeset
  1022
        m_ignoreNextRelease = true;
hgs
parents: 9
diff changeset
  1023
    }
hgs
parents: 9
diff changeset
  1024
    return willHandle;
hgs
parents: 9
diff changeset
  1025
}
hgs
parents: 9
diff changeset
  1026
hgs
parents: 9
diff changeset
  1027
hgs
parents: 9
diff changeset
  1028
hgs
parents: 9
diff changeset
  1029
bool ScrollableWebContentView::doTouch(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1030
{
hgs
parents: 9
diff changeset
  1031
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1032
    m_scrollHelper->stopScrollNoSignal();
hgs
parents: 9
diff changeset
  1033
    m_touchDownPos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1034
    if (!isSuperPage()) {
hgs
parents: 9
diff changeset
  1035
        m_hitTest = hitTest(m_touchDownPos);
hgs
parents: 9
diff changeset
  1036
        //toggleInputMethod(false);
hgs
parents: 9
diff changeset
  1037
        qreal scale = zoomScale();
hgs
parents: 9
diff changeset
  1038
hgs
parents: 9
diff changeset
  1039
        m_hoverTimer->stop();
hgs
parents: 9
diff changeset
  1040
        m_hoverTimer->setSingleShot(true);
hgs
parents: 9
diff changeset
  1041
        
hgs
parents: 9
diff changeset
  1042
        m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
  1043
        m_touchDownTimer->setSingleShot(true);
hgs
parents: 9
diff changeset
  1044
                
hgs
parents: 9
diff changeset
  1045
        m_touchDownTimer->start(TouchDownTimeout, this);
hgs
parents: 9
diff changeset
  1046
        m_hoverTimer->start(HoverTimeout, this);
hgs
parents: 9
diff changeset
  1047
    }
hgs
parents: 9
diff changeset
  1048
    else {
hgs
parents: 9
diff changeset
  1049
        sendEventToWebKit(QEvent::GraphicsSceneMousePress, m_touchDownPos);
hgs
parents: 9
diff changeset
  1050
    }
hgs
parents: 9
diff changeset
  1051
    return willHandle;
hgs
parents: 9
diff changeset
  1052
}
hgs
parents: 9
diff changeset
  1053
hgs
parents: 9
diff changeset
  1054
void ScrollableWebContentView::touchDownCallback()
hgs
parents: 9
diff changeset
  1055
{
hgs
parents: 9
diff changeset
  1056
    m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
  1057
    if (m_gesturesEnabled) {
hgs
parents: 9
diff changeset
  1058
        sendEventToWebKit(QEvent::GraphicsSceneMousePress, m_touchDownPos);
hgs
parents: 9
diff changeset
  1059
    }
hgs
parents: 9
diff changeset
  1060
}
hgs
parents: 9
diff changeset
  1061
hgs
parents: 9
diff changeset
  1062
void ScrollableWebContentView::hoverCallback()
hgs
parents: 9
diff changeset
  1063
{
hgs
parents: 9
diff changeset
  1064
    m_hoverTimer->stop();
hgs
parents: 9
diff changeset
  1065
    if (m_gesturesEnabled && !isSuperPage()) {
hgs
parents: 9
diff changeset
  1066
        sendEventToWebKit(QEvent::GraphicsSceneMouseMove, m_touchDownPos);
hgs
parents: 9
diff changeset
  1067
    }
hgs
parents: 9
diff changeset
  1068
}
hgs
parents: 9
diff changeset
  1069
hgs
parents: 9
diff changeset
  1070
hgs
parents: 9
diff changeset
  1071
bool ScrollableWebContentView::doTap(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1072
{
hgs
parents: 9
diff changeset
  1073
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1074
    if (willHandle && !isSuperPage()) {
hgs
parents: 9
diff changeset
  1075
        QPointF pos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1076
        bool hasInputMethod = toggleVkb();
hgs
parents: 9
diff changeset
  1077
        sendEventToWebKit(QEvent::GraphicsSceneMouseRelease, pos);
hgs
parents: 9
diff changeset
  1078
        emit contentViewMouseEvent(QEvent::GraphicsSceneMouseRelease);
hgs
parents: 9
diff changeset
  1079
    }
hgs
parents: 9
diff changeset
  1080
    return willHandle;
hgs
parents: 9
diff changeset
  1081
}
hgs
parents: 9
diff changeset
  1082
hgs
parents: 9
diff changeset
  1083
bool ScrollableWebContentView::doMaybeTap(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1084
{
hgs
parents: 9
diff changeset
  1085
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1086
    if (willHandle && isSuperPage()) {
hgs
parents: 9
diff changeset
  1087
        QPointF pos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1088
        sendEventToWebKit(QEvent::GraphicsSceneMouseRelease, pos);
hgs
parents: 9
diff changeset
  1089
    }
hgs
parents: 9
diff changeset
  1090
    return willHandle;
hgs
parents: 9
diff changeset
  1091
}
hgs
parents: 9
diff changeset
  1092
hgs
parents: 9
diff changeset
  1093
#ifdef USE_KINETIC_SCROLLER
hgs
parents: 9
diff changeset
  1094
bool ScrollableWebContentView::doPan(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1095
{
hgs
parents: 9
diff changeset
  1096
    if (m_touchDownTimer->isActive()) {
hgs
parents: 9
diff changeset
  1097
        m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
  1098
    }
hgs
parents: 9
diff changeset
  1099
    
hgs
parents: 9
diff changeset
  1100
    QStm_GestureType type = gesture->getGestureStmType();
hgs
parents: 9
diff changeset
  1101
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1102
    
hgs
parents: 9
diff changeset
  1103
    if (willHandle) {
hgs
parents: 9
diff changeset
  1104
        QPoint scrollPos = ScrollableViewBase::scrollPosition();
hgs
parents: 9
diff changeset
  1105
        QPoint delta = gesture->getLengthAndDirection();
hgs
parents: 9
diff changeset
  1106
        delta.ry() = -delta.y();
hgs
parents: 9
diff changeset
  1107
        m_kineticScroller->doPan(delta);
hgs
parents: 9
diff changeset
  1108
    }
hgs
parents: 9
diff changeset
  1109
    return willHandle;
hgs
parents: 9
diff changeset
  1110
}
hgs
parents: 9
diff changeset
  1111
#else
hgs
parents: 9
diff changeset
  1112
hgs
parents: 9
diff changeset
  1113
hgs
parents: 9
diff changeset
  1114
bool ScrollableWebContentView::doLeftRight(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1115
{
hgs
parents: 9
diff changeset
  1116
    bool ret = true;
hgs
parents: 9
diff changeset
  1117
    if (m_hitTest.isContentEditable() && m_isInputOn) {
hgs
parents: 9
diff changeset
  1118
        QPointF pos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1119
        sendEventToWebKit(QEvent::GraphicsSceneMouseMove, pos, true);
hgs
parents: 9
diff changeset
  1120
    }
hgs
parents: 9
diff changeset
  1121
    else {
hgs
parents: 9
diff changeset
  1122
        ret = doPan(gesture);
hgs
parents: 9
diff changeset
  1123
    }
hgs
parents: 9
diff changeset
  1124
    return ret;
3
hgs
parents:
diff changeset
  1125
}
hgs
parents:
diff changeset
  1126
16
hgs
parents: 9
diff changeset
  1127
hgs
parents: 9
diff changeset
  1128
bool ScrollableWebContentView::doUpDown(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1129
{
hgs
parents: 9
diff changeset
  1130
    bool ret = true;
hgs
parents: 9
diff changeset
  1131
    if (m_hitTest.isContentEditable() && m_isInputOn) {
hgs
parents: 9
diff changeset
  1132
        QPointF pos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1133
        sendEventToWebKit(QEvent::GraphicsSceneMouseMove, pos, true);
hgs
parents: 9
diff changeset
  1134
    }
hgs
parents: 9
diff changeset
  1135
    else {
hgs
parents: 9
diff changeset
  1136
        ret = doPan(gesture);
hgs
parents: 9
diff changeset
  1137
    }
hgs
parents: 9
diff changeset
  1138
    return ret;
hgs
parents: 9
diff changeset
  1139
}
hgs
parents: 9
diff changeset
  1140
hgs
parents: 9
diff changeset
  1141
hgs
parents: 9
diff changeset
  1142
hgs
parents: 9
diff changeset
  1143
bool ScrollableWebContentView::doPan(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1144
{
hgs
parents: 9
diff changeset
  1145
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1146
    if (m_hitTest.isContentEditable() && m_isInputOn) {
hgs
parents: 9
diff changeset
  1147
        QPointF pos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1148
        sendEventToWebKit(QEvent::GraphicsSceneMouseMove, pos, true);
hgs
parents: 9
diff changeset
  1149
    }
hgs
parents: 9
diff changeset
  1150
    else {
hgs
parents: 9
diff changeset
  1151
        dehighlightWebElement();
hgs
parents: 9
diff changeset
  1152
        if (willHandle) {
hgs
parents: 9
diff changeset
  1153
            if (gesture->gestureState() != Qt::GestureFinished) {
hgs
parents: 9
diff changeset
  1154
                QPointF delta = gesture->sceneLengthAndDirection(this);
hgs
parents: 9
diff changeset
  1155
hgs
parents: 9
diff changeset
  1156
                if (isSuperPage()) {
hgs
parents: 9
diff changeset
  1157
                    delta.rx() = 0.0;
hgs
parents: 9
diff changeset
  1158
                }
hgs
parents: 9
diff changeset
  1159
                else {
hgs
parents: 9
diff changeset
  1160
                    //delta.rx() = -delta.x();
hgs
parents: 9
diff changeset
  1161
                }
hgs
parents: 9
diff changeset
  1162
            
hgs
parents: 9
diff changeset
  1163
                //disableContentUpdates();
hgs
parents: 9
diff changeset
  1164
                qstmDebug() << "doPan: gesture timestamp: " << gesture->timestamp().toString("hh:mm:ss.zzz") <<
hgs
parents: 9
diff changeset
  1165
                        ", delta: " << delta << "\n";
hgs
parents: 9
diff changeset
  1166
hgs
parents: 9
diff changeset
  1167
                m_scrollHelper->scroll(delta);
hgs
parents: 9
diff changeset
  1168
            }
hgs
parents: 9
diff changeset
  1169
        }
hgs
parents: 9
diff changeset
  1170
    }
hgs
parents: 9
diff changeset
  1171
    return willHandle;
hgs
parents: 9
diff changeset
  1172
}
hgs
parents: 9
diff changeset
  1173
#endif //USE_KINETIC_SCROLLER
hgs
parents: 9
diff changeset
  1174
hgs
parents: 9
diff changeset
  1175
hgs
parents: 9
diff changeset
  1176
bool ScrollableWebContentView::doRelease(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1177
{
hgs
parents: 9
diff changeset
  1178
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1179
    if (willHandle) {
hgs
parents: 9
diff changeset
  1180
        if (m_ignoreNextRelease) {
hgs
parents: 9
diff changeset
  1181
            m_ignoreNextRelease = false;
hgs
parents: 9
diff changeset
  1182
        }
hgs
parents: 9
diff changeset
  1183
        else if (m_scrollHelper->isScrolling()) {
hgs
parents: 9
diff changeset
  1184
            m_scrollHelper->panFromOvershoot();
hgs
parents: 9
diff changeset
  1185
//            enableContentUpdates();
hgs
parents: 9
diff changeset
  1186
        }
hgs
parents: 9
diff changeset
  1187
        else {
hgs
parents: 9
diff changeset
  1188
            /*
hgs
parents: 9
diff changeset
  1189
             * on tap we send mouseRelease
hgs
parents: 9
diff changeset
  1190
             * assumption here is that we can get
hgs
parents: 9
diff changeset
  1191
             * either tap or release gesture but not both.
hgs
parents: 9
diff changeset
  1192
             */
hgs
parents: 9
diff changeset
  1193
            doTap(gesture);
hgs
parents: 9
diff changeset
  1194
        }
hgs
parents: 9
diff changeset
  1195
    }
hgs
parents: 9
diff changeset
  1196
    return willHandle;
hgs
parents: 9
diff changeset
  1197
}
hgs
parents: 9
diff changeset
  1198
hgs
parents: 9
diff changeset
  1199
#ifdef USE_KINETIC_SCROLLER
hgs
parents: 9
diff changeset
  1200
bool ScrollableWebContentView::doFlick(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1201
{
hgs
parents: 9
diff changeset
  1202
    int direction = gesture->getDirection();
hgs
parents: 9
diff changeset
  1203
    QStm_GestureType type = gesture->getGestureStmType();
hgs
parents: 9
diff changeset
  1204
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1205
    if (willHandle ) {          
hgs
parents: 9
diff changeset
  1206
        m_kineticScroller->doFlick(90 * gesture->getSpeedVec());
hgs
parents: 9
diff changeset
  1207
    }
hgs
parents: 9
diff changeset
  1208
}
hgs
parents: 9
diff changeset
  1209
hgs
parents: 9
diff changeset
  1210
#else
hgs
parents: 9
diff changeset
  1211
bool ScrollableWebContentView::doFlick(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1212
{    
hgs
parents: 9
diff changeset
  1213
    bool willHandle = m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1214
    int afterPinch = m_pinchFinishTime.elapsed();
hgs
parents: 9
diff changeset
  1215
    if (willHandle && afterPinch > 100 && m_scrollHelper->isScrolling()) {
hgs
parents: 9
diff changeset
  1216
        dehighlightWebElement();
hgs
parents: 9
diff changeset
  1217
        int direction = gesture->sceneDirection(this);
hgs
parents: 9
diff changeset
  1218
        QPointF v = gesture->sceneSpeedVec(this);
hgs
parents: 9
diff changeset
  1219
        QPointF vOrig = v;
hgs
parents: 9
diff changeset
  1220
        qstmDebug() << "doFlick: timestamp: " << gesture->timestamp().toString("hh:mm:ss.zzz") <<
hgs
parents: 9
diff changeset
  1221
                ", v: " << v << "\n";
hgs
parents: 9
diff changeset
  1222
        if (v.x() != 0.0 || v.y() != 0.0) {
hgs
parents: 9
diff changeset
  1223
            if (direction == EEast || direction == EWest) {
hgs
parents: 9
diff changeset
  1224
                v.ry() = 0.0;
hgs
parents: 9
diff changeset
  1225
            }
hgs
parents: 9
diff changeset
  1226
            if (direction == ENorth || direction == ESouth) {
hgs
parents: 9
diff changeset
  1227
                v.rx() = 0.0;
hgs
parents: 9
diff changeset
  1228
            }
hgs
parents: 9
diff changeset
  1229
            m_scrollHelper->kineticScroll(v);
hgs
parents: 9
diff changeset
  1230
            //enableContentUpdates();
hgs
parents: 9
diff changeset
  1231
            //m_tileUpdateEnableTimer.start(TileUpdateEnableDelay);
hgs
parents: 9
diff changeset
  1232
        }
hgs
parents: 9
diff changeset
  1233
        else if (afterPinch <= 500) {
hgs
parents: 9
diff changeset
  1234
            qstmDebug() << "doFlick: Flick is too soon after pinch\n";
hgs
parents: 9
diff changeset
  1235
        }
hgs
parents: 9
diff changeset
  1236
    }
hgs
parents: 9
diff changeset
  1237
    return willHandle;
hgs
parents: 9
diff changeset
  1238
}
hgs
parents: 9
diff changeset
  1239
#endif //USE_KINETIC_SCROLLER
hgs
parents: 9
diff changeset
  1240
hgs
parents: 9
diff changeset
  1241
bool ScrollableWebContentView::doDoubleTap(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1242
{
hgs
parents: 9
diff changeset
  1243
    if (!m_gesturesEnabled || !m_viewportMetaData->m_userScalable) {
hgs
parents: 9
diff changeset
  1244
        m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
  1245
        m_hoverTimer->stop();
hgs
parents: 9
diff changeset
  1246
        return m_gesturesEnabled;    
hgs
parents: 9
diff changeset
  1247
    }
hgs
parents: 9
diff changeset
  1248
    dehighlightWebElement();
hgs
parents: 9
diff changeset
  1249
    QPointF pos = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1250
    pos = mapFromScene(pos);
hgs
parents: 9
diff changeset
  1251
    qstmDebug() << "doDoubleTap: zoom at pos: " << pos << "\n";
hgs
parents: 9
diff changeset
  1252
    zoomAtPoint(pos);
hgs
parents: 9
diff changeset
  1253
    
hgs
parents: 9
diff changeset
  1254
    return m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1255
}
hgs
parents: 9
diff changeset
  1256
hgs
parents: 9
diff changeset
  1257
#define square(x) (x)*(x)
hgs
parents: 9
diff changeset
  1258
hgs
parents: 9
diff changeset
  1259
qreal ScrollableWebContentView::calcScale(int origDistance, QPointF p1, QPointF p2)
hgs
parents: 9
diff changeset
  1260
{
hgs
parents: 9
diff changeset
  1261
    qreal d1f = origDistance;
hgs
parents: 9
diff changeset
  1262
    qreal dist = calcDistance(p1, p2);
hgs
parents: 9
diff changeset
  1263
    return (dist/ d1f);
hgs
parents: 9
diff changeset
  1264
}
hgs
parents: 9
diff changeset
  1265
hgs
parents: 9
diff changeset
  1266
qreal ScrollableWebContentView::calcDistance(QPointF pt1, QPointF pt2)
hgs
parents: 9
diff changeset
  1267
{
hgs
parents: 9
diff changeset
  1268
    return (sqrt((double)square(pt2.x() - pt1.x()) + square(pt2.y() - pt1.y())));
hgs
parents: 9
diff changeset
  1269
}
hgs
parents: 9
diff changeset
  1270
hgs
parents: 9
diff changeset
  1271
QPointF ScrollableWebContentView::calcCenter(QPointF pt1, QPointF pt2)
hgs
parents: 9
diff changeset
  1272
{
hgs
parents: 9
diff changeset
  1273
    return((pt1 + pt2) / 2);
hgs
parents: 9
diff changeset
  1274
}
hgs
parents: 9
diff changeset
  1275
hgs
parents: 9
diff changeset
  1276
bool ScrollableWebContentView::doPinch(QStm_Gesture* gesture)
hgs
parents: 9
diff changeset
  1277
{
hgs
parents: 9
diff changeset
  1278
    m_scrollHelper->stopScrollNoSignal();
hgs
parents: 9
diff changeset
  1279
    dehighlightWebElement();
hgs
parents: 9
diff changeset
  1280
    m_pinchFinishTime.restart();
hgs
parents: 9
diff changeset
  1281
    if (!m_gesturesEnabled || !m_viewportMetaData->m_userScalable)
hgs
parents: 9
diff changeset
  1282
        return m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1283
hgs
parents: 9
diff changeset
  1284
    // Normally, "details" contains the distance between the two touched points
hgs
parents: 9
diff changeset
  1285
    // It's null when the pinch starts (which in effect is zero)
hgs
parents: 9
diff changeset
  1286
    // When we start pinch, we don't zoom because there is no delta
hgs
parents: 9
diff changeset
  1287
    QPointF p1 = gesture->scenePosition(this);
hgs
parents: 9
diff changeset
  1288
    QPointF p2 = gesture->scenePosition2(this);
hgs
parents: 9
diff changeset
  1289
    if (gesture->gestureState() == Qt::GestureFinished) {
hgs
parents: 9
diff changeset
  1290
        commitZoom();        
hgs
parents: 9
diff changeset
  1291
        return m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1292
    }
hgs
parents: 9
diff changeset
  1293
hgs
parents: 9
diff changeset
  1294
    if (!gesture->getDetails()) {
hgs
parents: 9
diff changeset
  1295
        m_pinchStartDistance = calcDistance(p1, p2);
hgs
parents: 9
diff changeset
  1296
        m_pinchStartScale = zoomScale();
hgs
parents: 9
diff changeset
  1297
    }
hgs
parents: 9
diff changeset
  1298
    else {
hgs
parents: 9
diff changeset
  1299
        qreal scale = calcScale(m_pinchStartDistance, p1, p2);
hgs
parents: 9
diff changeset
  1300
        qreal newScale = qBound(m_viewportMetaData->m_minimumScale, 
hgs
parents: 9
diff changeset
  1301
                                scale * m_pinchStartScale,
hgs
parents: 9
diff changeset
  1302
                                m_viewportMetaData->m_maximumScale);
hgs
parents: 9
diff changeset
  1303
        // Don't allow zooming beyond the min/max but still call the zoom animation (coz the hotspot could be moving and we want to pan with it)
hgs
parents: 9
diff changeset
  1304
        //zoomToHotSpot(calcCenter(p1, p2), newScale);
hgs
parents: 9
diff changeset
  1305
        if (!qFuzzyCompare(zoomScale(), newScale)) {
hgs
parents: 9
diff changeset
  1306
            startZoomAnimationToHotSpot(calcCenter(p1, p2), newScale, ZoomAnimationDuration);
hgs
parents: 9
diff changeset
  1307
        }
hgs
parents: 9
diff changeset
  1308
    }
hgs
parents: 9
diff changeset
  1309
    return m_gesturesEnabled;
hgs
parents: 9
diff changeset
  1310
}
hgs
parents: 9
diff changeset
  1311
hgs
parents: 9
diff changeset
  1312
bool ScrollableWebContentView::isZooming()
hgs
parents: 9
diff changeset
  1313
{
hgs
parents: 9
diff changeset
  1314
    return m_zoomAnimator->state() == QAbstractAnimation::Running;     
hgs
parents: 9
diff changeset
  1315
}
hgs
parents: 9
diff changeset
  1316
hgs
parents: 9
diff changeset
  1317
void ScrollableWebContentView::setGesturesEnabled(bool value) 
hgs
parents: 9
diff changeset
  1318
{ 
hgs
parents: 9
diff changeset
  1319
    if (!value && m_touchDownTimer->isActive()) {
hgs
parents: 9
diff changeset
  1320
        m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
  1321
    }
hgs
parents: 9
diff changeset
  1322
hgs
parents: 9
diff changeset
  1323
    m_gesturesEnabled = value;
hgs
parents: 9
diff changeset
  1324
}
hgs
parents: 9
diff changeset
  1325
hgs
parents: 9
diff changeset
  1326
bool ScrollableWebContentView::gesturesEnabled() 
hgs
parents: 9
diff changeset
  1327
{ 
hgs
parents: 9
diff changeset
  1328
    return m_gesturesEnabled; 
hgs
parents: 9
diff changeset
  1329
}
hgs
parents: 9
diff changeset
  1330
hgs
parents: 9
diff changeset
  1331
hgs
parents: 9
diff changeset
  1332
void ScrollableWebContentView::dehighlightWebElement()
hgs
parents: 9
diff changeset
  1333
{
hgs
parents: 9
diff changeset
  1334
    m_touchDownTimer->stop();
hgs
parents: 9
diff changeset
  1335
    m_hoverTimer->stop();
hgs
parents: 9
diff changeset
  1336
    
hgs
parents: 9
diff changeset
  1337
    QSizeF contentSize = webView()->size();
hgs
parents: 9
diff changeset
  1338
    QPointF dummyPosF(-contentSize.width() - 2.0, -contentSize.height( ) - 2.0);
hgs
parents: 9
diff changeset
  1339
    QPoint dummyPos(-1, -1);
hgs
parents: 9
diff changeset
  1340
    QGraphicsSceneMouseEvent event(QEvent::GraphicsSceneMouseRelease);
hgs
parents: 9
diff changeset
  1341
    event.setScenePos(dummyPos);
hgs
parents: 9
diff changeset
  1342
    event.setPos(dummyPos);
hgs
parents: 9
diff changeset
  1343
    event.setButton(Qt::LeftButton);
hgs
parents: 9
diff changeset
  1344
hgs
parents: 9
diff changeset
  1345
    bool hasInputMethod = toggleInputMethod(false);
hgs
parents: 9
diff changeset
  1346
    webView()->page()->event(&event);
hgs
parents: 9
diff changeset
  1347
    toggleInputMethod(hasInputMethod);
hgs
parents: 9
diff changeset
  1348
    //sendEventToWebKit(QEvent::GraphicsSceneMouseRelease, dummyPos);    
hgs
parents: 9
diff changeset
  1349
}
hgs
parents: 9
diff changeset
  1350
hgs
parents: 9
diff changeset
  1351
hgs
parents: 9
diff changeset
  1352
void ScrollableWebContentView::stopScrolling()
hgs
parents: 9
diff changeset
  1353
{
hgs
parents: 9
diff changeset
  1354
    m_isScrolling = false;
hgs
parents: 9
diff changeset
  1355
    //enableContentUpdates();
hgs
parents: 9
diff changeset
  1356
}
hgs
parents: 9
diff changeset
  1357
hgs
parents: 9
diff changeset
  1358
hgs
parents: 9
diff changeset
  1359
3
hgs
parents:
diff changeset
  1360
bool ScrollableWebContentView::sceneEventFilter(QGraphicsItem* item, QEvent* event)
hgs
parents:
diff changeset
  1361
{
hgs
parents:
diff changeset
  1362
    Q_UNUSED(item);
hgs
parents:
diff changeset
  1363
hgs
parents:
diff changeset
  1364
    bool handled = false;
16
hgs
parents: 9
diff changeset
  1365
#ifdef USE_KINETIC_SCROLLER    
hgs
parents: 9
diff changeset
  1366
    if (!isVisible())
hgs
parents: 9
diff changeset
  1367
        return handled;
3
hgs
parents:
diff changeset
  1368
hgs
parents:
diff changeset
  1369
    //Pass all events to recognizer
hgs
parents:
diff changeset
  1370
    handled  = m_gestureRecognizer.mouseEventFilter(static_cast<QGraphicsSceneMouseEvent *>(event));
16
hgs
parents: 9
diff changeset
  1371
#endif
3
hgs
parents:
diff changeset
  1372
    return handled;
hgs
parents:
diff changeset
  1373
}
hgs
parents:
diff changeset
  1374
16
hgs
parents: 9
diff changeset
  1375
3
hgs
parents:
diff changeset
  1376
void ScrollableWebContentView::handleGesture(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1377
{
hgs
parents:
diff changeset
  1378
    switch (gestureEvent->type()) {
hgs
parents:
diff changeset
  1379
    case GestureEvent::Touch:
hgs
parents:
diff changeset
  1380
        handlePress(gestureEvent);
hgs
parents:
diff changeset
  1381
        break;
hgs
parents:
diff changeset
  1382
    case GestureEvent::Release:
hgs
parents:
diff changeset
  1383
        handleRelease(gestureEvent);
hgs
parents:
diff changeset
  1384
        break;
hgs
parents:
diff changeset
  1385
    case GestureEvent::Pan:
hgs
parents:
diff changeset
  1386
        handlePan(gestureEvent);
hgs
parents:
diff changeset
  1387
        break;
hgs
parents:
diff changeset
  1388
    case GestureEvent::Flick:
hgs
parents:
diff changeset
  1389
        handleFlick(gestureEvent);
hgs
parents:
diff changeset
  1390
        break;
hgs
parents:
diff changeset
  1391
    case GestureEvent::DoubleTap:
hgs
parents:
diff changeset
  1392
        handleDoubleTap(gestureEvent);
hgs
parents:
diff changeset
  1393
        break;
hgs
parents:
diff changeset
  1394
    case GestureEvent::LongTap:
hgs
parents:
diff changeset
  1395
        handleLongTap(gestureEvent);
hgs
parents:
diff changeset
  1396
        break;
hgs
parents:
diff changeset
  1397
    default:
hgs
parents:
diff changeset
  1398
        break;
hgs
parents:
diff changeset
  1399
    }
hgs
parents:
diff changeset
  1400
hgs
parents:
diff changeset
  1401
}
hgs
parents:
diff changeset
  1402
hgs
parents:
diff changeset
  1403
void ScrollableWebContentView::handlePress(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1404
{
hgs
parents:
diff changeset
  1405
    m_kineticScroller->stop();
hgs
parents:
diff changeset
  1406
    QPointF pos = gestureEvent->position();
hgs
parents:
diff changeset
  1407
    sendEventToWebKit(QEvent::GraphicsSceneMousePress, pos);
hgs
parents:
diff changeset
  1408
}
hgs
parents:
diff changeset
  1409
hgs
parents:
diff changeset
  1410
void ScrollableWebContentView::handleRelease(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1411
{
hgs
parents:
diff changeset
  1412
    //Cache release event to send on release
hgs
parents:
diff changeset
  1413
    QPointF pos = gestureEvent->position();
hgs
parents:
diff changeset
  1414
    sendEventToWebKit(QEvent::GraphicsSceneMouseRelease, pos);
hgs
parents:
diff changeset
  1415
}
hgs
parents:
diff changeset
  1416
hgs
parents:
diff changeset
  1417
void ScrollableWebContentView::handleDoubleTap(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1418
{
hgs
parents:
diff changeset
  1419
    if (!m_viewportMetaData->m_userScalable)
hgs
parents:
diff changeset
  1420
        return;
hgs
parents:
diff changeset
  1421
hgs
parents:
diff changeset
  1422
    QRectF target;
hgs
parents:
diff changeset
  1423
hgs
parents:
diff changeset
  1424
    //Get the focussable element rect from current touch position
16
hgs
parents: 9
diff changeset
  1425
    QPointF touchPoint = mapFromScene(gestureEvent->position());
hgs
parents: 9
diff changeset
  1426
hgs
parents: 9
diff changeset
  1427
    if(isZoomedIn()) {
hgs
parents: 9
diff changeset
  1428
        startZoomAnimationToHotSpot(touchPoint,size().width() / webView()->size().width());
hgs
parents: 9
diff changeset
  1429
            return;
hgs
parents: 9
diff changeset
  1430
    }
hgs
parents: 9
diff changeset
  1431
hgs
parents: 9
diff changeset
  1432
    QRectF zoomRect = findZoomableRectForPoint(touchPoint);
3
hgs
parents:
diff changeset
  1433
hgs
parents:
diff changeset
  1434
    if (!zoomRect.isValid()) {
hgs
parents:
diff changeset
  1435
        //FIX ME: Add an event ignore animation
hgs
parents:
diff changeset
  1436
        return;
hgs
parents:
diff changeset
  1437
    }
hgs
parents:
diff changeset
  1438
16
hgs
parents: 9
diff changeset
  1439
    startZoomAnimation(zoomRect);
3
hgs
parents:
diff changeset
  1440
}
hgs
parents:
diff changeset
  1441
hgs
parents:
diff changeset
  1442
void ScrollableWebContentView::handlePan(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1443
{
hgs
parents:
diff changeset
  1444
    QPoint scrollPos = ScrollableViewBase::scrollPosition();
hgs
parents:
diff changeset
  1445
    m_kineticScroller->doPan(gestureEvent->delta());
hgs
parents:
diff changeset
  1446
}
hgs
parents:
diff changeset
  1447
hgs
parents:
diff changeset
  1448
void ScrollableWebContentView::handleFlick(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1449
{
hgs
parents:
diff changeset
  1450
    QPoint scrollPos = ScrollableViewBase::scrollPosition();
hgs
parents:
diff changeset
  1451
    m_kineticScroller->doFlick(gestureEvent->velocity());
hgs
parents:
diff changeset
  1452
}
hgs
parents:
diff changeset
  1453
hgs
parents:
diff changeset
  1454
void ScrollableWebContentView::handleLongTap(GestureEvent* gestureEvent)
hgs
parents:
diff changeset
  1455
{
16
hgs
parents: 9
diff changeset
  1456
    QWebPage* page = webView()->page();
hgs
parents: 9
diff changeset
  1457
    QPointF contextPt = webView()->mapFromScene(gestureEvent->position());
3
hgs
parents:
diff changeset
  1458
    QWebHitTestResult result = page->currentFrame()->hitTestContent(contextPt.toPoint());
16
hgs
parents: 9
diff changeset
  1459
    
3
hgs
parents:
diff changeset
  1460
    //Notify context menu observers
16
hgs
parents: 9
diff changeset
  1461
    emit contextEventObject(&result, gestureEvent->position());
3
hgs
parents:
diff changeset
  1462
}
hgs
parents:
diff changeset
  1463
16
hgs
parents: 9
diff changeset
  1464
void ScrollableWebContentView::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
3
hgs
parents:
diff changeset
  1465
{
hgs
parents:
diff changeset
  1466
16
hgs
parents: 9
diff changeset
  1467
    QRectF fillRect = option ? option->exposedRect : QRectF(QPoint(0, 0), size());
3
hgs
parents:
diff changeset
  1468
16
hgs
parents: 9
diff changeset
  1469
    painter->fillRect(fillRect, Qt::white);
3
hgs
parents:
diff changeset
  1470
}
hgs
parents:
diff changeset
  1471
hgs
parents:
diff changeset
  1472
hgs
parents:
diff changeset
  1473
} //namespace GVA