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 ASH_WM_PANELS_PANEL_LAYOUT_MANAGER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define ASH_WM_PANELS_PANEL_LAYOUT_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <list>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h"
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "ash/display/display_controller.h"
121e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "ash/shelf/shelf_icon_observer.h"
13b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "ash/shelf/shelf_layout_manager_observer.h"
142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/shell_observer.h"
154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_state_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/weak_ptr.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/layout_manager.h"
215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "ui/aura/window_observer.h"
22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/keyboard/keyboard_controller.h"
23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "ui/keyboard/keyboard_controller_observer.h"
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "ui/wm/public/activation_change_observer.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Window;
28f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)class WindowTracker;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Widget;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class PanelCalloutWidget;
41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass Shelf;
42b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)class ShelfLayoutManager;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// PanelLayoutManager is responsible for organizing panels within the
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// workspace. It is associated with a specific container window (i.e.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// kShellWindowId_PanelContainer) and controls the layout of any windows
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// added to that container.
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The constructor takes a |panel_container| argument which is expected to set
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// its layout manager to this instance, e.g.:
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// panel_container->SetLayoutManager(new PanelLayoutManager(panel_container));
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ASH_EXPORT PanelLayoutManager
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : public aura::LayoutManager,
551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      public ShelfIconObserver,
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)      public ShellObserver,
575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      public aura::WindowObserver,
585c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      public wm::WindowStateObserver,
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public aura::client::ActivationChangeObserver,
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      public keyboard::KeyboardControllerObserver,
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      public DisplayController::Observer,
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      public ShelfLayoutManagerObserver {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit PanelLayoutManager(aura::Window* panel_container);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~PanelLayoutManager();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Call Shutdown() before deleting children of panel_container.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void Shutdown();
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void StartDragging(aura::Window* panel);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void FinishDragging();
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ToggleMinimize(aura::Window* panel);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Hide / Show the panel callout widgets.
76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  void SetShowCalloutWidgets(bool show);
77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
78d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns the callout widget (arrow) for |panel|.
79d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  views::Widget* GetCalloutWidgetForPanel(aura::Window* panel);
80d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shelf* shelf() { return shelf_; }
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  void SetShelf(Shelf* shelf);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::LayoutManager:
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowResized() OVERRIDE;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChildWindowVisibilityChanged(aura::Window* child,
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              bool visibile) OVERRIDE;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetChildBounds(aura::Window* child,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& requested_bounds) OVERRIDE;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
941e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Overridden from ShelfIconObserver
951e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnShelfIconPositionsChanged() OVERRIDE;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
971e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  // Overridden from ShellObserver
981e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  virtual void OnShelfAlignmentChanged(aura::Window* root_window) OVERRIDE;
992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Overridden from aura::WindowObserver
1015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  virtual void OnWindowPropertyChanged(aura::Window* window,
1025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       const void* key,
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                                       intptr_t old) OVERRIDE;
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // Overridden from ash::wm::WindowStateObserver
106a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  virtual void OnPostWindowStateTypeChange(
107a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      wm::WindowState* window_state,
108a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)      wm::WindowStateType old_type) OVERRIDE;
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Overridden from aura::client::ActivationChangeObserver
1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  // Overridden from DisplayController::Observer
1157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  virtual void OnDisplayConfigurationChanged() OVERRIDE;
1167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
117b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  // Overridden from ShelfLayoutManagerObserver
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void WillChangeVisibilityState(
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ShelfVisibilityState new_state) OVERRIDE;
120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class PanelLayoutManagerTest;
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class PanelWindowResizerTest;
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class DockedWindowResizerTest;
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class DockedWindowLayoutManagerTest;
1265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  friend class WorkspaceControllerTest;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  views::Widget* CreateCalloutWidget();
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  struct PanelInfo{
131c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    PanelInfo() : window(NULL), callout_widget(NULL), slide_in(false) {}
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    bool operator==(const aura::Window* other_window) const {
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      return window == other_window;
1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    }
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // A weak pointer to the panel window.
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    aura::Window* window;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // The callout widget for this panel. This pointer must be managed
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // manually as this structure is used in a std::list. See
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    // http://www.chromium.org/developers/smart-pointer-guidelines
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    PanelCalloutWidget* callout_widget;
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // True on new and restored panel windows until the panel has been
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // positioned. The first time Relayout is called the panel will be shown,
1465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    // and slide into position and this will be set to false.
147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    bool slide_in;
1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  };
1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  typedef std::list<PanelInfo> PanelList;
1512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MinimizePanel(aura::Window* panel);
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void RestorePanel(aura::Window* panel);
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called whenever the panel layout might change.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void Relayout();
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called whenever the panel stacking order needs to be updated (e.g. focus
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // changes or a panel is moved).
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void UpdateStacking(aura::Window* active_panel);
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Update the callout arrows for all managed panels.
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void UpdateCallouts();
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Overridden from keyboard::KeyboardControllerObserver:
166c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnKeyboardBoundsChanging(
167c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      const gfx::Rect& keyboard_bounds) OVERRIDE;
168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Parent window associated with this layout manager.
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* panel_container_;
171eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Protect against recursive calls to OnWindowAddedToLayout().
172eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool in_add_window_;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Protect against recursive calls to Relayout().
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool in_layout_;
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Indicates if the panel callout widget should be created.
176f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  bool show_callout_widgets_;
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ordered list of unowned pointers to panel windows.
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PanelList panel_windows_;
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The panel being dragged.
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* dragged_panel_;
1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // The shelf we are observing for shelf icon changes.
1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Shelf* shelf_;
183c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // The shelf layout manager being observed for visibility changes.
184c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ShelfLayoutManager* shelf_layout_manager_;
185f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
186f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // When not NULL, the shelf is hidden (i.e. full screen) and this tracks the
187f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // set of panel windows which have been temporarily hidden and need to be
188f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  // restored when the shelf becomes visible again.
189f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  scoped_ptr<aura::WindowTracker> restore_windows_on_shelf_visible_;
190f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // The last active panel. Used to maintain stacking order even if no panels
192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // are currently focused.
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  aura::Window* last_active_panel_;
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::WeakPtrFactory<PanelLayoutManager> weak_factory_;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(PanelLayoutManager);
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif  // ASH_WM_PANELS_PANEL_LAYOUT_MANAGER_H_
202