| Index: mojo/services/view_manager/node.cc
|
| diff --git a/mojo/services/view_manager/node.cc b/mojo/services/view_manager/node.cc
|
| index 2d3659acec2911bd970d7ddc052969dd780b351d..f1185539a132009d4eb7572cf228912090741737 100644
|
| --- a/mojo/services/view_manager/node.cc
|
| +++ b/mojo/services/view_manager/node.cc
|
| @@ -5,184 +5,128 @@
|
| #include "mojo/services/view_manager/node.h"
|
|
|
| #include "mojo/services/view_manager/node_delegate.h"
|
| -#include "ui/aura/window_property.h"
|
| -#include "ui/base/cursor/cursor.h"
|
| -#include "ui/base/hit_test.h"
|
| -#include "ui/compositor/layer.h"
|
| -#include "ui/gfx/canvas.h"
|
| -#include "ui/gfx/image/image_skia.h"
|
| -#include "ui/gfx/native_widget_types.h"
|
| -
|
| -DECLARE_WINDOW_PROPERTY_TYPE(mojo::service::Node*);
|
|
|
| namespace mojo {
|
| namespace service {
|
|
|
| -DEFINE_WINDOW_PROPERTY_KEY(Node*, kNodeKey, NULL);
|
| -
|
| Node::Node(NodeDelegate* delegate, const NodeId& id)
|
| : delegate_(delegate),
|
| id_(id),
|
| - window_(this) {
|
| + parent_(NULL),
|
| + visible_(true) {
|
| DCHECK(delegate); // Must provide a delegate.
|
| - window_.set_owned_by_parent(false);
|
| - window_.AddObserver(this);
|
| - window_.SetProperty(kNodeKey, this);
|
| - window_.Init(aura::WINDOW_LAYER_TEXTURED);
|
| -
|
| - // TODO(sky): this likely needs to be false and add a visibility API.
|
| - window_.Show();
|
| }
|
|
|
| Node::~Node() {
|
| - // This is implicitly done during deletion of the window, but we do it here so
|
| - // that we're in a known state.
|
| - if (window_.parent())
|
| - window_.parent()->RemoveChild(&window_);
|
| + while (!children_.empty())
|
| + children_.front()->parent()->Remove(children_.front());
|
| +
|
| + if (parent_)
|
| + parent_->Remove(this);
|
|
|
| delegate_->OnNodeDestroyed(this);
|
| }
|
|
|
| -// static
|
| -Node* Node::NodeForWindow(aura::Window* window) {
|
| - return window->GetProperty(kNodeKey);
|
| -}
|
| +void Node::Add(Node* child) {
|
| + // We assume validation checks happened already.
|
| + DCHECK(child);
|
| + DCHECK(child != this);
|
| + DCHECK(!child->Contains(this));
|
| + if (child->parent() == this) {
|
| + if (children_.size() == 1)
|
| + return; // Already in the right position.
|
| + Reorder(child, children_.back(), ORDER_DIRECTION_ABOVE);
|
| + return;
|
| + }
|
|
|
| -const Node* Node::GetParent() const {
|
| - if (!window_.parent())
|
| - return NULL;
|
| - return window_.parent()->GetProperty(kNodeKey);
|
| -}
|
| + const Node* old_parent = child->parent();
|
| + if (child->parent())
|
| + child->parent()->RemoveImpl(child);
|
|
|
| -void Node::Add(Node* child) {
|
| - window_.AddChild(&child->window_);
|
| + child->parent_ = this;
|
| + children_.push_back(child);
|
| + child->delegate_->OnNodeHierarchyChanged(child, this, old_parent);
|
| }
|
|
|
| void Node::Remove(Node* child) {
|
| - window_.RemoveChild(&child->window_);
|
| + // We assume validation checks happened else where.
|
| + DCHECK(child);
|
| + DCHECK(child != this);
|
| + DCHECK(child->parent() == this);
|
| +
|
| + RemoveImpl(child);
|
| + child->delegate_->OnNodeHierarchyChanged(child, NULL, this);
|
| }
|
|
|
| void Node::Reorder(Node* child, Node* relative, OrderDirection direction) {
|
| - if (direction == ORDER_DIRECTION_ABOVE)
|
| - window_.StackChildAbove(child->window(), relative->window());
|
| - else if (direction == ORDER_DIRECTION_BELOW)
|
| - window_.StackChildBelow(child->window(), relative->window());
|
| + // We assume validation checks happened else where.
|
| + DCHECK(child);
|
| + DCHECK(child->parent() == this);
|
| + DCHECK_GT(children_.size(), 1u);
|
| + children_.erase(std::find(children_.begin(), children_.end(), child));
|
| + Nodes::iterator i = std::find(children_.begin(), children_.end(), relative);
|
| + if (direction == ORDER_DIRECTION_ABOVE) {
|
| + DCHECK(i != children_.end());
|
| + children_.insert(++i, child);
|
| + } else if (direction == ORDER_DIRECTION_BELOW) {
|
| + DCHECK(i != children_.end());
|
| + children_.insert(i, child);
|
| + }
|
| +}
|
| +
|
| +void Node::SetBounds(const gfx::Rect& bounds) {
|
| + if (bounds_ == bounds)
|
| + return;
|
| +
|
| + const gfx::Rect old_bounds = bounds_;
|
| + bounds_ = bounds;
|
| + delegate_->OnNodeBoundsChanged(this, old_bounds, bounds);
|
| }
|
|
|
| const Node* Node::GetRoot() const {
|
| - const aura::Window* window = &window_;
|
| - while (window && window->parent())
|
| - window = window->parent();
|
| - return window->GetProperty(kNodeKey);
|
| + const Node* node = this;
|
| + while (node && node->parent())
|
| + node = node->parent();
|
| + return node;
|
| }
|
|
|
| std::vector<const Node*> Node::GetChildren() const {
|
| std::vector<const Node*> children;
|
| - children.reserve(window_.children().size());
|
| - for (size_t i = 0; i < window_.children().size(); ++i)
|
| - children.push_back(window_.children()[i]->GetProperty(kNodeKey));
|
| + children.reserve(children_.size());
|
| + for (size_t i = 0; i < children_.size(); ++i)
|
| + children.push_back(children_[i]);
|
| return children;
|
| }
|
|
|
| std::vector<Node*> Node::GetChildren() {
|
| - std::vector<Node*> children;
|
| - children.reserve(window_.children().size());
|
| - for (size_t i = 0; i < window_.children().size(); ++i)
|
| - children.push_back(window_.children()[i]->GetProperty(kNodeKey));
|
| - return children;
|
| + // TODO(sky): rename to children() and fix return type.
|
| + return children_;
|
| }
|
|
|
| bool Node::Contains(const Node* node) const {
|
| - return node && window_.Contains(&(node->window_));
|
| -}
|
| -
|
| -bool Node::IsVisible() const {
|
| - return window_.TargetVisibility();
|
| + for (const Node* parent = node; parent; parent = parent->parent_) {
|
| + if (parent == this)
|
| + return true;
|
| + }
|
| + return false;
|
| }
|
|
|
| void Node::SetVisible(bool value) {
|
| - if (value)
|
| - window_.Show();
|
| - else
|
| - window_.Hide();
|
| -}
|
| -
|
| -void Node::SetBitmap(const SkBitmap& bitmap) {
|
| - bitmap_ = bitmap;
|
| - window_.SchedulePaintInRect(gfx::Rect(window_.bounds().size()));
|
| -}
|
| -
|
| -void Node::OnWindowHierarchyChanged(
|
| - const aura::WindowObserver::HierarchyChangeParams& params) {
|
| - if (params.target != &window_ || params.receiver != &window_)
|
| + if (visible_ == value)
|
| return;
|
| - const Node* new_parent = params.new_parent ?
|
| - params.new_parent->GetProperty(kNodeKey) : NULL;
|
| - const Node* old_parent = params.old_parent ?
|
| - params.old_parent->GetProperty(kNodeKey) : NULL;
|
| - // This check is needed because even the root Node's aura::Window has a
|
| - // parent, but the Node itself has no parent (so it's possible for us to
|
| - // receive this notification from aura when no logical Node hierarchy change
|
| - // has actually ocurred).
|
| - if (new_parent != old_parent)
|
| - delegate_->OnNodeHierarchyChanged(this, new_parent, old_parent);
|
| -}
|
| -
|
| -gfx::Size Node::GetMinimumSize() const {
|
| - return gfx::Size();
|
| -}
|
|
|
| -gfx::Size Node::GetMaximumSize() const {
|
| - return gfx::Size();
|
| + visible_ = value;
|
| + // TODO(sky): notification, including repaint.
|
| }
|
|
|
| -void Node::OnBoundsChanged(const gfx::Rect& old_bounds,
|
| - const gfx::Rect& new_bounds) {
|
| - delegate_->OnNodeBoundsChanged(this, old_bounds, new_bounds);
|
| -}
|
| -
|
| -gfx::NativeCursor Node::GetCursor(const gfx::Point& point) {
|
| - return gfx::kNullCursor;
|
| -}
|
| -
|
| -int Node::GetNonClientComponent(const gfx::Point& point) const {
|
| - return HTCAPTION;
|
| -}
|
| -
|
| -bool Node::ShouldDescendIntoChildForEventHandling(
|
| - aura::Window* child,
|
| - const gfx::Point& location) {
|
| - return true;
|
| -}
|
| -
|
| -bool Node::CanFocus() {
|
| - return true;
|
| -}
|
| -
|
| -void Node::OnCaptureLost() {
|
| -}
|
| -
|
| -void Node::OnPaint(gfx::Canvas* canvas) {
|
| - canvas->DrawImageInt(gfx::ImageSkia::CreateFrom1xBitmap(bitmap_), 0, 0);
|
| -}
|
| -
|
| -void Node::OnDeviceScaleFactorChanged(float device_scale_factor) {
|
| -}
|
| -
|
| -void Node::OnWindowDestroying(aura::Window* window) {
|
| -}
|
| -
|
| -void Node::OnWindowDestroyed(aura::Window* window) {
|
| -}
|
| -
|
| -void Node::OnWindowTargetVisibilityChanged(bool visible) {
|
| -}
|
| -
|
| -bool Node::HasHitTestMask() const {
|
| - return false;
|
| +void Node::SetBitmap(const SkBitmap& bitmap) {
|
| + bitmap_ = bitmap;
|
| + delegate_->OnNodeBitmapChanged(this);
|
| }
|
|
|
| -void Node::GetHitTestMask(gfx::Path* mask) const {
|
| +void Node::RemoveImpl(Node* node) {
|
| + node->parent_ = NULL;
|
| + children_.erase(std::find(children_.begin(), children_.end(), node));
|
| }
|
|
|
| } // namespace service
|
|
|