blob: 31babfb88c0a4e51b140d6359b1331d0f4f93983 [file] [log] [blame]
// 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