| Index: ui/views/view.cc
|
| diff --git a/ui/views/view.cc b/ui/views/view.cc
|
| index b6cd9d0e97f9345128f754a62f0b80e15fa2430f..92223157d4c8671aaa2c55aab4c006d1ee25b265 100644
|
| --- a/ui/views/view.cc
|
| +++ b/ui/views/view.cc
|
| @@ -51,6 +51,7 @@
|
| #include "ui/views/drag_controller.h"
|
| #include "ui/views/focus/view_storage.h"
|
| #include "ui/views/layout/layout_manager.h"
|
| +#include "ui/views/view_observer.h"
|
| #include "ui/views/views_delegate.h"
|
| #include "ui/views/widget/native_widget_private.h"
|
| #include "ui/views/widget/root_view.h"
|
| @@ -220,6 +221,9 @@ void View::AddChildViewAt(View* view, int index) {
|
|
|
| if (layout_manager_.get())
|
| layout_manager_->ViewAdded(this, view);
|
| +
|
| + for (ViewObserver& observer : observers_)
|
| + observer.OnChildViewAdded(view);
|
| }
|
|
|
| void View::ReorderChildView(View* view, int index) {
|
| @@ -247,6 +251,9 @@ void View::ReorderChildView(View* view, int index) {
|
| InitFocusSiblings(view, index);
|
| children_.insert(children_.begin() + index, view);
|
|
|
| + for (ViewObserver& observer : observers_)
|
| + observer.OnChildViewReordered(view);
|
| +
|
| ReorderLayers();
|
| }
|
|
|
| @@ -298,6 +305,9 @@ void View::SetBoundsRect(const gfx::Rect& bounds) {
|
| gfx::Rect prev = bounds_;
|
| bounds_ = bounds;
|
| BoundsChanged(prev);
|
| +
|
| + for (ViewObserver& observer : observers_)
|
| + observer.OnViewBoundsChanged(this);
|
| }
|
|
|
| void View::SetSize(const gfx::Size& size) {
|
| @@ -418,6 +428,9 @@ void View::SetVisible(bool visible) {
|
| parent_->NotifyAccessibilityEvent(ui::AX_EVENT_CHILDREN_CHANGED, false);
|
| }
|
|
|
| + for (ViewObserver& observer : observers_)
|
| + observer.OnViewVisibilityChanged(this);
|
| +
|
| // This notifies all sub-views recursively.
|
| PropagateVisibilityNotifications(this, visible_);
|
| UpdateLayerVisibility();
|
| @@ -436,7 +449,11 @@ void View::SetEnabled(bool enabled) {
|
| if (enabled != enabled_) {
|
| enabled_ = enabled;
|
| AdvanceFocusIfNecessary();
|
| +
|
| OnEnabledChanged();
|
| +
|
| + for (ViewObserver& observer : observers_)
|
| + observer.OnViewEnabledChanged(this);
|
| }
|
| }
|
|
|
| @@ -1364,6 +1381,19 @@ int View::GetLineScrollIncrement(ScrollView* scroll_view,
|
| return 0;
|
| }
|
|
|
| +void View::AddObserver(ViewObserver* observer) {
|
| + CHECK(observer);
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void View::RemoveObserver(ViewObserver* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +bool View::HasObserver(const ViewObserver* observer) const {
|
| + return observers_.HasObserver(observer);
|
| +}
|
| +
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // View, protected:
|
|
|
| @@ -1839,6 +1869,9 @@ void View::DoRemoveChildView(View* view,
|
|
|
| if (layout_manager_)
|
| layout_manager_->ViewRemoved(this, view);
|
| +
|
| + for (ViewObserver& observer : observers_)
|
| + observer.OnChildViewRemoved(view, this);
|
| }
|
|
|
| void View::PropagateRemoveNotifications(View* old_parent, View* new_parent) {
|
|
|