| // 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_ |