summaryrefslogtreecommitdiffstats
path: root/chromium/ui/views/view_targeter.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/ui/views/view_targeter.cc')
-rw-r--r--chromium/ui/views/view_targeter.cc79
1 files changed, 79 insertions, 0 deletions
diff --git a/chromium/ui/views/view_targeter.cc b/chromium/ui/views/view_targeter.cc
new file mode 100644
index 00000000000..31babfb88c0
--- /dev/null
+++ b/chromium/ui/views/view_targeter.cc
@@ -0,0 +1,79 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "ui/views/view_targeter.h"
+
+#include "ui/events/event_target.h"
+#include "ui/views/focus/focus_manager.h"
+#include "ui/views/view.h"
+
+namespace views {
+
+ViewTargeter::ViewTargeter() {}
+ViewTargeter::~ViewTargeter() {}
+
+gfx::RectF ViewTargeter::BoundsForEvent(const ui::LocatedEvent& event) const {
+ gfx::RectF event_bounds(event.location_f(), gfx::SizeF(1, 1));
+ if (event.IsGestureEvent()) {
+ const ui::GestureEvent& gesture =
+ static_cast<const ui::GestureEvent&>(event);
+ event_bounds = gesture.details().bounding_box_f();
+ }
+
+ return event_bounds;
+}
+
+ui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root,
+ ui::Event* event) {
+ View* view = static_cast<View*>(root);
+ if (event->IsKeyEvent())
+ return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event));
+ else if (event->IsScrollEvent())
+ return EventTargeter::FindTargetForEvent(root, event);
+
+ NOTREACHED() << "ViewTargeter does not yet support this event type.";
+ return NULL;
+}
+
+ui::EventTarget* ViewTargeter::FindNextBestTarget(
+ ui::EventTarget* previous_target,
+ ui::Event* event) {
+ return previous_target->GetParentTarget();
+}
+
+bool ViewTargeter::SubtreeCanAcceptEvent(
+ ui::EventTarget* target,
+ const ui::LocatedEvent& event) const {
+ views::View* view = static_cast<views::View*>(target);
+ if (!view->visible())
+ return false;
+
+ if (!view->CanProcessEventsWithinSubtree())
+ return false;
+
+ return true;
+}
+
+bool ViewTargeter::EventLocationInsideBounds(
+ ui::EventTarget* target,
+ const ui::LocatedEvent& event) const {
+ views::View* view = static_cast<views::View*>(target);
+ gfx::Rect rect(event.location(), gfx::Size(1, 1));
+ gfx::RectF rect_in_view_coords_f(rect);
+ if (view->parent())
+ View::ConvertRectToTarget(view->parent(), view, &rect_in_view_coords_f);
+ gfx::Rect rect_in_view_coords = gfx::ToEnclosingRect(rect_in_view_coords_f);
+
+ // TODO(tdanderson): Don't call into HitTestRect() directly here.
+ // See crbug.com/370579.
+ return view->HitTestRect(rect_in_view_coords);
+}
+
+View* ViewTargeter::FindTargetForKeyEvent(View* view, const ui::KeyEvent& key) {
+ if (view->GetFocusManager())
+ return view->GetFocusManager()->GetFocusedView();
+ return NULL;
+}
+
+} // namespace aura