Add a minor text member to ui::MenuModel.
[chromium-blink-merge.git] / chrome / browser / ui / panels / panel_manager.h
blobb131e954f878c8596703126d7ee74098585559b3
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.
5 #ifndef CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
6 #define CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
8 #include <list>
9 #include <vector>
10 #include "base/basictypes.h"
11 #include "base/lazy_instance.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "chrome/browser/ui/panels/display_settings_provider.h"
14 #include "chrome/browser/ui/panels/panel.h"
15 #include "chrome/browser/ui/panels/panel_collection.h"
16 #include "chrome/browser/ui/panels/panel_constants.h"
17 #include "ui/gfx/rect.h"
19 class DetachedPanelCollection;
20 class DockedPanelCollection;
21 class GURL;
22 class PanelDragController;
23 class PanelResizeController;
24 class PanelMouseWatcher;
25 class StackedPanelCollection;
27 // This class manages a set of panels.
28 class PanelManager : public DisplaySettingsProvider::DisplayObserver,
29 public DisplaySettingsProvider::FullScreenObserver {
30 public:
31 typedef std::list<StackedPanelCollection*> Stacks;
33 enum CreateMode {
34 CREATE_AS_DOCKED, // Creates a docked panel. The default.
35 CREATE_AS_DETACHED // Creates a detached panel.
38 // Returns a single instance.
39 static PanelManager* GetInstance();
41 // Tells PanelManager to use |provider| for testing purpose. This has to be
42 // called before GetInstance.
43 static void SetDisplaySettingsProviderForTesting(
44 DisplaySettingsProvider* provider);
46 // Returns true if panels should be used for the extension.
47 static bool ShouldUsePanels(const std::string& extension_id);
49 // Returns true if panel stacking support is enabled.
50 static bool IsPanelStackingEnabled();
52 // Returns true if a panel can be system-minimized by the desktop
53 // environment. Some desktop environment, like Unity, does not trigger the
54 // "window-state-event" which prevents the minimize and unminimize from
55 // working.
56 static bool CanUseSystemMinimize();
58 // Returns the default top-left position for a detached panel.
59 gfx::Point GetDefaultDetachedPanelOrigin();
61 // Creates a panel and returns it. The panel might be queued for display
62 // later.
63 // |app_name| is the default title for Panels when the page content does not
64 // provide a title. For extensions, this is usually the application name
65 // generated from the extension id.
66 // |requested_bounds| is the desired bounds for the panel, but actual
67 // bounds may differ after panel layout depending on create |mode|.
68 // |mode| indicates whether panel should be created as docked or detached.
69 Panel* CreatePanel(const std::string& app_name,
70 Profile* profile,
71 const GURL& url,
72 const gfx::Rect& requested_bounds,
73 CreateMode mode);
75 // Close all panels (asynchronous). Panels will be removed after closing.
76 void CloseAll();
78 // Asynchronous confirmation of panel having been closed.
79 void OnPanelClosed(Panel* panel);
81 // Creates a StackedPanelCollection and returns it.
82 StackedPanelCollection* CreateStack();
84 // Deletes |stack|. The stack must be empty at the time of deletion.
85 void RemoveStack(StackedPanelCollection* stack);
87 // Returns the maximum size that panel can be auto-resized or resized by the
88 // API.
89 int GetMaxPanelWidth(const gfx::Rect& work_area) const;
90 int GetMaxPanelHeight(const gfx::Rect& work_area) const;
92 // Drags the given panel.
93 // |mouse_location| is in screen coordinate system.
94 void StartDragging(Panel* panel, const gfx::Point& mouse_location);
95 void Drag(const gfx::Point& mouse_location);
96 void EndDragging(bool cancelled);
98 // Resizes the given panel.
99 // |mouse_location| is in screen coordinate system.
100 void StartResizingByMouse(Panel* panel, const gfx::Point& mouse_location,
101 panel::ResizingSides sides);
102 void ResizeByMouse(const gfx::Point& mouse_location);
103 void EndResizingByMouse(bool cancelled);
105 // Invoked when a panel's expansion state changes.
106 void OnPanelExpansionStateChanged(Panel* panel);
108 // Moves the |panel| to a different collection.
109 void MovePanelToCollection(Panel* panel,
110 PanelCollection* target_collection,
111 PanelCollection::PositioningMask positioning_mask);
113 // Returns true if we should bring up the titlebars, given the current mouse
114 // point.
115 bool ShouldBringUpTitlebars(int mouse_x, int mouse_y) const;
117 // Brings up or down the titlebars for all minimized panels.
118 void BringUpOrDownTitlebars(bool bring_up);
120 std::vector<Panel*> GetDetachedAndStackedPanels() const;
122 int num_panels() const;
123 std::vector<Panel*> panels() const;
125 const Stacks& stacks() const { return stacks_; }
126 int num_stacks() const { return stacks_.size(); }
128 PanelDragController* drag_controller() const {
129 return drag_controller_.get();
132 #ifdef UNIT_TEST
133 PanelResizeController* resize_controller() const {
134 return resize_controller_.get();
136 #endif
138 DisplaySettingsProvider* display_settings_provider() const {
139 return display_settings_provider_.get();
142 PanelMouseWatcher* mouse_watcher() const {
143 return panel_mouse_watcher_.get();
146 DetachedPanelCollection* detached_collection() const {
147 return detached_collection_.get();
150 DockedPanelCollection* docked_collection() const {
151 return docked_collection_.get();
154 // Reduces time interval in tests to shorten test run time.
155 // Wrapper should be used around all time intervals in panels code.
156 static inline double AdjustTimeInterval(double interval) {
157 if (shorten_time_intervals_)
158 return interval / 500.0;
159 else
160 return interval;
164 bool auto_sizing_enabled() const {
165 return auto_sizing_enabled_;
168 // Called from native level when panel animation ends.
169 void OnPanelAnimationEnded(Panel* panel);
171 #ifdef UNIT_TEST
172 static void shorten_time_intervals_for_testing() {
173 shorten_time_intervals_ = true;
176 void set_display_settings_provider(
177 DisplaySettingsProvider* display_settings_provider) {
178 display_settings_provider_.reset(display_settings_provider);
181 void enable_auto_sizing(bool enabled) {
182 auto_sizing_enabled_ = enabled;
185 void SetMouseWatcherForTesting(PanelMouseWatcher* watcher) {
186 SetMouseWatcher(watcher);
188 #endif
190 private:
191 friend struct base::DefaultLazyInstanceTraits<PanelManager>;
193 PanelManager();
194 virtual ~PanelManager();
196 void Initialize(DisplaySettingsProvider* provider);
198 // Overridden from DisplaySettingsProvider::DisplayObserver:
199 virtual void OnDisplayChanged() OVERRIDE;
201 // Overridden from DisplaySettingsProvider::FullScreenObserver:
202 virtual void OnFullScreenModeChanged(bool is_full_screen) OVERRIDE;
204 // Returns the collection to which a new panel should add. The new panel
205 // is expected to be created with |bounds| and |mode|. The size of |bounds|
206 // could be used to determine which collection is more appropriate to have
207 // the new panel. Upon return, |positioning_mask| contains the required mask
208 // to be applied when the new panel is being added to the collection.
209 PanelCollection* GetCollectionForNewPanel(
210 Panel* new_panel,
211 const gfx::Rect& bounds,
212 CreateMode mode,
213 PanelCollection::PositioningMask* positioning_mask);
215 // Tests may want to use a mock panel mouse watcher.
216 void SetMouseWatcher(PanelMouseWatcher* watcher);
218 // Tests may want to shorten time intervals to reduce running time.
219 static bool shorten_time_intervals_;
221 scoped_ptr<DetachedPanelCollection> detached_collection_;
222 scoped_ptr<DockedPanelCollection> docked_collection_;
223 Stacks stacks_;
225 scoped_ptr<PanelDragController> drag_controller_;
226 scoped_ptr<PanelResizeController> resize_controller_;
228 // Use a mouse watcher to know when to bring up titlebars to "peek" at
229 // minimized panels. Mouse movement is only tracked when there is a minimized
230 // panel.
231 scoped_ptr<PanelMouseWatcher> panel_mouse_watcher_;
233 scoped_ptr<DisplaySettingsProvider> display_settings_provider_;
235 // Whether or not bounds will be updated when the preferred content size is
236 // changed. The testing code could set this flag to false so that other tests
237 // will not be affected.
238 bool auto_sizing_enabled_;
240 DISALLOW_COPY_AND_ASSIGN(PanelManager);
243 #endif // CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_