// 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_event_dispatcher.h"

#include "mojo/services/view_manager/public/cpp/view.h"
#include "services/window_manager/view_target.h"

namespace window_manager {

ViewEventDispatcher::ViewEventDispatcher()
    : event_dispatch_target_(nullptr),
      old_dispatch_target_(nullptr) {
}

ViewEventDispatcher::~ViewEventDispatcher() {}

void ViewEventDispatcher::SetRootViewTarget(ViewTarget* root_view_target) {
  root_view_target_ = root_view_target;
}

ui::EventTarget* ViewEventDispatcher::GetRootTarget() {
  return root_view_target_;
}

void ViewEventDispatcher::OnEventProcessingStarted(ui::Event* event) {
}

bool ViewEventDispatcher::CanDispatchToTarget(ui::EventTarget* target) {
  return event_dispatch_target_ == target;
}

ui::EventDispatchDetails ViewEventDispatcher::PreDispatchEvent(
    ui::EventTarget* target,
    ui::Event* event) {
  // TODO(erg): PreDispatch in aura::WindowEventDispatcher does many, many
  // things. It, and the functions split off for different event types, are
  // most of the file.
  old_dispatch_target_ = event_dispatch_target_;
  event_dispatch_target_ = static_cast<ViewTarget*>(target);
  return ui::EventDispatchDetails();
}

ui::EventDispatchDetails ViewEventDispatcher::PostDispatchEvent(
    ui::EventTarget* target,
    const ui::Event& event) {
  // TODO(erg): Not at all as long as PreDispatchEvent, but still missing core
  // details.
  event_dispatch_target_ = old_dispatch_target_;
  old_dispatch_target_ = nullptr;
  return ui::EventDispatchDetails();
}

}  // namespace window_manager
