// 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.
#ifndef CHROME_BROWSER_UI_PANELS_PANEL_COLLECTION_H_
#define CHROME_BROWSER_UI_PANELS_PANEL_COLLECTION_H_
#include "chrome/browser/ui/panels/panel_constants.h"
#include "ui/gfx/point.h"
#include "ui/gfx/rect.h"
class Panel;
// Common base class for a collection of panels. Subclasses manage
// various layouts for displaying panels in the collection.
class PanelCollection {
public:
// Types of layout for the panel collections.
enum Type {
DETACHED, // free-floating panels
DOCKED, // panels are 'docked' along the window's edge
STACKED, // panels are stacked together
};
// Masks that control how the panel is added and positioned.
enum PositioningMask {
// The panel is added and placed at default position that is decided by the
// collection.
DEFAULT_POSITION = 0x0,
// The panel is being added based on its current known position.
KNOWN_POSITION = 0x1,
// The panel is added and placed at top position (currently only used by
// stacked collection)
TOP_POSITION = 0x2,
// Do not update panel bounds. Only valid with DEFAULT_POSIITON.
DO_NOT_UPDATE_BOUNDS = 0x4,
// Wait for a brief delay before refreshing layout of the collection after
// adding panel to the collection. If not set, the collection will refresh
// its layout immediately.
DELAY_LAYOUT_REFRESH = 0x8,
// Do not refresh layout. Used by stacking.
NO_LAYOUT_REFRESH = 0x10,
// Collapse other inactive stacked panels such the tha new panel can fit
// within the working area. Used by stacking.
COLLAPSE_TO_FIT = 0x20
};
enum RemovalReason {
PANEL_CLOSED,
PANEL_CHANGED_COLLECTION
};
Type type() const { return type_; }
// Called when the display area is changed.
virtual void OnDisplayChanged() = 0;
// Updates the positioning of all panels in the collection, usually as
// a result of removing or resizing a panel in collection.
virtual void RefreshLayout() = 0;
// Adds |panel| to the collection of panels.
// |positioning_mask| indicates how |panel| should be added and positioned.
virtual void AddPanel(Panel* panel, PositioningMask positioning_mask) = 0;
// Removes |panel| from the collection of panels. Invoked asynchronously
// after a panel has been closed.
// |reason| denotes why the panel is removed from the collection.
virtual void RemovePanel(Panel* panel, RemovalReason reason) = 0;
// Closes all panels in the collection. Panels will be removed after closing.
virtual void CloseAll() = 0;
// Resizes the |panel| to the |preferred_window_size| and updates the layout
// of other panels in the collection accordingly.
// |preferred_window_size| is the outer dimensions of the window, not
// the content area, and is in screen coordinates.
// The preferred size may be adjusted to fit layout constraints.
virtual void ResizePanelWindow(Panel* panel,
const gfx::Size& preferred_window_size) = 0;
// Returns the sides from which |panel| can be resized by the user
// if |panel| is resizable in this collection.
virtual panel::Resizability GetPanelResizability(
const Panel* panel) const = 0;
// Change panel's bounds and take care of all possible side effects
// in ths collection as a result of the panel being resized by the user.
// TODO (AndreiB) Add a parameter telling what how to approach animation
// (no animation, continue existing, or start new).
virtual void OnPanelResizedByMouse(Panel* panel,
const gfx::Rect& new_bounds) = 0;
// Invoked when the draw attention state of the panel has changed.
// Subclass should update the display of the panel to match the new
// draw attention state.
virtual void OnPanelAttentionStateChanged(Panel* panel) = 0;
// Invoked when the titlebar of a |panel| in the collection has been clicked.
// Click behavior may be modified as indicated by |modifier|.
virtual void OnPanelTitlebarClicked(Panel* panel,
panel::ClickModifier modifier) = 0;
// Called when a panel's expansion state changes.
virtual void OnPanelExpansionStateChanged(Panel* panel) = 0;
// Called when a panel in the collection becomes active or inactive.
virtual void OnPanelActiveStateChanged(Panel* panel) = 0;
// Updates the display to show |panel| as active.
virtual void ActivatePanel(Panel* panel) = 0;
// Updates the display to show |panel| as minimized/restored.
virtual void MinimizePanel(Panel* panel) = 0;
virtual void RestorePanel(Panel* panel) = 0;
// Called when a panel's minimize/restore button is clicked.
// The behavior might be modified as indicated by |modifier|.
virtual void OnMinimizeButtonClicked(Panel* panel,
panel::ClickModifier modifier) = 0;
virtual void OnRestoreButtonClicked(Panel* panel,
panel::ClickModifier modifier) = 0;
// Returns true if minimize or restore button can be shown on the panel's
// titlebar.
virtual bool CanShowMinimizeButton(const Panel* panel) const = 0;
virtual bool CanShowRestoreButton(const Panel* panel) const = 0;
virtual bool IsPanelMinimized(const Panel* panel) const = 0;
virtual bool UsesAlwaysOnTopPanels() const = 0;
// Saves/restores/discards the placement information of |panel|. This is
// useful in bringing back the dragging panel to its original positioning
// when the drag is cancelled. After the placement information is saved,
// the caller should only call one of RestorePanelToSavedPlacement or
// DiscardSavedPanelPlacement.
virtual void SavePanelPlacement(Panel* panel) = 0;
virtual void RestorePanelToSavedPlacement() = 0;
virtual void DiscardSavedPanelPlacement() = 0;
// When a panel is added to this collection, some modifications to its visual
// style or underlying implementation may be in order. Each collection decides
// what properties should be applied to a newly-added panel.
virtual void UpdatePanelOnCollectionChange(Panel* panel) = 0;
// Returns the initial bounds to show the panel based on the requested bounds.
virtual gfx::Rect GetInitialPanelBounds(
const gfx::Rect& requested_bounds) const = 0;
protected:
explicit PanelCollection(Type type);
virtual ~PanelCollection();
const Type type_; // Type of this panel collection.
};
#endif // CHROME_BROWSER_UI_PANELS_PANEL_COLLECTION_H_