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_); | |
sky
2014/06/05 18:18:52
nit: indent 1 more.
| |
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 |