event_target.cc 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. // Copyright (c) 2012 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. #include "ui/events/event_target.h"
  5. #include <algorithm>
  6. #include "base/check.h"
  7. #include "base/notreached.h"
  8. #include "ui/events/event.h"
  9. #include "ui/gfx/geometry/point_conversions.h"
  10. namespace ui {
  11. EventTarget::EventTarget() = default;
  12. EventTarget::~EventTarget() = default;
  13. void EventTarget::ConvertEventToTarget(const EventTarget* target,
  14. LocatedEvent* event) const {}
  15. gfx::PointF EventTarget::GetScreenLocationF(
  16. const ui::LocatedEvent& event) const {
  17. NOTREACHED();
  18. return event.root_location_f();
  19. }
  20. gfx::Point EventTarget::GetScreenLocation(const ui::LocatedEvent& event) const {
  21. return gfx::ToFlooredPoint(GetScreenLocationF(event));
  22. }
  23. void EventTarget::AddPreTargetHandler(EventHandler* handler) {
  24. AddPreTargetHandler(handler, Priority::kDefault);
  25. }
  26. void EventTarget::AddPreTargetHandler(EventHandler* handler,
  27. Priority priority) {
  28. CHECK(handler);
  29. PrioritizedHandler prioritized;
  30. prioritized.handler = handler;
  31. prioritized.priority = priority;
  32. if (priority == Priority::kDefault)
  33. pre_target_list_.push_back(prioritized);
  34. else
  35. pre_target_list_.insert(pre_target_list_.begin(), prioritized);
  36. }
  37. void EventTarget::RemovePreTargetHandler(EventHandler* handler) {
  38. CHECK(handler);
  39. EventHandlerPriorityList::iterator it, end;
  40. for (it = pre_target_list_.begin(), end = pre_target_list_.end(); it != end;
  41. ++it) {
  42. if (it->handler == handler) {
  43. pre_target_list_.erase(it);
  44. return;
  45. }
  46. }
  47. }
  48. void EventTarget::AddPostTargetHandler(EventHandler* handler) {
  49. DCHECK(handler);
  50. post_target_list_.push_back(handler);
  51. }
  52. void EventTarget::RemovePostTargetHandler(EventHandler* handler) {
  53. auto find =
  54. std::find(post_target_list_.begin(), post_target_list_.end(), handler);
  55. if (find != post_target_list_.end())
  56. post_target_list_.erase(find);
  57. }
  58. bool EventTarget::IsPreTargetListEmpty() const {
  59. return pre_target_list_.empty();
  60. }
  61. EventHandler* EventTarget::SetTargetHandler(EventHandler* target_handler) {
  62. EventHandler* original_target_handler = target_handler_;
  63. target_handler_ = target_handler;
  64. return original_target_handler;
  65. }
  66. void EventTarget::GetPreTargetHandlers(EventHandlerList* list) {
  67. EventTarget* target = this;
  68. EventHandlerPriorityList temp;
  69. while (target) {
  70. // Build a composite list of EventHandlers from targets.
  71. temp.insert(temp.begin(), target->pre_target_list_.begin(),
  72. target->pre_target_list_.end());
  73. target = target->GetParentTarget();
  74. }
  75. // Sort the list, keeping relative order, but making sure the
  76. // accessibility handlers always go first before system, which will
  77. // go before default, at all levels of EventTarget.
  78. std::stable_sort(temp.begin(), temp.end());
  79. // Add the sorted handlers to the result list, in order.
  80. for (size_t i = 0; i < temp.size(); ++i)
  81. list->insert(list->end(), temp[i].handler);
  82. }
  83. void EventTarget::GetPostTargetHandlers(EventHandlerList* list) {
  84. EventTarget* target = this;
  85. while (target) {
  86. list->insert(list->end(), target->post_target_list_.begin(),
  87. target->post_target_list_.end());
  88. target = target->GetParentTarget();
  89. }
  90. }
  91. } // namespace ui