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.
5 #include "ui/views/view_targeter.h"
7 #include "ui/events/event_target.h"
8 #include "ui/views/focus/focus_manager.h"
9 #include "ui/views/view.h"
13 ViewTargeter::ViewTargeter() {}
14 ViewTargeter::~ViewTargeter() {}
16 ui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root,
18 View* view = static_cast<View*>(root);
19 if (event->IsKeyEvent())
20 return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event));
21 else if (event->IsScrollEvent())
22 return EventTargeter::FindTargetForEvent(root, event);
24 NOTREACHED() << "ViewTargeter does not yet support this event type.";
28 ui::EventTarget* ViewTargeter::FindNextBestTarget(
29 ui::EventTarget* previous_target,
31 return previous_target->GetParentTarget();
34 bool ViewTargeter::SubtreeCanAcceptEvent(
35 ui::EventTarget* target,
36 const ui::LocatedEvent& event) const {
37 views::View* view = static_cast<views::View*>(target);
43 bool ViewTargeter::EventLocationInsideBounds(
44 ui::EventTarget* target,
45 const ui::LocatedEvent& event) const {
46 views::View* view = static_cast<views::View*>(target);
47 gfx::Rect rect(event.location(), gfx::Size(1, 1));
48 gfx::RectF rect_in_view_coords_f(rect);
50 View::ConvertRectToTarget(view->parent(), view, &rect_in_view_coords_f);
51 gfx::Rect rect_in_view_coords = gfx::ToEnclosingRect(rect_in_view_coords_f);
53 // TODO(tdanderson): Don't call into HitTestRect() directly here.
54 // See crbug.com/370579.
55 return view->HitTestRect(rect_in_view_coords);
58 View* ViewTargeter::FindTargetForKeyEvent(View* view, const ui::KeyEvent& key) {
59 if (view->GetFocusManager())
60 return view->GetFocusManager()->GetFocusedView();