OLD | NEW |
---|---|
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_synchronizer.h" | 7 #include "mojo/services/public/cpp/view_manager/lib/view_manager_synchronizer.h" |
8 #include "mojo/services/public/cpp/view_manager/lib/view_private.h" | 8 #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" | 9 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" |
10 #include "mojo/services/public/cpp/view_manager/view.h" | 10 #include "mojo/services/public/cpp/view_manager/view.h" |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
73 | 73 |
74 void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) { | 74 void RemoveChildImpl(ViewTreeNode* child, ViewTreeNode::Children* children) { |
75 ViewTreeNode::Children::iterator it = | 75 ViewTreeNode::Children::iterator it = |
76 std::find(children->begin(), children->end(), child); | 76 std::find(children->begin(), children->end(), child); |
77 if (it != children->end()) { | 77 if (it != children->end()) { |
78 children->erase(it); | 78 children->erase(it); |
79 ViewTreeNodePrivate(child).ClearParent(); | 79 ViewTreeNodePrivate(child).ClearParent(); |
80 } | 80 } |
81 } | 81 } |
82 | 82 |
83 class ScopedOrderChangedNotifier { | |
84 public: | |
85 ScopedOrderChangedNotifier(ViewTreeNode* node, | |
86 ViewTreeNode* relative_node, | |
87 OrderDirection direction) | |
88 : node_(node), | |
89 relative_node_(relative_node), | |
90 direction_(direction) { | |
91 FOR_EACH_OBSERVER( | |
92 ViewTreeNodeObserver, | |
93 *ViewTreeNodePrivate(node_).observers(), | |
94 OnNodeReordered(node_, | |
95 relative_node_, | |
96 direction_, | |
97 ViewTreeNodeObserver::DISPOSITION_CHANGING)); | |
98 | |
99 } | |
100 ~ScopedOrderChangedNotifier() { | |
101 FOR_EACH_OBSERVER( | |
102 ViewTreeNodeObserver, | |
103 *ViewTreeNodePrivate(node_).observers(), | |
104 OnNodeReordered(node_, | |
105 relative_node_, | |
106 direction_, | |
107 ViewTreeNodeObserver::DISPOSITION_CHANGED)); | |
108 } | |
109 | |
110 private: | |
111 ViewTreeNode* node_; | |
112 ViewTreeNode* relative_node_; | |
113 OrderDirection direction_; | |
114 | |
115 DISALLOW_COPY_AND_ASSIGN(ScopedOrderChangedNotifier); | |
116 }; | |
117 | |
118 // Returns true if the order actually changed. | |
119 bool ReorderImpl(ViewTreeNode::Children* children, | |
120 ViewTreeNode* node, | |
121 ViewTreeNode* relative, | |
122 OrderDirection direction) { | |
123 DCHECK(relative); | |
124 DCHECK_NE(node, relative); | |
125 DCHECK_EQ(node->parent(), relative->parent()); | |
126 | |
127 const size_t child_i = | |
128 std::find(children->begin(), children->end(), node) - children->begin(); | |
129 const size_t target_i = | |
130 std::find(children->begin(), children->end(), relative) - | |
131 children->begin(); | |
132 if ((direction == ORDER_ABOVE && child_i == target_i + 1) || | |
133 (direction == ORDER_BELOW && child_i +1 == target_i)) { | |
sky
2014/06/11 19:36:44
nit: '+1' -> '+ 1'
| |
134 return false; | |
135 } | |
136 | |
137 ScopedOrderChangedNotifier notifier(node, relative, direction); | |
138 | |
139 const size_t dest_i = | |
140 direction == ORDER_ABOVE ? | |
141 (child_i < target_i ? target_i : target_i + 1) : | |
142 (child_i < target_i ? target_i - 1 : target_i); | |
143 children->erase(children->begin() + child_i); | |
144 children->insert(children->begin() + dest_i, node); | |
145 | |
146 return true; | |
147 } | |
148 | |
83 class ScopedSetActiveViewNotifier { | 149 class ScopedSetActiveViewNotifier { |
84 public: | 150 public: |
85 ScopedSetActiveViewNotifier(ViewTreeNode* node, | 151 ScopedSetActiveViewNotifier(ViewTreeNode* node, |
86 View* old_view, | 152 View* old_view, |
87 View* new_view) | 153 View* new_view) |
88 : node_(node), | 154 : node_(node), |
89 old_view_(old_view), | 155 old_view_(old_view), |
90 new_view_(new_view) { | 156 new_view_(new_view) { |
91 FOR_EACH_OBSERVER( | 157 FOR_EACH_OBSERVER( |
92 ViewTreeNodeObserver, | 158 ViewTreeNodeObserver, |
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
231 // embeddee in an embedder-embeddee relationship. | 297 // embeddee in an embedder-embeddee relationship. |
232 if (manager_) | 298 if (manager_) |
233 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_); | 299 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_); |
234 LocalRemoveChild(child); | 300 LocalRemoveChild(child); |
235 if (manager_) { | 301 if (manager_) { |
236 static_cast<ViewManagerSynchronizer*>(manager_)->RemoveChild(child->id(), | 302 static_cast<ViewManagerSynchronizer*>(manager_)->RemoveChild(child->id(), |
237 id_); | 303 id_); |
238 } | 304 } |
239 } | 305 } |
240 | 306 |
307 void ViewTreeNode::MoveToFront() { | |
308 Reorder(parent_->children_.back(), ORDER_ABOVE); | |
309 } | |
310 | |
311 void ViewTreeNode::MoveToBack() { | |
312 Reorder(parent_->children_.front(), ORDER_BELOW); | |
313 } | |
314 | |
315 void ViewTreeNode::Reorder(ViewTreeNode* relative, OrderDirection direction) { | |
316 if (!LocalReorder(relative, direction)) | |
317 return; | |
318 if (manager_) { | |
319 static_cast<ViewManagerSynchronizer*>(manager_)->Reorder(id_, | |
320 relative->id(), | |
321 direction); | |
322 } | |
323 } | |
324 | |
241 bool ViewTreeNode::Contains(ViewTreeNode* child) const { | 325 bool ViewTreeNode::Contains(ViewTreeNode* child) const { |
242 if (manager_) | 326 if (manager_) |
243 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_); | 327 CHECK_EQ(ViewTreeNodePrivate(child).view_manager(), manager_); |
244 for (ViewTreeNode* p = child->parent(); p; p = p->parent()) { | 328 for (ViewTreeNode* p = child->parent(); p; p = p->parent()) { |
245 if (p == this) | 329 if (p == this) |
246 return true; | 330 return true; |
247 } | 331 } |
248 return false; | 332 return false; |
249 } | 333 } |
250 | 334 |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
317 children_.push_back(child); | 401 children_.push_back(child); |
318 child->parent_ = this; | 402 child->parent_ = this; |
319 } | 403 } |
320 | 404 |
321 void ViewTreeNode::LocalRemoveChild(ViewTreeNode* child) { | 405 void ViewTreeNode::LocalRemoveChild(ViewTreeNode* child) { |
322 DCHECK_EQ(this, child->parent()); | 406 DCHECK_EQ(this, child->parent()); |
323 ScopedTreeNotifier notifier(child, this, NULL); | 407 ScopedTreeNotifier notifier(child, this, NULL); |
324 RemoveChildImpl(child, &children_); | 408 RemoveChildImpl(child, &children_); |
325 } | 409 } |
326 | 410 |
411 bool ViewTreeNode::LocalReorder(ViewTreeNode* relative, | |
412 OrderDirection direction) { | |
413 return ReorderImpl(&parent_->children_, this, relative, direction); | |
414 } | |
415 | |
327 void ViewTreeNode::LocalSetActiveView(View* view) { | 416 void ViewTreeNode::LocalSetActiveView(View* view) { |
328 ScopedSetActiveViewNotifier notifier(this, active_view_, view); | 417 ScopedSetActiveViewNotifier notifier(this, active_view_, view); |
329 if (active_view_) | 418 if (active_view_) |
330 ViewPrivate(active_view_).set_node(NULL); | 419 ViewPrivate(active_view_).set_node(NULL); |
331 active_view_ = view; | 420 active_view_ = view; |
332 if (active_view_) | 421 if (active_view_) |
333 ViewPrivate(active_view_).set_node(this); | 422 ViewPrivate(active_view_).set_node(this); |
334 } | 423 } |
335 | 424 |
336 void ViewTreeNode::LocalSetBounds(const gfx::Rect& old_bounds, | 425 void ViewTreeNode::LocalSetBounds(const gfx::Rect& old_bounds, |
337 const gfx::Rect& new_bounds) { | 426 const gfx::Rect& new_bounds) { |
338 DCHECK(old_bounds == bounds_); | 427 DCHECK(old_bounds == bounds_); |
339 ScopedSetBoundsNotifier notifier(this, old_bounds, new_bounds); | 428 ScopedSetBoundsNotifier notifier(this, old_bounds, new_bounds); |
340 bounds_ = new_bounds; | 429 bounds_ = new_bounds; |
341 } | 430 } |
342 | 431 |
343 } // namespace view_manager | 432 } // namespace view_manager |
344 } // namespace mojo | 433 } // namespace mojo |
345 | 434 |
OLD | NEW |