Home | History | Annotate | Download | only in events
      1 // Copyright (c) 2013 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/events/event_targeter.h"
      6 
      7 #include "ui/events/event.h"
      8 #include "ui/events/event_target.h"
      9 #include "ui/events/event_target_iterator.h"
     10 
     11 namespace ui {
     12 
     13 EventTargeter::~EventTargeter() {
     14 }
     15 
     16 EventTarget* EventTargeter::FindTargetForEvent(EventTarget* root,
     17                                                Event* event) {
     18   if (event->IsMouseEvent() ||
     19       event->IsScrollEvent() ||
     20       event->IsTouchEvent() ||
     21       event->IsGestureEvent()) {
     22     return FindTargetForLocatedEvent(root,
     23                                      static_cast<LocatedEvent*>(event));
     24   }
     25   return root;
     26 }
     27 
     28 EventTarget* EventTargeter::FindTargetForLocatedEvent(EventTarget* root,
     29                                                       LocatedEvent* event) {
     30   scoped_ptr<EventTargetIterator> iter = root->GetChildIterator();
     31   if (iter) {
     32     EventTarget* target = root;
     33     for (EventTarget* child = iter->GetNextTarget(); child;
     34          child = iter->GetNextTarget()) {
     35       EventTargeter* targeter = child->GetEventTargeter();
     36       if (!targeter)
     37         targeter = this;
     38       if (!targeter->SubtreeShouldBeExploredForEvent(child, *event))
     39         continue;
     40       target->ConvertEventToTarget(child, event);
     41       target = child;
     42       EventTarget* child_target = targeter ?
     43           targeter->FindTargetForLocatedEvent(child, event) :
     44           FindTargetForLocatedEvent(child, event);
     45       if (child_target)
     46         return child_target;
     47     }
     48     target->ConvertEventToTarget(root, event);
     49   }
     50   return root->CanAcceptEvent(*event) ? root : NULL;
     51 }
     52 
     53 bool EventTargeter::SubtreeShouldBeExploredForEvent(EventTarget* target,
     54                                                     const LocatedEvent& event) {
     55   return SubtreeCanAcceptEvent(target, event) &&
     56          EventLocationInsideBounds(target, event);
     57 }
     58 
     59 EventTarget* EventTargeter::FindNextBestTarget(EventTarget* previous_target,
     60                                                Event* event) {
     61   return NULL;
     62 }
     63 
     64 bool EventTargeter::SubtreeCanAcceptEvent(EventTarget* target,
     65                                           const LocatedEvent& event) const {
     66   return true;
     67 }
     68 
     69 bool EventTargeter::EventLocationInsideBounds(EventTarget* target,
     70                                               const LocatedEvent& event) const {
     71   return true;
     72 }
     73 
     74 }  // namespace ui
     75