| 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 |