1 // Copyright 2014 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 "athena/wm/public/window_manager.h"
7 #include "athena/input/public/accelerator_manager.h"
8 #include "athena/screen/public/screen_manager.h"
9 #include "athena/wm/public/window_manager_observer.h"
10 #include "athena/wm/window_overview_mode.h"
11 #include "base/logging.h"
12 #include "base/observer_list.h"
13 #include "ui/aura/layout_manager.h"
14 #include "ui/aura/window.h"
15 #include "ui/wm/public/window_types.h"
20 class WindowManagerImpl
: public WindowManager
,
21 public WindowOverviewModeDelegate
,
22 public aura::WindowObserver
,
23 public AcceleratorHandler
{
26 virtual ~WindowManagerImpl();
31 virtual void ToggleOverview() OVERRIDE
{
34 FOR_EACH_OBSERVER(WindowManagerObserver
, observers_
,
35 OnOverviewModeExit());
37 overview_
= WindowOverviewMode::Create(container_
.get(), this);
38 FOR_EACH_OBSERVER(WindowManagerObserver
, observers_
,
39 OnOverviewModeEnter());
45 COMMAND_TOGGLE_OVERVIEW
,
48 void InstallAccelerators() {
49 const AcceleratorData accelerator_data
[] = {
50 {TRIGGER_ON_PRESS
, ui::VKEY_F6
, ui::EF_NONE
, COMMAND_TOGGLE_OVERVIEW
,
53 AcceleratorManager::Get()->RegisterAccelerators(
54 accelerator_data
, arraysize(accelerator_data
), this);
58 virtual void AddObserver(WindowManagerObserver
* observer
) OVERRIDE
{
59 observers_
.AddObserver(observer
);
62 virtual void RemoveObserver(WindowManagerObserver
* observer
) OVERRIDE
{
63 observers_
.RemoveObserver(observer
);
66 // WindowOverviewModeDelegate:
67 virtual void OnSelectWindow(aura::Window
* window
) OVERRIDE
{
68 CHECK_EQ(container_
.get(), window
->parent());
69 container_
->StackChildAtTop(window
);
71 FOR_EACH_OBSERVER(WindowManagerObserver
, observers_
,
72 OnOverviewModeExit());
75 // aura::WindowObserver
76 virtual void OnWindowDestroying(aura::Window
* window
) OVERRIDE
{
77 if (window
== container_
)
81 // AcceleratorHandler:
82 virtual bool IsCommandEnabled(int command_id
) const OVERRIDE
{ return true; }
83 virtual bool OnAcceleratorFired(int command_id
,
84 const ui::Accelerator
& accelerator
) OVERRIDE
{
86 case COMMAND_TOGGLE_OVERVIEW
:
93 scoped_ptr
<aura::Window
> container_
;
94 scoped_ptr
<WindowOverviewMode
> overview_
;
95 ObserverList
<WindowManagerObserver
> observers_
;
97 DISALLOW_COPY_AND_ASSIGN(WindowManagerImpl
);
100 class WindowManagerImpl
* instance
= NULL
;
102 class AthenaContainerLayoutManager
: public aura::LayoutManager
{
104 AthenaContainerLayoutManager() {}
105 virtual ~AthenaContainerLayoutManager() {}
108 // aura::LayoutManager:
109 virtual void OnWindowResized() OVERRIDE
{ instance
->Layout(); }
110 virtual void OnWindowAddedToLayout(aura::Window
* child
) OVERRIDE
{
113 virtual void OnWillRemoveWindowFromLayout(aura::Window
* child
) OVERRIDE
{}
114 virtual void OnWindowRemovedFromLayout(aura::Window
* child
) OVERRIDE
{
117 virtual void OnChildWindowVisibilityChanged(aura::Window
* child
,
118 bool visible
) OVERRIDE
{
121 virtual void SetChildBounds(aura::Window
* child
,
122 const gfx::Rect
& requested_bounds
) OVERRIDE
{
123 if (!requested_bounds
.IsEmpty())
124 SetChildBoundsDirect(child
, requested_bounds
);
127 DISALLOW_COPY_AND_ASSIGN(AthenaContainerLayoutManager
);
130 WindowManagerImpl::WindowManagerImpl() {
131 ScreenManager::ContainerParams
params("DefaultContainer");
132 params
.can_activate_children
= true;
133 container_
.reset(ScreenManager::Get()->CreateDefaultContainer(params
));
134 container_
->SetLayoutManager(new AthenaContainerLayoutManager
);
135 container_
->AddObserver(this);
137 InstallAccelerators();
140 WindowManagerImpl::~WindowManagerImpl() {
142 container_
->RemoveObserver(this);
147 void WindowManagerImpl::Layout() {
150 gfx::Rect bounds
= gfx::Rect(container_
->bounds().size());
151 const aura::Window::Windows
& children
= container_
->children();
152 for (aura::Window::Windows::const_iterator iter
= children
.begin();
153 iter
!= children
.end();
155 if ((*iter
)->type() == ui::wm::WINDOW_TYPE_NORMAL
||
156 (*iter
)->type() == ui::wm::WINDOW_TYPE_POPUP
)
157 (*iter
)->SetBounds(bounds
);
164 WindowManager
* WindowManager::Create() {
166 new WindowManagerImpl
;
172 void WindowManager::Shutdown() {
179 WindowManager
* WindowManager::GetInstance() {
184 } // namespace athena