Index: ui/aura_shell/workspace/workspace_manager.cc |
=================================================================== |
--- ui/aura_shell/workspace/workspace_manager.cc (revision 115655) |
+++ ui/aura_shell/workspace/workspace_manager.cc (working copy) |
@@ -1,276 +0,0 @@ |
-// Copyright (c) 2011 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 "ui/aura_shell/workspace/workspace_manager.h" |
- |
-#include <algorithm> |
- |
-#include "base/auto_reset.h" |
-#include "base/logging.h" |
-#include "base/stl_util.h" |
-#include "ui/aura/root_window.h" |
-#include "ui/aura/screen_aura.h" |
-#include "ui/aura/window.h" |
-#include "ui/aura_shell/workspace/workspace.h" |
-#include "ui/aura_shell/workspace/workspace_observer.h" |
-#include "ui/gfx/compositor/layer.h" |
-#include "ui/gfx/compositor/layer_animator.h" |
-#include "ui/gfx/screen.h" |
-#include "ui/gfx/transform.h" |
- |
-namespace { |
- |
-// The horizontal margein between workspaces in pixels. |
-const int kWorkspaceHorizontalMargin = 50; |
- |
-// Minimum/maximum scale for overview mode. |
-const float kMaxOverviewScale = 0.9f; |
-const float kMinOverviewScale = 0.3f; |
- |
-} |
- |
-namespace aura_shell { |
-namespace internal { |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// WindowManager, public: |
- |
-WorkspaceManager::WorkspaceManager(aura::Window* contents_view) |
- : contents_view_(contents_view), |
- active_workspace_(NULL), |
- workspace_size_( |
- gfx::Screen::GetMonitorAreaNearestWindow(contents_view_).size()), |
- is_overview_(false), |
- layout_in_progress_(false), |
- ignored_window_(NULL) { |
- DCHECK(contents_view); |
-} |
- |
-WorkspaceManager::~WorkspaceManager() { |
- std::vector<Workspace*> copy_to_delete(workspaces_); |
- STLDeleteElements(©_to_delete); |
-} |
- |
-Workspace* WorkspaceManager::CreateWorkspace() { |
- Workspace* workspace = new Workspace(this); |
- LayoutWorkspaces(); |
- return workspace; |
-} |
- |
-Workspace* WorkspaceManager::GetActiveWorkspace() const { |
- return active_workspace_; |
-} |
- |
-Workspace* WorkspaceManager::FindBy(aura::Window* window) const { |
- int index = GetWorkspaceIndexContaining(window); |
- return index < 0 ? NULL : workspaces_[index]; |
-} |
- |
-aura::Window* WorkspaceManager::FindRotateWindowForLocation( |
- const gfx::Point& point) { |
- for (Workspaces::const_iterator i = workspaces_.begin(); |
- i != workspaces_.end(); |
- ++i) { |
- aura::Window* window = (*i)->FindRotateWindowForLocation(point); |
- if (window) |
- return window; |
- } |
- return NULL; |
-} |
- |
-void WorkspaceManager::LayoutWorkspaces() { |
- UpdateContentsView(); |
- |
- gfx::Rect bounds(workspace_size_); |
- int x = 0; |
- for (Workspaces::const_iterator i = workspaces_.begin(); |
- i != workspaces_.end(); |
- ++i) { |
- Workspace* workspace = *i; |
- bounds.set_x(x); |
- workspace->SetBounds(bounds); |
- x += bounds.width() + kWorkspaceHorizontalMargin; |
- } |
-} |
- |
-gfx::Rect WorkspaceManager::GetDragAreaBounds() { |
- return GetWorkAreaBounds(gfx::Rect(contents_view_->bounds().size())); |
-} |
- |
-void WorkspaceManager::SetOverview(bool overview) { |
- if (is_overview_ == overview) |
- return; |
- is_overview_ = overview; |
- |
- ui::Transform transform; |
- if (is_overview_) { |
- // TODO(oshima|sky): We limit the how small windows can be shrinked |
- // in overview mode, thus part of the contents_view may not be visible. |
- // We need to add capability to scroll/move contents_view in overview mode. |
- float scale = std::min( |
- kMaxOverviewScale, |
- workspace_size_.width() / |
- static_cast<float>(contents_view_->bounds().width())); |
- scale = std::max(kMinOverviewScale, scale); |
- |
- transform.SetScale(scale, scale); |
- |
- int overview_width = contents_view_->bounds().width() * scale; |
- int dx = 0; |
- if (overview_width < workspace_size_.width()) { |
- dx = (workspace_size_.width() - overview_width) / 2; |
- } else if (active_workspace_) { |
- // Center the active workspace. |
- int active_workspace_mid_x = (active_workspace_->bounds().x() + |
- active_workspace_->bounds().width() / 2) * scale; |
- dx = workspace_size_.width() / 2 - active_workspace_mid_x; |
- dx = std::min(0, std::max(dx, workspace_size_.width() - overview_width)); |
- } |
- |
- transform.SetTranslateX(dx); |
- transform.SetTranslateY(workspace_size_.height() * (1.0f - scale) / 2); |
- } else if (active_workspace_) { |
- transform.SetTranslateX(-active_workspace_->bounds().x()); |
- } |
- |
- ui::LayerAnimator::ScopedSettings settings( |
- contents_view_->layer()->GetAnimator()); |
- contents_view_->layer()->SetTransform(transform); |
-} |
- |
-void WorkspaceManager::RotateWindows(aura::Window* source, |
- aura::Window* target) { |
- DCHECK(source); |
- DCHECK(target); |
- int source_ws_index = GetWorkspaceIndexContaining(source); |
- int target_ws_index = GetWorkspaceIndexContaining(target); |
- DCHECK(source_ws_index >= 0); |
- DCHECK(target_ws_index >= 0); |
- if (source_ws_index == target_ws_index) { |
- workspaces_[source_ws_index]->RotateWindows(source, target); |
- } else { |
- aura::Window* insert = source; |
- aura::Window* target_to_insert = target; |
- if (source_ws_index < target_ws_index) { |
- for (int i = target_ws_index; i >= source_ws_index; --i) { |
- insert = workspaces_[i]->ShiftWindows( |
- insert, source, target_to_insert, Workspace::SHIFT_TO_LEFT); |
- // |target| can only be in the 1st workspace. |
- target_to_insert = NULL; |
- } |
- } else { |
- for (int i = target_ws_index; i <= source_ws_index; ++i) { |
- insert = workspaces_[i]->ShiftWindows( |
- insert, source, target_to_insert, Workspace::SHIFT_TO_RIGHT); |
- // |target| can only be in the 1st workspace. |
- target_to_insert = NULL; |
- } |
- } |
- } |
- FOR_EACH_OBSERVER(WorkspaceObserver, observers_, |
- WindowMoved(this, source, target)); |
- workspaces_[target_ws_index]->Activate(); |
-} |
- |
-void WorkspaceManager::SetWorkspaceSize(const gfx::Size& workspace_size) { |
- if (workspace_size == workspace_size_) |
- return; |
- workspace_size_ = workspace_size; |
- LayoutWorkspaces(); |
-} |
- |
-void WorkspaceManager::AddObserver(WorkspaceObserver* observer) { |
- observers_.AddObserver(observer); |
-} |
- |
-void WorkspaceManager::RemoveObserver(WorkspaceObserver* observer) { |
- observers_.RemoveObserver(observer); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// WorkspaceManager, private: |
- |
-void WorkspaceManager::AddWorkspace(Workspace* workspace) { |
- Workspaces::iterator i = std::find(workspaces_.begin(), |
- workspaces_.end(), |
- workspace); |
- DCHECK(i == workspaces_.end()); |
- workspaces_.push_back(workspace); |
-} |
- |
-void WorkspaceManager::RemoveWorkspace(Workspace* workspace) { |
- Workspaces::iterator i = std::find(workspaces_.begin(), |
- workspaces_.end(), |
- workspace); |
- DCHECK(i != workspaces_.end()); |
- Workspace* old = NULL; |
- |
- if (workspace == active_workspace_) { |
- old = active_workspace_; |
- active_workspace_ = NULL; |
- } |
- workspaces_.erase(i); |
- LayoutWorkspaces(); |
- |
- if (old) { |
- FOR_EACH_OBSERVER(WorkspaceObserver, observers_, |
- ActiveWorkspaceChanged(this, old)); |
- } |
-} |
- |
-void WorkspaceManager::SetActiveWorkspace(Workspace* workspace) { |
- if (active_workspace_ == workspace) |
- return; |
- DCHECK(std::find(workspaces_.begin(), workspaces_.end(), |
- workspace) != workspaces_.end()); |
- Workspace* old = active_workspace_; |
- active_workspace_ = workspace; |
- |
- is_overview_ = false; |
- UpdateContentsView(); |
- |
- FOR_EACH_OBSERVER(WorkspaceObserver, observers_, |
- ActiveWorkspaceChanged(this, old)); |
-} |
- |
-gfx::Rect WorkspaceManager::GetWorkAreaBounds( |
- const gfx::Rect& workspace_bounds) { |
- gfx::Rect bounds = workspace_bounds; |
- bounds.Inset( |
- aura::RootWindow::GetInstance()->screen()->work_area_insets()); |
- return bounds; |
-} |
- |
-// Returns the index of the workspace that contains the |window|. |
-int WorkspaceManager::GetWorkspaceIndexContaining(aura::Window* window) const { |
- for (Workspaces::const_iterator i = workspaces_.begin(); |
- i != workspaces_.end(); |
- ++i) { |
- if ((*i)->Contains(window)) |
- return i - workspaces_.begin(); |
- } |
- return -1; |
-} |
- |
-void WorkspaceManager::UpdateContentsView() { |
- int num_workspaces = std::max(1, static_cast<int>(workspaces_.size())); |
- int total_width = workspace_size_.width() * num_workspaces + |
- kWorkspaceHorizontalMargin * (num_workspaces - 1); |
- gfx::Rect bounds(0, 0, total_width, workspace_size_.height()); |
- |
- if (contents_view_->GetTargetBounds() != bounds) |
- contents_view_->SetBounds(bounds); |
- |
- // Move to active workspace. |
- if (active_workspace_) { |
- ui::Transform transform; |
- transform.SetTranslateX(-active_workspace_->bounds().x()); |
- ui::LayerAnimator::ScopedSettings settings( |
- contents_view_->layer()->GetAnimator()); |
- contents_view_->SetTransform(transform); |
- } |
-} |
- |
-} // namespace internal |
-} // namespace aura_shell |