blob: 03567b6f0c0b36f03a5bf33fc9ece961314ca1b6 [file] [log] [blame]
// Copyright (c) 2012 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 "ash/wm/workspace/workspace2.h"
#include "ash/shell_window_ids.h"
#include "ash/wm/property_util.h"
#include "ash/wm/window_properties.h"
#include "ash/wm/window_util.h"
#include "ash/wm/workspace/workspace_event_handler.h"
#include "ash/wm/workspace/workspace_layout_manager2.h"
#include "ash/wm/workspace/workspace_manager2.h"
#include "ui/aura/window.h"
namespace ash {
namespace internal {
Workspace2::Workspace2(WorkspaceManager2* manager,
aura::Window* parent,
bool is_maximized)
: is_maximized_(is_maximized),
workspace_manager_(manager),
window_(new aura::Window(NULL)),
event_handler_(new WorkspaceEventHandler(window_)),
workspace_layout_manager_(NULL) {
window_->SetProperty(internal::kChildWindowVisibilityChangesAnimatedKey,
true);
window_->set_id(kShellWindowId_WorkspaceContainer);
window_->SetName("WorkspaceContainer");
window_->Init(ui::LAYER_NOT_DRAWN);
// Do this so when animating out windows don't extend beyond the bounds.
window_->layer()->SetMasksToBounds(true);
window_->Hide();
window_->SetParent(parent);
window_->SetProperty(internal::kUsesScreenCoordinatesKey, true);
// The layout-manager cannot be created in the initializer list since it
// depends on the window to have been initialized.
workspace_layout_manager_ = new WorkspaceLayoutManager2(this);
window_->SetLayoutManager(workspace_layout_manager_);
}
Workspace2::~Workspace2() {
// ReleaseWindow() should have been invoked before we're deleted.
DCHECK(!window_);
}
aura::Window* Workspace2::ReleaseWindow() {
// Remove the LayoutManager and EventFilter as they refer back to us and/or
// WorkspaceManager.
window_->SetLayoutManager(NULL);
window_->SetEventFilter(NULL);
aura::Window* window = window_;
window_ = NULL;
return window;
}
bool Workspace2::ShouldMoveToPending() const {
if (!is_maximized_)
return false;
bool has_visible_non_maximized_window = false;
for (size_t i = 0; i < window_->children().size(); ++i) {
aura::Window* child(window_->children()[i]);
if (!child->TargetVisibility() || wm::IsWindowMinimized(child))
continue;
if (WorkspaceManager2::IsMaximized(child))
return false;
if (GetTrackedByWorkspace(child) && !GetPersistsAcrossAllWorkspaces(child))
has_visible_non_maximized_window = true;
}
return !has_visible_non_maximized_window;
}
int Workspace2::GetNumMaximizedWindows() const {
int count = 0;
for (size_t i = 0; i < window_->children().size(); ++i) {
aura::Window* child = window_->children()[i];
if (WorkspaceManager2::IsMaximized(child) ||
WorkspaceManager2::WillRestoreMaximized(child)) {
if (++count == 2)
return count;
}
}
return count;
}
} // namespace internal
} // namespace ash