view_targeter.cc revision 5f1c94371a64b3196d4be9466099bb892df9b88e
1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// found in the LICENSE file.
4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/view_targeter.h"
6c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/events/event_target.h"
8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/focus/focus_manager.h"
9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "ui/views/view.h"
10116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "ui/views/view_targeter_delegate.h"
11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace views {
13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
14116680a4aac90f2aa7413d9095a592090648e557Ben MurdochViewTargeter::ViewTargeter(ViewTargeterDelegate* delegate)
15116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    : delegate_(delegate) {
165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  DCHECK(delegate_);
17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
18116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochViewTargeter::~ViewTargeter() {}
20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
21116680a4aac90f2aa7413d9095a592090648e557Ben Murdochbool ViewTargeter::DoesIntersectRect(const View* target,
22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                     const gfx::Rect& rect) const {
23116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return delegate_->DoesIntersectRect(target, rect);
24116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
25116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)View* ViewTargeter::TargetForRect(View* root, const gfx::Rect& rect) const {
275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return delegate_->TargetForRect(root, rect);
28cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
29cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root,
31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                                  ui::Event* event) {
32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  View* view = static_cast<View*>(root);
335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  if (event->IsKeyEvent())
35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event));
365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (event->IsScrollEvent()) {
385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return FindTargetForScrollEvent(view,
395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                    *static_cast<ui::ScrollEvent*>(event));
405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  }
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  NOTREACHED() << "ViewTargeter does not yet support this event type.";
43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return NULL;
44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochui::EventTarget* ViewTargeter::FindNextBestTarget(
47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ui::EventTarget* previous_target,
48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ui::Event* event) {
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return previous_target->GetParentTarget();
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
52010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ViewTargeter::SubtreeCanAcceptEvent(
53010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::EventTarget* target,
54010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::LocatedEvent& event) const {
555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
59010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ViewTargeter::EventLocationInsideBounds(
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::EventTarget* target,
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::LocatedEvent& event) const {
625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
65010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)View* ViewTargeter::FindTargetForKeyEvent(View* root, const ui::KeyEvent& key) {
675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (root->GetFocusManager())
685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return root->GetFocusManager()->GetFocusedView();
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return NULL;
70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)View* ViewTargeter::FindTargetForScrollEvent(View* root,
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             const ui::ScrollEvent& scroll) {
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Rect rect(scroll.location(), gfx::Size(1, 1));
755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return root->GetEffectiveViewTargeter()->TargetForRect(root, rect);
765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace views
79