// 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 "sky/tools/debugger/focus_rules.h"

namespace sky {

FocusRules::FocusRules(mojo::WindowManagerApp* window_manager_app,
                       mojo::View* content)
    : content_(content),
      window_manager_app_(window_manager_app) {
}

FocusRules::~FocusRules() {
}

bool FocusRules::IsToplevelWindow(aura::Window* window) const {
  return mojo::WindowManagerApp::GetViewForWindow(window)->parent() == content_;
}

bool FocusRules::CanActivateWindow(aura::Window* window) const {
  return mojo::WindowManagerApp::GetViewForWindow(window)->parent() == content_;
}

bool FocusRules::CanFocusWindow(aura::Window* window) const {
  return true;
}

aura::Window* FocusRules::GetToplevelWindow(aura::Window* window) const {
  mojo::View* view = mojo::WindowManagerApp::GetViewForWindow(window);
  while (view->parent() != content_) {
    view = view->parent();
    if (!view)
      return NULL;
  }
  return window_manager_app_->GetWindowForViewId(view->id());
}

aura::Window* FocusRules::GetActivatableWindow(aura::Window* window) const {
  return GetToplevelWindow(window);
}

aura::Window* FocusRules::GetFocusableWindow(aura::Window* window) const {
  return window;
}

aura::Window* FocusRules::GetNextActivatableWindow(aura::Window* ignore) const {
  aura::Window* activatable = GetActivatableWindow(ignore);
  const aura::Window::Windows& children = activatable->parent()->children();
  for (aura::Window::Windows::const_reverse_iterator it = children.rbegin();
       it != children.rend(); ++it) {
    if (*it != ignore)
      return *it;
  }
  return NULL;
}

}  // namespace sky
