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)
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_UI_PANELS_DOCKED_PANEL_COLLECTION_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_UI_PANELS_DOCKED_PANEL_COLLECTION_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/display_settings_provider.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/panels/panel_collection.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/panels/panel_mouse_watcher_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PanelManager;
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This class manages a group of panels that could be docked to the bottom of
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// screen.
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class DockedPanelCollection :
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public PanelCollection,
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public PanelMouseWatcherObserver,
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    public DisplaySettingsProvider::DesktopBarObserver {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::list<Panel*> Panels;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  explicit DockedPanelCollection(PanelManager* panel_manager);
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~DockedPanelCollection();
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // PanelCollection OVERRIDES:
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnDisplayChanged() OVERRIDE;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Rearranges the positions of the panels in the collection
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // and reduces their width when there is not enough room.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This is called when the display space has been changed, i.e. working
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // area being changed or a panel being closed.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RefreshLayout() OVERRIDE;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Adds a panel to the collection. The panel may be a newly created panel or
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // one that is transitioning from another grouping of panels.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void AddPanel(Panel* panel,
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        PositioningMask positioning_mask) OVERRIDE;
452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void RemovePanel(Panel* pane, RemovalReason reasonl) OVERRIDE;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CloseAll() OVERRIDE;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ResizePanelWindow(
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Panel* panel,
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const gfx::Size& preferred_window_size) OVERRIDE;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual panel::Resizability GetPanelResizability(
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const Panel* panel) const OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPanelResizedByMouse(Panel* panel,
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPanelAttentionStateChanged(Panel* panel) OVERRIDE;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPanelTitlebarClicked(Panel* panel,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                      panel::ClickModifier modifier) OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ActivatePanel(Panel* panel) OVERRIDE;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void MinimizePanel(Panel* panel) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RestorePanel(Panel* panel) OVERRIDE;
602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnMinimizeButtonClicked(Panel* panel,
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       panel::ClickModifier modifier) OVERRIDE;
622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnRestoreButtonClicked(Panel* panel,
632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      panel::ClickModifier modifier) OVERRIDE;
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanShowMinimizeButton(const Panel* panel) const OVERRIDE;
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool CanShowRestoreButton(const Panel* panel) const OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool IsPanelMinimized(const Panel* panel) const OVERRIDE;
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  virtual bool UsesAlwaysOnTopPanels() const OVERRIDE;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SavePanelPlacement(Panel* panel) OVERRIDE;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void RestorePanelToSavedPlacement() OVERRIDE;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void DiscardSavedPanelPlacement() OVERRIDE;
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void UpdatePanelOnCollectionChange(Panel* panel) OVERRIDE;
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnPanelExpansionStateChanged(Panel* panel) OVERRIDE;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPanelActiveStateChanged(Panel* panel) OVERRIDE;
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual gfx::Rect GetInitialPanelBounds(
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const gfx::Rect& requested_bounds) const OVERRIDE;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true if we should bring up the titlebars, given the current mouse
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // point.
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool ShouldBringUpTitlebars(int mouse_x, int mouse_y) const;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Brings up or down the titlebars for all minimized panels.
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void BringUpOrDownTitlebars(bool bring_up);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the bottom position for the panel per its expansion state. If auto-
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // hide bottom bar is present, we want to move the minimized panel to the
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // bottom of the screen, not the bottom of the work area.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetBottomPositionForExpansionState(
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Panel::ExpansionState expansion_state) const;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns panel width to be used, taking into account possible "squeezing"
912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // due to lack of space in the collection.
922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  int WidthToDisplayPanelInCollection(bool is_for_active_panel,
932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      double squeeze_factor,
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                      int full_width) const;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool HasPanel(Panel* panel) const;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // num_panels() and panels() only includes panels in the collection that
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // do NOT have a temporary layout.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int num_panels() const { return panels_.size(); }
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const Panels& panels() const { return panels_; }
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Panel* last_panel() const { return panels_.empty() ? NULL : panels_.back(); }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect work_area() const { return work_area_; }
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int StartingRightPosition() const;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifdef UNIT_TEST
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int minimized_panel_count() const {return minimized_panel_count_; }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class DockedPanelDragHandler;
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum TitlebarAction {
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NO_ACTION,
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BRING_UP,
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BRING_DOWN
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct PanelPlacement {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Panel* panel;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Used to remember the panel to the left of |panel|, if any, for use when
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // restoring the position of |panel|.
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Panel* left_panel;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    PanelPlacement() : panel(NULL), left_panel(NULL) { }
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from PanelMouseWatcherObserver:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnMouseMove(const gfx::Point& mouse_position) OVERRIDE;
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from DisplaySettingsProvider::DesktopBarObserver:
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnAutoHidingDesktopBarVisibilityChanged(
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DisplaySettingsProvider::DesktopBarAlignment alignment,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      DisplaySettingsProvider::DesktopBarVisibility visibility) OVERRIDE;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnAutoHidingDesktopBarThicknessChanged(
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      DisplaySettingsProvider::DesktopBarAlignment alignment,
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      int thickness) OVERRIDE;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Schedules a layout refresh with a short delay to avoid too much flicker.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ScheduleLayoutRefresh();
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keep track of the minimized panels to control mouse watching.
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateMinimizedPanelCount();
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Minimizes or restores all panels in the collection.
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MinimizeAll();
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RestoreAll();
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Makes sure the panel's bounds reflect its expansion state and the
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // panel is aligned at the bottom of the screen. Does not touch the x
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // coordinate.
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void AdjustPanelBoundsPerExpansionState(Panel* panel,
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      gfx::Rect* panel_bounds);
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Does the real job of bringing up or down the titlebars.
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DoBringUpOrDownTitlebars(bool bring_up);
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The callback for a delyed task, checks if it still need to perform
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // the delayed action.
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void DelayedBringUpOrDownTitlebarsCheck();
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
163c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Compute default bounds for a panel of |full_size| that would be used
164c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // when adding the panel to the collection.
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  gfx::Point GetDefaultPositionForPanel(const gfx::Size& full_size) const;
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int GetRightMostAvailablePosition() const;
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelManager* panel_manager_;  // Weak, owns us.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // All panels in the collection must fit within this area.
1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  gfx::Rect work_area_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Panels panels_;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int minimized_panel_count_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool are_titlebars_up_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool minimizing_all_;  // True while minimizing all panels.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delayed transitions support. Sometimes transitions between minimized and
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // title-only states are delayed, for better usability with Taskbars/Docks.
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  TitlebarAction delayed_titlebar_action_;
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Used to save the placement information for a panel.
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  PanelPlacement saved_panel_placement_;
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  static const int kPanelsHorizontalSpacing = 4;
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Owned by MessageLoop after posting.
1912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<DockedPanelCollection> titlebar_action_factory_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Owned by MessageLoop after posting.
1942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::WeakPtrFactory<DockedPanelCollection> refresh_action_factory_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DockedPanelCollection);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // CHROME_BROWSER_UI_PANELS_DOCKED_PANEL_COLLECTION_H_
200