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)) { |
| 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 |