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