#ifndef UI_EVENTS_EVENT_TARGET_H_
#define UI_EVENTS_EVENT_TARGET_H_
#include <memory>
#include <vector>
#include "base/memory/raw_ptr.h"
#include "base/memory/raw_ptr_exclusion.h"
#include "base/scoped_observation_traits.h"
#include "ui/events/event_handler.h"
#include "ui/events/events_export.h"
#include "ui/gfx/geometry/point.h"
#include "ui/gfx/geometry/point_f.h"
namespace ui {
class EventDispatcher;
class EventTargeter;
class EventTargetIterator;
class LocatedEvent;
class EVENTS_EXPORT EventTarget {
public:
class DispatcherApi {
public:
explicit DispatcherApi(EventTarget* target) : target_(target) {}
DispatcherApi(const DispatcherApi&) = delete;
DispatcherApi& operator=(const DispatcherApi&) = delete;
private:
DispatcherApi();
raw_ptr<EventTarget> target_;
};
EventTarget();
EventTarget(const EventTarget&) = delete;
EventTarget& operator=(const EventTarget&) = delete;
virtual ~EventTarget();
virtual bool CanAcceptEvent(const Event& event) = 0;
virtual EventTarget* GetParentTarget() = 0;
virtual std::unique_ptr<EventTargetIterator> GetChildIterator() const = 0;
virtual EventTargeter* GetEventTargeter() = 0;
virtual void ConvertEventToTarget(const EventTarget* target,
LocatedEvent* event) const;
virtual gfx::PointF GetScreenLocationF(const LocatedEvent& event) const;
gfx::Point GetScreenLocation(const LocatedEvent& event) const;
enum class Priority {
kAccessibility,
kSystem,
kDefault,
};
void AddPreTargetHandler(EventHandler* handler);
void AddPreTargetHandler(EventHandler* handler, Priority priority);
void RemovePreTargetHandler(EventHandler* handler);
void AddPostTargetHandler(EventHandler* handler);
void RemovePostTargetHandler(EventHandler* handler);
bool IsPreTargetListEmpty() const;
EventHandler* SetTargetHandler(EventHandler* target_handler);
bool HasTargetHandler() const { return target_handler_ != nullptr; }
protected:
EventHandler* target_handler() { return target_handler_; }
private:
friend class EventDispatcher;
friend class EventTargetTestApi;
struct PrioritizedHandler {
RAW_PTR_EXCLUSION EventHandler* handler = nullptr;
Priority priority = Priority::kDefault;
bool operator<(const PrioritizedHandler& ph) const {
return priority < ph.priority;
}
};
using EventHandlerPriorityList = std::vector<PrioritizedHandler>;
void GetPreTargetHandlers(EventHandlerList* list);
void GetPostTargetHandlers(EventHandlerList* list);
EventHandlerPriorityList pre_target_list_;
EventHandlerList post_target_list_;
raw_ptr<EventHandler, DanglingUntriaged> target_handler_ = nullptr;
};
}
namespace base {
template <>
struct ScopedObservationTraits<ui::EventTarget, ui::EventHandler> {
static void AddObserver(ui::EventTarget* source, ui::EventHandler* observer) {
source->AddPreTargetHandler(observer);
}
static void RemoveObserver(ui::EventTarget* source,
ui::EventHandler* observer) {
source->RemovePreTargetHandler(observer);
}
};
}
#endif