OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "mojo/services/window_manager/view_target.h" | 5 #include "mojo/services/window_manager/view_target.h" |
6 | 6 |
7 #include "mojo/converters/geometry/geometry_type_converters.h" | |
7 #include "mojo/services/public/cpp/view_manager/view.h" | 8 #include "mojo/services/public/cpp/view_manager/view.h" |
9 #include "mojo/services/public/cpp/view_manager/view_property.h" | |
10 #include "mojo/services/window_manager/view_targeter.h" | |
8 #include "mojo/services/window_manager/window_manager_app.h" | 11 #include "mojo/services/window_manager/window_manager_app.h" |
9 #include "ui/events/event.h" | 12 #include "ui/events/event.h" |
10 #include "ui/events/event_target_iterator.h" | 13 #include "ui/events/event_target_iterator.h" |
11 #include "ui/events/event_targeter.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" | |
12 | 18 |
13 namespace mojo { | 19 namespace mojo { |
14 | 20 |
15 class ViewTargeter : public ui::EventTargeter {}; | 21 namespace { |
16 | 22 |
17 ViewTarget::ViewTarget(WindowManagerApp* app, View* view_to_wrap) | 23 DEFINE_OWNED_VIEW_PROPERTY_KEY(ViewTarget, kViewTargetKey, nullptr); |
18 : app_(app), | 24 |
19 view_(view_to_wrap) { | 25 } // namespace |
26 | |
27 ViewTarget::ViewTarget(View* view_to_wrap) | |
28 : view_(view_to_wrap) { | |
29 view_->SetLocalProperty(kViewTargetKey, this); | |
sky
2014/11/17 22:39:27
DCHECK GetLocalProperty(kViewTargetKey, this) == n
| |
30 view_->AddObserver(this); | |
20 } | 31 } |
21 | 32 |
22 ViewTarget::~ViewTarget() { | 33 // static |
23 // We don't own our children or |view_|. | 34 ViewTarget* ViewTarget::TargetFromView(View* view) { |
sky
2014/11/17 22:39:27
Keep definitions & declarations in order.
| |
35 return view ? view->GetLocalProperty(kViewTargetKey) : nullptr; | |
36 } | |
37 | |
38 void ViewTarget::ConvertPointToTarget(const ViewTarget* source, | |
39 const ViewTarget* target, | |
40 gfx::Point* point) { | |
41 // TODO(erg): Do we need to deal with |source| and |target| being in | |
42 // different trees? | |
43 if (source == target) | |
44 return; | |
45 | |
46 const ViewTarget* root_target = source->GetRoot(); | |
47 CHECK_EQ(root_target, target->GetRoot()); | |
48 | |
49 if (source != root_target) | |
50 source->ConvertPointForAncestor(root_target, point); | |
51 if (target != root_target) | |
52 target->ConvertPointFromAncestor(root_target, point); | |
53 } | |
54 | |
55 std::vector<ViewTarget*> ViewTarget::GetChildren() const { | |
56 std::vector<ViewTarget*> targets; | |
57 for (View* child : view_->children()) | |
58 targets.push_back(TargetFromView(child)); | |
59 return targets; | |
60 } | |
61 | |
62 ViewTarget* ViewTarget::GetParent() const { | |
63 return TargetFromView(view_->parent()); | |
64 } | |
65 | |
66 gfx::Rect ViewTarget::GetBounds() const { | |
67 return view_->bounds().To<gfx::Rect>(); | |
24 } | 68 } |
25 | 69 |
26 bool ViewTarget::HasParent() const { | 70 bool ViewTarget::HasParent() const { |
27 return !!view_->parent(); | 71 return !!view_->parent(); |
28 } | 72 } |
29 | 73 |
30 bool ViewTarget::IsVisible() const { | 74 bool ViewTarget::IsVisible() const { |
31 return view_->visible(); | 75 return view_->visible(); |
32 } | 76 } |
33 | 77 |
34 void ViewTarget::AddChild(ViewTarget* view) { | 78 const ViewTarget* ViewTarget::GetRoot() const { |
35 children_.push_back(view); | 79 const ViewTarget* root = nullptr; |
sky
2014/11/17 22:39:27
Should this be set to this first?
Elliot Glaysher
2014/11/17 23:33:01
Rewrote this to not use a parent temporary.
(I th
| |
80 for (const ViewTarget* parent = this; parent; parent = parent->GetParent()) | |
81 root = parent; | |
82 return root; | |
36 } | 83 } |
37 | 84 |
38 scoped_ptr<ViewTargeter> ViewTarget::SetEventTargeter( | 85 scoped_ptr<ViewTargeter> ViewTarget::SetEventTargeter( |
39 scoped_ptr<ViewTargeter> targeter) { | 86 scoped_ptr<ViewTargeter> targeter) { |
40 scoped_ptr<ViewTargeter> old_targeter = targeter_.Pass(); | 87 scoped_ptr<ViewTargeter> old_targeter = targeter_.Pass(); |
41 targeter_ = targeter.Pass(); | 88 targeter_ = targeter.Pass(); |
42 return old_targeter.Pass(); | 89 return old_targeter.Pass(); |
43 } | 90 } |
44 | 91 |
45 bool ViewTarget::CanAcceptEvent(const ui::Event& event) { | 92 bool ViewTarget::CanAcceptEvent(const ui::Event& event) { |
46 // We need to make sure that a touch cancel event and any gesture events it | 93 // We need to make sure that a touch cancel event and any gesture events it |
47 // creates can always reach the window. This ensures that we receive a valid | 94 // creates can always reach the window. This ensures that we receive a valid |
48 // touch / gesture stream. | 95 // touch / gesture stream. |
49 if (event.IsEndingEvent()) | 96 if (event.IsEndingEvent()) |
50 return true; | 97 return true; |
51 | 98 |
52 if (!view_->visible()) | 99 if (!view_->visible()) |
53 return false; | 100 return false; |
54 | 101 |
55 // The top-most window can always process an event. | 102 // The top-most window can always process an event. |
56 if (!view_->parent()) | 103 if (!view_->parent()) |
57 return true; | 104 return true; |
58 | 105 |
59 // For located events (i.e. mouse, touch etc.), an assumption is made that | 106 // In aura, we only accept events if this is a key event or if the user |
60 // windows that don't have a default event-handler cannot process the event | 107 // supplied a TargetHandler, usually the aura::WindowDelegate. Here, we're |
61 // (see more in GetWindowForPoint()). This assumption is not made for key | 108 // just forwarding events to other Views which may be in other processes, so |
62 // events. | 109 // always accept. |
63 return event.IsKeyEvent() || target_handler(); | 110 return true; |
64 } | 111 } |
65 | 112 |
66 ui::EventTarget* ViewTarget::GetParentTarget() { | 113 ui::EventTarget* ViewTarget::GetParentTarget() { |
67 if (!view_->parent()) { | 114 return TargetFromView(view_->parent()); |
68 // We are the root node. | |
69 return nullptr; | |
70 } | |
71 | |
72 return app_->GetViewTargetForViewId(view_->parent()->id()); | |
73 } | 115 } |
74 | 116 |
75 scoped_ptr<ui::EventTargetIterator> ViewTarget::GetChildIterator() const { | 117 scoped_ptr<ui::EventTargetIterator> ViewTarget::GetChildIterator() const { |
76 return scoped_ptr<ui::EventTargetIterator>( | 118 return scoped_ptr<ui::EventTargetIterator>( |
77 new ui::EventTargetIteratorImpl<ViewTarget>(children_)); | 119 new ui::CopyingEventTargetIteratorImpl<ViewTarget>(GetChildren())); |
78 } | 120 } |
79 | 121 |
80 ui::EventTargeter* ViewTarget::GetEventTargeter() { | 122 ui::EventTargeter* ViewTarget::GetEventTargeter() { |
81 return targeter_.get(); | 123 return targeter_.get(); |
82 } | 124 } |
83 | 125 |
84 void ViewTarget::ConvertEventToTarget(ui::EventTarget* target, | 126 void ViewTarget::ConvertEventToTarget(ui::EventTarget* target, |
85 ui::LocatedEvent* event) { | 127 ui::LocatedEvent* event) { |
86 // TODO(erg): Actually doing enabling this line requires doing some partially | 128 event->ConvertLocationToTarget(this, |
87 // specialized template cruft. Punt for now. | 129 static_cast<ViewTarget*>(target)); |
88 // | 130 } |
89 // event->ConvertLocationToTarget(this, | 131 |
90 // static_cast<ViewTarget*>(target)); | 132 void ViewTarget::OnViewDestroying(View* view) { |
133 view->RemoveObserver(this); | |
sky
2014/11/17 22:39:27
Is it necessary to add an observer anymore?
Elliot Glaysher
2014/11/17 23:33:01
It isn't.
| |
134 } | |
135 | |
136 ViewTarget::~ViewTarget() {} | |
137 | |
138 bool ViewTarget::ConvertPointForAncestor(const ViewTarget* ancestor, | |
139 gfx::Point* point) const { | |
140 gfx::Vector2d offset; | |
141 bool result = GetTargetOffsetRelativeTo(ancestor, &offset); | |
142 *point += offset; | |
143 return result; | |
144 } | |
145 | |
146 bool ViewTarget::ConvertPointFromAncestor(const ViewTarget* ancestor, | |
147 gfx::Point* point) const { | |
148 gfx::Vector2d offset; | |
149 bool result = GetTargetOffsetRelativeTo(ancestor, &offset); | |
150 *point -= offset; | |
151 return result; | |
152 } | |
153 | |
154 bool ViewTarget::GetTargetOffsetRelativeTo(const ViewTarget* ancestor, | |
155 gfx::Vector2d* offset) const { | |
156 const ViewTarget* v = this; | |
157 for (; v && v != ancestor; v = v->GetParent()) { | |
158 gfx::Rect bounds = v->GetBounds(); | |
159 *offset += gfx::Vector2d(bounds.x(), bounds.y()); | |
160 } | |
161 return v == ancestor; | |
91 } | 162 } |
92 | 163 |
93 } // namespace mojo | 164 } // namespace mojo |
OLD | NEW |