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
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event->IsGestureEvent()) {
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::GestureEvent* gesture = event->AsGestureEvent();
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    View* gesture_target = FindTargetForGestureEvent(view, *gesture);
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    root->ConvertEventToTarget(gesture_target, gesture);
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return gesture_target;
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  NOTREACHED() << "ViewTargeter does not yet support this event type.";
50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return NULL;
51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochui::EventTarget* ViewTargeter::FindNextBestTarget(
54c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ui::EventTarget* previous_target,
55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ui::Event* event) {
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!previous_target)
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (event->IsGestureEvent()) {
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::GestureEvent* gesture = event->AsGestureEvent();
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::EventTarget* next_target =
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci        FindNextBestTargetForGestureEvent(previous_target, *gesture);
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    previous_target->ConvertEventToTarget(next_target, gesture);
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return next_target;
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return previous_target->GetParentTarget();
68c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
70010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ViewTargeter::SubtreeCanAcceptEvent(
71010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::EventTarget* target,
72010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::LocatedEvent& event) const {
735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
745f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
75010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
76010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
77010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)bool ViewTargeter::EventLocationInsideBounds(
78010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    ui::EventTarget* target,
79010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)    const ui::LocatedEvent& event) const {
805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  NOTREACHED();
815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return false;
82010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)}
83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)View* ViewTargeter::FindTargetForKeyEvent(View* root, const ui::KeyEvent& key) {
855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  if (root->GetFocusManager())
865f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    return root->GetFocusManager()->GetFocusedView();
87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  return NULL;
88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
905f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)View* ViewTargeter::FindTargetForScrollEvent(View* root,
915f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                                             const ui::ScrollEvent& scroll) {
925f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  gfx::Rect rect(scroll.location(), gfx::Size(1, 1));
935f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return root->GetEffectiveViewTargeter()->TargetForRect(root, rect);
945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciView* ViewTargeter::FindTargetForGestureEvent(View* root,
971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                              const ui::GestureEvent& gesture) {
981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // TODO(tdanderson): The only code path that performs targeting for gestures
991320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //                   uses the ViewTargeter installed on the RootView (i.e.,
1001320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //                   a RootViewTargeter). Provide a default implementation
1011320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //                   here if we need to be able to perform gesture targeting
1021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  //                   starting at an arbitrary node in a Views tree.
1031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciui::EventTarget* ViewTargeter::FindNextBestTargetForGestureEvent(
1081320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::EventTarget* previous_target,
1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ui::GestureEvent& gesture) {
1101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  NOTREACHED();
1111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return NULL;
1121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}  // namespace views
115