| Index: mojo/services/public/cpp/view_manager/lib/view_manager_private.cc
|
| diff --git a/mojo/services/public/cpp/view_manager/lib/view_manager_private.cc b/mojo/services/public/cpp/view_manager/lib/view_manager_private.cc
|
| index e350f3426dfd42481358e7edf35b12b38c697308..92756dcefa7236bec9b07be1b2a53c1e07d3615f 100644
|
| --- a/mojo/services/public/cpp/view_manager/lib/view_manager_private.cc
|
| +++ b/mojo/services/public/cpp/view_manager/lib/view_manager_private.cc
|
| @@ -4,13 +4,62 @@
|
|
|
| #include "mojo/services/public/cpp/view_manager/lib/view_manager_private.h"
|
|
|
| +#include "mojo/services/public/cpp/view_manager/lib/view_tree_node_private.h"
|
| +#include "mojo/services/public/cpp/view_manager/view_tree_node_observer.h"
|
| +
|
| namespace mojo {
|
| namespace view_manager {
|
| +namespace {
|
| +
|
| +// Responsible for removing a root from the ViewManager when that node is
|
| +// destroyed.
|
| +class RootObserver : public ViewTreeNodeObserver {
|
| + public:
|
| + explicit RootObserver(ViewTreeNode* root) : root_(root) {}
|
| + virtual ~RootObserver() {}
|
| +
|
| + private:
|
| + // Overridden from ViewTreeNodeObserver:
|
| + virtual void OnNodeDestroy(ViewTreeNode* node,
|
| + DispositionChangePhase phase) OVERRIDE {
|
| + DCHECK_EQ(node, root_);
|
| + if (phase != ViewTreeNodeObserver::DISPOSITION_CHANGED)
|
| + return;
|
| + ViewManagerPrivate(
|
| + ViewTreeNodePrivate(root_).view_manager()).RemoveRoot(root_);
|
| + }
|
| +
|
| + ViewTreeNode* root_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(RootObserver);
|
| +};
|
| +
|
| +} // namespace
|
|
|
| ViewManagerPrivate::ViewManagerPrivate(ViewManager* manager)
|
| : manager_(manager) {}
|
| ViewManagerPrivate::~ViewManagerPrivate() {}
|
|
|
| +void ViewManagerPrivate::AddRoot(ViewTreeNode* root) {
|
| + // A new root must not already exist as a root or be contained by an existing
|
| + // hierarchy visible to this view manager.
|
| + std::vector<ViewTreeNode*>::const_iterator it = manager_->roots().begin();
|
| + for (; it != manager_->roots().end(); ++it) {
|
| + if (*it == root || (*it)->Contains(root))
|
| + return;
|
| + }
|
| + manager_->roots_.push_back(root);
|
| + root->AddObserver(new RootObserver(root));
|
| + manager_->root_added_callback_.Run(manager_);
|
| +}
|
| +
|
| +void ViewManagerPrivate::RemoveRoot(ViewTreeNode* root) {
|
| + std::vector<ViewTreeNode*>::iterator it =
|
| + std::find(manager_->roots_.begin(), manager_->roots_.end(), root);
|
| + if (it != manager_->roots_.end())
|
| + manager_->roots_.erase(it);
|
| +}
|
| +
|
| void ViewManagerPrivate::AddNode(TransportNodeId node_id, ViewTreeNode* node) {
|
| DCHECK(!manager_->nodes_[node_id]);
|
| manager_->nodes_[node_id] = node;
|
|
|