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