// Copyright 2014 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.

#include "services/window_manager/view_targeter.h"

#include "services/window_manager/focus_controller.h"
#include "services/window_manager/view_target.h"

namespace window_manager {

ViewTargeter::ViewTargeter() {}

ViewTargeter::~ViewTargeter() {}

ui::EventTarget* ViewTargeter::FindTargetForEvent(ui::EventTarget* root,
                                                  ui::Event* event) {
  ViewTarget* view = static_cast<ViewTarget*>(root);
  ViewTarget* target =
      event->IsKeyEvent()
          ? FindTargetForKeyEvent(view, *static_cast<ui::KeyEvent*>(event))
          : static_cast<ViewTarget*>(
                EventTargeter::FindTargetForEvent(root, event));

  // TODO(erg): The aura version of this method does a lot of work to handle
  // dispatching to a target that isn't a child of |view|. For now, punt on
  // this.
  DCHECK_EQ(view->GetRoot(), target->GetRoot());

  return target;
}

ui::EventTarget* ViewTargeter::FindTargetForLocatedEvent(
    ui::EventTarget* root,
    ui::LocatedEvent* event) {
  ViewTarget* view = static_cast<ViewTarget*>(root);
  if (!view->HasParent()) {
    ViewTarget* target = FindTargetInRootView(view, *event);
    if (target) {
      view->ConvertEventToTarget(target, event);
      return target;
    }
  }
  return EventTargeter::FindTargetForLocatedEvent(view, event);
}

bool ViewTargeter::SubtreeCanAcceptEvent(ui::EventTarget* target,
                                         const ui::LocatedEvent& event) const {
  ViewTarget* view = static_cast<ViewTarget*>(target);

  if (!view->IsVisible())
    return false;

  // TODO(erg): We may need to keep track of the parent on ViewTarget, because
  // we have a check here about
  // WindowDelegate::ShouldDescendIntoChildForEventHandling().

  return true;
}

bool ViewTargeter::EventLocationInsideBounds(
    ui::EventTarget* target,
    const ui::LocatedEvent& event) const {
  ViewTarget* view = static_cast<ViewTarget*>(target);
  gfx::Point point = event.location();
  const ViewTarget* parent = view->GetParent();
  if (parent)
    ViewTarget::ConvertPointToTarget(parent, view, &point);
  return gfx::Rect(view->GetBounds().size()).Contains(point);
}

ViewTarget* ViewTargeter::FindTargetForKeyEvent(ViewTarget* view_target,
                                                const ui::KeyEvent& key) {
  FocusController* focus_controller = GetFocusController(view_target->view());
  mojo::View* focused_view = focus_controller->GetFocusedView();
  if (focused_view)
    return ViewTarget::TargetFromView(focused_view);

  return view_target;
}

ViewTarget* ViewTargeter::FindTargetInRootView(ViewTarget* root_view,
                                               const ui::LocatedEvent& event) {
  // TODO(erg): This here is important because it resolves
  // mouse_pressed_handler() in the aura version. This is what makes sure
  // that a view gets both the mouse down and up.

  // TODO(erg): We redirect to a currently active capture window here. Add this
  // when we have capture working.

  // TODO(erg): There's a whole bunch of junk about handling touch events
  // here. Handle later.

  return nullptr;
}

}  // namespace window_manager
