| OLD | NEW | 
|---|
| 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 #include "views/widget/root_view.h" | 5 #include "views/widget/root_view.h" | 
| 6 | 6 | 
| 7 #include <algorithm> | 7 #include <algorithm> | 
| 8 | 8 | 
| 9 #if defined(TOUCH_UI) && defined(HAVE_XINPUT2) | 9 #if defined(TOUCH_UI) && defined(HAVE_XINPUT2) | 
| 10 #include <gdk/gdkx.h> | 10 #include <gdk/gdkx.h> | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 97 #ifndef NDEBUG | 97 #ifndef NDEBUG | 
| 98       , | 98       , | 
| 99       is_processing_paint_(false) | 99       is_processing_paint_(false) | 
| 100 #endif | 100 #endif | 
| 101 { | 101 { | 
| 102 } | 102 } | 
| 103 | 103 | 
| 104 RootView::~RootView() { | 104 RootView::~RootView() { | 
| 105   // If we have children remove them explicitly so to make sure a remove | 105   // If we have children remove them explicitly so to make sure a remove | 
| 106   // notification is sent for each one of them. | 106   // notification is sent for each one of them. | 
| 107   if (!child_views_.empty()) | 107   if (has_children()) | 
| 108     RemoveAllChildViews(true); | 108     RemoveAllChildViews(true); | 
| 109 | 109 | 
| 110   if (pending_paint_task_) | 110   if (pending_paint_task_) | 
| 111     pending_paint_task_->Cancel();  // Ensure we're not called any more. | 111     pending_paint_task_->Cancel();  // Ensure we're not called any more. | 
| 112 } | 112 } | 
| 113 | 113 | 
| 114 void RootView::SetContentsView(View* contents_view) { | 114 void RootView::SetContentsView(View* contents_view) { | 
| 115   DCHECK(contents_view && GetWidget()->GetNativeView()) << | 115   DCHECK(contents_view && GetWidget()->GetNativeView()) << | 
| 116       "Can't be called until after the native view is created!"; | 116       "Can't be called until after the native view is created!"; | 
| 117   // The ContentsView must be set up _after_ the window is created so that its | 117   // The ContentsView must be set up _after_ the window is created so that its | 
| 118   // Widget pointer is valid. | 118   // Widget pointer is valid. | 
| 119   SetLayoutManager(new FillLayout); | 119   SetLayoutManager(new FillLayout); | 
| 120   if (GetChildViewCount() != 0) | 120   if (has_children()) | 
| 121     RemoveAllChildViews(true); | 121     RemoveAllChildViews(true); | 
| 122   AddChildView(contents_view); | 122   AddChildView(contents_view); | 
| 123 | 123 | 
| 124   // Force a layout now, since the attached hierarchy won't be ready for the | 124   // Force a layout now, since the attached hierarchy won't be ready for the | 
| 125   // containing window's bounds. Note that we call Layout directly rather than | 125   // containing window's bounds. Note that we call Layout directly rather than | 
| 126   // calling the widget's size changed handler, since the RootView's bounds may | 126   // calling the widget's size changed handler, since the RootView's bounds may | 
| 127   // not have changed, which will cause the Layout not to be done otherwise. | 127   // not have changed, which will cause the Layout not to be done otherwise. | 
| 128   Layout(); | 128   Layout(); | 
| 129 } | 129 } | 
| 130 | 130 | 
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 245 | 245 | 
| 246   return invalid_rect_.Intersect(GetLocalBounds()); | 246   return invalid_rect_.Intersect(GetLocalBounds()); | 
| 247 } | 247 } | 
| 248 | 248 | 
| 249 ///////////////////////////////////////////////////////////////////////////// | 249 ///////////////////////////////////////////////////////////////////////////// | 
| 250 // | 250 // | 
| 251 // RootView - tree | 251 // RootView - tree | 
| 252 // | 252 // | 
| 253 ///////////////////////////////////////////////////////////////////////////// | 253 ///////////////////////////////////////////////////////////////////////////// | 
| 254 | 254 | 
| 255 Widget* RootView::GetWidget() const { | 255 const Widget* RootView::GetWidget() const { | 
| 256   return widget_; | 256   return widget_; | 
| 257 } | 257 } | 
| 258 | 258 | 
|  | 259 Widget* RootView::GetWidget() { | 
|  | 260   return const_cast<Widget*>(const_cast<const RootView*>(this)->GetWidget()); | 
|  | 261 } | 
|  | 262 | 
| 259 void RootView::NotifyThemeChanged() { | 263 void RootView::NotifyThemeChanged() { | 
| 260   View::PropagateThemeChanged(); | 264   View::PropagateThemeChanged(); | 
| 261 } | 265 } | 
| 262 | 266 | 
| 263 void RootView::NotifyLocaleChanged() { | 267 void RootView::NotifyLocaleChanged() { | 
| 264   View::PropagateLocaleChanged(); | 268   View::PropagateLocaleChanged(); | 
| 265 } | 269 } | 
| 266 | 270 | 
| 267 ///////////////////////////////////////////////////////////////////////////// | 271 ///////////////////////////////////////////////////////////////////////////// | 
| 268 // | 272 // | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 325     status = touch_pressed_handler_->ProcessTouchEvent(touch_event); | 329     status = touch_pressed_handler_->ProcessTouchEvent(touch_event); | 
| 326     gesture_manager_->ProcessTouchEventForGesture(e, this, status); | 330     gesture_manager_->ProcessTouchEventForGesture(e, this, status); | 
| 327     if (status == TOUCH_STATUS_END) | 331     if (status == TOUCH_STATUS_END) | 
| 328       touch_pressed_handler_ = NULL; | 332       touch_pressed_handler_ = NULL; | 
| 329     return status; | 333     return status; | 
| 330   } | 334   } | 
| 331 | 335 | 
| 332   // Walk up the tree until we find a view that wants the touch event. | 336   // Walk up the tree until we find a view that wants the touch event. | 
| 333   for (touch_pressed_handler_ = GetViewForPoint(e.location()); | 337   for (touch_pressed_handler_ = GetViewForPoint(e.location()); | 
| 334        touch_pressed_handler_ && (touch_pressed_handler_ != this); | 338        touch_pressed_handler_ && (touch_pressed_handler_ != this); | 
| 335        touch_pressed_handler_ = touch_pressed_handler_->GetParent()) { | 339        touch_pressed_handler_ = touch_pressed_handler_->parent()) { | 
| 336     if (!touch_pressed_handler_->IsEnabled()) { | 340     if (!touch_pressed_handler_->IsEnabled()) { | 
| 337       // Disabled views eat events but are treated as not handled by the | 341       // Disabled views eat events but are treated as not handled by the | 
| 338       // the GestureManager. | 342       // the GestureManager. | 
| 339       status = TOUCH_STATUS_UNKNOWN; | 343       status = TOUCH_STATUS_UNKNOWN; | 
| 340       break; | 344       break; | 
| 341     } | 345     } | 
| 342 | 346 | 
| 343     // See if this view wants to handle the touch | 347     // See if this view wants to handle the touch | 
| 344     TouchEvent touch_event(e, this, touch_pressed_handler_); | 348     TouchEvent touch_event(e, this, touch_pressed_handler_); | 
| 345     status = touch_pressed_handler_->ProcessTouchEvent(touch_event); | 349     status = touch_pressed_handler_->ProcessTouchEvent(touch_event); | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 400     mouse_pressed_handler_->ProcessMousePressed(mouse_pressed_event, | 404     mouse_pressed_handler_->ProcessMousePressed(mouse_pressed_event, | 
| 401                                                 &drag_info); | 405                                                 &drag_info); | 
| 402     return true; | 406     return true; | 
| 403   } | 407   } | 
| 404   DCHECK(!explicit_mouse_handler_); | 408   DCHECK(!explicit_mouse_handler_); | 
| 405 | 409 | 
| 406   bool hit_disabled_view = false; | 410   bool hit_disabled_view = false; | 
| 407   // Walk up the tree until we find a view that wants the mouse event. | 411   // Walk up the tree until we find a view that wants the mouse event. | 
| 408   for (mouse_pressed_handler_ = GetViewForPoint(e.location()); | 412   for (mouse_pressed_handler_ = GetViewForPoint(e.location()); | 
| 409        mouse_pressed_handler_ && (mouse_pressed_handler_ != this); | 413        mouse_pressed_handler_ && (mouse_pressed_handler_ != this); | 
| 410        mouse_pressed_handler_ = mouse_pressed_handler_->GetParent()) { | 414        mouse_pressed_handler_ = mouse_pressed_handler_->parent()) { | 
| 411     if (!mouse_pressed_handler_->IsEnabled()) { | 415     if (!mouse_pressed_handler_->IsEnabled()) { | 
| 412       // Disabled views should eat events instead of propagating them upwards. | 416       // Disabled views should eat events instead of propagating them upwards. | 
| 413       hit_disabled_view = true; | 417       hit_disabled_view = true; | 
| 414       break; | 418       break; | 
| 415     } | 419     } | 
| 416 | 420 | 
| 417     // See if this view wants to handle the mouse press. | 421     // See if this view wants to handle the mouse press. | 
| 418     MouseEvent mouse_pressed_event(e, this, mouse_pressed_handler_); | 422     MouseEvent mouse_pressed_event(e, this, mouse_pressed_handler_); | 
| 419 | 423 | 
| 420     // Remove the double-click flag if the handler is different than the | 424     // Remove the double-click flag if the handler is different than the | 
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 540   } | 544   } | 
| 541 } | 545 } | 
| 542 | 546 | 
| 543 void RootView::OnMouseMoved(const MouseEvent& e) { | 547 void RootView::OnMouseMoved(const MouseEvent& e) { | 
| 544   View* v = GetViewForPoint(e.location()); | 548   View* v = GetViewForPoint(e.location()); | 
| 545   // Find the first enabled view, or the existing move handler, whichever comes | 549   // Find the first enabled view, or the existing move handler, whichever comes | 
| 546   // first.  The check for the existing handler is because if a view becomes | 550   // first.  The check for the existing handler is because if a view becomes | 
| 547   // disabled while handling moves, it's wrong to suddenly send ET_MOUSE_EXITED | 551   // disabled while handling moves, it's wrong to suddenly send ET_MOUSE_EXITED | 
| 548   // and ET_MOUSE_ENTERED events, because the mouse hasn't actually exited yet. | 552   // and ET_MOUSE_ENTERED events, because the mouse hasn't actually exited yet. | 
| 549   while (v && !v->IsEnabled() && (v != mouse_move_handler_)) | 553   while (v && !v->IsEnabled() && (v != mouse_move_handler_)) | 
| 550     v = v->GetParent(); | 554     v = v->parent(); | 
| 551   if (v && v != this) { | 555   if (v && v != this) { | 
| 552     if (v != mouse_move_handler_) { | 556     if (v != mouse_move_handler_) { | 
| 553       if (mouse_move_handler_ != NULL) { | 557       if (mouse_move_handler_ != NULL) { | 
| 554         MouseEvent exited_event(Event::ET_MOUSE_EXITED, 0, 0, 0); | 558         MouseEvent exited_event(Event::ET_MOUSE_EXITED, 0, 0, 0); | 
| 555         mouse_move_handler_->OnMouseExited(exited_event); | 559         mouse_move_handler_->OnMouseExited(exited_event); | 
| 556       } | 560       } | 
| 557 | 561 | 
| 558       mouse_move_handler_ = v; | 562       mouse_move_handler_ = v; | 
| 559 | 563 | 
| 560       MouseEvent entered_event(Event::ET_MOUSE_ENTERED, | 564       MouseEvent entered_event(Event::ET_MOUSE_ENTERED, | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 674   bool consumed = false; | 678   bool consumed = false; | 
| 675 | 679 | 
| 676   View* v = GetFocusedView(); | 680   View* v = GetFocusedView(); | 
| 677   // Special case to handle right-click context menus triggered by the | 681   // Special case to handle right-click context menus triggered by the | 
| 678   // keyboard. | 682   // keyboard. | 
| 679   if (v && v->IsEnabled() && ((event.GetKeyCode() == ui::VKEY_APPS) || | 683   if (v && v->IsEnabled() && ((event.GetKeyCode() == ui::VKEY_APPS) || | 
| 680      (event.GetKeyCode() == ui::VKEY_F10 && event.IsShiftDown()))) { | 684      (event.GetKeyCode() == ui::VKEY_F10 && event.IsShiftDown()))) { | 
| 681     v->ShowContextMenu(v->GetKeyboardContextMenuLocation(), false); | 685     v->ShowContextMenu(v->GetKeyboardContextMenuLocation(), false); | 
| 682     return true; | 686     return true; | 
| 683   } | 687   } | 
| 684   for (; v && v != this && !consumed; v = v->GetParent()) { | 688   for (; v && v != this && !consumed; v = v->parent()) { | 
| 685     consumed = (event.GetType() == Event::ET_KEY_PRESSED) ? | 689     consumed = (event.GetType() == Event::ET_KEY_PRESSED) ? | 
| 686         v->OnKeyPressed(event) : v->OnKeyReleased(event); | 690         v->OnKeyPressed(event) : v->OnKeyReleased(event); | 
| 687   } | 691   } | 
| 688 | 692 | 
| 689   if (!consumed && default_keyboard_handler_) { | 693   if (!consumed && default_keyboard_handler_) { | 
| 690     consumed = (event.GetType() == Event::ET_KEY_PRESSED) ? | 694     consumed = (event.GetType() == Event::ET_KEY_PRESSED) ? | 
| 691         default_keyboard_handler_->OnKeyPressed(event) : | 695         default_keyboard_handler_->OnKeyPressed(event) : | 
| 692         default_keyboard_handler_->OnKeyReleased(event); | 696         default_keyboard_handler_->OnKeyReleased(event); | 
| 693   } | 697   } | 
| 694 | 698 | 
| 695   return consumed; | 699   return consumed; | 
| 696 } | 700 } | 
| 697 | 701 | 
| 698 bool RootView::ProcessMouseWheelEvent(const MouseWheelEvent& e) { | 702 bool RootView::ProcessMouseWheelEvent(const MouseWheelEvent& e) { | 
| 699   View* v; | 703   View* v; | 
| 700   bool consumed = false; | 704   bool consumed = false; | 
| 701   if (GetFocusedView()) { | 705   if (GetFocusedView()) { | 
| 702     for (v = GetFocusedView(); | 706     for (v = GetFocusedView(); v && v != this && !consumed; v = v->parent()) | 
| 703          v && v != this && !consumed; v = v->GetParent()) { |  | 
| 704       consumed = v->OnMouseWheel(e); | 707       consumed = v->OnMouseWheel(e); | 
| 705     } |  | 
| 706   } | 708   } | 
| 707 | 709 | 
| 708   if (!consumed && default_keyboard_handler_) { | 710   if (!consumed && default_keyboard_handler_) { | 
| 709     consumed = default_keyboard_handler_->OnMouseWheel(e); | 711     consumed = default_keyboard_handler_->OnMouseWheel(e); | 
| 710   } | 712   } | 
| 711   return consumed; | 713   return consumed; | 
| 712 } | 714 } | 
| 713 | 715 | 
| 714 void RootView::SetDefaultKeyboardHandler(View* v) { | 716 void RootView::SetDefaultKeyboardHandler(View* v) { | 
| 715   default_keyboard_handler_ = v; | 717   default_keyboard_handler_ = v; | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 729        i != view->descendants_to_notify_->end(); ++i) { | 731        i != view->descendants_to_notify_->end(); ++i) { | 
| 730     (*i)->VisibleBoundsInRootChanged(); | 732     (*i)->VisibleBoundsInRootChanged(); | 
| 731   } | 733   } | 
| 732 } | 734 } | 
| 733 | 735 | 
| 734 void RootView::RegisterViewForVisibleBoundsNotification(View* view) { | 736 void RootView::RegisterViewForVisibleBoundsNotification(View* view) { | 
| 735   DCHECK(view); | 737   DCHECK(view); | 
| 736   if (view->registered_for_visible_bounds_notification_) | 738   if (view->registered_for_visible_bounds_notification_) | 
| 737     return; | 739     return; | 
| 738   view->registered_for_visible_bounds_notification_ = true; | 740   view->registered_for_visible_bounds_notification_ = true; | 
| 739   View* ancestor = view->GetParent(); | 741   View* ancestor = view->parent(); | 
| 740   while (ancestor) { | 742   while (ancestor) { | 
| 741     ancestor->AddDescendantToNotify(view); | 743     ancestor->AddDescendantToNotify(view); | 
| 742     ancestor = ancestor->GetParent(); | 744     ancestor = ancestor->parent(); | 
| 743   } | 745   } | 
| 744 } | 746 } | 
| 745 | 747 | 
| 746 void RootView::UnregisterViewForVisibleBoundsNotification(View* view) { | 748 void RootView::UnregisterViewForVisibleBoundsNotification(View* view) { | 
| 747   DCHECK(view); | 749   DCHECK(view); | 
| 748   if (!view->registered_for_visible_bounds_notification_) | 750   if (!view->registered_for_visible_bounds_notification_) | 
| 749     return; | 751     return; | 
| 750   view->registered_for_visible_bounds_notification_ = false; | 752   view->registered_for_visible_bounds_notification_ = false; | 
| 751   View* ancestor = view->GetParent(); | 753   View* ancestor = view->parent(); | 
| 752   while (ancestor) { | 754   while (ancestor) { | 
| 753     ancestor->RemoveDescendantToNotify(view); | 755     ancestor->RemoveDescendantToNotify(view); | 
| 754     ancestor = ancestor->GetParent(); | 756     ancestor = ancestor->parent(); | 
| 755   } | 757   } | 
| 756 } | 758 } | 
| 757 | 759 | 
| 758 void RootView::SetMouseLocationAndFlags(const MouseEvent& e) { | 760 void RootView::SetMouseLocationAndFlags(const MouseEvent& e) { | 
| 759   last_mouse_event_flags_ = e.GetFlags(); | 761   last_mouse_event_flags_ = e.GetFlags(); | 
| 760   last_mouse_event_x_ = e.x(); | 762   last_mouse_event_x_ = e.x(); | 
| 761   last_mouse_event_y_ = e.y(); | 763   last_mouse_event_y_ = e.y(); | 
| 762 } | 764 } | 
| 763 | 765 | 
| 764 std::string RootView::GetClassName() const { | 766 std::string RootView::GetClassName() const { | 
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 807   if (!TouchFactory::GetInstance()->is_cursor_visible()) { | 809   if (!TouchFactory::GetInstance()->is_cursor_visible()) { | 
| 808     cursor = gfx::GetCursor(GDK_BLANK_CURSOR); | 810     cursor = gfx::GetCursor(GDK_BLANK_CURSOR); | 
| 809   } | 811   } | 
| 810 #endif | 812 #endif | 
| 811 | 813 | 
| 812   gdk_window_set_cursor(native_view->window, cursor); | 814   gdk_window_set_cursor(native_view->window, cursor); | 
| 813 #endif | 815 #endif | 
| 814 } | 816 } | 
| 815 | 817 | 
| 816 }  // namespace views | 818 }  // namespace views | 
| OLD | NEW | 
|---|