// 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 "athena/util/fill_layout_manager.h"

#include "base/logging.h"
#include "ui/aura/window.h"

namespace athena {
namespace {

// TODO(oshima): Implement real window/layout manager. crbug.com/388362.
bool ShouldFill(aura::Window* window) {
  return window->type() != ui::wm::WINDOW_TYPE_MENU &&
      window->type() != ui::wm::WINDOW_TYPE_TOOLTIP;
}

}  // namespace

FillLayoutManager::FillLayoutManager(aura::Window* container)
    : container_(container) {
  DCHECK(container_);
}

FillLayoutManager::~FillLayoutManager() {
}

void FillLayoutManager::OnWindowResized() {
  gfx::Rect full_bounds = gfx::Rect(container_->bounds().size());
  for (aura::Window::Windows::const_iterator iter =
           container_->children().begin();
       iter != container_->children().end();
       ++iter) {
    if (ShouldFill(*iter))
      SetChildBoundsDirect(*iter, full_bounds);
  }
}

void FillLayoutManager::OnWindowAddedToLayout(aura::Window* child) {
  if (ShouldFill(child))
    SetChildBoundsDirect(child, (gfx::Rect(container_->bounds().size())));
}

void FillLayoutManager::OnWillRemoveWindowFromLayout(aura::Window* child) {
}
void FillLayoutManager::OnWindowRemovedFromLayout(aura::Window* child) {
}
void FillLayoutManager::OnChildWindowVisibilityChanged(aura::Window* child,
                                                       bool visible) {
}
void FillLayoutManager::SetChildBounds(aura::Window* child,
                                       const gfx::Rect& requested_bounds) {
  if (!ShouldFill(child))
    SetChildBoundsDirect(child, requested_bounds);
}

}  // namespace athena
