text: // Copyright (c) 2013 The Chromium Authors. All rights reserved.
  // Use of this source code is governed by a BSD-style license that can be
  // found in the LICENSE file.
  
  #ifndef UI_EVENTS_EVENT_TARGETER_H_
  #define UI_EVENTS_EVENT_TARGETER_H_
  
  #include "base/compiler_specific.h"
  #include "ui/events/event.h"
  #include "ui/events/events_export.h"
  
  namespace ui {
  
  class Event;
  class EventTarget;
  class LocatedEvent;
  
  class EVENTS_EXPORT EventTargeter {
   public:
    virtual ~EventTargeter();
  
    // Returns the target |event| should be dispatched to. If there is no such
    // target, this should return NULL.
    virtual EventTarget* FindTargetForEvent(EventTarget* root,
                                            Event* event);
  
    // Same as FindTargetForEvent(), but used for positional events. The location
    // etc. of |event| are in |root|'s coordinate system. When finding the target
    // for the event, the targeter can mutate the |event| (e.g. change the
    // coordinate to be in the returned target's coordinate system) so that it can
    // be dispatched to the target without any farther modification.
    virtual EventTarget* FindTargetForLocatedEvent(EventTarget* root,
                                                   LocatedEvent* event);
  
    // Returns true of |target| or one of its descendants can be a target of
    // |event|. Note that the location etc. of |event| is in |target|'s parent's
    // coordinate system.
    virtual bool SubtreeShouldBeExploredForEvent(EventTarget* target,
                                                 const LocatedEvent& event);
  
    // Returns the next best target for |event| as compared to |previous_target|.
    // Also mutates |event| so that it can be dispatched to the returned target
    // (e.g., by changing |event|'s location to be in the returned target's
    // coordinate space).
    virtual EventTarget* FindNextBestTarget(EventTarget* previous_target,
                                            Event* event);
  };
  
  }  // namespace ui
  
  #endif  // UI_EVENTS_EVENT_TARGETER_H_
  