11320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Copyright 2014 The Chromium Authors. All rights reserved.
21320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// Use of this source code is governed by a BSD-style license that can be
31320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// found in the LICENSE file.
41320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
51320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/root_view_targeter.h"
61320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
71320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/view.h"
81320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/view_targeter_delegate.h"
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/views_switches.h"
101320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/root_view.h"
111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "ui/views/widget/widget.h"
121320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
131320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tuccinamespace views {
141320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
151320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRootViewTargeter::RootViewTargeter(ViewTargeterDelegate* delegate,
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                                   internal::RootView* root_view)
171320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    : ViewTargeter(delegate), root_view_(root_view) {
181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciRootViewTargeter::~RootViewTargeter() {
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
221320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
231320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciView* RootViewTargeter::FindTargetForGestureEvent(
241320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    View* root,
251320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ui::GestureEvent& gesture) {
261320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  CHECK_EQ(root, root_view_);
271320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Return the default gesture handler if one is already set.
291320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (root_view_->gesture_handler_) {
301320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    CHECK(root_view_->gesture_handler_set_before_processing_);
311320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return root_view_->gesture_handler_;
321320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If no default gesture handler has already been set, do not perform any
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // targeting for a ET_GESTURE_END event.
361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (gesture.type() == ui::ET_GESTURE_END)
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If rect-based targeting is enabled, use the gesture's bounding box to
401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // determine the target. Otherwise use the center point of the gesture's
411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // bounding box to determine the target.
421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  gfx::Rect rect(gesture.location(), gfx::Size(1, 1));
431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (views::switches::IsRectBasedTargetingEnabled() &&
441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      !gesture.details().bounding_box().IsEmpty()) {
451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // TODO(tdanderson): Pass in the bounding box to GetEventHandlerForRect()
461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    // once crbug.com/313392 is resolved.
471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    rect.set_size(gesture.details().bounding_box().size());
481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    rect.Offset(-rect.width() / 2, -rect.height() / 2);
491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return root->GetEffectiveViewTargeter()->TargetForRect(root, rect);
521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciui::EventTarget* RootViewTargeter::FindNextBestTargetForGestureEvent(
551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    ui::EventTarget* previous_target,
561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    const ui::GestureEvent& gesture) {
571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // ET_GESTURE_END events should only ever be targeted to the default
581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // gesture handler set by a previous gesture, if one exists. Thus we do not
591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // permit any re-targeting of ET_GESTURE_END events.
601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (gesture.type() == ui::ET_GESTURE_END)
611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // Prohibit re-targeting of gesture events (except for GESTURE_SCROLL_BEGIN
641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // events) if the default gesture handler was set by the dispatch of a
651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // previous gesture event.
661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (root_view_->gesture_handler_set_before_processing_ &&
671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      gesture.type() != ui::ET_GESTURE_SCROLL_BEGIN) {
681320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
691320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  }
701320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
711320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // If |gesture_handler_| is NULL, it is either because the view was removed
721320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // from the tree by the previous dispatch of |gesture| or because |gesture| is
731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // the GESTURE_END event corresponding to the removal of the last touch
741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // point. In either case, no further re-targeting of |gesture| should be
751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // permitted.
761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  if (!root_view_->gesture_handler_)
771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci    return NULL;
781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
791320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return previous_target->GetParentTarget();
801320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
811320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}  // namespace views
83