| Index: ui/aura_shell/workspace/workspace.cc
|
| ===================================================================
|
| --- ui/aura_shell/workspace/workspace.cc (revision 115655)
|
| +++ ui/aura_shell/workspace/workspace.cc (working copy)
|
| @@ -1,286 +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.h"
|
| -
|
| -#include <algorithm>
|
| -
|
| -#include "base/logging.h"
|
| -#include "ui/aura/client/aura_constants.h"
|
| -#include "ui/aura/root_window.h"
|
| -#include "ui/aura/window.h"
|
| -#include "ui/aura_shell/property_util.h"
|
| -#include "ui/aura_shell/window_util.h"
|
| -#include "ui/aura_shell/workspace/workspace_manager.h"
|
| -#include "ui/base/ui_base_types.h"
|
| -#include "ui/gfx/compositor/layer.h"
|
| -#include "ui/gfx/compositor/layer_animator.h"
|
| -
|
| -namespace {
|
| -// Horizontal margin between windows.
|
| -const int kWindowHorizontalMargin = 10;
|
| -
|
| -// Maximum number of windows a workspace can have.
|
| -size_t g_max_windows_per_workspace = 2;
|
| -
|
| -// Returns the bounds of the window that should be used to calculate
|
| -// the layout. It uses the restore bounds if exits, or
|
| -// the target bounds of the window. The target bounds is the
|
| -// final destination of |window| if the window's layer is animating,
|
| -// or the current bounds of the window of no animation is currently
|
| -// in progress.
|
| -gfx::Rect GetLayoutBounds(aura::Window* window) {
|
| - const gfx::Rect* restore_bounds = aura_shell::GetRestoreBounds(window);
|
| - return restore_bounds ? *restore_bounds : window->GetTargetBounds();
|
| -}
|
| -
|
| -// Returns the width of the window that should be used to calculate
|
| -// the layout. See |GetLayoutBounds| for more details.
|
| -int GetLayoutWidth(aura::Window* window) {
|
| - return GetLayoutBounds(window).width();
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -namespace aura_shell {
|
| -namespace internal {
|
| -
|
| -Workspace::Workspace(WorkspaceManager* manager)
|
| - : workspace_manager_(manager) {
|
| - workspace_manager_->AddWorkspace(this);
|
| -}
|
| -
|
| -Workspace::~Workspace() {
|
| - workspace_manager_->RemoveWorkspace(this);
|
| -}
|
| -
|
| -void Workspace::SetBounds(const gfx::Rect& bounds) {
|
| - bool bounds_changed = bounds_ != bounds;
|
| - bounds_ = bounds;
|
| - if (bounds_changed)
|
| - Layout(NULL);
|
| -}
|
| -
|
| -gfx::Rect Workspace::GetWorkAreaBounds() const {
|
| - return workspace_manager_->GetWorkAreaBounds(bounds_);
|
| -}
|
| -
|
| -bool Workspace::AddWindowAfter(aura::Window* window, aura::Window* after) {
|
| - if (!CanAdd(window))
|
| - return false;
|
| - DCHECK(!Contains(window));
|
| -
|
| - if (!after) { // insert at the end.
|
| - windows_.push_back(window);
|
| - } else {
|
| - DCHECK(Contains(after));
|
| - aura::Window::Windows::iterator i =
|
| - std::find(windows_.begin(), windows_.end(), after);
|
| - windows_.insert(++i, window);
|
| - }
|
| - Layout(window);
|
| -
|
| - return true;
|
| -}
|
| -
|
| -void Workspace::RemoveWindow(aura::Window* window) {
|
| - DCHECK(Contains(window));
|
| - windows_.erase(std::find(windows_.begin(), windows_.end(), window));
|
| - Layout(NULL);
|
| -}
|
| -
|
| -bool Workspace::Contains(aura::Window* window) const {
|
| - return std::find(windows_.begin(), windows_.end(), window) != windows_.end();
|
| -}
|
| -
|
| -aura::Window* Workspace::FindRotateWindowForLocation(
|
| - const gfx::Point& position) {
|
| - aura::Window* active = aura_shell::GetActiveWindow();
|
| - if (GetTotalWindowsWidth() < bounds_.width()) {
|
| - // If all windows fit to the width of the workspace, it returns the
|
| - // window which contains |position|'s x coordinate.
|
| - for (aura::Window::Windows::const_iterator i = windows_.begin();
|
| - i != windows_.end();
|
| - ++i) {
|
| - if (active == *i)
|
| - continue;
|
| - gfx::Rect bounds = (*i)->GetTargetBounds();
|
| - if (bounds.x() < position.x() && position.x() < bounds.right())
|
| - return *i;
|
| - }
|
| - } else if (bounds_.x() < position.x() && position.x() < bounds_.right()) {
|
| - // If windows are overlapping, it divides the workspace into
|
| - // regions with the same width, and returns the Nth window that
|
| - // corresponds to the region that contains the |position|.
|
| - int width = bounds_.width() / windows_.size();
|
| - size_t index = (position.x() - bounds_.x()) / width;
|
| - DCHECK(index < windows_.size());
|
| - aura::Window* window = windows_[index];
|
| - if (window != active)
|
| - return window;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -void Workspace::RotateWindows(aura::Window* source, aura::Window* target) {
|
| - DCHECK(Contains(source));
|
| - DCHECK(Contains(target));
|
| - aura::Window::Windows::iterator source_iter =
|
| - std::find(windows_.begin(), windows_.end(), source);
|
| - aura::Window::Windows::iterator target_iter =
|
| - std::find(windows_.begin(), windows_.end(), target);
|
| - DCHECK(source_iter != target_iter);
|
| - if (source_iter < target_iter)
|
| - std::rotate(source_iter, source_iter + 1, target_iter + 1);
|
| - else
|
| - std::rotate(target_iter, source_iter, source_iter + 1);
|
| - Layout(NULL);
|
| -}
|
| -
|
| -aura::Window* Workspace::ShiftWindows(aura::Window* insert,
|
| - aura::Window* until,
|
| - aura::Window* target,
|
| - ShiftDirection direction) {
|
| - DCHECK(until);
|
| - DCHECK(!Contains(insert));
|
| -
|
| - bool shift_reached_until = GetIndexOf(until) >= 0;
|
| - if (shift_reached_until) {
|
| - // Calling RemoveWindow here causes the animation set in Layout below
|
| - // to be ignored. See crbug.com/102413.
|
| - windows_.erase(std::find(windows_.begin(), windows_.end(), until));
|
| - }
|
| - aura::Window* pushed = NULL;
|
| - if (direction == SHIFT_TO_RIGHT) {
|
| - aura::Window::Windows::iterator iter =
|
| - std::find(windows_.begin(), windows_.end(), target);
|
| - // Insert at |target| position, or at the begining.
|
| - if (iter == windows_.end())
|
| - iter = windows_.begin();
|
| - windows_.insert(iter, insert);
|
| - if (!shift_reached_until) {
|
| - pushed = windows_.back();
|
| - windows_.erase(--windows_.end());
|
| - }
|
| - } else {
|
| - aura::Window::Windows::iterator iter =
|
| - std::find(windows_.begin(), windows_.end(), target);
|
| - // Insert after |target|, or at the end.
|
| - if (iter != windows_.end())
|
| - ++iter;
|
| - windows_.insert(iter, insert);
|
| - if (!shift_reached_until) {
|
| - pushed = windows_.front();
|
| - windows_.erase(windows_.begin());
|
| - }
|
| - }
|
| - Layout(NULL);
|
| - return pushed;
|
| -}
|
| -
|
| -void Workspace::Activate() {
|
| - workspace_manager_->SetActiveWorkspace(this);
|
| -}
|
| -
|
| -void Workspace::Layout(aura::Window* no_animation) {
|
| - aura::Window* ignore = workspace_manager_->ignored_window();
|
| - workspace_manager_->set_layout_in_progress(true);
|
| - gfx::Rect work_area = workspace_manager_->GetWorkAreaBounds(bounds_);
|
| - int total_width = GetTotalWindowsWidth();
|
| - if (total_width < work_area.width()) {
|
| - int dx = (work_area.width() - total_width) / 2;
|
| - for (aura::Window::Windows::iterator i = windows_.begin();
|
| - i != windows_.end();
|
| - ++i) {
|
| - if (*i != ignore) {
|
| - MoveWindowTo(*i,
|
| - gfx::Point(work_area.x() + dx, work_area.y()),
|
| - no_animation != *i);
|
| - }
|
| - dx += GetLayoutWidth(*i) + kWindowHorizontalMargin;
|
| - }
|
| - } else {
|
| - DCHECK_LT(windows_.size(), 3U);
|
| - // TODO(oshima): This is messy. Figure out general algorithm to
|
| - // layout more than 2 windows.
|
| - if (windows_[0] != ignore) {
|
| - MoveWindowTo(windows_[0],
|
| - work_area.origin(),
|
| - no_animation != windows_[0]);
|
| - }
|
| - if (windows_.size() == 2 && windows_[1] != ignore) {
|
| - MoveWindowTo(windows_[1],
|
| - gfx::Point(work_area.right() - GetLayoutWidth(windows_[1]),
|
| - work_area.y()),
|
| - no_animation != windows_[1]);
|
| - }
|
| - }
|
| - workspace_manager_->set_layout_in_progress(false);
|
| -}
|
| -
|
| -bool Workspace::ContainsFullscreenWindow() const {
|
| - for (aura::Window::Windows::const_iterator i = windows_.begin();
|
| - i != windows_.end();
|
| - ++i) {
|
| - aura::Window* w = *i;
|
| - if (w->IsVisible() &&
|
| - w->GetIntProperty(aura::client::kShowStateKey) ==
|
| - ui::SHOW_STATE_FULLSCREEN)
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -int Workspace::GetIndexOf(aura::Window* window) const {
|
| - aura::Window::Windows::const_iterator i =
|
| - std::find(windows_.begin(), windows_.end(), window);
|
| - return i == windows_.end() ? -1 : i - windows_.begin();
|
| -}
|
| -
|
| -bool Workspace::CanAdd(aura::Window* window) const {
|
| - // TODO(oshima): This should be based on available space and the
|
| - // size of the |window|.
|
| - //NOTIMPLEMENTED();
|
| - return windows_.size() < g_max_windows_per_workspace;
|
| -}
|
| -
|
| -void Workspace::MoveWindowTo(
|
| - aura::Window* window,
|
| - const gfx::Point& origin,
|
| - bool animate) {
|
| - gfx::Rect bounds = GetLayoutBounds(window);
|
| - gfx::Rect work_area = GetWorkAreaBounds();
|
| - // Make sure the window isn't bigger than the workspace size.
|
| - bounds.SetRect(origin.x(), origin.y(),
|
| - std::min(work_area.width(), bounds.width()),
|
| - std::min(work_area.height(), bounds.height()));
|
| - if (animate) {
|
| - ui::LayerAnimator::ScopedSettings settings(window->layer()->GetAnimator());
|
| - window->SetBounds(bounds);
|
| - } else {
|
| - window->SetBounds(bounds);
|
| - }
|
| -}
|
| -
|
| -int Workspace::GetTotalWindowsWidth() const {
|
| - int total_width = 0;
|
| - for (aura::Window::Windows::const_iterator i = windows_.begin();
|
| - i != windows_.end();
|
| - ++i) {
|
| - if (total_width)
|
| - total_width += kWindowHorizontalMargin;
|
| - total_width += GetLayoutWidth(*i);
|
| - }
|
| - return total_width;
|
| -}
|
| -
|
| -// static
|
| -size_t Workspace::SetMaxWindowsCount(size_t max) {
|
| - int old = g_max_windows_per_workspace;
|
| - g_max_windows_per_workspace = max;
|
| - return old;
|
| -}
|
| -
|
| -} // namespace internal
|
| -} // namespace aura_shell
|
|
|