| 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); |
| 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) { |
| 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; |
| 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); |
| 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 |