15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_PANELS_DETACHED_PANEL_COLLECTION_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_UI_PANELS_DETACHED_PANEL_COLLECTION_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/panel_collection.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelManager; 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages a group of free-floating panels. 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DetachedPanelCollection : public PanelCollection { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef std::list<Panel*> Panels; 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) typedef bool (*PanelsComparer)(Panel* panel1, Panel* panel2); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit DetachedPanelCollection(PanelManager* panel_manager); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~DetachedPanelCollection(); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PanelCollection OVERRIDES: 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnDisplayChanged() OVERRIDE; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RefreshLayout() OVERRIDE; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddPanel(Panel* panel, 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PositioningMask positioning_mask) OVERRIDE; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void RemovePanel(Panel* panel, RemovalReason reason) OVERRIDE; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseAll() OVERRIDE; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResizePanelWindow( 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& preferred_window_size) OVERRIDE; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual panel::Resizability GetPanelResizability( 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Panel* panel) const OVERRIDE; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPanelResizedByMouse(Panel* panel, 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& new_bounds) OVERRIDE; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPanelAttentionStateChanged(Panel* panel) OVERRIDE; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPanelTitlebarClicked(Panel* panel, 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) panel::ClickModifier modifier) OVERRIDE; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ActivatePanel(Panel* panel) OVERRIDE; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MinimizePanel(Panel* panel) OVERRIDE; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RestorePanel(Panel* panel) OVERRIDE; 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnMinimizeButtonClicked(Panel* panel, 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) panel::ClickModifier modifier) OVERRIDE; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnRestoreButtonClicked(Panel* panel, 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) panel::ClickModifier modifier) OVERRIDE; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanShowMinimizeButton(const Panel* panel) const OVERRIDE; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool CanShowRestoreButton(const Panel* panel) const OVERRIDE; 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsPanelMinimized(const Panel* panel) const OVERRIDE; 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual bool UsesAlwaysOnTopPanels() const OVERRIDE; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SavePanelPlacement(Panel* panel) OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RestorePanelToSavedPlacement() OVERRIDE; 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void DiscardSavedPanelPlacement() OVERRIDE; 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdatePanelOnCollectionChange(Panel* panel) OVERRIDE; 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPanelExpansionStateChanged(Panel* panel) OVERRIDE; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPanelActiveStateChanged(Panel* panel) OVERRIDE; 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual gfx::Rect GetInitialPanelBounds( 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const gfx::Rect& requested_bounds) const OVERRIDE; 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool HasPanel(Panel* panel) const; 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SortPanels(PanelsComparer comparer); 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int num_panels() const { return panels_.size(); } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Panels& panels() const { return panels_; } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns default top-left to use for a detached panel whose position is 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // not specified during panel creation. 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point GetDefaultPanelOrigin(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Offset the default panel top-left position by kPanelTilePixels. Wrap 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // around to initial position if position goes beyond display area. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void ComputeNextDefaultPanelOrigin(); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) struct PanelPlacement { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panel* panel; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point position; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelPlacement() : panel(NULL) { } 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelManager* panel_manager_; // Weak, owns us. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Collection of all panels. 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Panels panels_; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to save the placement information for a panel. 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PanelPlacement saved_panel_placement_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Default top-left position to use for next detached panel if position is 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // unspecified by panel creator. 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point default_panel_origin_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DetachedPanelCollection); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_UI_PANELS_DETACHED_PANEL_COLLECTION_H_ 102