OLD | NEW |
| (Empty) |
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 | |
3 // found in the LICENSE file. | |
4 | |
5 #include "services/window_manager/view_target.h" | |
6 | |
7 #include "mojo/converters/geometry/geometry_type_converters.h" | |
8 #include "mojo/services/view_manager/cpp/view.h" | |
9 #include "mojo/services/view_manager/cpp/view_property.h" | |
10 #include "services/window_manager/view_targeter.h" | |
11 #include "services/window_manager/window_manager_app.h" | |
12 #include "ui/events/event.h" | |
13 #include "ui/events/event_target_iterator.h" | |
14 #include "ui/events/event_targeter.h" | |
15 #include "ui/gfx/geometry/rect.h" | |
16 #include "ui/gfx/point3_f.h" | |
17 #include "ui/gfx/transform.h" | |
18 | |
19 namespace window_manager { | |
20 | |
21 namespace { | |
22 | |
23 DEFINE_OWNED_VIEW_PROPERTY_KEY(ViewTarget, kViewTargetKey, nullptr); | |
24 | |
25 } // namespace | |
26 | |
27 ViewTarget::~ViewTarget() { | |
28 } | |
29 | |
30 // static | |
31 ViewTarget* ViewTarget::TargetFromView(mojo::View* view) { | |
32 if (!view) | |
33 return nullptr; | |
34 | |
35 ViewTarget* target = view->GetLocalProperty(kViewTargetKey); | |
36 if (target) | |
37 return target; | |
38 | |
39 return new ViewTarget(view); | |
40 } | |
41 | |
42 void ViewTarget::ConvertPointToTarget(const ViewTarget* source, | |
43 const ViewTarget* target, | |
44 gfx::Point* point) { | |
45 // TODO(erg): Do we need to deal with |source| and |target| being in | |
46 // different trees? | |
47 DCHECK_EQ(source->GetRoot(), target->GetRoot()); | |
48 if (source == target) | |
49 return; | |
50 | |
51 const ViewTarget* root_target = source->GetRoot(); | |
52 CHECK_EQ(root_target, target->GetRoot()); | |
53 | |
54 if (source != root_target) | |
55 source->ConvertPointForAncestor(root_target, point); | |
56 if (target != root_target) | |
57 target->ConvertPointFromAncestor(root_target, point); | |
58 } | |
59 | |
60 std::vector<ViewTarget*> ViewTarget::GetChildren() const { | |
61 std::vector<ViewTarget*> targets; | |
62 for (mojo::View* child : view_->children()) | |
63 targets.push_back(TargetFromView(child)); | |
64 return targets; | |
65 } | |
66 | |
67 const ViewTarget* ViewTarget::GetParent() const { | |
68 return TargetFromView(view_->parent()); | |
69 } | |
70 | |
71 gfx::Rect ViewTarget::GetBounds() const { | |
72 return view_->bounds().To<gfx::Rect>(); | |
73 } | |
74 | |
75 bool ViewTarget::HasParent() const { | |
76 return !!view_->parent(); | |
77 } | |
78 | |
79 bool ViewTarget::IsVisible() const { | |
80 return view_->visible(); | |
81 } | |
82 | |
83 const ViewTarget* ViewTarget::GetRoot() const { | |
84 const ViewTarget* root = this; | |
85 for (const ViewTarget* parent = this; parent; parent = parent->GetParent()) | |
86 root = parent; | |
87 return root; | |
88 } | |
89 | |
90 scoped_ptr<ViewTargeter> ViewTarget::SetEventTargeter( | |
91 scoped_ptr<ViewTargeter> targeter) { | |
92 scoped_ptr<ViewTargeter> old_targeter = targeter_.Pass(); | |
93 targeter_ = targeter.Pass(); | |
94 return old_targeter; | |
95 } | |
96 | |
97 bool ViewTarget::CanAcceptEvent(const ui::Event& event) { | |
98 // We need to make sure that a touch cancel event and any gesture events it | |
99 // creates can always reach the window. This ensures that we receive a valid | |
100 // touch / gesture stream. | |
101 if (event.IsEndingEvent()) | |
102 return true; | |
103 | |
104 if (!view_->visible()) | |
105 return false; | |
106 | |
107 // The top-most window can always process an event. | |
108 if (!view_->parent()) | |
109 return true; | |
110 | |
111 // In aura, we only accept events if this is a key event or if the user | |
112 // supplied a TargetHandler, usually the aura::WindowDelegate. Here, we're | |
113 // just forwarding events to other Views which may be in other processes, so | |
114 // always accept. | |
115 return true; | |
116 } | |
117 | |
118 ui::EventTarget* ViewTarget::GetParentTarget() { | |
119 return TargetFromView(view_->parent()); | |
120 } | |
121 | |
122 scoped_ptr<ui::EventTargetIterator> ViewTarget::GetChildIterator() const { | |
123 return scoped_ptr<ui::EventTargetIterator>( | |
124 new ui::CopyingEventTargetIteratorImpl<ViewTarget>(GetChildren())); | |
125 } | |
126 | |
127 ui::EventTargeter* ViewTarget::GetEventTargeter() { | |
128 return targeter_.get(); | |
129 } | |
130 | |
131 void ViewTarget::ConvertEventToTarget(ui::EventTarget* target, | |
132 ui::LocatedEvent* event) { | |
133 event->ConvertLocationToTarget(this, static_cast<ViewTarget*>(target)); | |
134 } | |
135 | |
136 ViewTarget::ViewTarget(mojo::View* view_to_wrap) : view_(view_to_wrap) { | |
137 DCHECK(view_->GetLocalProperty(kViewTargetKey) == nullptr); | |
138 view_->SetLocalProperty(kViewTargetKey, this); | |
139 } | |
140 | |
141 bool ViewTarget::ConvertPointForAncestor(const ViewTarget* ancestor, | |
142 gfx::Point* point) const { | |
143 gfx::Vector2d offset; | |
144 bool result = GetTargetOffsetRelativeTo(ancestor, &offset); | |
145 *point += offset; | |
146 return result; | |
147 } | |
148 | |
149 bool ViewTarget::ConvertPointFromAncestor(const ViewTarget* ancestor, | |
150 gfx::Point* point) const { | |
151 gfx::Vector2d offset; | |
152 bool result = GetTargetOffsetRelativeTo(ancestor, &offset); | |
153 *point -= offset; | |
154 return result; | |
155 } | |
156 | |
157 bool ViewTarget::GetTargetOffsetRelativeTo(const ViewTarget* ancestor, | |
158 gfx::Vector2d* offset) const { | |
159 const ViewTarget* v = this; | |
160 for (; v && v != ancestor; v = v->GetParent()) { | |
161 gfx::Rect bounds = v->GetBounds(); | |
162 *offset += gfx::Vector2d(bounds.x(), bounds.y()); | |
163 } | |
164 return v == ancestor; | |
165 } | |
166 | |
167 } // namespace window_manager | |
OLD | NEW |