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/view.h" | 5 #include "views/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 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
529 void View::GetViewsWithGroup(int group_id, std::vector<View*>* out) { | 529 void View::GetViewsWithGroup(int group_id, std::vector<View*>* out) { |
530 if (group_ == group_id) | 530 if (group_ == group_id) |
531 out->push_back(this); | 531 out->push_back(this); |
532 | 532 |
533 for (int i = 0, count = child_count(); i < count; ++i) | 533 for (int i = 0, count = child_count(); i < count; ++i) |
534 GetChildViewAt(i)->GetViewsWithGroup(group_id, out); | 534 GetChildViewAt(i)->GetViewsWithGroup(group_id, out); |
535 } | 535 } |
536 | 536 |
537 View* View::GetSelectedViewForGroup(int group_id) { | 537 View* View::GetSelectedViewForGroup(int group_id) { |
538 std::vector<View*> views; | 538 std::vector<View*> views; |
539 GetRootView()->GetViewsWithGroup(group_id, &views); | 539 GetWidget()->GetRootView()->GetViewsWithGroup(group_id, &views); |
540 if (views.size() > 0) | 540 if (views.size() > 0) |
541 return views[0]; | 541 return views[0]; |
542 else | 542 else |
543 return NULL; | 543 return NULL; |
544 } | 544 } |
545 | 545 |
546 // Coordinate conversion ------------------------------------------------------- | 546 // Coordinate conversion ------------------------------------------------------- |
547 | 547 |
548 // static | 548 // static |
549 void View::ConvertPointToView(const View* src, | 549 void View::ConvertPointToView(const View* src, |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 } | 789 } |
790 | 790 |
791 size_t index = iter - accelerators_->begin(); | 791 size_t index = iter - accelerators_->begin(); |
792 accelerators_->erase(iter); | 792 accelerators_->erase(iter); |
793 if (index >= registered_accelerator_count_) { | 793 if (index >= registered_accelerator_count_) { |
794 // The accelerator is not registered to FocusManager. | 794 // The accelerator is not registered to FocusManager. |
795 return; | 795 return; |
796 } | 796 } |
797 --registered_accelerator_count_; | 797 --registered_accelerator_count_; |
798 | 798 |
799 RootView* root_view = GetRootView(); | 799 // Providing we are attached to a Widget and registered with a focus manager, |
800 if (!root_view) { | 800 // we should de-register from that focus manager now. |
801 // We are not part of a view hierarchy, so there is nothing to do as we | 801 if (GetWidget() && accelerator_focus_manager_) |
802 // removed ourselves from accelerators_, we won't be registered when added | |
803 // to one. | |
804 return; | |
805 } | |
806 | |
807 // If accelerator_focus_manager_ is NULL then we did not registered | |
808 // accelerators so there is nothing to unregister. | |
809 if (accelerator_focus_manager_) { | |
810 accelerator_focus_manager_->UnregisterAccelerator(accelerator, this); | 802 accelerator_focus_manager_->UnregisterAccelerator(accelerator, this); |
811 } | |
812 } | 803 } |
813 | 804 |
814 void View::ResetAccelerators() { | 805 void View::ResetAccelerators() { |
815 if (accelerators_.get()) | 806 if (accelerators_.get()) |
816 UnregisterAccelerators(false); | 807 UnregisterAccelerators(false); |
817 } | 808 } |
818 | 809 |
819 // Focus ----------------------------------------------------------------------- | 810 // Focus ----------------------------------------------------------------------- |
820 | 811 |
821 bool View::HasFocus() { | 812 bool View::HasFocus() { |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
854 return (focusable_ || accessibility_focusable_) && IsEnabled() && | 845 return (focusable_ || accessibility_focusable_) && IsEnabled() && |
855 IsVisibleInRootView(); | 846 IsVisibleInRootView(); |
856 } | 847 } |
857 | 848 |
858 FocusManager* View::GetFocusManager() { | 849 FocusManager* View::GetFocusManager() { |
859 Widget* widget = GetWidget(); | 850 Widget* widget = GetWidget(); |
860 return widget ? widget->GetFocusManager() : NULL; | 851 return widget ? widget->GetFocusManager() : NULL; |
861 } | 852 } |
862 | 853 |
863 void View::RequestFocus() { | 854 void View::RequestFocus() { |
864 RootView* rv = GetRootView(); | 855 FocusManager* focus_manager = GetFocusManager(); |
865 if (rv && IsFocusableInRootView()) | 856 if (focus_manager && IsFocusableInRootView()) |
866 rv->FocusView(this); | 857 focus_manager->SetFocusedView(this); |
867 } | 858 } |
868 | 859 |
869 void View::WillGainFocus() { | 860 void View::WillGainFocus() { |
870 } | 861 } |
871 | 862 |
872 void View::DidGainFocus() { | 863 void View::DidGainFocus() { |
873 } | 864 } |
874 | 865 |
875 void View::WillLoseFocus() { | 866 void View::WillLoseFocus() { |
876 } | 867 } |
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
930 return ui::DragDropTypes::DRAG_NONE; | 921 return ui::DragDropTypes::DRAG_NONE; |
931 } | 922 } |
932 | 923 |
933 void View::OnDragExited() { | 924 void View::OnDragExited() { |
934 } | 925 } |
935 | 926 |
936 int View::OnPerformDrop(const DropTargetEvent& event) { | 927 int View::OnPerformDrop(const DropTargetEvent& event) { |
937 return ui::DragDropTypes::DRAG_NONE; | 928 return ui::DragDropTypes::DRAG_NONE; |
938 } | 929 } |
939 | 930 |
| 931 void View::OnDragDone() { |
| 932 } |
| 933 |
940 // static | 934 // static |
941 bool View::ExceededDragThreshold(int delta_x, int delta_y) { | 935 bool View::ExceededDragThreshold(int delta_x, int delta_y) { |
942 return (abs(delta_x) > GetHorizontalDragThreshold() || | 936 return (abs(delta_x) > GetHorizontalDragThreshold() || |
943 abs(delta_y) > GetVerticalDragThreshold()); | 937 abs(delta_y) > GetVerticalDragThreshold()); |
944 } | 938 } |
945 | 939 |
946 // Accessibility --------------------------------------------------------------- | 940 // Accessibility --------------------------------------------------------------- |
947 | 941 |
948 void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type) { | 942 void View::NotifyAccessibilityEvent(AccessibilityTypes::Event event_type) { |
949 NotifyAccessibilityEvent(event_type, true); | 943 NotifyAccessibilityEvent(event_type, true); |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1123 return drag_controller_ ? | 1117 return drag_controller_ ? |
1124 drag_controller_->GetDragOperations(this, press_pt) : | 1118 drag_controller_->GetDragOperations(this, press_pt) : |
1125 ui::DragDropTypes::DRAG_NONE; | 1119 ui::DragDropTypes::DRAG_NONE; |
1126 } | 1120 } |
1127 | 1121 |
1128 void View::WriteDragData(const gfx::Point& press_pt, OSExchangeData* data) { | 1122 void View::WriteDragData(const gfx::Point& press_pt, OSExchangeData* data) { |
1129 DCHECK(drag_controller_); | 1123 DCHECK(drag_controller_); |
1130 drag_controller_->WriteDragData(this, press_pt, data); | 1124 drag_controller_->WriteDragData(this, press_pt, data); |
1131 } | 1125 } |
1132 | 1126 |
1133 void View::OnDragDone() { | |
1134 } | |
1135 | |
1136 bool View::InDrag() { | 1127 bool View::InDrag() { |
1137 RootView* root_view = GetRootView(); | 1128 Widget* widget = GetWidget(); |
1138 return root_view ? (root_view->GetDragView() == this) : false; | 1129 return widget ? widget->GetDraggedView() == this : false; |
1139 } | 1130 } |
1140 | 1131 |
1141 //////////////////////////////////////////////////////////////////////////////// | 1132 //////////////////////////////////////////////////////////////////////////////// |
1142 // View, private: | 1133 // View, private: |
1143 | 1134 |
1144 // DropInfo -------------------------------------------------------------------- | 1135 // DropInfo -------------------------------------------------------------------- |
1145 | 1136 |
1146 void View::DragInfo::Reset() { | 1137 void View::DragInfo::Reset() { |
1147 possible_drag = false; | 1138 possible_drag = false; |
1148 start_pt = gfx::Point(); | 1139 start_pt = gfx::Point(); |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1454 | 1445 |
1455 // Accelerators ---------------------------------------------------------------- | 1446 // Accelerators ---------------------------------------------------------------- |
1456 | 1447 |
1457 void View::RegisterPendingAccelerators() { | 1448 void View::RegisterPendingAccelerators() { |
1458 if (!accelerators_.get() || | 1449 if (!accelerators_.get() || |
1459 registered_accelerator_count_ == accelerators_->size()) { | 1450 registered_accelerator_count_ == accelerators_->size()) { |
1460 // No accelerators are waiting for registration. | 1451 // No accelerators are waiting for registration. |
1461 return; | 1452 return; |
1462 } | 1453 } |
1463 | 1454 |
1464 RootView* root_view = GetRootView(); | 1455 if (!GetWidget()) { |
1465 if (!root_view) { | 1456 // The view is not yet attached to a widget, defer registration until then. |
1466 // We are not yet part of a view hierarchy, we'll register ourselves once | |
1467 // added to one. | |
1468 return; | 1457 return; |
1469 } | 1458 } |
1470 | 1459 |
1471 accelerator_focus_manager_ = GetFocusManager(); | 1460 accelerator_focus_manager_ = GetFocusManager(); |
1472 if (!accelerator_focus_manager_) { | 1461 if (!accelerator_focus_manager_) { |
1473 // Some crash reports seem to show that we may get cases where we have no | 1462 // Some crash reports seem to show that we may get cases where we have no |
1474 // focus manager (see bug #1291225). This should never be the case, just | 1463 // focus manager (see bug #1291225). This should never be the case, just |
1475 // making sure we don't crash. | 1464 // making sure we don't crash. |
1476 | 1465 |
1477 // TODO(jcampan): This fails for a view under WidgetGtk with TYPE_CHILD. | 1466 // TODO(jcampan): This fails for a view under WidgetGtk with TYPE_CHILD. |
(...skipping 12 matching lines...) Expand all Loading... |
1490 iter != accelerators_->end(); ++iter) { | 1479 iter != accelerators_->end(); ++iter) { |
1491 accelerator_focus_manager_->RegisterAccelerator(*iter, this); | 1480 accelerator_focus_manager_->RegisterAccelerator(*iter, this); |
1492 } | 1481 } |
1493 registered_accelerator_count_ = accelerators_->size(); | 1482 registered_accelerator_count_ = accelerators_->size(); |
1494 } | 1483 } |
1495 | 1484 |
1496 void View::UnregisterAccelerators(bool leave_data_intact) { | 1485 void View::UnregisterAccelerators(bool leave_data_intact) { |
1497 if (!accelerators_.get()) | 1486 if (!accelerators_.get()) |
1498 return; | 1487 return; |
1499 | 1488 |
1500 RootView* root_view = GetRootView(); | 1489 if (GetWidget()) { |
1501 if (root_view) { | |
1502 if (accelerator_focus_manager_) { | 1490 if (accelerator_focus_manager_) { |
1503 // We may not have a FocusManager if the window containing us is being | 1491 // We may not have a FocusManager if the window containing us is being |
1504 // closed, in which case the FocusManager is being deleted so there is | 1492 // closed, in which case the FocusManager is being deleted so there is |
1505 // nothing to unregister. | 1493 // nothing to unregister. |
1506 accelerator_focus_manager_->UnregisterAccelerators(this); | 1494 accelerator_focus_manager_->UnregisterAccelerators(this); |
1507 accelerator_focus_manager_ = NULL; | 1495 accelerator_focus_manager_ = NULL; |
1508 } | 1496 } |
1509 if (!leave_data_intact) { | 1497 if (!leave_data_intact) { |
1510 accelerators_->clear(); | 1498 accelerators_->clear(); |
1511 accelerators_.reset(); | 1499 accelerators_.reset(); |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1586 void View::DoDrag(const MouseEvent& e, const gfx::Point& press_pt) { | 1574 void View::DoDrag(const MouseEvent& e, const gfx::Point& press_pt) { |
1587 int drag_operations = GetDragOperations(press_pt); | 1575 int drag_operations = GetDragOperations(press_pt); |
1588 if (drag_operations == ui::DragDropTypes::DRAG_NONE) | 1576 if (drag_operations == ui::DragDropTypes::DRAG_NONE) |
1589 return; | 1577 return; |
1590 | 1578 |
1591 OSExchangeData data; | 1579 OSExchangeData data; |
1592 WriteDragData(press_pt, &data); | 1580 WriteDragData(press_pt, &data); |
1593 | 1581 |
1594 // Message the RootView to do the drag and drop. That way if we're removed | 1582 // Message the RootView to do the drag and drop. That way if we're removed |
1595 // the RootView can detect it and avoid calling us back. | 1583 // the RootView can detect it and avoid calling us back. |
1596 RootView* root_view = GetRootView(); | 1584 GetWidget()->StartDragForViewFromMouseEvent(this, data, drag_operations); |
1597 root_view->StartDragForViewFromMouseEvent(this, data, drag_operations); | |
1598 } | 1585 } |
1599 | 1586 |
1600 } // namespace views | 1587 } // namespace views |
OLD | NEW |