Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(94)

Side by Side Diff: mojo/services/public/cpp/view_manager/lib/view_tree_node.cc

Issue 272833002: View synchronization (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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 "mojo/services/public/cpp/view_manager/view_tree_node.h" 5 #include "mojo/services/public/cpp/view_manager/view_tree_node.h"
6 6
7 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h" 7 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
8 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h" 8 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h"
9 #include "mojo/services/public/cpp/view_manager/lib/view_private.h"
9 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" 10 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
11 #include "mojo/services/public/cpp/view_manager/view.h"
10 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" 12 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h"
11 13
12 namespace mojo { 14 namespace mojo {
13 namespace services { 15 namespace services {
14 namespace view_manager { 16 namespace view_manager {
15 17
18 namespace {
19
16 void NotifyViewTreeChangeAtReceiver( 20 void NotifyViewTreeChangeAtReceiver(
17 ViewTreeNode* receiver, 21 ViewTreeNode* receiver,
18 const ViewTreeNodeObserver::TreeChangeParams& params) { 22 const ViewTreeNodeObserver::TreeChangeParams& params) {
19 ViewTreeNodeObserver::TreeChangeParams local_params = params; 23 ViewTreeNodeObserver::TreeChangeParams local_params = params;
20 local_params.receiver = receiver; 24 local_params.receiver = receiver;
21 FOR_EACH_OBSERVER(ViewTreeNodeObserver, 25 FOR_EACH_OBSERVER(ViewTreeNodeObserver,
22 *ViewTreeNodePrivate(receiver).observers(), 26 *ViewTreeNodePrivate(receiver).observers(),
23 OnTreeChange(local_params)); 27 OnTreeChange(local_params));
24 } 28 }
25 29
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 84
81 void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) { 85 void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) {
82 ViewTreeNode::Children::iterator it = 86 ViewTreeNode::Children::iterator it =
83 std::find(children->begin(), children->end(), child); 87 std::find(children->begin(), children->end(), child);
84 if (it != children->end()) { 88 if (it != children->end()) {
85 children->erase(it); 89 children->erase(it);
86 ViewTreeNodePrivate(child).ClearParent(); 90 ViewTreeNodePrivate(child).ClearParent();
87 } 91 }
88 } 92 }
89 93
94 class ScopedSetActiveViewNotifier {
95 public:
96 ScopedSetActiveViewNotifier(ViewTreeNode* node,
97 View* old_view,
98 View* new_view)
99 : node_(node),
100 old_view_(old_view),
101 new_view_(new_view) {
102 FOR_EACH_OBSERVER(
103 ViewTreeNodeObserver,
104 *ViewTreeNodePrivate(node).observers(),
105 OnNodeActiveViewChange(node_,
106 old_view_,
107 new_view_,
108 ViewTreeNodeObserver::DISPOSITION_CHANGING));
109 }
110 ~ScopedSetActiveViewNotifier() {
111 FOR_EACH_OBSERVER(
112 ViewTreeNodeObserver,
113 *ViewTreeNodePrivate(node_).observers(),
114 OnNodeActiveViewChange(node_,
115 old_view_,
116 new_view_,
117 ViewTreeNodeObserver::DISPOSITION_CHANGED));
118 }
119
120 private:
121 ViewTreeNode* node_;
122 View* old_view_;
123 View* new_view_;
124
125 DISALLOW_COPY_AND_ASSIGN(ScopedSetActiveViewNotifier);
126 };
127
128 class ScopedDestructionNotifier {
129 public:
130 explicit ScopedDestructionNotifier(ViewTreeNode* node)
131 : node_(node) {
132 FOR_EACH_OBSERVER(
133 ViewTreeNodeObserver,
134 *ViewTreeNodePrivate(node_).observers(),
135 OnNodeDestroy(node_, ViewTreeNodeObserver::DISPOSITION_CHANGING));
136 }
137 ~ScopedDestructionNotifier() {
138 FOR_EACH_OBSERVER(
139 ViewTreeNodeObserver,
140 *ViewTreeNodePrivate(node_).observers(),
141 OnNodeDestroy(node_, ViewTreeNodeObserver::DISPOSITION_CHANGED));
142 }
143
144 private:
145 ViewTreeNode* node_;
146
147 DISALLOW_COPY_AND_ASSIGN(ScopedDestructionNotifier);
148 };
149
150 } // namespace
151
90 //////////////////////////////////////////////////////////////////////////////// 152 ////////////////////////////////////////////////////////////////////////////////
91 // ViewTreeNode, public: 153 // ViewTreeNode, public:
92 154
93 // static 155 // static
94 ViewTreeNode* ViewTreeNode::Create(ViewManager* view_manager) { 156 ViewTreeNode* ViewTreeNode::Create(ViewManager* view_manager) {
95 ViewTreeNode* node = new ViewTreeNode(view_manager); 157 ViewTreeNode* node = new ViewTreeNode(view_manager);
96 ViewManagerPrivate(view_manager).AddNode(node->id(), node); 158 ViewManagerPrivate(view_manager).AddNode(node->id(), node);
97 return node; 159 return node;
98 } 160 }
99 161
100 void ViewTreeNode::Destroy() { 162 void ViewTreeNode::Destroy() {
101 if (manager_) 163 if (manager_)
102 ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_); 164 ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_);
103 while (!children_.empty()) 165 while (!children_.empty())
104 children_.front()->Destroy(); 166 children_.front()->Destroy();
105 LocalDestroy(); 167 LocalDestroy();
106 } 168 }
107 169
108 void ViewTreeNode::AddObserver(ViewTreeNodeObserver* observer) { 170 void ViewTreeNode::AddObserver(ViewTreeNodeObserver* observer) {
109 observers_.AddObserver(observer); 171 observers_.AddObserver(observer);
110 } 172 }
111 173
112 void ViewTreeNode::RemoveObserver(ViewTreeNodeObserver* observer) { 174 void ViewTreeNode::RemoveObserver(ViewTreeNodeObserver* observer) {
113 observers_.RemoveObserver(observer); 175 observers_.RemoveObserver(observer);
114 } 176 }
115 177
116 void ViewTreeNode::AddChild(ViewTreeNode* child) { 178 void ViewTreeNode::AddChild(ViewTreeNode* child) {
179 if (manager_)
180 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_);
117 LocalAddChild(child); 181 LocalAddChild(child);
118 if (manager_) 182 if (manager_)
119 ViewManagerPrivate(manager_).synchronizer()->AddChild(child->id(), id_); 183 ViewManagerPrivate(manager_).synchronizer()->AddChild(child->id(), id_);
120 } 184 }
121 185
122 void ViewTreeNode::RemoveChild(ViewTreeNode* child) { 186 void ViewTreeNode::RemoveChild(ViewTreeNode* child) {
187 if (manager_)
188 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_);
123 LocalRemoveChild(child); 189 LocalRemoveChild(child);
124 if (manager_) 190 if (manager_)
125 ViewManagerPrivate(manager_).synchronizer()->RemoveChild(child->id(), id_); 191 ViewManagerPrivate(manager_).synchronizer()->RemoveChild(child->id(), id_);
126 } 192 }
127 193
128 bool ViewTreeNode::Contains(ViewTreeNode* child) const { 194 bool ViewTreeNode::Contains(ViewTreeNode* child) const {
195 if (manager_)
196 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_);
129 for (ViewTreeNode* p = child->parent(); p; p = p->parent()) { 197 for (ViewTreeNode* p = child->parent(); p; p = p->parent()) {
130 if (p == this) 198 if (p == this)
131 return true; 199 return true;
132 } 200 }
133 return false; 201 return false;
134 } 202 }
135 203
136 ViewTreeNode* ViewTreeNode::GetChildById(TransportNodeId id) { 204 ViewTreeNode* ViewTreeNode::GetChildById(TransportNodeId id) {
137 if (id == id_) 205 if (id == id_)
138 return this; 206 return this;
139 // TODO(beng): this could be improved depending on how we decide to own nodes. 207 // TODO(beng): this could be improved depending on how we decide to own nodes.
140 Children::const_iterator it = children_.begin(); 208 Children::const_iterator it = children_.begin();
141 for (; it != children_.end(); ++it) { 209 for (; it != children_.end(); ++it) {
142 ViewTreeNode* node = (*it)->GetChildById(id); 210 ViewTreeNode* node = (*it)->GetChildById(id);
143 if (node) 211 if (node)
144 return node; 212 return node;
145 } 213 }
146 return NULL; 214 return NULL;
147 } 215 }
148 216
217 void ViewTreeNode::SetActiveView(View* view) {
218 if (manager_)
219 CHECK_EQ(ViewPrivate(view).view_manager(), manager_);
220 LocalSetActiveView(view);
221 if (manager_) {
222 ViewManagerPrivate(manager_).synchronizer()->SetActiveView(
223 id_, active_view_->id());
224 }
225 }
226
149 //////////////////////////////////////////////////////////////////////////////// 227 ////////////////////////////////////////////////////////////////////////////////
150 // ViewTreeNode, protected: 228 // ViewTreeNode, protected:
151 229
152 ViewTreeNode::ViewTreeNode() 230 ViewTreeNode::ViewTreeNode()
153 : manager_(NULL), 231 : manager_(NULL),
154 id_(-1), 232 id_(-1),
155 parent_(NULL) {} 233 parent_(NULL),
234 active_view_(NULL) {}
156 235
157 ViewTreeNode::~ViewTreeNode() { 236 ViewTreeNode::~ViewTreeNode() {
158 FOR_EACH_OBSERVER( 237 ScopedDestructionNotifier notifier(this);
159 ViewTreeNodeObserver,
160 observers_,
161 OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGING));
162 if (parent_) 238 if (parent_)
163 parent_->LocalRemoveChild(this); 239 parent_->LocalRemoveChild(this);
164 FOR_EACH_OBSERVER(
165 ViewTreeNodeObserver,
166 observers_,
167 OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGED));
168 if (manager_) 240 if (manager_)
169 ViewManagerPrivate(manager_).RemoveNode(id_); 241 ViewManagerPrivate(manager_).RemoveNode(id_);
170 } 242 }
171 243
172 //////////////////////////////////////////////////////////////////////////////// 244 ////////////////////////////////////////////////////////////////////////////////
173 // ViewTreeNode, private: 245 // ViewTreeNode, private:
174 246
175 ViewTreeNode::ViewTreeNode(ViewManager* manager) 247 ViewTreeNode::ViewTreeNode(ViewManager* manager)
176 : manager_(manager), 248 : manager_(manager),
177 id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()), 249 id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()),
178 parent_(NULL) {} 250 parent_(NULL),
251 active_view_(NULL) {}
179 252
180 void ViewTreeNode::LocalDestroy() { 253 void ViewTreeNode::LocalDestroy() {
181 delete this; 254 delete this;
182 } 255 }
183 256
184 void ViewTreeNode::LocalAddChild(ViewTreeNode* child) { 257 void ViewTreeNode::LocalAddChild(ViewTreeNode* child) {
185 ScopedTreeNotifier notifier(child, child->parent(), this); 258 ScopedTreeNotifier notifier(child, child->parent(), this);
186 if (child->parent()) 259 if (child->parent())
187 RemoveChildImpl(child, &child->parent_->children_); 260 RemoveChildImpl(child, &child->parent_->children_);
188 children_.push_back(child); 261 children_.push_back(child);
189 child->parent_ = this; 262 child->parent_ = this;
190 } 263 }
191 264
192 void ViewTreeNode::LocalRemoveChild(ViewTreeNode* child) { 265 void ViewTreeNode::LocalRemoveChild(ViewTreeNode* child) {
193 DCHECK_EQ(this, child->parent()); 266 DCHECK_EQ(this, child->parent());
194 ScopedTreeNotifier(child, this, NULL); 267 ScopedTreeNotifier(child, this, NULL);
195 RemoveChildImpl(child, &children_); 268 RemoveChildImpl(child, &children_);
196 } 269 }
197 270
271 void ViewTreeNode::LocalSetActiveView(View* view) {
272 ScopedSetActiveViewNotifier notifier(this, active_view_, view);
273 if (active_view_)
274 ViewPrivate(active_view_).set_node(NULL);
275 active_view_ = view;
276 if (active_view_)
277 ViewPrivate(active_view_).set_node(this);
278 }
279
198 } // namespace view_manager 280 } // namespace view_manager
199 } // namespace services 281 } // namespace services
200 } // namespace mojo 282 } // namespace mojo
201 283
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698