Index: trunk/src/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc |
=================================================================== |
--- trunk/src/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc (revision 269420) |
+++ trunk/src/mojo/services/public/cpp/view_manager/lib/view_tree_node.cc (working copy) |
@@ -90,19 +90,36 @@ |
//////////////////////////////////////////////////////////////////////////////// |
// ViewTreeNode, public: |
-// static |
-ViewTreeNode* ViewTreeNode::Create(ViewManager* view_manager) { |
- ViewTreeNode* node = new ViewTreeNode(view_manager); |
- ViewManagerPrivate(view_manager).AddNode(node->id(), node); |
- return node; |
-} |
+ViewTreeNode::ViewTreeNode() |
+ : manager_(NULL), |
+ id_(-1), |
+ owned_by_parent_(true), |
+ parent_(NULL) {} |
-void ViewTreeNode::Destroy() { |
+ViewTreeNode::ViewTreeNode(ViewManager* manager) |
+ : manager_(manager), |
+ id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()), |
+ owned_by_parent_(true), |
+ parent_(NULL) {} |
+ |
+ViewTreeNode::~ViewTreeNode() { |
+ while (!children_.empty()) { |
+ ViewTreeNode* child = children_.front(); |
+ if (child->owned_by_parent_) { |
+ delete child; |
+ // Deleting the child also removes it from our child list. |
+ DCHECK(std::find(children_.begin(), children_.end(), child) == |
+ children_.end()); |
+ } else { |
+ RemoveChild(child); |
+ } |
+ } |
+ |
+ if (parent_) |
+ parent_->RemoveChild(this); |
+ |
if (manager_) |
ViewManagerPrivate(manager_).synchronizer()->DestroyViewTreeNode(id_); |
- while (!children_.empty()) |
- children_.front()->Destroy(); |
- LocalDestroy(); |
} |
void ViewTreeNode::AddObserver(ViewTreeNodeObserver* observer) { |
@@ -147,40 +164,8 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// ViewTreeNode, protected: |
- |
-ViewTreeNode::ViewTreeNode() |
- : manager_(NULL), |
- id_(-1), |
- parent_(NULL) {} |
- |
-ViewTreeNode::~ViewTreeNode() { |
- FOR_EACH_OBSERVER( |
- ViewTreeNodeObserver, |
- observers_, |
- OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGING)); |
- if (parent_) |
- parent_->LocalRemoveChild(this); |
- FOR_EACH_OBSERVER( |
- ViewTreeNodeObserver, |
- observers_, |
- OnNodeDestroy(this, ViewTreeNodeObserver::DISPOSITION_CHANGED)); |
- if (manager_) |
- ViewManagerPrivate(manager_).RemoveNode(id_); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
// ViewTreeNode, private: |
-ViewTreeNode::ViewTreeNode(ViewManager* manager) |
- : manager_(manager), |
- id_(ViewManagerPrivate(manager).synchronizer()->CreateViewTreeNode()), |
- parent_(NULL) {} |
- |
-void ViewTreeNode::LocalDestroy() { |
- delete this; |
-} |
- |
void ViewTreeNode::LocalAddChild(ViewTreeNode* child) { |
ScopedTreeNotifier notifier(child, child->parent(), this); |
if (child->parent()) |