Move render_view_context_menu.* and related files out of tab_contents.
[chromium-blink-merge.git] / ash / wm / overview / window_selector_panels.cc
blob37d66871d5d6c763e284c77a5454f09fdbf54c90
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.
5 #include "ash/wm/overview/window_selector_panels.h"
7 #include "ash/shell.h"
8 #include "ash/shell_window_ids.h"
9 #include "ash/wm/overview/scoped_transform_overview_window.h"
10 #include "ash/wm/panels/panel_layout_manager.h"
11 #include "ui/aura/client/screen_position_client.h"
12 #include "ui/aura/window.h"
13 #include "ui/compositor/layer.h"
14 #include "ui/compositor/layer_animation_observer.h"
15 #include "ui/compositor/layer_animation_sequence.h"
16 #include "ui/views/widget/widget.h"
18 namespace ash {
20 namespace {
22 const int kPanelCalloutFadeInDurationMilliseconds = 50;
24 // This class extends ScopedTransformOverviewMode to hide and show the callout
25 // widget for a panel window when entering / leaving overview mode.
26 class ScopedTransformPanelWindow : public ScopedTransformOverviewWindow {
27 public:
28 ScopedTransformPanelWindow(aura::Window* window);
29 virtual ~ScopedTransformPanelWindow();
31 // ScopedTransformOverviewWindow overrides:
32 virtual void PrepareForOverview() OVERRIDE;
34 private:
35 // Returns the callout widget for the transformed panel.
36 views::Widget* GetCalloutWidget();
38 // Restores the callout visibility.
39 void RestoreCallout();
41 // Trigger relayout
42 void Relayout();
44 bool callout_visible_;
46 DISALLOW_COPY_AND_ASSIGN(ScopedTransformPanelWindow);
49 ScopedTransformPanelWindow::ScopedTransformPanelWindow(aura::Window* window)
50 : ScopedTransformOverviewWindow(window) {
53 ScopedTransformPanelWindow::~ScopedTransformPanelWindow() {
54 // window() will be NULL if the window was destroyed.
55 if (window())
56 RestoreCallout();
59 void ScopedTransformPanelWindow::PrepareForOverview() {
60 ScopedTransformOverviewWindow::PrepareForOverview();
61 GetCalloutWidget()->GetLayer()->SetOpacity(0.0f);
64 views::Widget* ScopedTransformPanelWindow::GetCalloutWidget() {
65 DCHECK(window()->parent()->id() == internal::kShellWindowId_PanelContainer);
66 internal::PanelLayoutManager* panel_layout_manager =
67 static_cast<internal::PanelLayoutManager*>(
68 window()->parent()->layout_manager());
69 return panel_layout_manager->GetCalloutWidgetForPanel(window());
72 void ScopedTransformPanelWindow::RestoreCallout() {
73 scoped_ptr<ui::LayerAnimationSequence> sequence(
74 new ui::LayerAnimationSequence);
75 sequence->AddElement(ui::LayerAnimationElement::CreatePauseElement(
76 ui::LayerAnimationElement::OPACITY, base::TimeDelta::FromMilliseconds(
77 ScopedTransformOverviewWindow::kTransitionMilliseconds)));
78 sequence->AddElement(ui::LayerAnimationElement::CreateOpacityElement(1,
79 base::TimeDelta::FromMilliseconds(
80 kPanelCalloutFadeInDurationMilliseconds)));
81 GetCalloutWidget()->GetLayer()->GetAnimator()->StartAnimation(
82 sequence.release());
85 } // namespace
87 WindowSelectorPanels::WindowSelectorPanels() {
90 WindowSelectorPanels::~WindowSelectorPanels() {
93 void WindowSelectorPanels::AddWindow(aura::Window* window) {
94 transform_windows_.push_back(new ScopedTransformPanelWindow(window));
97 aura::Window* WindowSelectorPanels::GetRootWindow() {
98 return transform_windows_.front()->window()->GetRootWindow();
101 bool WindowSelectorPanels::HasSelectableWindow(const aura::Window* window) {
102 for (WindowList::const_iterator iter = transform_windows_.begin();
103 iter != transform_windows_.end(); ++iter) {
104 if ((*iter)->window() == window)
105 return true;
107 return false;
110 aura::Window* WindowSelectorPanels::TargetedWindow(const aura::Window* target) {
111 for (WindowList::const_iterator iter = transform_windows_.begin();
112 iter != transform_windows_.end(); ++iter) {
113 if ((*iter)->Contains(target))
114 return (*iter)->window();
116 return NULL;
119 void WindowSelectorPanels::RestoreWindowOnExit(aura::Window* window) {
120 for (WindowList::iterator iter = transform_windows_.begin();
121 iter != transform_windows_.end(); ++iter) {
122 if ((*iter)->Contains(window)) {
123 (*iter)->RestoreWindowOnExit();
124 break;
129 aura::Window* WindowSelectorPanels::SelectionWindow() {
130 return transform_windows_.front()->window();
133 void WindowSelectorPanels::RemoveWindow(const aura::Window* window) {
134 for (WindowList::iterator iter = transform_windows_.begin();
135 iter != transform_windows_.end(); ++iter) {
136 if ((*iter)->window() == window) {
137 (*iter)->OnWindowDestroyed();
138 transform_windows_.erase(iter);
139 break;
144 bool WindowSelectorPanels::empty() const {
145 return transform_windows_.empty();
148 void WindowSelectorPanels::PrepareForOverview() {
149 for (WindowList::iterator iter = transform_windows_.begin();
150 iter != transform_windows_.end(); ++iter) {
151 (*iter)->PrepareForOverview();
155 void WindowSelectorPanels::SetItemBounds(aura::Window* root_window,
156 const gfx::Rect& target_bounds,
157 bool animate) {
158 gfx::Rect bounding_rect;
159 for (WindowList::iterator iter = transform_windows_.begin();
160 iter != transform_windows_.end(); ++iter) {
161 bounding_rect.Union((*iter)->GetBoundsInScreen());
163 set_bounds(ScopedTransformOverviewWindow::
164 ShrinkRectToFitPreservingAspectRatio(bounding_rect, target_bounds));
165 gfx::Transform bounding_transform =
166 ScopedTransformOverviewWindow::GetTransformForRect(bounding_rect,
167 bounds());
168 for (WindowList::iterator iter = transform_windows_.begin();
169 iter != transform_windows_.end(); ++iter) {
170 gfx::Transform transform;
171 gfx::Rect bounds = (*iter)->GetBoundsInScreen();
172 transform.Translate(bounding_rect.x() - bounds.x(),
173 bounding_rect.y() - bounds.y());
174 transform.PreconcatTransform(bounding_transform);
175 transform.Translate(bounds.x() - bounding_rect.x(),
176 bounds.y() - bounding_rect.y());
177 (*iter)->SetTransform(root_window, transform, animate);
181 } // namespace ash