94db9f700998d679a837ca73213ad11e0050eb97
[WebKit-https.git] / Source / WebCore / platform / PlatformWheelEvent.h
1 /*
2  * Copyright (C) 2004, 2005, 2006, 2009 Apple Inc. All rights reserved.
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 COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef PlatformWheelEvent_h
27 #define PlatformWheelEvent_h
28
29 #include "IntPoint.h"
30 #include "PlatformEvent.h"
31 #if OS(WINDOWS)
32 #include "WindowsExtras.h"
33 #endif
34
35 #if PLATFORM(GTK)
36 typedef struct _GdkEventScroll GdkEventScroll;
37 #endif
38
39 #if PLATFORM(EFL)
40 typedef struct _Evas_Event_Mouse_Wheel Evas_Event_Mouse_Wheel;
41 #endif
42
43 #if PLATFORM(WX)
44 class wxMouseEvent;
45 class wxPoint;
46 #endif
47
48 namespace WebCore {
49
50     class FloatPoint;
51     class FloatSize;
52
53     // Wheel events come in two flavors:
54     // The ScrollByPixelWheelEvent is a fine-grained event that specifies the precise number of pixels to scroll.  It is sent directly by MacBook touchpads on OS X,
55     // and synthesized in other cases where platforms generate line-by-line scrolling events.
56     // The ScrollByPageWheelEvent indicates that the wheel event should scroll an entire page.  In this case WebCore's built in paging behavior is used to page
57     // up and down (you get the same behavior as if the user was clicking in a scrollbar track to page up or page down).
58     enum PlatformWheelEventGranularity {
59         ScrollByPageWheelEvent,
60         ScrollByPixelWheelEvent,
61     };
62
63 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
64     enum PlatformWheelEventPhase {
65         PlatformWheelEventPhaseNone        = 0,
66         PlatformWheelEventPhaseBegan       = 1 << 0,
67         PlatformWheelEventPhaseStationary  = 1 << 1,
68         PlatformWheelEventPhaseChanged     = 1 << 2,
69         PlatformWheelEventPhaseEnded       = 1 << 3,
70         PlatformWheelEventPhaseCancelled   = 1 << 4,
71         PlatformWheelEventPhaseMayBegin    = 1 << 5,
72     };
73 #endif
74
75     class PlatformWheelEvent : public PlatformEvent {
76     public:
77         PlatformWheelEvent()
78             : PlatformEvent(PlatformEvent::Wheel)
79             , m_deltaX(0)
80             , m_deltaY(0)
81             , m_wheelTicksX(0)
82             , m_wheelTicksY(0)
83             , m_granularity(ScrollByPixelWheelEvent)
84             , m_directionInvertedFromDevice(false)
85 #if PLATFORM(MAC) || PLATFORM(CHROMIUM)
86             , m_hasPreciseScrollingDeltas(false)
87 #endif
88 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
89             , m_phase(PlatformWheelEventPhaseNone)
90             , m_momentumPhase(PlatformWheelEventPhaseNone)
91             , m_scrollCount(0)
92             , m_unacceleratedScrollingDeltaX(0)
93             , m_unacceleratedScrollingDeltaY(0)
94 #endif
95         {
96         }
97
98         PlatformWheelEvent(IntPoint position, IntPoint globalPosition, float deltaX, float deltaY, float wheelTicksX, float wheelTicksY, PlatformWheelEventGranularity granularity, bool shiftKey, bool ctrlKey, bool altKey, bool metaKey)
99             : PlatformEvent(PlatformEvent::Wheel, shiftKey, ctrlKey, altKey, metaKey, 0)
100             , m_position(position)
101             , m_globalPosition(globalPosition)
102             , m_deltaX(deltaX)
103             , m_deltaY(deltaY)
104             , m_wheelTicksX(wheelTicksX)
105             , m_wheelTicksY(wheelTicksY)
106             , m_granularity(granularity)
107             , m_directionInvertedFromDevice(false)
108 #if PLATFORM(MAC) || PLATFORM(CHROMIUM)
109             , m_hasPreciseScrollingDeltas(false)
110 #endif
111 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
112             , m_phase(PlatformWheelEventPhaseNone)
113             , m_momentumPhase(PlatformWheelEventPhaseNone)
114             , m_scrollCount(0)
115             , m_unacceleratedScrollingDeltaX(0)
116             , m_unacceleratedScrollingDeltaY(0)
117 #endif
118         {
119         }
120
121         PlatformWheelEvent copyTurningVerticalTicksIntoHorizontalTicks() const
122         {
123             PlatformWheelEvent copy = *this;
124
125             copy.m_deltaX = copy.m_deltaY;
126             copy.m_deltaY = 0;
127             copy.m_wheelTicksX = copy.m_wheelTicksY;
128             copy.m_wheelTicksY = 0;
129
130             return copy;
131         }
132
133         const IntPoint& position() const { return m_position; } // PlatformWindow coordinates.
134         const IntPoint& globalPosition() const { return m_globalPosition; } // Screen coordinates.
135
136         float deltaX() const { return m_deltaX; }
137         float deltaY() const { return m_deltaY; }
138
139         float wheelTicksX() const { return m_wheelTicksX; }
140         float wheelTicksY() const { return m_wheelTicksY; }
141
142         PlatformWheelEventGranularity granularity() const { return m_granularity; }
143
144         bool directionInvertedFromDevice() const { return m_directionInvertedFromDevice; }
145
146 #if PLATFORM(GTK)
147         explicit PlatformWheelEvent(GdkEventScroll*);
148 #endif
149
150 #if PLATFORM(EFL)
151         explicit PlatformWheelEvent(const Evas_Event_Mouse_Wheel*);
152 #endif
153
154 #if PLATFORM(MAC) || PLATFORM(CHROMIUM)
155         bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; }
156         void setHasPreciseScrollingDeltas(bool b) { m_hasPreciseScrollingDeltas = b; }
157 #endif
158 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
159         PlatformWheelEventPhase phase() const { return m_phase; }
160         PlatformWheelEventPhase momentumPhase() const { return m_momentumPhase; }
161         unsigned scrollCount() const { return m_scrollCount; }
162         float unacceleratedScrollingDeltaX() const { return m_unacceleratedScrollingDeltaX; }
163         float unacceleratedScrollingDeltaY() const { return m_unacceleratedScrollingDeltaY; }
164         bool useLatchedEventNode() const { return m_momentumPhase == PlatformWheelEventPhaseBegan || m_momentumPhase == PlatformWheelEventPhaseChanged; }
165 #else
166         bool useLatchedEventNode() const { return false; }
167 #endif
168
169 #if PLATFORM(WIN)
170         PlatformWheelEvent(HWND, WPARAM, LPARAM, bool isMouseHWheel);
171         PlatformWheelEvent(HWND, const FloatSize& delta, const FloatPoint& location);
172 #endif
173
174 #if PLATFORM(WX)
175         PlatformWheelEvent(const wxMouseEvent&, const wxPoint&);
176 #endif
177
178     protected:
179         IntPoint m_position;
180         IntPoint m_globalPosition;
181         float m_deltaX;
182         float m_deltaY;
183         float m_wheelTicksX;
184         float m_wheelTicksY;
185         PlatformWheelEventGranularity m_granularity;
186         bool m_directionInvertedFromDevice;
187 #if PLATFORM(MAC) || PLATFORM(CHROMIUM)
188         bool m_hasPreciseScrollingDeltas;
189 #endif
190 #if PLATFORM(MAC) || (PLATFORM(CHROMIUM) && OS(DARWIN))
191         PlatformWheelEventPhase m_phase;
192         PlatformWheelEventPhase m_momentumPhase;
193         unsigned m_scrollCount;
194         float m_unacceleratedScrollingDeltaX;
195         float m_unacceleratedScrollingDeltaY;
196 #endif
197     };
198
199 } // namespace WebCore
200
201 #endif // PlatformWheelEvent_h