| Index: chrome/browser/ui/panels/stacked_panel_collection.cc
|
| diff --git a/chrome/browser/ui/panels/stacked_panel_collection.cc b/chrome/browser/ui/panels/stacked_panel_collection.cc
|
| deleted file mode 100644
|
| index 7bcf5081967dca7784e798511f1161b65cb78576..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/ui/panels/stacked_panel_collection.cc
|
| +++ /dev/null
|
| @@ -1,798 +0,0 @@
|
| -// 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 "chrome/browser/ui/panels/stacked_panel_collection.h"
|
| -
|
| -#include <algorithm>
|
| -#include "base/auto_reset.h"
|
| -#include "base/logging.h"
|
| -#include "base/strings/utf_string_conversions.h"
|
| -#include "chrome/browser/ui/panels/detached_panel_collection.h"
|
| -#include "chrome/browser/ui/panels/display_settings_provider.h"
|
| -#include "chrome/browser/ui/panels/native_panel_stack_window.h"
|
| -#include "chrome/browser/ui/panels/panel.h"
|
| -#include "chrome/browser/ui/panels/panel_constants.h"
|
| -#include "chrome/browser/ui/panels/panel_manager.h"
|
| -#include "extensions/common/extension.h"
|
| -
|
| -StackedPanelCollection::StackedPanelCollection(PanelManager* panel_manager)
|
| - : PanelCollection(PanelCollection::STACKED),
|
| - panel_manager_(panel_manager),
|
| - primary_stack_window_(NULL),
|
| - secondary_stack_window_(NULL),
|
| - minimizing_all_(false) {
|
| -}
|
| -
|
| -StackedPanelCollection::~StackedPanelCollection() {
|
| - DCHECK(panels_.empty());
|
| - DCHECK(most_recently_active_panels_.empty());
|
| -}
|
| -
|
| -void StackedPanelCollection::OnDisplayChanged() {
|
| - if (panels_.empty())
|
| - return;
|
| -
|
| - gfx::Rect enclosing_bounds = GetEnclosingBounds();
|
| - gfx::Rect work_area = panel_manager_->display_settings_provider()->
|
| - GetWorkAreaMatching(enclosing_bounds);
|
| -
|
| - // If the height of the whole stack is bigger than the height of the new work
|
| - // area, try to reduce the stack height by collapsing panels. In rare case,
|
| - // all panels are collapsed and there is still not enough space. We simply
|
| - // let the stack go beyond the work area limit.
|
| - if (enclosing_bounds.height() > work_area.height()) {
|
| - int needed_space = enclosing_bounds.height() - work_area.height();
|
| - MinimizePanelsForSpace(needed_space);
|
| - }
|
| -
|
| - gfx::Rect top_bounds = top_panel()->GetBounds();
|
| - int common_width = top_bounds.width();
|
| - if (common_width > work_area.width())
|
| - common_width = work_area.width();
|
| -
|
| - int common_x = top_bounds.x();
|
| - if (common_x + common_width > work_area.right())
|
| - common_x = work_area.right() - common_width;
|
| - if (common_x < work_area.x())
|
| - common_x = work_area.x();
|
| -
|
| - int total_height = bottom_panel()->GetBounds().bottom() - top_bounds.y();
|
| - int start_y = top_bounds.y();
|
| - if (start_y + total_height > work_area.bottom())
|
| - start_y = work_area.bottom() - total_height;
|
| - if (start_y < work_area.y())
|
| - start_y = work_area.y();
|
| -
|
| - RefreshLayoutWithTopPanelStartingAt(
|
| - gfx::Point(common_x, start_y), common_width);
|
| -}
|
| -
|
| -void StackedPanelCollection::RefreshLayout() {
|
| - if (panels_.empty())
|
| - return;
|
| - gfx::Rect top_bounds = top_panel()->GetBounds();
|
| - RefreshLayoutWithTopPanelStartingAt(top_bounds.origin(), top_bounds.width());
|
| -}
|
| -
|
| -void StackedPanelCollection::RefreshLayoutWithTopPanelStartingAt(
|
| - const gfx::Point& start_position, int common_width) {
|
| - if (panels_.empty())
|
| - return;
|
| -
|
| - // If only one panel is left in the stack, we only need to check if it should
|
| - // be moved to |start_y| position.
|
| - if (panels_.size() == 1) {
|
| - Panel* panel = panels_.front();
|
| - gfx::Rect bounds = panel->GetBounds();
|
| - if (bounds.origin() != start_position) {
|
| - bounds.set_origin(start_position);
|
| - panel->SetPanelBounds(bounds);
|
| - }
|
| - return;
|
| - }
|
| -
|
| - // We do not update bounds for affected panels one by one. Instead, all
|
| - // changes are bundled and performed synchronously.
|
| - primary_stack_window_->BeginBatchUpdatePanelBounds(true);
|
| - if (secondary_stack_window_)
|
| - secondary_stack_window_->BeginBatchUpdatePanelBounds(true);
|
| -
|
| - int y = start_position.y();
|
| - int common_x = start_position.x();
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); ++iter) {
|
| - Panel* panel = *iter;
|
| -
|
| - // The visibility of minimize button might need to be updated due to that
|
| - // top panel might change when a panel is being added or removed from
|
| - // the stack.
|
| - panel->UpdateMinimizeRestoreButtonVisibility();
|
| -
|
| - // Don't update the stacked panel that is in preview mode.
|
| - gfx::Rect bounds = panel->GetBounds();
|
| - if (panel->in_preview_mode()) {
|
| - y += bounds.height();
|
| - continue;
|
| - }
|
| -
|
| - // Update the restored size.
|
| - gfx::Size full_size = panel->full_size();
|
| - full_size.set_width(common_width);
|
| - panel->set_full_size(full_size);
|
| -
|
| - // Recompute the bounds.
|
| - bounds.SetRect(
|
| - common_x,
|
| - y,
|
| - common_width,
|
| - panel->expansion_state() == Panel::EXPANDED ?
|
| - panel->full_size().height() : panel->TitleOnlyHeight());
|
| -
|
| - GetStackWindowForPanel(panel)->AddPanelBoundsForBatchUpdate(panel, bounds);
|
| -
|
| - y += bounds.height();
|
| - }
|
| -
|
| - primary_stack_window_->EndBatchUpdatePanelBounds();
|
| - if (secondary_stack_window_)
|
| - secondary_stack_window_->EndBatchUpdatePanelBounds();
|
| -}
|
| -
|
| -base::string16 StackedPanelCollection::GetTitle() const {
|
| - if (panels_.empty())
|
| - return base::string16();
|
| -
|
| - Panel* panel = panels_.front();
|
| - const extensions::Extension* extension = panel->GetExtension();
|
| - return base::UTF8ToUTF16(extension && !extension->name().empty() ?
|
| - extension->name() : panel->app_name());
|
| -}
|
| -
|
| -gfx::Image StackedPanelCollection::GetIcon() const {
|
| - if (panels_.empty())
|
| - return gfx::Image();
|
| - return panels_.front()->app_icon();
|
| -}
|
| -
|
| -void StackedPanelCollection::PanelBoundsBatchUpdateCompleted() {
|
| - if (!secondary_stack_window_ || panels_.empty())
|
| - return;
|
| -
|
| - if (top_panel()->in_preview_mode() != bottom_panel()->in_preview_mode() ||
|
| - primary_stack_window_->IsAnimatingPanelBounds() ||
|
| - secondary_stack_window_->IsAnimatingPanelBounds())
|
| - return;
|
| -
|
| - // Move all panels from secondary stack window to primary stack window.
|
| - primary_stack_window_->MergeWith(secondary_stack_window_);
|
| - secondary_stack_window_->Close();
|
| - secondary_stack_window_ = NULL;
|
| -}
|
| -
|
| -gfx::Rect StackedPanelCollection::GetEnclosingBounds() const {
|
| - gfx::Rect enclosing_bounds = top_panel()->GetBounds();
|
| - enclosing_bounds.set_height(
|
| - bottom_panel()->GetBounds().bottom() - enclosing_bounds.y());
|
| - return enclosing_bounds;
|
| -}
|
| -
|
| -int StackedPanelCollection::MinimizePanelsForSpace(int needed_space) {
|
| - int available_space = GetCurrentAvailableBottomSpace();
|
| -
|
| - // Only the most recently active panel might be active.
|
| - Panel* active_panel = NULL;
|
| - if (!most_recently_active_panels_.empty()) {
|
| - Panel* most_recently_active_panel = most_recently_active_panels_.front();
|
| - if (most_recently_active_panel->IsActive())
|
| - active_panel = most_recently_active_panel;
|
| - }
|
| -
|
| - for (Panels::const_reverse_iterator iter =
|
| - most_recently_active_panels_.rbegin();
|
| - iter != most_recently_active_panels_.rend() &&
|
| - available_space < needed_space;
|
| - ++iter) {
|
| - Panel* current_panel = *iter;
|
| - if (current_panel != active_panel && !IsPanelMinimized(current_panel)) {
|
| - available_space +=
|
| - current_panel->GetBounds().height() - panel::kTitlebarHeight;
|
| - MinimizePanel(current_panel);
|
| - }
|
| - }
|
| - return available_space;
|
| -}
|
| -
|
| -void StackedPanelCollection::AddPanel(Panel* panel,
|
| - PositioningMask positioning_mask) {
|
| - DCHECK_NE(this, panel->collection());
|
| - panel->set_collection(this);
|
| - Panel* adjacent_panel = NULL;
|
| - if (positioning_mask & PanelCollection::TOP_POSITION) {
|
| - adjacent_panel = top_panel();
|
| - panels_.push_front(panel);
|
| - } else {
|
| - // To fit the new panel within the working area, collapse unfocused panels
|
| - // in the least recent active order until there is enough space.
|
| - if (positioning_mask & PanelCollection::COLLAPSE_TO_FIT) {
|
| - int needed_space = panel->GetBounds().height();
|
| - int available_space = MinimizePanelsForSpace(needed_space);
|
| - DCHECK(available_space >= needed_space);
|
| - }
|
| -
|
| - adjacent_panel = bottom_panel();
|
| - panels_.push_back(panel);
|
| - }
|
| -
|
| - if (panel->IsActive())
|
| - most_recently_active_panels_.push_front(panel);
|
| - else
|
| - most_recently_active_panels_.push_back(panel);
|
| -
|
| - if (adjacent_panel)
|
| - UpdatePanelCornerStyle(adjacent_panel);
|
| -
|
| - // The secondary stack window should be used when one of the following occurs:
|
| - // 1) Some panels but not all panels are being dragged. This is because
|
| - // those panels being dragged might not be fully aligned with other panels
|
| - // not being dragged.
|
| - // 2) The newly added panel is not fully aligned with the existing panel, in
|
| - // terms of both x and width.
|
| - NativePanelStackWindow* stack_window;
|
| - if (top_panel()->in_preview_mode() == bottom_panel()->in_preview_mode() &&
|
| - top_panel()->GetBounds().x() == bottom_panel()->GetBounds().x() &&
|
| - top_panel()->GetBounds().width() == bottom_panel()->GetBounds().width()) {
|
| - if (!primary_stack_window_)
|
| - primary_stack_window_ = NativePanelStackWindow::Create(this);
|
| - stack_window = primary_stack_window_;
|
| - } else {
|
| - if (!secondary_stack_window_)
|
| - secondary_stack_window_ = NativePanelStackWindow::Create(this);
|
| - stack_window = secondary_stack_window_;
|
| - }
|
| - stack_window->AddPanel(panel);
|
| -
|
| - if ((positioning_mask & NO_LAYOUT_REFRESH) == 0)
|
| - RefreshLayout();
|
| -}
|
| -
|
| -void StackedPanelCollection::RemovePanel(Panel* panel, RemovalReason reason) {
|
| - bool is_top = panel == top_panel();
|
| - bool is_bottom = panel == bottom_panel();
|
| -
|
| - // If the top panel is being closed, all panels below it should move up. To
|
| - // do this, the top y position of top panel needs to be tracked first.
|
| - bool top_panel_closed = false;
|
| - gfx::Point top_origin;
|
| - int top_width = 0;
|
| - if (reason == PanelCollection::PANEL_CLOSED && is_top) {
|
| - top_panel_closed = true;
|
| - top_origin = panel->GetBounds().origin();
|
| - top_width = panel->GetBounds().width();
|
| - }
|
| -
|
| - panel->set_collection(NULL);
|
| - panels_.remove(panel);
|
| - most_recently_active_panels_.remove(panel);
|
| -
|
| - if (is_top) {
|
| - Panel* new_top_panel = top_panel();
|
| - if (new_top_panel)
|
| - UpdatePanelCornerStyle(new_top_panel);
|
| - } else if (is_bottom) {
|
| - Panel* new_bottom_panel = bottom_panel();
|
| - if (new_bottom_panel)
|
| - UpdatePanelCornerStyle(new_bottom_panel);
|
| - }
|
| -
|
| - // If an active panel is being closed, try to focus the next recently active
|
| - // panel in the stack that is not minimized.
|
| - if (reason == PanelCollection::PANEL_CLOSED &&
|
| - panel->IsActive() &&
|
| - !most_recently_active_panels_.empty()) {
|
| - for (Panels::const_iterator iter = most_recently_active_panels_.begin();
|
| - iter != most_recently_active_panels_.end(); ++iter) {
|
| - Panel* other_panel = *iter;
|
| - if (!IsPanelMinimized(other_panel)) {
|
| - other_panel->Activate();
|
| - break;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // If the top panel is closed, move up all other panels to stay at the same
|
| - // y position as the top panel being closed.
|
| - if (top_panel_closed)
|
| - RefreshLayoutWithTopPanelStartingAt(top_origin, top_width);
|
| - else if (reason == PanelCollection::PANEL_CLOSED)
|
| - RefreshLayout();
|
| -
|
| - // Remove the panel from the corresponding stack window.
|
| - GetStackWindowForPanel(panel)->RemovePanel(panel);
|
| -
|
| - // Close the secondary stack window if no panel is is shown inside it.
|
| - // Note that we do not need to do this for primary stack window since the
|
| - // whole stack will be gone when only one panel is left.
|
| - if (secondary_stack_window_ && secondary_stack_window_->IsEmpty()) {
|
| - secondary_stack_window_->Close();
|
| - secondary_stack_window_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void StackedPanelCollection::CloseAll() {
|
| - // Make a copy as closing panels can modify the iterator.
|
| - Panels panels_copy = panels_;
|
| -
|
| - for (Panels::const_iterator iter = panels_copy.begin();
|
| - iter != panels_copy.end(); ++iter)
|
| - (*iter)->Close();
|
| -
|
| - if (primary_stack_window_) {
|
| - primary_stack_window_->Close();
|
| - primary_stack_window_ = NULL;
|
| - }
|
| - if (secondary_stack_window_) {
|
| - secondary_stack_window_->Close();
|
| - secondary_stack_window_ = NULL;
|
| - }
|
| -}
|
| -
|
| -void StackedPanelCollection::OnPanelAttentionStateChanged(Panel* panel) {
|
| - if ((panel->attention_mode() & Panel::USE_SYSTEM_ATTENTION) != 0)
|
| - primary_stack_window_->DrawSystemAttention(panel->IsDrawingAttention());
|
| -}
|
| -
|
| -void StackedPanelCollection::OnPanelTitlebarClicked(
|
| - Panel* panel, panel::ClickModifier modifier) {
|
| - bool expanded = panel->expansion_state() == Panel::EXPANDED;
|
| - if (modifier == panel::APPLY_TO_ALL) {
|
| - if (expanded)
|
| - MinimizeAll();
|
| - else
|
| - RestoreAll(panel);
|
| - } else {
|
| - if (expanded)
|
| - MinimizePanel(panel);
|
| - else
|
| - RestorePanel(panel);
|
| - }
|
| -}
|
| -
|
| -void StackedPanelCollection::ResizePanelWindow(
|
| - Panel* panel,
|
| - const gfx::Size& preferred_window_size) {
|
| -}
|
| -
|
| -void StackedPanelCollection::ActivatePanel(Panel* panel) {
|
| - // Make sure the panel is expanded when activated so the user input
|
| - // does not go into a collapsed window.
|
| - if (panel->IsMinimized())
|
| - panel->SetExpansionState(Panel::EXPANDED);
|
| -}
|
| -
|
| -void StackedPanelCollection::MinimizePanel(Panel* panel) {
|
| - panel->SetExpansionState(Panel::TITLE_ONLY);
|
| -}
|
| -
|
| -void StackedPanelCollection::RestorePanel(Panel* panel) {
|
| - // Ensure that the panel could fit within the work area after it is expanded.
|
| - // First, try to collapse the unfocused panel in the least recent active
|
| - // order in order to get enough space.
|
| - int needed_space = panel->full_size().height() - panel->TitleOnlyHeight();
|
| - int available_space = MinimizePanelsForSpace(needed_space);
|
| -
|
| - // If there is still not enough space, try to move up the stack.
|
| - int space_beyond_available = needed_space - available_space;
|
| - if (space_beyond_available > 0) {
|
| - int top_available_space = GetCurrentAvailableTopSpace();
|
| - int move_delta = (space_beyond_available > top_available_space) ?
|
| - top_available_space : space_beyond_available;
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); iter++) {
|
| - Panel* current_panel = *iter;
|
| - gfx::Rect bounds = current_panel->GetBounds();
|
| - bounds.set_y(bounds.y() - move_delta);
|
| - current_panel->SetPanelBounds(bounds);
|
| - }
|
| - available_space += move_delta;
|
| - }
|
| -
|
| - // If there is still not enough space, shrink the restored height to make it
|
| - // fit at the last resort. Note that the restored height cannot be shrunk less
|
| - // than the minimum panel height. If this is the case, we will just let it
|
| - // expand beyond the screen boundary.
|
| - space_beyond_available = needed_space - available_space;
|
| - if (space_beyond_available > 0) {
|
| - gfx::Size full_size = panel->full_size();
|
| - int reduced_height = full_size.height() - space_beyond_available;
|
| - if (reduced_height < panel::kPanelMinHeight)
|
| - reduced_height = panel::kPanelMinHeight;
|
| - full_size.set_height(reduced_height);
|
| - panel->set_full_size(full_size);
|
| - }
|
| -
|
| - panel->SetExpansionState(Panel::EXPANDED);
|
| -}
|
| -
|
| -void StackedPanelCollection::MinimizeAll() {
|
| - // Set minimizing_all_ to prevent deactivation of each panel when it
|
| - // is minimized. See comments in OnPanelExpansionStateChanged.
|
| - base::AutoReset<bool> pin(&minimizing_all_, true);
|
| - Panel* minimized_active_panel = NULL;
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); ++iter) {
|
| - if ((*iter)->IsActive())
|
| - minimized_active_panel = *iter;
|
| - MinimizePanel(*iter);
|
| - }
|
| -
|
| - // When a single panel is minimized, it is deactivated to ensure that
|
| - // a minimized panel does not have focus. However, when minimizing all,
|
| - // the deactivation is only done once after all panels are minimized,
|
| - // rather than per minimized panel, both for efficiency and to avoid
|
| - // temporary activations of random not-yet-minimized panels.
|
| - if (minimized_active_panel) {
|
| - minimized_active_panel->Deactivate();
|
| - // Layout will be refreshed in response to (de)activation notification.
|
| - }
|
| -}
|
| -
|
| -void StackedPanelCollection::RestoreAll(Panel* panel_clicked) {
|
| - // Expand the panel being clicked first. This is to make sure at least one
|
| - // panel that is clicked by the user will be expanded.
|
| - RestorePanel(panel_clicked);
|
| -
|
| - // Try to expand all other panels starting from the most recently active
|
| - // panel.
|
| - for (Panels::const_iterator iter = most_recently_active_panels_.begin();
|
| - iter != most_recently_active_panels_.end(); ++iter) {
|
| - // If the stack already extends to both top and bottom of the work area,
|
| - // stop now since we cannot fit any more expanded panels.
|
| - if (GetCurrentAvailableTopSpace() == 0 &&
|
| - GetCurrentAvailableBottomSpace() == 0) {
|
| - break;
|
| - }
|
| -
|
| - Panel* panel = *iter;
|
| - if (panel != panel_clicked)
|
| - RestorePanel(panel);
|
| - }
|
| -}
|
| -
|
| -void StackedPanelCollection::OnMinimizeButtonClicked(
|
| - Panel* panel, panel::ClickModifier modifier) {
|
| - // The minimize button is only present in the top panel.
|
| - DCHECK_EQ(top_panel(), panel);
|
| -
|
| - primary_stack_window_->Minimize();
|
| -}
|
| -
|
| -void StackedPanelCollection::OnRestoreButtonClicked(
|
| - Panel* panel, panel::ClickModifier modifier) {
|
| - NOTREACHED();
|
| -}
|
| -
|
| -bool StackedPanelCollection::CanShowMinimizeButton(const Panel* panel) const {
|
| - // Only the top panel in the stack shows the minimize button.
|
| - return PanelManager::CanUseSystemMinimize() && panel == top_panel();
|
| -}
|
| -
|
| -bool StackedPanelCollection::CanShowRestoreButton(const Panel* panel) const {
|
| - return false;
|
| -}
|
| -
|
| -bool StackedPanelCollection::IsPanelMinimized(const Panel* panel) const {
|
| - return panel->expansion_state() != Panel::EXPANDED;
|
| -}
|
| -
|
| -bool StackedPanelCollection::UsesAlwaysOnTopPanels() const {
|
| - return false;
|
| -}
|
| -
|
| -void StackedPanelCollection::SavePanelPlacement(Panel* panel) {
|
| - DCHECK(!saved_panel_placement_.panel);
|
| - saved_panel_placement_.panel = panel;
|
| -
|
| - if (top_panel() != panel)
|
| - saved_panel_placement_.top_panel = top_panel();
|
| - else
|
| - saved_panel_placement_.position = panel->GetBounds().origin();
|
| -
|
| - saved_panel_placement_.top_panel = top_panel() != panel ? top_panel() : NULL;
|
| -}
|
| -
|
| -void StackedPanelCollection::RestorePanelToSavedPlacement() {
|
| - DCHECK(saved_panel_placement_.panel);
|
| -
|
| - if (saved_panel_placement_.top_panel) {
|
| - // Restore the top panel if it has been moved out of the stack. This could
|
| - // happen when there're 2 panels in the stack and the bottom panel is being
|
| - // dragged out of the stack and thus cause both panels become detached.
|
| - if (saved_panel_placement_.top_panel->stack() != this) {
|
| - DCHECK_EQ(PanelCollection::DETACHED,
|
| - saved_panel_placement_.top_panel->collection()->type());
|
| - panel_manager_->MovePanelToCollection(
|
| - saved_panel_placement_.top_panel,
|
| - this,
|
| - static_cast<PanelCollection::PositioningMask>(
|
| - PanelCollection::TOP_POSITION |
|
| - PanelCollection::NO_LAYOUT_REFRESH));
|
| - }
|
| - RefreshLayout();
|
| - } else {
|
| - // Restore the position when the top panel is being dragged.
|
| - DCHECK_EQ(top_panel(), saved_panel_placement_.panel);
|
| - RefreshLayoutWithTopPanelStartingAt(saved_panel_placement_.position,
|
| - top_panel()->GetBounds().width());
|
| - }
|
| -
|
| - DiscardSavedPanelPlacement();
|
| -}
|
| -
|
| -void StackedPanelCollection::DiscardSavedPanelPlacement() {
|
| - DCHECK(saved_panel_placement_.panel);
|
| - saved_panel_placement_.panel = NULL;
|
| - saved_panel_placement_.top_panel = NULL;
|
| -}
|
| -
|
| -panel::Resizability StackedPanelCollection::GetPanelResizability(
|
| - const Panel* panel) const {
|
| - // The panel in the stack can be resized by the following rules:
|
| - // * If collapsed, it can only be resized by its left or right edge.
|
| - // * Otherwise, it can be resized by its left or right edge plus:
|
| - // % top edge and corners, if it is at the top;
|
| - // % bottom edge, if it is not at the bottom.
|
| - // % bottom edge and corners, if it is at the bottom.
|
| - panel::Resizability resizability = static_cast<panel::Resizability>(
|
| - panel::RESIZABLE_LEFT | panel::RESIZABLE_RIGHT);
|
| - if (panel->IsMinimized())
|
| - return resizability;
|
| - if (panel == top_panel()) {
|
| - resizability = static_cast<panel::Resizability>(resizability |
|
| - panel::RESIZABLE_TOP | panel::RESIZABLE_TOP_LEFT |
|
| - panel::RESIZABLE_TOP_RIGHT);
|
| - }
|
| - if (panel == bottom_panel()) {
|
| - resizability = static_cast<panel::Resizability>(resizability |
|
| - panel::RESIZABLE_BOTTOM | panel::RESIZABLE_BOTTOM_LEFT |
|
| - panel::RESIZABLE_BOTTOM_RIGHT);
|
| - } else {
|
| - resizability = static_cast<panel::Resizability>(resizability |
|
| - panel::RESIZABLE_BOTTOM);
|
| - }
|
| - return resizability;
|
| -}
|
| -
|
| -void StackedPanelCollection::OnPanelResizedByMouse(
|
| - Panel* resized_panel, const gfx::Rect& new_bounds) {
|
| - resized_panel->set_full_size(new_bounds.size());
|
| -
|
| - DCHECK(!secondary_stack_window_);
|
| - primary_stack_window_->BeginBatchUpdatePanelBounds(false);
|
| -
|
| - // The delta x and width can be computed from the difference between
|
| - // the panel being resized and any other panel.
|
| - Panel* other_panel = resized_panel == top_panel() ? bottom_panel()
|
| - : top_panel();
|
| - gfx::Rect other_bounds = other_panel->GetBounds();
|
| - int delta_x = new_bounds.x() - other_bounds.x();
|
| - int delta_width = new_bounds.width() - other_bounds.width();
|
| -
|
| - gfx::Rect previous_bounds;
|
| - bool resized_panel_found = false;
|
| - bool panel_below_resized_panel_updated = false;
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); iter++) {
|
| - Panel* panel = *iter;
|
| - if (panel == resized_panel) {
|
| - // |new_bounds| should be used since the panel bounds have not been
|
| - // updated yet.
|
| - previous_bounds = new_bounds;
|
| - resized_panel_found = true;
|
| - primary_stack_window_->AddPanelBoundsForBatchUpdate(panel, new_bounds);
|
| - continue;
|
| - }
|
| -
|
| - gfx::Rect bounds = panel->GetBounds();
|
| - bounds.set_x(bounds.x() + delta_x);
|
| - bounds.set_width(bounds.width() + delta_width);
|
| -
|
| - // If the panel below the panel being resized is expanded, update its
|
| - // height to offset the height change of the panel being resized.
|
| - // For example, the stack has P1 and P2 (from top to bottom). P1's height
|
| - // is 100 and P2's height is 120. If P1's bottom increases by 10, P2's
|
| - // height needs to shrink by 10.
|
| - if (resized_panel_found) {
|
| - if (!panel_below_resized_panel_updated && !panel->IsMinimized()) {
|
| - int old_bottom = bounds.bottom();
|
| - bounds.set_y(previous_bounds.bottom());
|
| - bounds.set_height(old_bottom - bounds.y());
|
| - } else {
|
| - bounds.set_y(previous_bounds.bottom());
|
| - }
|
| - panel_below_resized_panel_updated = true;
|
| - }
|
| -
|
| - if (!panel->IsMinimized())
|
| - panel->set_full_size(bounds.size());
|
| -
|
| - primary_stack_window_->AddPanelBoundsForBatchUpdate(panel, bounds);
|
| - previous_bounds = bounds;
|
| - }
|
| -
|
| - primary_stack_window_->EndBatchUpdatePanelBounds();
|
| -}
|
| -
|
| -bool StackedPanelCollection::HasPanel(Panel* panel) const {
|
| - return std::find(panels_.begin(), panels_.end(), panel) != panels_.end();
|
| -}
|
| -
|
| -void StackedPanelCollection::UpdatePanelOnCollectionChange(Panel* panel) {
|
| - panel->set_attention_mode(
|
| - static_cast<Panel::AttentionMode>(Panel::USE_PANEL_ATTENTION |
|
| - Panel::USE_SYSTEM_ATTENTION));
|
| - panel->ShowShadow(false);
|
| - panel->UpdateMinimizeRestoreButtonVisibility();
|
| - UpdatePanelCornerStyle(panel);
|
| -}
|
| -
|
| -void StackedPanelCollection::OnPanelExpansionStateChanged(Panel* panel) {
|
| - DCHECK_NE(Panel::MINIMIZED, panel->expansion_state());
|
| -
|
| - // Ensure minimized panel does not get the focus. If minimizing all,
|
| - // the active panel will be deactivated once when all panels are minimized
|
| - // rather than per minimized panel.
|
| - if (panel->expansion_state() != Panel::EXPANDED && !minimizing_all_ &&
|
| - panel->IsActive()) {
|
| - panel->Deactivate();
|
| - }
|
| -
|
| - // The bounds change per expansion state will be done in RefreshLayout.
|
| - RefreshLayout();
|
| -}
|
| -
|
| -void StackedPanelCollection::OnPanelActiveStateChanged(Panel* panel) {
|
| - if (!panel->IsActive())
|
| - return;
|
| -
|
| - // Move the panel to the front if not yet.
|
| - Panels::iterator iter = std::find(most_recently_active_panels_.begin(),
|
| - most_recently_active_panels_.end(), panel);
|
| - DCHECK(iter != most_recently_active_panels_.end());
|
| - if (iter != most_recently_active_panels_.begin()) {
|
| - most_recently_active_panels_.erase(iter);
|
| - most_recently_active_panels_.push_front(panel);
|
| - }
|
| -
|
| - GetStackWindowForPanel(panel)->OnPanelActivated(panel);
|
| -}
|
| -
|
| -gfx::Rect StackedPanelCollection::GetInitialPanelBounds(
|
| - const gfx::Rect& requested_bounds) const {
|
| - DCHECK(!panels_.empty());
|
| - gfx::Rect bottom_panel_bounds = bottom_panel()->GetBounds();
|
| - return gfx::Rect(bottom_panel_bounds.x(),
|
| - bottom_panel_bounds.bottom(),
|
| - bottom_panel_bounds.width(),
|
| - requested_bounds.height());
|
| -}
|
| -
|
| -Panel* StackedPanelCollection::GetPanelAbove(Panel* panel) const {
|
| - DCHECK(panel);
|
| -
|
| - if (panels_.size() < 2)
|
| - return NULL;
|
| - Panels::const_iterator iter = panels_.begin();
|
| - Panel* above_panel = *iter;
|
| - for (; iter != panels_.end(); ++iter) {
|
| - if (*iter == panel)
|
| - return above_panel;
|
| - above_panel = *iter;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -Panel* StackedPanelCollection::GetPanelBelow(Panel* panel) const {
|
| - DCHECK(panel);
|
| -
|
| - if (panels_.size() < 2)
|
| - return NULL;
|
| - Panels::const_iterator iter =
|
| - std::find(panels_.begin(), panels_.end(), panel);
|
| - if (iter == panels_.end())
|
| - return NULL;
|
| - ++iter;
|
| - return iter == panels_.end() ? NULL : *iter;
|
| -}
|
| -
|
| -void StackedPanelCollection::MoveAllDraggingPanelsInstantly(
|
| - const gfx::Vector2d& delta_origin) {
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); iter++) {
|
| - Panel* panel = *iter;
|
| - if (panel->in_preview_mode()) {
|
| - GetStackWindowForPanel(panel)->MovePanelsBy(delta_origin);
|
| - return;
|
| - }
|
| - }
|
| -}
|
| -
|
| -bool StackedPanelCollection::IsMinimized() const {
|
| - return primary_stack_window_->IsMinimized();
|
| -}
|
| -
|
| -bool StackedPanelCollection::IsAnimatingPanelBounds(Panel* panel) const {
|
| - return GetStackWindowForPanel(panel)->IsAnimatingPanelBounds();
|
| -}
|
| -
|
| -void StackedPanelCollection::UpdatePanelCornerStyle(Panel* panel) {
|
| - panel::CornerStyle corner_style;
|
| - bool at_top = panel == top_panel();
|
| - bool at_bottom = panel == bottom_panel();
|
| - if (at_top && at_bottom)
|
| - corner_style = panel::ALL_ROUNDED;
|
| - else if (at_top)
|
| - corner_style = panel::TOP_ROUNDED;
|
| - else if (at_bottom)
|
| - corner_style = panel::BOTTOM_ROUNDED;
|
| - else
|
| - corner_style = panel::NOT_ROUNDED;
|
| - panel->SetWindowCornerStyle(corner_style);
|
| -}
|
| -
|
| -gfx::Rect StackedPanelCollection::GetWorkArea() const {
|
| - if (panels_.empty())
|
| - return panel_manager_->display_settings_provider()->GetPrimaryWorkArea();
|
| - return panel_manager_->display_settings_provider()->GetWorkAreaMatching(
|
| - GetEnclosingBounds());
|
| -}
|
| -
|
| -int StackedPanelCollection::GetCurrentAvailableTopSpace() const {
|
| - gfx::Rect work_area = GetWorkArea();
|
| - if (panels_.empty())
|
| - return work_area.height();
|
| -
|
| - int available_space = top_panel()->GetBounds().y() - work_area.y();
|
| - if (available_space < 0)
|
| - available_space = 0;
|
| - return available_space;
|
| -}
|
| -
|
| -int StackedPanelCollection::GetCurrentAvailableBottomSpace() const {
|
| - gfx::Rect work_area = GetWorkArea();
|
| - if (panels_.empty())
|
| - return work_area.height();
|
| -
|
| - int available_space = work_area.bottom() -
|
| - bottom_panel()->GetBounds().bottom();
|
| - if (available_space < 0)
|
| - available_space = 0;
|
| - return available_space;
|
| -}
|
| -
|
| -int StackedPanelCollection::GetMaximiumAvailableBottomSpace() const {
|
| - gfx::Rect work_area = GetWorkArea();
|
| - if (panels_.empty())
|
| - return work_area.height();
|
| -
|
| - int bottom = top_panel()->GetBounds().y();
|
| - for (Panels::const_iterator iter = panels_.begin();
|
| - iter != panels_.end(); iter++) {
|
| - Panel* panel = *iter;
|
| - // Only the most recently active panel might be active.
|
| - if (iter == panels_.begin() && panel->IsActive())
|
| - bottom += panel->GetBounds().height();
|
| - else
|
| - bottom += panel::kTitlebarHeight;
|
| - }
|
| - int available_space = work_area.bottom() - bottom;
|
| - if (available_space < 0)
|
| - available_space = 0;
|
| - return available_space;
|
| -}
|
| -
|
| -NativePanelStackWindow* StackedPanelCollection::GetStackWindowForPanel(
|
| - Panel* panel) const {
|
| - return secondary_stack_window_ && secondary_stack_window_->HasPanel(panel) ?
|
| - secondary_stack_window_ : primary_stack_window_;
|
| -}
|
|
|