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 |