1/*
2 * Copyright (C) 2011 Benjamin Poulain <benjamin@webkit.org>
3 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 *    notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 *    notice, this list of conditions and the following disclaimer in the
11 *    documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23 * THE POSSIBILITY OF SUCH DAMAGE.
24 */
25#include "config.h"
26#include "QtPanGestureRecognizer.h"
27
28#include "PageViewportControllerClientQt.h"
29#include "QtWebPageEventHandler.h"
30
31namespace WebKit {
32
33QtPanGestureRecognizer::QtPanGestureRecognizer(QtWebPageEventHandler* eventHandler)
34    : QtGestureRecognizer(eventHandler)
35{
36    reset();
37}
38
39bool QtPanGestureRecognizer::update(const QTouchEvent::TouchPoint& touchPoint, qint64 eventTimestampMillis)
40{
41    m_lastPosition = touchPoint.pos();
42    m_lastEventTimestampMillis = eventTimestampMillis;
43
44    switch (m_state) {
45    case NoGesture:
46        m_state = GestureRecognitionStarted;
47        m_firstScreenPosition = touchPoint.screenPos();
48        if (viewportController())
49            viewportController()->cancelScrollAnimation();
50        return false;
51    case GestureRecognitionStarted: {
52        // To start the gesture, the delta from start in screen coordinates
53        // must be bigger than the trigger threshold.
54        QPointF totalOffsetFromStart(touchPoint.screenPos() - m_firstScreenPosition);
55        if (qAbs(totalOffsetFromStart.x()) < panningInitialTriggerDistanceThreshold && qAbs(totalOffsetFromStart.y()) < panningInitialTriggerDistanceThreshold)
56            return false;
57
58        m_state = GestureRecognized;
59        if (viewportController())
60            viewportController()->panGestureStarted(touchPoint.pos(), eventTimestampMillis);
61        return true;
62    }
63    case GestureRecognized:
64        if (viewportController())
65            viewportController()->panGestureRequestUpdate(touchPoint.pos(), eventTimestampMillis);
66        return true;
67    default:
68        ASSERT_NOT_REACHED();
69    }
70    return false;
71}
72
73void QtPanGestureRecognizer::finish(const QTouchEvent::TouchPoint& touchPoint, qint64 eventTimestampMillis)
74{
75    if (m_state == NoGesture)
76        return;
77
78    if (viewportController())
79        viewportController()->panGestureEnded(touchPoint.pos(), eventTimestampMillis);
80    reset();
81}
82
83void QtPanGestureRecognizer::cancel()
84{
85    if (m_state == NoGesture)
86        return;
87
88    if (viewportController()) {
89        viewportController()->panGestureEnded(m_lastPosition, m_lastEventTimestampMillis);
90        viewportController()->panGestureCancelled();
91    }
92    reset();
93}
94
95} // namespace WebKit
96