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. 4 5#include "ui/views/view_targeter.h" 6 7#include "ui/events/event_target.h" 8#include "ui/views/focus/focus_manager.h" 9#include "ui/views/view.h" 10#include "ui/views/view_targeter_delegate.h" 11 12namespace views { 13 14ViewTargeter::ViewTargeter(ViewTargeterDelegate* delegate) 15 : delegate_(delegate) { 16 DCHECK(delegate_); 17} 18 19ViewTargeter::~ViewTargeter() {} 20 21bool ViewTargeter::DoesIntersectRect(const View* target, 22 const gfx::Rect& rect) const { 23 return delegate_->DoesIntersectRect(target, rect); 24} 25 26View* ViewTargeter::TargetForRect(View* root, const gfx::Rect& rect) const { 27 return delegate_->TargetForRect(root, rect); 28} 29 30ui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root, 31 ui::Event* event) { 32 View* view = static_cast<View*>(root); 33 34 if (event->IsKeyEvent()) 35 return FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event)); 36 37 if (event->IsScrollEvent()) { 38 return FindTargetForScrollEvent(view, 39 *static_cast<ui::ScrollEvent*>(event)); 40 } 41 42 if (event->IsGestureEvent()) { 43 ui::GestureEvent* gesture = event->AsGestureEvent(); 44 View* gesture_target = FindTargetForGestureEvent(view, *gesture); 45 root->ConvertEventToTarget(gesture_target, gesture); 46 return gesture_target; 47 } 48 49 NOTREACHED() << "ViewTargeter does not yet support this event type."; 50 return NULL; 51} 52 53ui::EventTarget* ViewTargeter::FindNextBestTarget( 54 ui::EventTarget* previous_target, 55 ui::Event* event) { 56 if (!previous_target) 57 return NULL; 58 59 if (event->IsGestureEvent()) { 60 ui::GestureEvent* gesture = event->AsGestureEvent(); 61 ui::EventTarget* next_target = 62 FindNextBestTargetForGestureEvent(previous_target, *gesture); 63 previous_target->ConvertEventToTarget(next_target, gesture); 64 return next_target; 65 } 66 67 return previous_target->GetParentTarget(); 68} 69 70bool ViewTargeter::SubtreeCanAcceptEvent( 71 ui::EventTarget* target, 72 const ui::LocatedEvent& event) const { 73 NOTREACHED(); 74 return false; 75} 76 77bool ViewTargeter::EventLocationInsideBounds( 78 ui::EventTarget* target, 79 const ui::LocatedEvent& event) const { 80 NOTREACHED(); 81 return false; 82} 83 84View* ViewTargeter::FindTargetForKeyEvent(View* root, const ui::KeyEvent& key) { 85 if (root->GetFocusManager()) 86 return root->GetFocusManager()->GetFocusedView(); 87 return NULL; 88} 89 90View* ViewTargeter::FindTargetForScrollEvent(View* root, 91 const ui::ScrollEvent& scroll) { 92 gfx::Rect rect(scroll.location(), gfx::Size(1, 1)); 93 return root->GetEffectiveViewTargeter()->TargetForRect(root, rect); 94} 95 96View* ViewTargeter::FindTargetForGestureEvent(View* root, 97 const ui::GestureEvent& gesture) { 98 // TODO(tdanderson): The only code path that performs targeting for gestures 99 // uses the ViewTargeter installed on the RootView (i.e., 100 // a RootViewTargeter). Provide a default implementation 101 // here if we need to be able to perform gesture targeting 102 // starting at an arbitrary node in a Views tree. 103 NOTREACHED(); 104 return NULL; 105} 106 107ui::EventTarget* ViewTargeter::FindNextBestTargetForGestureEvent( 108 ui::EventTarget* previous_target, 109 const ui::GestureEvent& gesture) { 110 NOTREACHED(); 111 return NULL; 112} 113 114} // namespace views 115