// Copyright (c) 2012 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 "ash/wm/always_on_top_controller.h"

#include "ash/shell.h"
#include "ash/shell_window_ids.h"
#include "ui/aura/client/aura_constants.h"
#include "ui/aura/window.h"

namespace ash {
namespace internal {

AlwaysOnTopController::AlwaysOnTopController()
    : always_on_top_container_(NULL) {
}

AlwaysOnTopController::~AlwaysOnTopController() {
  if (always_on_top_container_)
    always_on_top_container_->RemoveObserver(this);
}

void AlwaysOnTopController::SetAlwaysOnTopContainer(
    aura::Window* always_on_top_container) {
  // Container should be empty.
  DCHECK(always_on_top_container->children().empty());

  // We are not handling any containers yet.
  DCHECK(always_on_top_container_ == NULL);

  always_on_top_container_ = always_on_top_container;
  always_on_top_container_->AddObserver(this);
}

aura::Window* AlwaysOnTopController::GetContainer(aura::Window* window) const {
  DCHECK(always_on_top_container_);
  if (window->GetProperty(aura::client::kAlwaysOnTopKey))
    return always_on_top_container_;
  return Shell::GetContainer(always_on_top_container_->GetRootWindow(),
                             kShellWindowId_DefaultContainer);
}

void AlwaysOnTopController::OnWindowAdded(aura::Window* child) {
  // Observe direct child of the containers.
  if (child->parent() == always_on_top_container_)
    child->AddObserver(this);
}

void AlwaysOnTopController::OnWillRemoveWindow(aura::Window* child) {
  child->RemoveObserver(this);
}

void AlwaysOnTopController::OnWindowPropertyChanged(aura::Window* window,
                                                    const void* key,
                                                    intptr_t old) {
  if (key == aura::client::kAlwaysOnTopKey) {
    DCHECK(window->type() == aura::client::WINDOW_TYPE_NORMAL ||
           window->type() == aura::client::WINDOW_TYPE_POPUP);
    aura::Window* container = GetContainer(window);
    if (window->parent() != container)
      container->AddChild(window);
  }
}

void AlwaysOnTopController::OnWindowDestroyed(aura::Window* window) {
  if (window == always_on_top_container_)
    always_on_top_container_ = NULL;
}

}  // namespace internal
}  // namespace ash
