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