| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 #include "ui/views/widget/root_view.h" | 5 #include "ui/views/widget/root_view.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 | 189 |
| 190 return status; | 190 return status; |
| 191 } | 191 } |
| 192 | 192 |
| 193 // Reset touch_pressed_handler_ to indicate that no processing is occurring. | 193 // Reset touch_pressed_handler_ to indicate that no processing is occurring. |
| 194 touch_pressed_handler_ = NULL; | 194 touch_pressed_handler_ = NULL; |
| 195 | 195 |
| 196 return status; | 196 return status; |
| 197 } | 197 } |
| 198 | 198 |
| 199 ui::EventResult RootView::DispatchGestureEvent(ui::GestureEvent* event) { | 199 void RootView::DispatchGestureEvent(ui::GestureEvent* event) { |
| 200 ui::EventResult status = ui::ER_UNHANDLED; | |
| 201 | |
| 202 if (gesture_handler_) { | 200 if (gesture_handler_) { |
| 203 // |gesture_handler_| (or |scroll_gesture_handler_|) can be deleted during | 201 // |gesture_handler_| (or |scroll_gesture_handler_|) can be deleted during |
| 204 // processing. | 202 // processing. |
| 205 View* handler = scroll_gesture_handler_ && | 203 View* handler = scroll_gesture_handler_ && |
| 206 (event->IsScrollGestureEvent() || event->IsFlingScrollEvent()) ? | 204 (event->IsScrollGestureEvent() || event->IsFlingScrollEvent()) ? |
| 207 scroll_gesture_handler_ : gesture_handler_; | 205 scroll_gesture_handler_ : gesture_handler_; |
| 208 ui::GestureEvent handler_event(*event, static_cast<View*>(this), handler); | 206 ui::GestureEvent handler_event(*event, static_cast<View*>(this), handler); |
| 209 | 207 handler->ProcessGestureEvent(&handler_event); |
| 210 ui::EventResult status = handler->ProcessGestureEvent(&handler_event); | |
| 211 | 208 |
| 212 if (event->type() == ui::ET_GESTURE_END && | 209 if (event->type() == ui::ET_GESTURE_END && |
| 213 event->details().touch_points() <= 1) { | 210 event->details().touch_points() <= 1) { |
| 214 // In case a drag was in progress, reset all the handlers. Otherwise, just | 211 // In case a drag was in progress, reset all the handlers. Otherwise, just |
| 215 // reset the gesture handler. | 212 // reset the gesture handler. |
| 216 if (gesture_handler_ == mouse_pressed_handler_) | 213 if (gesture_handler_ == mouse_pressed_handler_) |
| 217 SetMouseHandler(NULL); | 214 SetMouseHandler(NULL); |
| 218 else | 215 else |
| 219 gesture_handler_ = NULL; | 216 gesture_handler_ = NULL; |
| 220 } | 217 } |
| 221 | 218 |
| 222 if (scroll_gesture_handler_ && | 219 if (scroll_gesture_handler_ && |
| 223 (event->type() == ui::ET_GESTURE_SCROLL_END || | 220 (event->type() == ui::ET_GESTURE_SCROLL_END || |
| 224 event->type() == ui::ET_SCROLL_FLING_START)) { | 221 event->type() == ui::ET_SCROLL_FLING_START)) { |
| 225 scroll_gesture_handler_ = NULL; | 222 scroll_gesture_handler_ = NULL; |
| 226 } | 223 } |
| 227 | 224 |
| 228 if (status == ui::ER_CONSUMED) | 225 if (handler_event.stopped_propagation()) { |
| 229 return status; | 226 event->StopPropagation(); |
| 230 | 227 return; |
| 231 DCHECK_EQ(ui::ER_UNHANDLED, status); | 228 } else if (handler_event.handled()) { |
| 229 event->SetHandled(); |
| 230 return; |
| 231 } |
| 232 | 232 |
| 233 if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN && | 233 if (event->type() == ui::ET_GESTURE_SCROLL_BEGIN && |
| 234 !scroll_gesture_handler_) { | 234 !scroll_gesture_handler_) { |
| 235 // Some view started processing gesture events, however it does not | 235 // Some view started processing gesture events, however it does not |
| 236 // process scroll-gesture events. In such case, we allow the event to | 236 // process scroll-gesture events. In such case, we allow the event to |
| 237 // bubble up, and install a different scroll-gesture handler different | 237 // bubble up, and install a different scroll-gesture handler different |
| 238 // from the default gesture handler. | 238 // from the default gesture handler. |
| 239 for (scroll_gesture_handler_ = gesture_handler_->parent(); | 239 for (scroll_gesture_handler_ = gesture_handler_->parent(); |
| 240 scroll_gesture_handler_ && scroll_gesture_handler_ != this; | 240 scroll_gesture_handler_ && scroll_gesture_handler_ != this; |
| 241 scroll_gesture_handler_ = scroll_gesture_handler_->parent()) { | 241 scroll_gesture_handler_ = scroll_gesture_handler_->parent()) { |
| 242 ui::GestureEvent gesture_event(*event, static_cast<View*>(this), | 242 ui::GestureEvent gesture_event(*event, static_cast<View*>(this), |
| 243 scroll_gesture_handler_); | 243 scroll_gesture_handler_); |
| 244 status = scroll_gesture_handler_->ProcessGestureEvent(&gesture_event); | 244 scroll_gesture_handler_->ProcessGestureEvent(&gesture_event); |
| 245 if (status == ui::ER_CONSUMED) | 245 if (gesture_event.stopped_propagation()) { |
| 246 return status; | 246 event->StopPropagation(); |
| 247 return; |
| 248 } else if (gesture_event.handled()) { |
| 249 event->SetHandled(); |
| 250 return; |
| 251 } |
| 247 } | 252 } |
| 248 scroll_gesture_handler_ = NULL; | 253 scroll_gesture_handler_ = NULL; |
| 249 } | 254 } |
| 250 | 255 |
| 251 return ui::ER_UNHANDLED; | 256 return; |
| 252 } | 257 } |
| 253 | 258 |
| 254 // Walk up the tree until we find a view that wants the gesture event. | 259 // Walk up the tree until we find a view that wants the gesture event. |
| 255 for (gesture_handler_ = GetEventHandlerForPoint(event->location()); | 260 for (gesture_handler_ = GetEventHandlerForPoint(event->location()); |
| 256 gesture_handler_ && (gesture_handler_ != this); | 261 gesture_handler_ && (gesture_handler_ != this); |
| 257 gesture_handler_ = gesture_handler_->parent()) { | 262 gesture_handler_ = gesture_handler_->parent()) { |
| 258 if (!gesture_handler_->enabled()) { | 263 if (!gesture_handler_->enabled()) { |
| 259 // Disabled views eat events but are treated as not handled. | 264 // Disabled views eat events but are treated as not handled. |
| 260 return ui::ER_UNHANDLED; | 265 return; |
| 261 } | 266 } |
| 262 | 267 |
| 263 // See if this view wants to handle the Gesture. | 268 // See if this view wants to handle the Gesture. |
| 264 ui::GestureEvent gesture_event(*event, static_cast<View*>(this), | 269 ui::GestureEvent gesture_event(*event, static_cast<View*>(this), |
| 265 gesture_handler_); | 270 gesture_handler_); |
| 266 status = gesture_handler_->ProcessGestureEvent(&gesture_event); | 271 gesture_handler_->ProcessGestureEvent(&gesture_event); |
| 267 | 272 |
| 268 // The view could have removed itself from the tree when handling | 273 // The view could have removed itself from the tree when handling |
| 269 // OnGestureEvent(). So handle as per OnMousePressed. NB: we | 274 // OnGestureEvent(). So handle as per OnMousePressed. NB: we |
| 270 // assume that the RootView itself cannot be so removed. | 275 // assume that the RootView itself cannot be so removed. |
| 271 if (!gesture_handler_) | 276 if (!gesture_handler_) |
| 272 return ui::ER_UNHANDLED; | 277 return; |
| 273 | 278 |
| 274 if (status == ui::ER_CONSUMED) { | 279 if (gesture_event.handled()) { |
| 275 if (gesture_event.type() == ui::ET_GESTURE_SCROLL_BEGIN) | 280 if (gesture_event.type() == ui::ET_GESTURE_SCROLL_BEGIN) |
| 276 scroll_gesture_handler_ = gesture_handler_; | 281 scroll_gesture_handler_ = gesture_handler_; |
| 277 return status; | 282 if (gesture_event.stopped_propagation()) |
| 283 event->StopPropagation(); |
| 284 else |
| 285 event->SetHandled(); |
| 286 return; |
| 278 } | 287 } |
| 279 | 288 |
| 280 // The gesture event wasn't processed. Go up the view hierarchy and | 289 // The gesture event wasn't processed. Go up the view hierarchy and |
| 281 // dispatch the gesture event. | 290 // dispatch the gesture event. |
| 282 DCHECK_EQ(ui::ER_UNHANDLED, status); | |
| 283 } | 291 } |
| 284 | 292 |
| 285 gesture_handler_ = NULL; | 293 gesture_handler_ = NULL; |
| 286 | |
| 287 return status; | |
| 288 } | 294 } |
| 289 | 295 |
| 290 // Focus ----------------------------------------------------------------------- | 296 // Focus ----------------------------------------------------------------------- |
| 291 | 297 |
| 292 void RootView::SetFocusTraversableParent(FocusTraversable* focus_traversable) { | 298 void RootView::SetFocusTraversableParent(FocusTraversable* focus_traversable) { |
| 293 DCHECK(focus_traversable != this); | 299 DCHECK(focus_traversable != this); |
| 294 focus_traversable_parent_ = focus_traversable; | 300 focus_traversable_parent_ = focus_traversable; |
| 295 } | 301 } |
| 296 | 302 |
| 297 void RootView::SetFocusTraversableParentView(View* view) { | 303 void RootView::SetFocusTraversableParentView(View* view) { |
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 } | 619 } |
| 614 | 620 |
| 615 void RootView::SetMouseLocationAndFlags(const ui::MouseEvent& event) { | 621 void RootView::SetMouseLocationAndFlags(const ui::MouseEvent& event) { |
| 616 last_mouse_event_flags_ = event.flags(); | 622 last_mouse_event_flags_ = event.flags(); |
| 617 last_mouse_event_x_ = event.x(); | 623 last_mouse_event_x_ = event.x(); |
| 618 last_mouse_event_y_ = event.y(); | 624 last_mouse_event_y_ = event.y(); |
| 619 } | 625 } |
| 620 | 626 |
| 621 } // namespace internal | 627 } // namespace internal |
| 622 } // namespace views | 628 } // namespace views |
| OLD | NEW |