// 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(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(root); if (event->IsKeyEvent()) return FindTargetForKeyEvent(view, *static_cast(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(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(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