Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(978)

Side by Side Diff: views/events/event.h

Issue 8588064: views: Move bubble, events, focus and layout to ui/views/. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 9 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « views/bubble/bubble_frame_view_unittest.cc ('k') | views/events/event.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef VIEWS_EVENTS_EVENT_H_ 5 #ifndef VIEWS_EVENTS_EVENT_H_
6 #define VIEWS_EVENTS_EVENT_H_ 6 #define VIEWS_EVENTS_EVENT_H_
7 #pragma once 7 #pragma once
8 8
9 #include "base/basictypes.h" 9 #include "ui/views/events/event.h"
10 #include "base/time.h" 10 // TODO(tfarina): remove this file once all includes have been updated.
11 #include "ui/base/events.h"
12 #include "ui/base/keycodes/keyboard_codes.h"
13 #include "ui/gfx/point.h"
14 #include "views/views_export.h"
15
16 namespace ui {
17 class OSExchangeData;
18 }
19
20 #if defined(USE_AURA)
21 namespace aura {
22 class Event;
23 }
24 #endif
25
26 // TODO(msw): Remove GTK support from views event code when possible.
27 #if defined(TOOLKIT_USES_GTK)
28 typedef union _GdkEvent GdkEvent;
29 #endif
30
31 namespace views {
32
33 #if defined(USE_AURA)
34 typedef aura::Event* NativeEvent;
35 #else
36 typedef base::NativeEvent NativeEvent;
37 #endif
38
39 class View;
40
41 namespace internal {
42 class NativeWidgetView;
43 class RootView;
44 }
45
46 ////////////////////////////////////////////////////////////////////////////////
47 //
48 // Event class
49 //
50 // An event encapsulates an input event that can be propagated into view
51 // hierarchies. An event has a type, some flags and a time stamp.
52 //
53 // Each major event type has a corresponding Event subclass.
54 //
55 // Events are immutable but support copy
56 //
57 ////////////////////////////////////////////////////////////////////////////////
58 class VIEWS_EXPORT Event {
59 public:
60 const NativeEvent& native_event() const { return native_event_; }
61 #if defined(TOOLKIT_USES_GTK)
62 GdkEvent* gdk_event() const { return gdk_event_; }
63 #endif
64 ui::EventType type() const { return type_; }
65 const base::Time& time_stamp() const { return time_stamp_; }
66 int flags() const { return flags_; }
67 void set_flags(int flags) { flags_ = flags; }
68
69 // The following methods return true if the respective keys were pressed at
70 // the time the event was created.
71 bool IsShiftDown() const { return (flags_ & ui::EF_SHIFT_DOWN) != 0; }
72 bool IsControlDown() const { return (flags_ & ui::EF_CONTROL_DOWN) != 0; }
73 bool IsCapsLockDown() const { return (flags_ & ui::EF_CAPS_LOCK_DOWN) != 0; }
74 bool IsAltDown() const { return (flags_ & ui::EF_ALT_DOWN) != 0; }
75
76 bool IsMouseEvent() const {
77 return type_ == ui::ET_MOUSE_PRESSED ||
78 type_ == ui::ET_MOUSE_DRAGGED ||
79 type_ == ui::ET_MOUSE_RELEASED ||
80 type_ == ui::ET_MOUSE_MOVED ||
81 type_ == ui::ET_MOUSE_ENTERED ||
82 type_ == ui::ET_MOUSE_EXITED ||
83 type_ == ui::ET_MOUSEWHEEL;
84 }
85
86 bool IsTouchEvent() const {
87 return type_ == ui::ET_TOUCH_RELEASED ||
88 type_ == ui::ET_TOUCH_PRESSED ||
89 type_ == ui::ET_TOUCH_MOVED ||
90 type_ == ui::ET_TOUCH_STATIONARY ||
91 type_ == ui::ET_TOUCH_CANCELLED;
92 }
93
94 protected:
95 Event(ui::EventType type, int flags);
96 Event(const NativeEvent& native_event, ui::EventType type, int flags);
97 #if defined(TOOLKIT_USES_GTK)
98 Event(GdkEvent* gdk_event, ui::EventType type, int flags);
99 #endif
100
101 Event(const Event& model)
102 : native_event_(model.native_event()),
103 #if defined(TOOLKIT_USES_GTK)
104 gdk_event_(model.gdk_event_),
105 #endif
106 type_(model.type()),
107 time_stamp_(model.time_stamp()),
108 flags_(model.flags()) {
109 }
110
111 void set_type(ui::EventType type) { type_ = type; }
112
113 private:
114 void operator=(const Event&);
115
116 NativeEvent native_event_;
117 #if defined(TOOLKIT_USES_GTK)
118 GdkEvent* gdk_event_;
119 #endif
120 ui::EventType type_;
121 base::Time time_stamp_;
122 int flags_;
123 };
124
125 ////////////////////////////////////////////////////////////////////////////////
126 //
127 // LocatedEvent class
128 //
129 // A generic event that is used for any events that is located at a specific
130 // position in the screen.
131 //
132 ////////////////////////////////////////////////////////////////////////////////
133 class VIEWS_EXPORT LocatedEvent : public Event {
134 public:
135 int x() const { return location_.x(); }
136 int y() const { return location_.y(); }
137 const gfx::Point& location() const { return location_; }
138
139 protected:
140 explicit LocatedEvent(const NativeEvent& native_event);
141 #if defined(TOOLKIT_USES_GTK)
142 explicit LocatedEvent(GdkEvent* gdk_event);
143 #endif
144
145 // TODO(msw): Kill this legacy constructor when we update uses.
146 // Simple initialization from cracked metadata.
147 LocatedEvent(ui::EventType type, const gfx::Point& location, int flags);
148
149 // Create a new LocatedEvent which is identical to the provided model.
150 // If source / target views are provided, the model location will be converted
151 // from |source| coordinate system to |target| coordinate system.
152 LocatedEvent(const LocatedEvent& model, View* source, View* target);
153
154 // This constructor is to allow converting the location of an event from the
155 // widget's coordinate system to the RootView's coordinate system.
156 LocatedEvent(const LocatedEvent& model, View* root);
157
158 gfx::Point location_;
159 };
160
161 class TouchEvent;
162
163 ////////////////////////////////////////////////////////////////////////////////
164 //
165 // MouseEvent class
166 //
167 // A mouse event is used for any input event related to the mouse.
168 //
169 ////////////////////////////////////////////////////////////////////////////////
170 class VIEWS_EXPORT MouseEvent : public LocatedEvent {
171 public:
172 explicit MouseEvent(const NativeEvent& native_event);
173 #if defined(TOOLKIT_USES_GTK)
174 explicit MouseEvent(GdkEvent* gdk_event);
175 #endif
176
177 // Create a new MouseEvent which is identical to the provided model.
178 // If source / target views are provided, the model location will be converted
179 // from |source| coordinate system to |target| coordinate system.
180 MouseEvent(const MouseEvent& model, View* source, View* target);
181
182 // Creates a new MouseEvent from a TouchEvent. The location of the TouchEvent
183 // is the same as the MouseEvent. Other attributes (e.g. type, flags) are
184 // mapped from the TouchEvent to appropriate MouseEvent attributes.
185 // GestureManager uses this to convert TouchEvents that are not handled by any
186 // view.
187 explicit MouseEvent(const TouchEvent& touch);
188
189 // TODO(msw): Kill this legacy constructor when we update uses.
190 // Create a new mouse event
191 MouseEvent(ui::EventType type, int x, int y, int flags)
192 : LocatedEvent(type, gfx::Point(x, y), flags) {
193 }
194
195 // Conveniences to quickly test what button is down
196 bool IsOnlyLeftMouseButton() const {
197 return (flags() & ui::EF_LEFT_BUTTON_DOWN) &&
198 !(flags() & (ui::EF_MIDDLE_BUTTON_DOWN | ui::EF_RIGHT_BUTTON_DOWN));
199 }
200
201 bool IsLeftMouseButton() const {
202 return (flags() & ui::EF_LEFT_BUTTON_DOWN) != 0;
203 }
204
205 bool IsOnlyMiddleMouseButton() const {
206 return (flags() & ui::EF_MIDDLE_BUTTON_DOWN) &&
207 !(flags() & (ui::EF_LEFT_BUTTON_DOWN | ui::EF_RIGHT_BUTTON_DOWN));
208 }
209
210 bool IsMiddleMouseButton() const {
211 return (flags() & ui::EF_MIDDLE_BUTTON_DOWN) != 0;
212 }
213
214 bool IsOnlyRightMouseButton() const {
215 return (flags() & ui::EF_RIGHT_BUTTON_DOWN) &&
216 !(flags() & (ui::EF_LEFT_BUTTON_DOWN | ui::EF_MIDDLE_BUTTON_DOWN));
217 }
218
219 bool IsRightMouseButton() const {
220 return (flags() & ui::EF_RIGHT_BUTTON_DOWN) != 0;
221 }
222
223 protected:
224 MouseEvent(const MouseEvent& model, View* root)
225 : LocatedEvent(model, root) {
226 }
227
228 private:
229 friend class internal::NativeWidgetView;
230 friend class internal::RootView;
231
232 DISALLOW_COPY_AND_ASSIGN(MouseEvent);
233 };
234
235 ////////////////////////////////////////////////////////////////////////////////
236 //
237 // TouchEvent class
238 //
239 // A touch event is generated by touch screen and advanced track
240 // pad devices. There is a deliberate direct correspondence between
241 // TouchEvent and PlatformTouchPoint.
242 //
243 ////////////////////////////////////////////////////////////////////////////////
244 class VIEWS_EXPORT TouchEvent : public LocatedEvent {
245 public:
246 explicit TouchEvent(const NativeEvent& native_event);
247
248 // Create a new touch event.
249 TouchEvent(ui::EventType type,
250 int x,
251 int y,
252 int flags,
253 int touch_id,
254 float radius_x,
255 float radius_y,
256 float angle,
257 float force);
258
259 // Create a new TouchEvent which is identical to the provided model.
260 // If source / target views are provided, the model location will be converted
261 // from |source| coordinate system to |target| coordinate system.
262 TouchEvent(const TouchEvent& model, View* source, View* target);
263
264 int identity() const { return touch_id_; }
265
266 float radius_x() const { return radius_x_; }
267 float radius_y() const { return radius_y_; }
268 float rotation_angle() const { return rotation_angle_; }
269 float force() const { return force_; }
270
271 private:
272 friend class internal::NativeWidgetView;
273 friend class internal::RootView;
274
275 TouchEvent(const TouchEvent& model, View* root);
276
277 // The identity (typically finger) of the touch starting at 0 and incrementing
278 // for each separable additional touch that the hardware can detect.
279 const int touch_id_;
280
281 // Radius of the X (major) axis of the touch ellipse. 1.0 if unknown.
282 const float radius_x_;
283
284 // Radius of the Y (minor) axis of the touch ellipse. 1.0 if unknown.
285 const float radius_y_;
286
287 // Angle of the major axis away from the X axis. Default 0.0.
288 const float rotation_angle_;
289
290 // Force (pressure) of the touch. Normalized to be [0, 1]. Default to be 0.0.
291 const float force_;
292
293 DISALLOW_COPY_AND_ASSIGN(TouchEvent);
294 };
295
296 ////////////////////////////////////////////////////////////////////////////////
297 // KeyEvent class
298 //
299 // KeyEvent encapsulates keyboard input events - key press and release.
300 //
301 ////////////////////////////////////////////////////////////////////////////////
302 class VIEWS_EXPORT KeyEvent : public Event {
303 public:
304 explicit KeyEvent(const NativeEvent& native_event);
305 #if defined(TOOLKIT_USES_GTK)
306 explicit KeyEvent(GdkEvent* gdk_event);
307 #endif
308
309 // Creates a new KeyEvent synthetically (i.e. not in response to an input
310 // event from the host environment). This is typically only used in testing as
311 // some metadata obtainable from the underlying native event is not present.
312 // It's also used by input methods to fabricate keyboard events.
313 KeyEvent(ui::EventType type,
314 ui::KeyboardCode key_code,
315 int event_flags);
316
317 ui::KeyboardCode key_code() const { return key_code_; }
318
319 // These setters allow an I18N virtual keyboard to fabricate a keyboard event
320 // which does not have a corresponding ui::KeyboardCode (example: U+00E1 Latin
321 // small letter A with acute, U+0410 Cyrillic capital letter A.)
322 // GetCharacter() and GetUnmodifiedCharacter() return the character.
323 void set_character(uint16 character) { character_ = character; }
324 void set_unmodified_character(uint16 unmodified_character) {
325 unmodified_character_ = unmodified_character;
326 }
327
328 // Gets the character generated by this key event. It only supports Unicode
329 // BMP characters.
330 uint16 GetCharacter() const;
331
332 // Gets the character generated by this key event ignoring concurrently-held
333 // modifiers (except shift).
334 uint16 GetUnmodifiedCharacter() const;
335
336 private:
337 ui::KeyboardCode key_code_;
338
339 uint16 character_;
340 uint16 unmodified_character_;
341
342 DISALLOW_COPY_AND_ASSIGN(KeyEvent);
343 };
344
345 ////////////////////////////////////////////////////////////////////////////////
346 //
347 // MouseWheelEvent class
348 //
349 // A MouseWheelEvent is used to propagate mouse wheel user events.
350 // Note: e.GetOffset() > 0 means scroll up / left.
351 //
352 ////////////////////////////////////////////////////////////////////////////////
353 class VIEWS_EXPORT MouseWheelEvent : public MouseEvent {
354 public:
355 // See |offset| for details.
356 static const int kWheelDelta;
357
358 explicit MouseWheelEvent(const NativeEvent& native_event);
359 #if defined(TOOLKIT_USES_GTK)
360 explicit MouseWheelEvent(GdkEvent* gdk_event);
361 #endif
362
363 // The amount to scroll. This is in multiples of kWheelDelta.
364 int offset() const { return offset_; }
365
366 private:
367 friend class internal::RootView;
368 friend class internal::NativeWidgetView;
369
370 MouseWheelEvent(const MouseWheelEvent& model, View* root)
371 : MouseEvent(model, root),
372 offset_(model.offset_) {
373 }
374
375 int offset_;
376
377 DISALLOW_COPY_AND_ASSIGN(MouseWheelEvent);
378 };
379
380 ////////////////////////////////////////////////////////////////////////////////
381 //
382 // DropTargetEvent class
383 //
384 // A DropTargetEvent is sent to the view the mouse is over during a drag and
385 // drop operation.
386 //
387 ////////////////////////////////////////////////////////////////////////////////
388 class VIEWS_EXPORT DropTargetEvent : public LocatedEvent {
389 public:
390 DropTargetEvent(const ui::OSExchangeData& data,
391 int x,
392 int y,
393 int source_operations)
394 : LocatedEvent(ui::ET_DROP_TARGET_EVENT, gfx::Point(x, y), 0),
395 data_(data),
396 source_operations_(source_operations) {
397 // TODO(msw): Hook up key state flags for CTRL + drag and drop, etc.
398 }
399
400 const ui::OSExchangeData& data() const { return data_; }
401 int source_operations() const { return source_operations_; }
402
403 private:
404 // Data associated with the drag/drop session.
405 const ui::OSExchangeData& data_;
406
407 // Bitmask of supported ui::DragDropTypes::DragOperation by the source.
408 int source_operations_;
409
410 DISALLOW_COPY_AND_ASSIGN(DropTargetEvent);
411 };
412
413 } // namespace views
414 11
415 #endif // VIEWS_EVENTS_EVENT_H_ 12 #endif // VIEWS_EVENTS_EVENT_H_
OLDNEW
« no previous file with comments | « views/bubble/bubble_frame_view_unittest.cc ('k') | views/events/event.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698