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