15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "mojo/services/view_manager/node.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "mojo/services/view_manager/node_delegate.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "mojo/services/view_manager/view.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/window_property.h"
106d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)#include "ui/base/cursor/cursor.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/hit_test.h"
12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "ui/gfx/canvas.h"
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ui/gfx/image/image_skia.h"
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/gfx/native_widget_types.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
161e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)DECLARE_WINDOW_PROPERTY_TYPE(mojo::view_manager::service::Node*);
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
186d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)namespace mojo {
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace view_manager {
20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace service {
216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)DEFINE_WINDOW_PROPERTY_KEY(Node*, kNodeKey, NULL);
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Node::Node(NodeDelegate* delegate, const NodeId& id)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : delegate_(delegate),
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      id_(id),
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      view_(NULL),
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      window_(this) {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(delegate);  // Must provide a delegate.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.set_owned_by_parent(false);
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.AddObserver(this);
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.SetProperty(kNodeKey, this);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.Init(aura::WINDOW_LAYER_TEXTURED);
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(sky): this likely needs to be false and add a visibility API.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.Show();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
386d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
39f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)Node::~Node() {
40cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  SetView(NULL);
41cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // This is implicitly done during deletion of the window, but we do it here so
426d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // that we're in a known state.
436d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (window_.parent())
446d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    window_.parent()->RemoveChild(&window_);
456d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
466d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
476d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const Node* Node::GetParent() const {
486d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (!window_.parent())
496d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return NULL;
506d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return window_.parent()->GetProperty(kNodeKey);
516d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
526d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
533240926e260ce088908e02ac07a6cf7b0c0cbf44Ben Murdochvoid Node::Add(Node* child) {
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  window_.AddChild(&child->window_);
55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
566d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
576d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void Node::Remove(Node* child) {
586d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  window_.RemoveChild(&child->window_);
59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
616d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void Node::Reorder(Node* child, Node* relative, OrderDirection direction) {
626d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (direction == ORDER_ABOVE)
63f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    window_.StackChildAbove(child->window(), relative->window());
64cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  else if (direction == ORDER_BELOW)
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    window_.StackChildBelow(child->window(), relative->window());
666d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
676d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
686d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)const Node* Node::GetRoot() const {
69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const aura::Window* window = &window_;
706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  while (window && window->parent())
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    window = window->parent();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window->GetProperty(kNodeKey);
7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
741e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
751e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)std::vector<const Node*> Node::GetChildren() const {
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::vector<const Node*> children;
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  children.reserve(window_.children().size());
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < window_.children().size(); ++i)
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    children.push_back(window_.children()[i]->GetProperty(kNodeKey));
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  return children;
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)std::vector<Node*> Node::GetChildren() {
84b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  std::vector<Node*> children;
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  children.reserve(window_.children().size());
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  for (size_t i = 0; i < window_.children().size(); ++i)
87b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    children.push_back(window_.children()[i]->GetProperty(kNodeKey));
88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  return children;
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Node::Contains(const Node* node) const {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return node && window_.Contains(&(node->window_));
93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Node::SetView(View* view) {
966d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (view == view_)
976d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    return;
986d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
996d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  // Detach view from existing node. This way notifications are sent out.
1006d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  if (view && view->node())
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    view->node()->SetView(NULL);
102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  View* old_view = view_;
104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (view_)
105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    view_->set_node(NULL);
1066d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  view_ = view;
107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (view)
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    view->set_node(this);
109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  delegate_->OnNodeViewReplaced(this, view, old_view);
110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Node::OnWindowHierarchyChanged(
113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const aura::WindowObserver::HierarchyChangeParams& params) {
114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (params.target != &window_ || params.receiver != &window_)
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    return;
116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Node* new_parent = params.new_parent ?
117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      params.new_parent->GetProperty(kNodeKey) : NULL;
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const Node* old_parent = params.old_parent ?
1196d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)      params.old_parent->GetProperty(kNodeKey) : NULL;
1206d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  delegate_->OnNodeHierarchyChanged(this, new_parent, old_parent);
1216d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1226d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::Size Node::GetMinimumSize() const {
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return gfx::Size();
1256d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1266d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::Size Node::GetMaximumSize() const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void Node::OnBoundsChanged(const gfx::Rect& old_bounds,
132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                           const gfx::Rect& new_bounds) {
133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
13446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)gfx::NativeCursor Node::GetCursor(const gfx::Point& point) {
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return gfx::kNullCursor;
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)int Node::GetNonClientComponent(const gfx::Point& point) const {
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return HTCAPTION;
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool Node::ShouldDescendIntoChildForEventHandling(
144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    aura::Window* child,
145cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    const gfx::Point& location) {
146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Node::CanFocus() {
150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return true;
151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Node::OnCaptureLost() {
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Node::OnPaint(gfx::Canvas* canvas) {
157f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  if (view_) {
158f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    canvas->DrawImageInt(
159f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        gfx::ImageSkia::CreateFrom1xBitmap(view_->bitmap()), 0, 0);
160f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  }
161f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
162f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
163f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void Node::OnDeviceScaleFactorChanged(float device_scale_factor) {
164f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
1656d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Node::OnWindowDestroying(aura::Window* window) {
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void Node::OnWindowDestroyed(aura::Window* window) {
1706d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1716d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1726d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void Node::OnWindowTargetVisibilityChanged(bool visible) {
1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1746d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1756d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)bool Node::HasHitTestMask() const {
1766d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return false;
1776d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1786d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)void Node::GetHitTestMask(gfx::Path* mask) const {
1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
181a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
182a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void Node::OnEvent(ui::Event* event) {
183a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  if (view_)
1846d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)    delegate_->OnViewInputEvent(view_, event);
1856d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1866d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace service
1886d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace view_manager
1896d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}  // namespace mojo
1906d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)