1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "ash/wm/overview/window_selector_window.h"
6
7#include "ash/screen_util.h"
8#include "ash/shell.h"
9#include "ash/shell_window_ids.h"
10#include "ash/wm/overview/scoped_transform_overview_window.h"
11#include "ui/aura/window.h"
12#include "ui/compositor/scoped_layer_animation_settings.h"
13#include "ui/gfx/rect.h"
14#include "ui/gfx/transform.h"
15#include "ui/views/controls/button/image_button.h"
16#include "ui/views/widget/widget.h"
17
18namespace ash {
19
20WindowSelectorWindow::WindowSelectorWindow(aura::Window* window)
21    : transform_window_(window) {
22  window->AddObserver(this);
23}
24
25WindowSelectorWindow::~WindowSelectorWindow() {
26  if (transform_window_.window())
27    transform_window_.window()->RemoveObserver(this);
28}
29
30aura::Window* WindowSelectorWindow::GetRootWindow() {
31  return transform_window_.window()->GetRootWindow();
32}
33
34bool WindowSelectorWindow::HasSelectableWindow(const aura::Window* window) {
35  return transform_window_.window() == window;
36}
37
38bool WindowSelectorWindow::Contains(const aura::Window* target) {
39  return transform_window_.Contains(target);
40}
41
42void WindowSelectorWindow::RestoreWindowOnExit(aura::Window* window) {
43  transform_window_.RestoreWindowOnExit();
44}
45
46aura::Window* WindowSelectorWindow::SelectionWindow() {
47  return transform_window_.window();
48}
49
50void WindowSelectorWindow::RemoveWindow(const aura::Window* window) {
51  DCHECK_EQ(transform_window_.window(), window);
52  transform_window_.window()->RemoveObserver(this);
53  transform_window_.OnWindowDestroyed();
54  WindowSelectorItem::RemoveWindow(window);
55}
56
57bool WindowSelectorWindow::empty() const {
58  return transform_window_.window() == NULL;
59}
60
61void WindowSelectorWindow::PrepareForOverview() {
62  transform_window_.PrepareForOverview();
63}
64
65void WindowSelectorWindow::SetItemBounds(aura::Window* root_window,
66                                         const gfx::Rect& target_bounds,
67                                         bool animate) {
68  gfx::Rect src_rect = transform_window_.GetBoundsInScreen();
69  set_bounds(ScopedTransformOverviewWindow::
70        ShrinkRectToFitPreservingAspectRatio(src_rect, target_bounds));
71  transform_window_.SetTransform(root_window,
72      ScopedTransformOverviewWindow::GetTransformForRect(src_rect, bounds()),
73      animate);
74}
75
76void WindowSelectorWindow::SetOpacity(float opacity) {
77  transform_window_.window()->layer()->SetOpacity(opacity);
78  WindowSelectorItem::SetOpacity(opacity);
79}
80
81}  // namespace ash
82