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