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/lib/view_manager_private.h" | 5 #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h" |
6 | 6 |
| 7 #include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h" |
| 8 #include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h" |
| 9 |
7 namespace mojo { | 10 namespace mojo { |
8 namespace view_manager { | 11 namespace view_manager { |
| 12 namespace { |
| 13 |
| 14 // Responsible for removing a root from the ViewManager when that node is |
| 15 // destroyed. |
| 16 class RootObserver : public ViewTreeNodeObserver { |
| 17 public: |
| 18 explicit RootObserver(ViewTreeNode* root) : root_(root) {} |
| 19 virtual ~RootObserver() {} |
| 20 |
| 21 private: |
| 22 // Overridden from ViewTreeNodeObserver: |
| 23 virtual void OnNodeDestroy(ViewTreeNode* node, |
| 24 DispositionChangePhase phase) OVERRIDE { |
| 25 DCHECK_EQ(node, root_); |
| 26 if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED) |
| 27 return; |
| 28 ViewManagerPrivate( |
| 29 ViewTreeNodePrivate(root_).view_manager()).RemoveRoot(root_); |
| 30 } |
| 31 |
| 32 ViewTreeNode* root_; |
| 33 |
| 34 DISALLOW_COPY_AND_ASSIGN(RootObserver); |
| 35 }; |
| 36 |
| 37 } // namespace |
9 | 38 |
10 ViewManagerPrivate::ViewManagerPrivate(ViewManager* manager) | 39 ViewManagerPrivate::ViewManagerPrivate(ViewManager* manager) |
11 : manager_(manager) {} | 40 : manager_(manager) {} |
12 ViewManagerPrivate::~ViewManagerPrivate() {} | 41 ViewManagerPrivate::~ViewManagerPrivate() {} |
13 | 42 |
| 43 void ViewManagerPrivate::AddRoot(ViewTreeNode* root) { |
| 44 // A new root must not already exist as a root or be contained by an existing |
| 45 // hierarchy visible to this view manager. |
| 46 std::vector<ViewTreeNode*>::const_iterator it = manager_->roots().begin(); |
| 47 for (; it != manager_->roots().end(); ++it) { |
| 48 if (*it == root || (*it)->Contains(root)) |
| 49 return; |
| 50 } |
| 51 manager_->roots_.push_back(root); |
| 52 root->AddObserver(new RootObserver(root)); |
| 53 manager_->root_added_callback_.Run(manager_); |
| 54 } |
| 55 |
| 56 void ViewManagerPrivate::RemoveRoot(ViewTreeNode* root) { |
| 57 std::vector<ViewTreeNode*>::iterator it = |
| 58 std::find(manager_->roots_.begin(), manager_->roots_.end(), root); |
| 59 if (it != manager_->roots_.end()) |
| 60 manager_->roots_.erase(it); |
| 61 } |
| 62 |
14 void ViewManagerPrivate::AddNode(TransportNodeId node_id, ViewTreeNode* node) { | 63 void ViewManagerPrivate::AddNode(TransportNodeId node_id, ViewTreeNode* node) { |
15 DCHECK(!manager_->nodes_[node_id]); | 64 DCHECK(!manager_->nodes_[node_id]); |
16 manager_->nodes_[node_id] = node; | 65 manager_->nodes_[node_id] = node; |
17 } | 66 } |
18 | 67 |
19 void ViewManagerPrivate::RemoveNode(TransportNodeId node_id) { | 68 void ViewManagerPrivate::RemoveNode(TransportNodeId node_id) { |
20 ViewManager::IdToNodeMap::iterator it = manager_->nodes_.find(node_id); | 69 ViewManager::IdToNodeMap::iterator it = manager_->nodes_.find(node_id); |
21 if (it != manager_->nodes_.end()) | 70 if (it != manager_->nodes_.end()) |
22 manager_->nodes_.erase(it); | 71 manager_->nodes_.erase(it); |
23 } | 72 } |
24 | 73 |
25 void ViewManagerPrivate::AddView(TransportViewId view_id, View* view) { | 74 void ViewManagerPrivate::AddView(TransportViewId view_id, View* view) { |
26 DCHECK(!manager_->views_[view_id]); | 75 DCHECK(!manager_->views_[view_id]); |
27 manager_->views_[view_id] = view; | 76 manager_->views_[view_id] = view; |
28 } | 77 } |
29 | 78 |
30 void ViewManagerPrivate::RemoveView(TransportViewId view_id) { | 79 void ViewManagerPrivate::RemoveView(TransportViewId view_id) { |
31 ViewManager::IdToViewMap::iterator it = manager_->views_.find(view_id); | 80 ViewManager::IdToViewMap::iterator it = manager_->views_.find(view_id); |
32 if (it != manager_->views_.end()) | 81 if (it != manager_->views_.end()) |
33 manager_->views_.erase(it); | 82 manager_->views_.erase(it); |
34 } | 83 } |
35 | 84 |
36 } // namespace view_manager | 85 } // namespace view_manager |
37 } // namespace mojo | 86 } // namespace mojo |
OLD | NEW |