OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 #include "ui/aura_shell/workspace/workspace_manager.h" | 4 #include "ui/aura_shell/workspace/workspace_manager.h" |
5 | 5 |
6 #include <algorithm> | 6 #include <algorithm> |
7 | 7 |
8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
9 #include "ui/aura/desktop.h" | 9 #include "ui/aura/desktop.h" |
10 #include "ui/aura/screen_aura.h" | 10 #include "ui/aura/screen_aura.h" |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
53 Workspace* workspace = new Workspace(this); | 53 Workspace* workspace = new Workspace(this); |
54 LayoutWorkspaces(); | 54 LayoutWorkspaces(); |
55 return workspace; | 55 return workspace; |
56 } | 56 } |
57 | 57 |
58 Workspace* WorkspaceManager::GetActiveWorkspace() const { | 58 Workspace* WorkspaceManager::GetActiveWorkspace() const { |
59 return active_workspace_; | 59 return active_workspace_; |
60 } | 60 } |
61 | 61 |
62 Workspace* WorkspaceManager::FindBy(aura::Window* window) const { | 62 Workspace* WorkspaceManager::FindBy(aura::Window* window) const { |
| 63 int index = GetWorkspaceIndexContaining(window); |
| 64 return index < 0 ? NULL : workspaces_[index]; |
| 65 } |
| 66 |
| 67 aura::Window* WorkspaceManager::FindRotateWindowForLocation( |
| 68 const gfx::Point& point) { |
63 for (Workspaces::const_iterator i = workspaces_.begin(); | 69 for (Workspaces::const_iterator i = workspaces_.begin(); |
64 i != workspaces_.end(); | 70 i != workspaces_.end(); |
65 ++i) { | 71 ++i) { |
66 if ((*i)->Contains(window)) | 72 aura::Window* window = (*i)->FindRotateWindowForLocation(point); |
67 return *i; | 73 if (window) |
| 74 return window; |
68 } | 75 } |
69 return NULL; | 76 return NULL; |
70 } | 77 } |
71 | 78 |
72 void WorkspaceManager::LayoutWorkspaces() { | 79 void WorkspaceManager::LayoutWorkspaces() { |
73 UpdateViewport(); | 80 UpdateViewport(); |
74 | 81 |
75 gfx::Rect bounds(workspace_size_); | 82 gfx::Rect bounds(workspace_size_); |
76 int x = 0; | 83 int x = 0; |
77 for (Workspaces::const_iterator i = workspaces_.begin(); | 84 for (Workspaces::const_iterator i = workspaces_.begin(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 transform.SetTranslateX(-viewport_->GetTargetBounds().x() + dx); | 121 transform.SetTranslateX(-viewport_->GetTargetBounds().x() + dx); |
115 transform.SetTranslateY(workspace_size_.height() * (1.0f - scale) / 2); | 122 transform.SetTranslateY(workspace_size_.height() * (1.0f - scale) / 2); |
116 } else { | 123 } else { |
117 transform.SetTranslateX(-active_workspace_->bounds().x()); | 124 transform.SetTranslateX(-active_workspace_->bounds().x()); |
118 } | 125 } |
119 | 126 |
120 viewport_->layer()->SetAnimation(aura::Window::CreateDefaultAnimation()); | 127 viewport_->layer()->SetAnimation(aura::Window::CreateDefaultAnimation()); |
121 viewport_->layer()->SetTransform(transform); | 128 viewport_->layer()->SetTransform(transform); |
122 } | 129 } |
123 | 130 |
| 131 void WorkspaceManager::RotateWindows(aura::Window* source, |
| 132 aura::Window* target) { |
| 133 DCHECK(source); |
| 134 DCHECK(target); |
| 135 int source_ws_index = GetWorkspaceIndexContaining(source); |
| 136 int target_ws_index = GetWorkspaceIndexContaining(target); |
| 137 DCHECK(source_ws_index >= 0); |
| 138 DCHECK(target_ws_index >= 0); |
| 139 if (source_ws_index == target_ws_index) { |
| 140 workspaces_[source_ws_index]->RotateWindows(source, target); |
| 141 } else { |
| 142 aura::Window* insert = source; |
| 143 if (source_ws_index < target_ws_index) { |
| 144 for (int i = target_ws_index; i >= source_ws_index; --i) { |
| 145 insert = workspaces_[i]->ShiftWindows( |
| 146 insert, source, Workspace::SHIFT_TO_LEFT); |
| 147 } |
| 148 } else { |
| 149 for (int i = target_ws_index; i <= source_ws_index; ++i) { |
| 150 insert = workspaces_[i]->ShiftWindows( |
| 151 insert, source, Workspace::SHIFT_TO_RIGHT); |
| 152 } |
| 153 } |
| 154 } |
| 155 } |
| 156 |
124 //////////////////////////////////////////////////////////////////////////////// | 157 //////////////////////////////////////////////////////////////////////////////// |
125 // WorkspaceManager, Overridden from aura::DesktopObserver: | 158 // WorkspaceManager, Overridden from aura::DesktopObserver: |
126 | 159 |
127 void WorkspaceManager::OnDesktopResized(const gfx::Size& new_size) { | 160 void WorkspaceManager::OnDesktopResized(const gfx::Size& new_size) { |
128 workspace_size_ = | 161 workspace_size_ = |
129 gfx::Screen::GetMonitorAreaNearestWindow(viewport_).size(); | 162 gfx::Screen::GetMonitorAreaNearestWindow(viewport_).size(); |
130 LayoutWorkspaces(); | 163 LayoutWorkspaces(); |
131 } | 164 } |
132 | 165 |
133 void WorkspaceManager::OnActiveWindowChanged(aura::Window* active) { | 166 void WorkspaceManager::OnActiveWindowChanged(aura::Window* active) { |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
172 } | 205 } |
173 | 206 |
174 gfx::Rect WorkspaceManager::GetWorkAreaBounds( | 207 gfx::Rect WorkspaceManager::GetWorkAreaBounds( |
175 const gfx::Rect& workspace_bounds) { | 208 const gfx::Rect& workspace_bounds) { |
176 gfx::Rect bounds = workspace_bounds; | 209 gfx::Rect bounds = workspace_bounds; |
177 bounds.Inset( | 210 bounds.Inset( |
178 aura::Desktop::GetInstance()->screen()->work_area_insets()); | 211 aura::Desktop::GetInstance()->screen()->work_area_insets()); |
179 return bounds; | 212 return bounds; |
180 } | 213 } |
181 | 214 |
| 215 // Returns the index of the workspace that contains the |window|. |
| 216 int WorkspaceManager::GetWorkspaceIndexContaining(aura::Window* window) const { |
| 217 for (Workspaces::const_iterator i = workspaces_.begin(); |
| 218 i != workspaces_.end(); |
| 219 ++i) { |
| 220 if ((*i)->Contains(window)) |
| 221 return i - workspaces_.begin(); |
| 222 } |
| 223 return -1; |
| 224 } |
| 225 |
182 void WorkspaceManager::UpdateViewport() { | 226 void WorkspaceManager::UpdateViewport() { |
183 int num_workspaces = std::max(1, static_cast<int>(workspaces_.size())); | 227 int num_workspaces = std::max(1, static_cast<int>(workspaces_.size())); |
184 int total_width = workspace_size_.width() * num_workspaces + | 228 int total_width = workspace_size_.width() * num_workspaces + |
185 kWorkspaceHorizontalMargin * (num_workspaces - 1); | 229 kWorkspaceHorizontalMargin * (num_workspaces - 1); |
186 gfx::Rect bounds(0, 0, total_width, workspace_size_.height()); | 230 gfx::Rect bounds(0, 0, total_width, workspace_size_.height()); |
187 | 231 |
188 if (viewport_->GetTargetBounds() != bounds) | 232 if (viewport_->GetTargetBounds() != bounds) |
189 viewport_->SetBounds(bounds); | 233 viewport_->SetBounds(bounds); |
190 | 234 |
191 // Move to active workspace. | 235 // Move to active workspace. |
192 if (active_workspace_) { | 236 if (active_workspace_) { |
193 ui::Transform transform; | 237 ui::Transform transform; |
194 transform.SetTranslateX(-active_workspace_->bounds().x()); | 238 transform.SetTranslateX(-active_workspace_->bounds().x()); |
195 viewport_->layer()->SetAnimation(aura::Window::CreateDefaultAnimation()); | 239 viewport_->layer()->SetAnimation(aura::Window::CreateDefaultAnimation()); |
196 viewport_->SetTransform(transform); | 240 viewport_->SetTransform(transform); |
197 } | 241 } |
198 } | 242 } |
199 | 243 |
200 } // namespace aura_shell | 244 } // namespace aura_shell |
OLD | NEW |