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

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

Issue 316083002: Add support for multiple roots to the client lib. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 6 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/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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698