• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef CHROME_BROWSER_UI_PANELS_DOCKED_PANEL_COLLECTION_H_
6 #define CHROME_BROWSER_UI_PANELS_DOCKED_PANEL_COLLECTION_H_
7 
8 #include <list>
9 #include <set>
10 #include "base/basictypes.h"
11 #include "base/memory/weak_ptr.h"
12 #include "chrome/browser/ui/panels/display_settings_provider.h"
13 #include "chrome/browser/ui/panels/panel.h"
14 #include "chrome/browser/ui/panels/panel_collection.h"
15 #include "chrome/browser/ui/panels/panel_mouse_watcher_observer.h"
16 #include "ui/gfx/rect.h"
17 
18 class PanelManager;
19 
20 // This class manages a group of panels that could be docked to the bottom of
21 // screen.
22 class DockedPanelCollection :
23     public PanelCollection,
24     public PanelMouseWatcherObserver,
25     public DisplaySettingsProvider::DesktopBarObserver {
26  public:
27   typedef std::list<Panel*> Panels;
28 
29   explicit DockedPanelCollection(PanelManager* panel_manager);
30   virtual ~DockedPanelCollection();
31 
32   // PanelCollection OVERRIDES:
33   virtual void OnDisplayChanged() OVERRIDE;
34 
35   // Rearranges the positions of the panels in the collection
36   // and reduces their width when there is not enough room.
37   // This is called when the display space has been changed, i.e. working
38   // area being changed or a panel being closed.
39   virtual void RefreshLayout() OVERRIDE;
40 
41   // Adds a panel to the collection. The panel may be a newly created panel or
42   // one that is transitioning from another grouping of panels.
43   virtual void AddPanel(Panel* panel,
44                         PositioningMask positioning_mask) OVERRIDE;
45   virtual void RemovePanel(Panel* pane, RemovalReason reasonl) OVERRIDE;
46   virtual void CloseAll() OVERRIDE;
47   virtual void ResizePanelWindow(
48       Panel* panel,
49       const gfx::Size& preferred_window_size) OVERRIDE;
50   virtual panel::Resizability GetPanelResizability(
51       const Panel* panel) const OVERRIDE;
52   virtual void OnPanelResizedByMouse(Panel* panel,
53                                      const gfx::Rect& new_bounds) OVERRIDE;
54   virtual void OnPanelAttentionStateChanged(Panel* panel) OVERRIDE;
55   virtual void OnPanelTitlebarClicked(Panel* panel,
56                                       panel::ClickModifier modifier) OVERRIDE;
57   virtual void ActivatePanel(Panel* panel) OVERRIDE;
58   virtual void MinimizePanel(Panel* panel) OVERRIDE;
59   virtual void RestorePanel(Panel* panel) OVERRIDE;
60   virtual void OnMinimizeButtonClicked(Panel* panel,
61                                        panel::ClickModifier modifier) OVERRIDE;
62   virtual void OnRestoreButtonClicked(Panel* panel,
63                                       panel::ClickModifier modifier) OVERRIDE;
64   virtual bool CanShowMinimizeButton(const Panel* panel) const OVERRIDE;
65   virtual bool CanShowRestoreButton(const Panel* panel) const OVERRIDE;
66   virtual bool IsPanelMinimized(const Panel* panel) const OVERRIDE;
67   virtual bool UsesAlwaysOnTopPanels() const OVERRIDE;
68   virtual void SavePanelPlacement(Panel* panel) OVERRIDE;
69   virtual void RestorePanelToSavedPlacement() OVERRIDE;
70   virtual void DiscardSavedPanelPlacement() OVERRIDE;
71   virtual void UpdatePanelOnCollectionChange(Panel* panel) OVERRIDE;
72   virtual void OnPanelExpansionStateChanged(Panel* panel) OVERRIDE;
73   virtual void OnPanelActiveStateChanged(Panel* panel) OVERRIDE;
74   virtual gfx::Rect GetInitialPanelBounds(
75       const gfx::Rect& requested_bounds) const OVERRIDE;
76 
77   // Returns true if we should bring up the titlebars, given the current mouse
78   // point.
79   bool ShouldBringUpTitlebars(int mouse_x, int mouse_y) const;
80 
81   // Brings up or down the titlebars for all minimized panels.
82   void BringUpOrDownTitlebars(bool bring_up);
83 
84   // Returns the bottom position for the panel per its expansion state. If auto-
85   // hide bottom bar is present, we want to move the minimized panel to the
86   // bottom of the screen, not the bottom of the work area.
87   int GetBottomPositionForExpansionState(
88       Panel::ExpansionState expansion_state) const;
89 
90   // Returns panel width to be used, taking into account possible "squeezing"
91   // due to lack of space in the collection.
92   int WidthToDisplayPanelInCollection(bool is_for_active_panel,
93                                       double squeeze_factor,
94                                       int full_width) const;
95 
96   bool HasPanel(Panel* panel) const;
97 
98   // num_panels() and panels() only includes panels in the collection that
99   // do NOT have a temporary layout.
num_panels()100   int num_panels() const { return panels_.size(); }
panels()101   const Panels& panels() const { return panels_; }
last_panel()102   Panel* last_panel() const { return panels_.empty() ? NULL : panels_.back(); }
103 
work_area()104   gfx::Rect work_area() const { return work_area_; }
105 
106   int StartingRightPosition() const;
107 
108 #ifdef UNIT_TEST
minimized_panel_count()109   int minimized_panel_count() const {return minimized_panel_count_; }
110 #endif
111 
112  private:
113   friend class DockedPanelDragHandler;
114 
115   enum TitlebarAction {
116     NO_ACTION,
117     BRING_UP,
118     BRING_DOWN
119   };
120 
121   struct PanelPlacement {
122     Panel* panel;
123     // Used to remember the panel to the left of |panel|, if any, for use when
124     // restoring the position of |panel|.
125     Panel* left_panel;
126 
PanelPlacementPanelPlacement127     PanelPlacement() : panel(NULL), left_panel(NULL) { }
128   };
129 
130   // Overridden from PanelMouseWatcherObserver:
131   virtual void OnMouseMove(const gfx::Point& mouse_position) OVERRIDE;
132 
133   // Overridden from DisplaySettingsProvider::DesktopBarObserver:
134   virtual void OnAutoHidingDesktopBarVisibilityChanged(
135       DisplaySettingsProvider::DesktopBarAlignment alignment,
136       DisplaySettingsProvider::DesktopBarVisibility visibility) OVERRIDE;
137   virtual void OnAutoHidingDesktopBarThicknessChanged(
138       DisplaySettingsProvider::DesktopBarAlignment alignment,
139       int thickness) OVERRIDE;
140 
141   // Schedules a layout refresh with a short delay to avoid too much flicker.
142   void ScheduleLayoutRefresh();
143 
144   // Keep track of the minimized panels to control mouse watching.
145   void UpdateMinimizedPanelCount();
146 
147   // Minimizes or restores all panels in the collection.
148   void MinimizeAll();
149   void RestoreAll();
150 
151   // Makes sure the panel's bounds reflect its expansion state and the
152   // panel is aligned at the bottom of the screen. Does not touch the x
153   // coordinate.
154   void AdjustPanelBoundsPerExpansionState(Panel* panel,
155       gfx::Rect* panel_bounds);
156 
157   // Does the real job of bringing up or down the titlebars.
158   void DoBringUpOrDownTitlebars(bool bring_up);
159   // The callback for a delyed task, checks if it still need to perform
160   // the delayed action.
161   void DelayedBringUpOrDownTitlebarsCheck();
162 
163   // Compute default bounds for a panel of |full_size| that would be used
164   // when adding the panel to the collection.
165   gfx::Point GetDefaultPositionForPanel(const gfx::Size& full_size) const;
166 
167   int GetRightMostAvailablePosition() const;
168 
169   PanelManager* panel_manager_;  // Weak, owns us.
170 
171   // All panels in the collection must fit within this area.
172   gfx::Rect work_area_;
173 
174   Panels panels_;
175 
176   int minimized_panel_count_;
177   bool are_titlebars_up_;
178 
179   bool minimizing_all_;  // True while minimizing all panels.
180 
181   // Delayed transitions support. Sometimes transitions between minimized and
182   // title-only states are delayed, for better usability with Taskbars/Docks.
183   TitlebarAction delayed_titlebar_action_;
184 
185   // Used to save the placement information for a panel.
186   PanelPlacement saved_panel_placement_;
187 
188   static const int kPanelsHorizontalSpacing = 4;
189 
190   // Owned by MessageLoop after posting.
191   base::WeakPtrFactory<DockedPanelCollection> titlebar_action_factory_;
192 
193   // Owned by MessageLoop after posting.
194   base::WeakPtrFactory<DockedPanelCollection> refresh_action_factory_;
195 
196   DISALLOW_COPY_AND_ASSIGN(DockedPanelCollection);
197 };
198 
199 #endif  // CHROME_BROWSER_UI_PANELS_DOCKED_PANEL_COLLECTION_H_
200