diff options
author | vollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-17 03:28:27 +0000 |
---|---|---|
committer | vollick@chromium.org <vollick@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-17 03:28:27 +0000 |
commit | a7826751a6148308e774797db2f9842ec1cdefa1 (patch) | |
tree | 3e0385f2a6b4e65bedc14945487a0a17e913aa7c /ui/views/widget | |
parent | c4b89ffbed7bb2d2cde94b5ebd6b42f72bca45db (diff) | |
download | chromium_src-a7826751a6148308e774797db2f9842ec1cdefa1.zip chromium_src-a7826751a6148308e774797db2f9842ec1cdefa1.tar.gz chromium_src-a7826751a6148308e774797db2f9842ec1cdefa1.tar.bz2 |
Initial views touchui Gesture Recognizer support
This is just a merge of Gajen's patch (http://codereview.chromium.org/8364039/) with ToT.
BUG=101645
TEST=views_unittest
Review URL: http://codereview.chromium.org/9076002
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117869 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/views/widget')
-rw-r--r-- | ui/views/widget/native_widget_delegate.h | 4 | ||||
-rw-r--r-- | ui/views/widget/root_view.cc | 75 | ||||
-rw-r--r-- | ui/views/widget/root_view.h | 15 | ||||
-rw-r--r-- | ui/views/widget/widget.cc | 7 | ||||
-rw-r--r-- | ui/views/widget/widget.h | 1 |
5 files changed, 98 insertions, 4 deletions
diff --git a/ui/views/widget/native_widget_delegate.h b/ui/views/widget/native_widget_delegate.h index 317374a..6bbef31 100644 --- a/ui/views/widget/native_widget_delegate.h +++ b/ui/views/widget/native_widget_delegate.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -17,6 +17,7 @@ class Size; namespace views { class InputMethod; +class GestureEvent; class KeyEvent; class MouseEvent; class TouchEvent; @@ -96,6 +97,7 @@ class VIEWS_EXPORT NativeWidgetDelegate { virtual bool OnMouseEvent(const MouseEvent& event) = 0; virtual void OnMouseCaptureLost() = 0; virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) = 0; + virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) = 0; // Runs the specified native command. Returns true if the command is handled. virtual bool ExecuteCommand(int command_id) = 0; diff --git a/ui/views/widget/root_view.cc b/ui/views/widget/root_view.cc index c4978ca..a8f4ef6 100644 --- a/ui/views/widget/root_view.cc +++ b/ui/views/widget/root_view.cc @@ -16,6 +16,7 @@ #include "ui/views/focus/view_storage.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/touchui/gesture_manager.h" +#include "ui/views/touchui/gesture_recognizer.h" #include "ui/views/widget/widget.h" namespace views { @@ -40,6 +41,8 @@ RootView::RootView(Widget* widget) last_mouse_event_y_(-1), gesture_manager_(GestureManager::GetInstance()), touch_pressed_handler_(NULL), + gesture_recognizer_(GestureRecognizer::GetInstance()), + gesture_handling_view_(NULL), ALLOW_THIS_IN_INITIALIZER_LIST(focus_search_(this, false, false)), focus_traversable_parent_(NULL), focus_traversable_parent_view_(NULL) { @@ -337,7 +340,7 @@ ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) { if (touch_pressed_handler_) { TouchEvent touch_event(e, this, touch_pressed_handler_); status = touch_pressed_handler_->ProcessTouchEvent(touch_event); - if (gesture_manager_->ProcessTouchEventForGesture(e, this, status)) + if (DoGestureProcessing(e, status)) status = ui::TOUCH_STATUS_SYNTH_MOUSE; if (status == ui::TOUCH_STATUS_END) touch_pressed_handler_ = NULL; @@ -376,7 +379,7 @@ ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) { if (status != ui::TOUCH_STATUS_START) touch_pressed_handler_ = NULL; - if (gesture_manager_->ProcessTouchEventForGesture(e, this, status)) + if (DoGestureProcessing(e, status)) status = ui::TOUCH_STATUS_SYNTH_MOUSE; return status; } @@ -390,6 +393,42 @@ ui::TouchStatus RootView::OnTouchEvent(const TouchEvent& event) { return status; } +ui::GestureStatus RootView::OnGestureEvent(const GestureEvent& event) { + GestureEvent e(event, this); + ui::GestureStatus status = ui::GESTURE_STATUS_UNKNOWN; + + // Walk up the tree until we find a view that wants the gesture event. + for (gesture_handling_view_ = GetEventHandlerForPoint(e.location()); + gesture_handling_view_ && (gesture_handling_view_ != this); + gesture_handling_view_ = gesture_handling_view_->parent()) { + if (!gesture_handling_view_->enabled()) { + // Disabled views eat events but are treated as not handled by the + // the GestureManager. + return ui::GESTURE_STATUS_UNKNOWN; + } + + // See if this view wants to handle the Gesture. + GestureEvent gesture_event(e, this, gesture_handling_view_); + status = gesture_handling_view_->ProcessGestureEvent(gesture_event); + + // The view could have removed itself from the tree when handling + // OnGestureEvent(). So handle as per OnMousePressed. NB: we + // assume that the RootView itself cannot be so removed. + if (!gesture_handling_view_) return ui::GESTURE_STATUS_UNKNOWN; + + // The gesture event wasn't processed. Go up the view hierarchy and + // dispatch the gesture event. + if (status == ui::GESTURE_STATUS_UNKNOWN) { + continue; + } else if (status == ui::GESTURE_STATUS_CONSUMED) { + return status; + } else { + return ui::GESTURE_STATUS_UNKNOWN; + } + } + return status; +} + void RootView::SetMouseHandler(View *new_mh) { // If we're clearing the mouse handler, clear explicit_mouse_handler_ as well. explicit_mouse_handler_ = (new_mh != NULL); @@ -418,6 +457,8 @@ void RootView::ViewHierarchyChanged(bool is_add, View* parent, View* child) { mouse_move_handler_ = NULL; if (touch_pressed_handler_ == child) touch_pressed_handler_ = NULL; + if (gesture_handling_view_ == child) + gesture_handling_view_ = NULL; } } @@ -457,5 +498,35 @@ void RootView::SetMouseLocationAndFlags(const MouseEvent& event) { last_mouse_event_y_ = event.y(); } +bool RootView::DoGestureProcessing(const TouchEvent& event, + ui::TouchStatus status) { + if (status != ui::TOUCH_STATUS_UNKNOWN) + return false; // The event was consumed by a touch sequence. + + // Get the GestureEvent list processed from GestureRecognizer. + scoped_ptr<GestureRecognizer::Gestures> gestures; + gestures.reset(gesture_recognizer_->ProcessTouchEventForGesture(event, + status)); + bool synthetic = true; + for (unsigned int i = 0; i < gestures->size(); i++) { + GestureEvent* event = gestures->at(i).get(); + GestureEvent e(*event, this); + if (OnGestureEvent(e) == ui::GESTURE_STATUS_CONSUMED) { + // All gesture events should be consumed. + synthetic = false; + } else { + synthetic = true; + break; + } + } + if (synthetic) { + // TODO(Gajen): This should be removed in future once all views are capable + // of handling OnGestureEvent. + return gesture_manager_->ProcessTouchEventForGesture(event, this, + status); + } + return synthetic; +} + } // namespace internal } // namespace views diff --git a/ui/views/widget/root_view.h b/ui/views/widget/root_view.h index 3f372e6..2539676 100644 --- a/ui/views/widget/root_view.h +++ b/ui/views/widget/root_view.h @@ -21,6 +21,7 @@ namespace views { class Widget; class GestureManager; +class GestureRecognizer; // This is a views-internal API and should not be used externally. // Widget exposes this object as a View*. @@ -71,6 +72,9 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable { // Provided only for testing: void SetGestureManagerForTesting(GestureManager* g) { gesture_manager_ = g; } + void SetGestureRecognizerForTesting(GestureRecognizer* gr) { + gesture_recognizer_ = gr; + } // Focus --------------------------------------------------------------------- @@ -110,6 +114,7 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable { virtual void OnMouseExited(const MouseEvent& event) OVERRIDE; virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE; virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE; + virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) OVERRIDE; virtual void SetMouseHandler(View* new_mouse_handler) OVERRIDE; virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; virtual void ReorderChildLayers(ui::Layer* parent_layer) OVERRIDE; @@ -145,6 +150,10 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable { // be applied to the point prior to calling this). void SetMouseLocationAndFlags(const MouseEvent& event); + // Feeds touch event to GestureRecognizer. + // Returns true if the event resulted in firing a synthetic event. + bool DoGestureProcessing(const TouchEvent& event, ui::TouchStatus status); + ////////////////////////////////////////////////////////////////////////////// // Tree operations ----------------------------------------------------------- @@ -179,6 +188,12 @@ class VIEWS_EXPORT RootView : public View, public FocusTraversable { // The view currently handling touch events. View* touch_pressed_handler_; + // The gesture_recognizer_ for this. + GestureRecognizer* gesture_recognizer_; + + // The view currently handling gesture events. + View* gesture_handling_view_; + // Focus --------------------------------------------------------------------- // The focus search algorithm. diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 73c2bd0..b9be13b4 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc @@ -1074,7 +1074,12 @@ void Widget::OnMouseCaptureLost() { ui::TouchStatus Widget::OnTouchEvent(const TouchEvent& event) { ScopedEvent scoped(this, event); - return static_cast<internal::RootView*>(GetRootView())->OnTouchEvent(event); + return GetRootView()->OnTouchEvent(event); +} + +ui::GestureStatus Widget::OnGestureEvent(const GestureEvent& event) { + ScopedEvent scoped(this, event); + return GetRootView()->OnGestureEvent(event); } bool Widget::ExecuteCommand(int command_id) { diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index f00d6b7..f1b2d41 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h @@ -619,6 +619,7 @@ class VIEWS_EXPORT Widget : public internal::NativeWidgetDelegate, virtual bool OnMouseEvent(const MouseEvent& event) OVERRIDE; virtual void OnMouseCaptureLost() OVERRIDE; virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE; + virtual ui::GestureStatus OnGestureEvent(const GestureEvent& event) OVERRIDE; virtual bool ExecuteCommand(int command_id) OVERRIDE; virtual InputMethod* GetInputMethodDirect() OVERRIDE; virtual Widget* AsWidget() OVERRIDE; |