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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/display_settings_provider.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/panel_collection.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_constants.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DetachedPanelCollection;
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DockedPanelCollection;
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelDragController;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelResizeController;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelMouseWatcher;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class StackedPanelCollection;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class manages a set of panels.
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PanelManager : public DisplaySettingsProvider::DisplayObserver,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     public DisplaySettingsProvider::FullScreenObserver {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::list<StackedPanelCollection*> Stacks;
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum CreateMode {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE_AS_DOCKED,  // Creates a docked panel. The default.
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    CREATE_AS_DETACHED  // Creates a detached panel.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a single instance.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static PanelManager* GetInstance();
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Tells PanelManager to use |provider| for testing purpose. This has to be
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // called before GetInstance.
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static void SetDisplaySettingsProviderForTesting(
442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DisplaySettingsProvider* provider);
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if panels should be used for the extension.
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool ShouldUsePanels(const std::string& extension_id);
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if panel stacking support is enabled.
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  static bool IsPanelStackingEnabled();
512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
52a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Returns true if a panel can be system-minimized by the desktop
53a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // environment. Some desktop environment, like Unity, does not trigger the
54a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // "window-state-event" which prevents the minimize and unminimize from
55a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // working.
56a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  static bool CanUseSystemMinimize();
57a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the default top-left position for a detached panel.
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Point GetDefaultDetachedPanelOrigin();
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a panel and returns it. The panel might be queued for display
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // later.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |app_name| is the default title for Panels when the page content does not
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // provide a title. For extensions, this is usually the application name
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // generated from the extension id.
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |requested_bounds| is the desired bounds for the panel, but actual
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bounds may differ after panel layout depending on create |mode|.
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |mode| indicates whether panel should be created as docked or detached.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Panel* CreatePanel(const std::string& app_name,
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     Profile* profile,
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const GURL& url,
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const gfx::Rect& requested_bounds,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     CreateMode mode);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Close all panels (asynchronous). Panels will be removed after closing.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void CloseAll();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Asynchronous confirmation of panel having been closed.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPanelClosed(Panel* panel);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Creates a StackedPanelCollection and returns it.
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  StackedPanelCollection* CreateStack();
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Deletes |stack|. The stack must be empty at the time of deletion.
852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RemoveStack(StackedPanelCollection* stack);
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum size that panel can be auto-resized or resized by the
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // API.
892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetMaxPanelWidth(const gfx::Rect& work_area) const;
902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int GetMaxPanelHeight(const gfx::Rect& work_area) const;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Drags the given panel.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |mouse_location| is in screen coordinate system.
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartDragging(Panel* panel, const gfx::Point& mouse_location);
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Drag(const gfx::Point& mouse_location);
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndDragging(bool cancelled);
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Resizes the given panel.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |mouse_location| is in screen coordinate system.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartResizingByMouse(Panel* panel, const gfx::Point& mouse_location,
101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                            int component);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ResizeByMouse(const gfx::Point& mouse_location);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void EndResizingByMouse(bool cancelled);
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked when a panel's expansion state changes.
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPanelExpansionStateChanged(Panel* panel);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Moves the |panel| to a different collection.
1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MovePanelToCollection(Panel* panel,
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             PanelCollection* target_collection,
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                             PanelCollection::PositioningMask positioning_mask);
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we should bring up the titlebars, given the current mouse
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldBringUpTitlebars(int mouse_x, int mouse_y) const;
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Brings up or down the titlebars for all minimized panels.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BringUpOrDownTitlebars(bool bring_up);
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<Panel*> GetDetachedAndStackedPanels() const;
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_panels() const;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<Panel*> panels() const;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const Stacks& stacks() const { return stacks_; }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int num_stacks() const { return stacks_.size(); }
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelDragController* drag_controller() const {
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return drag_controller_.get();
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef UNIT_TEST
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelResizeController* resize_controller() const {
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return resize_controller_.get();
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DisplaySettingsProvider* display_settings_provider() const {
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return display_settings_provider_.get();
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelMouseWatcher* mouse_watcher() const {
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return panel_mouse_watcher_.get();
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DetachedPanelCollection* detached_collection() const {
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return detached_collection_.get();
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DockedPanelCollection* docked_collection() const {
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return docked_collection_.get();
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Reduces time interval in tests to shorten test run time.
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Wrapper should be used around all time intervals in panels code.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static inline double AdjustTimeInterval(double interval) {
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (shorten_time_intervals_)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return interval / 500.0;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return interval;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool auto_sizing_enabled() const {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return auto_sizing_enabled_;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called from native level when panel animation ends.
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnPanelAnimationEnded(Panel* panel);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef UNIT_TEST
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void shorten_time_intervals_for_testing() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shorten_time_intervals_ = true;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void set_display_settings_provider(
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DisplaySettingsProvider* display_settings_provider) {
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    display_settings_provider_.reset(display_settings_provider);
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void enable_auto_sizing(bool enabled) {
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    auto_sizing_enabled_ = enabled;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetMouseWatcherForTesting(PanelMouseWatcher* watcher) {
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    SetMouseWatcher(watcher);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct base::DefaultLazyInstanceTraits<PanelManager>;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelManager();
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PanelManager();
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Initialize(DisplaySettingsProvider* provider);
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Overridden from DisplaySettingsProvider::DisplayObserver:
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayChanged() OVERRIDE;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from DisplaySettingsProvider::FullScreenObserver:
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnFullScreenModeChanged(bool is_full_screen) OVERRIDE;
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns the collection to which a new panel should add. The new panel
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // is expected to be created with |bounds| and |mode|. The size of |bounds|
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // could be used to determine which collection is more appropriate to have
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // the new panel. Upon return, |positioning_mask| contains the required mask
2082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // to be applied when the new panel is being added to the collection.
2092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PanelCollection* GetCollectionForNewPanel(
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      Panel* new_panel,
2112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      const gfx::Rect& bounds,
2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      CreateMode mode,
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      PanelCollection::PositioningMask* positioning_mask);
2142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests may want to use a mock panel mouse watcher.
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void SetMouseWatcher(PanelMouseWatcher* watcher);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tests may want to shorten time intervals to reduce running time.
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool shorten_time_intervals_;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DetachedPanelCollection> detached_collection_;
2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<DockedPanelCollection> docked_collection_;
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  Stacks stacks_;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PanelDragController> drag_controller_;
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PanelResizeController> resize_controller_;
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Use a mouse watcher to know when to bring up titlebars to "peek" at
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // minimized panels. Mouse movement is only tracked when there is a minimized
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // panel.
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<PanelMouseWatcher> panel_mouse_watcher_;
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<DisplaySettingsProvider> display_settings_provider_;
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Whether or not bounds will be updated when the preferred content size is
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changed. The testing code could set this flag to false so that other tests
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will not be affected.
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool auto_sizing_enabled_;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PanelManager);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_PANELS_PANEL_MANAGER_H_
244