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