docked_window_layout_manager.h revision 68043e1e95eeb07d5cae7aca370b26518b0867d6
1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2013 The Chromium Authors. All rights reserved.
27d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
37d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// found in the LICENSE file.
47d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
57d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#ifndef ASH_WM_DOCK_DOCKED_WINDOW_LAYOUT_MANAGER_H_
67d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#define ASH_WM_DOCK_DOCKED_WINDOW_LAYOUT_MANAGER_H_
77d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/ash_export.h"
97d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/shelf/shelf_layout_manager_observer.h"
107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/shell_observer.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ash/wm/dock/dock_types.h"
12d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ash/wm/workspace/snap_types.h"
137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/basictypes.h"
147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/compiler_specific.h"
15ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/gtest_prod_util.h"
16bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "base/memory/scoped_ptr.h"
17ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "base/observer_list.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/client/activation_change_observer.h"
197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/layout_manager.h"
207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/aura/window_observer.h"
21ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#include "ui/gfx/rect.h"
227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "ui/keyboard/keyboard_controller_observer.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace aura {
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class Window;
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace gfx {
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class Point;
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
32bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochnamespace views {
33bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdochclass Widget;
34bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch}
35bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace ash {
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class Launcher;
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)namespace internal {
40ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass DockedWindowLayoutManagerObserver;
41ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdochclass DockedWindowResizerTest;
427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ShelfLayoutManager;
437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// DockedWindowLayoutManager is responsible for organizing windows when they are
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// docked to the side of a screen. It is associated with a specific container
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// window (i.e. kShellWindowId_DockContainer) and controls the layout of any
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// windows added to that container.
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// The constructor takes a |dock_container| argument which is expected to set
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// its layout manager to this instance, e.g.:
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)// dock_container->SetLayoutManager(
527d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)//     new DockedWindowLayoutManager(dock_container));
533551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)//
543551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// TODO(varkha): extend BaseLayoutManager instead of LayoutManager to inherit
553551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// common functionality.
567d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class ASH_EXPORT DockedWindowLayoutManager
577d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    : public aura::LayoutManager,
587d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public ash::ShellObserver,
597d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public aura::WindowObserver,
607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public aura::client::ActivationChangeObserver,
617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public keyboard::KeyboardControllerObserver,
627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      public ash::ShelfLayoutManagerObserver {
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public:
64d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Maximum width of the docked windows area.
65d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  static const int kMaxDockWidth;
66d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  explicit DockedWindowLayoutManager(aura::Window* dock_container);
687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual ~DockedWindowLayoutManager();
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
70ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Disconnects observers before container windows get destroyed.
71ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void Shutdown();
72ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
73ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Management of the observer list.
74ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void AddObserver(DockedWindowLayoutManagerObserver* observer);
75ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void RemoveObserver(DockedWindowLayoutManagerObserver* observer);
76ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Called by a DockedWindowResizer to update which window is being dragged.
783551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Starts observing the window unless it is a child.
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void StartDragging(aura::Window* window);
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
813551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Called by a DockedWindowResizer when a dragged window is docked.
823551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void DockDraggedWindow(aura::Window* window);
833551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
843551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Called by a DockedWindowResizer when a dragged window is no longer docked.
853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void UndockDraggedWindow();
863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Called by a DockedWindowResizer when a window is no longer being dragged.
883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Stops observing the window unless it is a child.
893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void FinishDragging();
907d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ash::Launcher* launcher() { return launcher_; }
927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void SetLauncher(ash::Launcher* launcher);
937d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
943551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Calculates if a window is touching the screen edges and returns edge.
953551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  DockedAlignment GetAlignmentOfWindow(const aura::Window* window) const;
963551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
977d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Used to snap docked windows to the side of screen during drag.
98ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  DockedAlignment CalculateAlignment() const;
99ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true when a window can be docked. Windows cannot be docked at the
101d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // edge used by the launcher shelf or the edge opposite from existing dock.
102d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool CanDockWindow(aura::Window* window, SnapType edge);
103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1043551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  aura::Window* dock_container() const { return dock_container_; }
1053551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
106ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Returns current bounding rectangle of docked windows area.
107ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  const gfx::Rect& docked_bounds() const { return docked_bounds_; }
1087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1093551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns last known coordinates of |dragged_window_| after Relayout.
1103551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  const gfx::Rect dragged_bounds() const { return dragged_bounds_;}
1117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
112d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // Returns true if currently dragged window is docked at the screen edge.
113d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  bool is_dragged_window_docked() const { return is_dragged_window_docked_; }
114d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)
1157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // aura::LayoutManager:
1167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowResized() OVERRIDE;
1177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE;
118ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE {}
1197d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE;
1207d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnChildWindowVisibilityChanged(aura::Window* child,
1217d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                              bool visibile) OVERRIDE;
1227d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void SetChildBounds(aura::Window* child,
1237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                              const gfx::Rect& requested_bounds) OVERRIDE;
1247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ash::ShellObserver:
1267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnShelfAlignmentChanged(aura::RootWindow* root_window) OVERRIDE;
1277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // aura::WindowObserver:
1297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowPropertyChanged(aura::Window* window,
1307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       const void* key,
1317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                       intptr_t old) OVERRIDE;
132bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual void OnWindowBoundsChanged(aura::Window* window,
133bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                     const gfx::Rect& old_bounds,
134bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch                                     const gfx::Rect& new_bounds) OVERRIDE;
13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void OnWindowVisibilityChanging(aura::Window* window,
13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                                          bool visible) OVERRIDE;
137bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
1387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // aura::client::ActivationChangeObserver:
1407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
1417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE;
1427d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1437d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // ShelfLayoutManagerObserver:
1447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void WillChangeVisibilityState(
1457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      ShelfVisibilityState new_state) OVERRIDE;
1467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) private:
14868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowResizerTest, AttachTryDetach);
149ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(DockedWindowResizerTest, AttachTwoWindowsDetachOne);
150ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(DockedWindowResizerTest, AttachWindowMaximizeOther);
151ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(DockedWindowResizerTest, AttachOneTestSticky);
152ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(DockedWindowResizerTest, ResizeTwoWindows);
153ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  FRIEND_TEST_ALL_PREFIXES(DockedWindowResizerTest, DragToShelf);
15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest, AddOneWindow);
155d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest, AutoPlacingLeft);
156d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest, AutoPlacingRight);
157d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest,
158d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)                           AutoPlacingRightSecondScreen);
15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest, TwoWindowsWidthNew);
16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest,
16168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           TwoWindowsWidthNonResizableSecond);
16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest, ThreeWindowsDragging);
16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  FRIEND_TEST_ALL_PREFIXES(DockedWindowLayoutManagerTest,
16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)                           ThreeWindowsDraggingSecondScreen);
1657d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class DockedWindowLayoutManagerTest;
1667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  friend class DockedWindowResizerTest;
1677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
168ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Minimum width of the docked windows area.
169ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  static const int kMinDockWidth;
170ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
171ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Width of the gap between the docked windows and a workspace.
172ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  static const int kMinDockGap;
173ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Ideal (starting) width of the dock.
17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static const int kIdealWidth;
17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Keep at most kMaxVisibleWindows visible in the dock and minimize the rest
17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // (except for |child|).
17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void MaybeMinimizeChildrenExcept(aura::Window* child);
18068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Minimize / restore window and relayout.
18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void MinimizeDockedWindow(aura::Window* window);
18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void RestoreDockedWindow(aura::Window* window);
1847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
1853551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Updates docked layout state when a window gets inside the dock.
1863551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void OnWindowDocked(aura::Window* window);
1873551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1883551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Updates docked layout state when a window gets outside the dock.
1893551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  void OnWindowUndocked();
1903551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
1913551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Returns true if there are any windows currently docked.
1923551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool IsAnyWindowDocked();
193ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // Returns width that is as close as possible to |target_width| while being
19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // consistent with docked min and max restrictions and respects the |window|'s
19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // minimum and maximum size.
19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  static int GetWindowWidthCloseTo(aura::Window* window, int target_width);
19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
1997d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Called whenever the window layout might change.
2007d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void Relayout();
2017d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
202ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Updates |docked_bounds_| and workspace insets when bounds of docked windows
203ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // area change.
204ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void UpdateDockBounds();
205ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2067d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Called whenever the window stacking order needs to be updated (e.g. focus
2077d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // changes or a window is moved).
2087d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void UpdateStacking(aura::Window* active_window);
2097d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2107d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // keyboard::KeyboardControllerObserver:
2117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnKeyboardBoundsChanging(
2127d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)      const gfx::Rect& keyboard_bounds) OVERRIDE;
2137d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2147d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Parent window associated with this layout manager.
2157d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::Window* dock_container_;
2167d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Protect against recursive calls to Relayout().
2177d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool in_layout_;
2183551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2193551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // A window that is being dragged (whether docked or not).
2203551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Windows are tracked by docked layout manager only if they are docked;
2213551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // however we need to know if a window is being dragged in order to avoid
2223551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // positioning it or even considering it for layout.
2237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  aura::Window* dragged_window_;
2243551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2253551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // True if the window being dragged is currently docked.
2263551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool is_dragged_window_docked_;
2273551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2283551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Previously docked windows use a more relaxed dragging sorting algorithm
2293551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // that uses assumption that a window starts being dragged out of position
2303551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // that was previously established in Relayout. This allows easier reordering.
2313551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  bool is_dragged_from_dock_;
2323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The launcher we are observing for launcher icon changes.
2347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  Launcher* launcher_;
2357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The shelf layout manager being observed for visibility changes.
2367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  ShelfLayoutManager* shelf_layout_manager_;
2377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Tracks the visibility of the shelf. Defaults to false when there is no
2387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // shelf.
2397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  bool shelf_hidden_;
240ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Current width of the dock.
241ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int docked_width_;
242ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // How many docked windows are allowed to be shown.
24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  // TODO(varkha): Make this dynamic based on windows heights.
24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  int max_visible_windows_;
24668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
247ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Last bounds that were sent to observers.
248ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  gfx::Rect docked_bounds_;
2497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2503551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  // Target bounds of a docked window being dragged.
2513551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)  gfx::Rect dragged_bounds_;
2523551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Side of the screen that the dock is positioned at.
2547d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DockedAlignment alignment_;
2557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
256bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // The last active window. Used to maintain stacking order even if no windows
257bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  // are currently focused.
258bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch  aura::Window* last_active_window_;
259bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch
260bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Widget used to paint a background for the docked area.
261bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  scoped_ptr<views::Widget> background_widget_;
262bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch
263ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Observers of dock bounds changes.
264ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  ObserverList<DockedWindowLayoutManagerObserver> observer_list_;
265ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
2667d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(DockedWindowLayoutManager);
2677d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)};
2687d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace internal
2707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)}  // namespace ash
2717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
2727d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#endif  // ASH_WM_DOCK_DOCKED_WINDOW_LAYOUT_MANAGER_H_
273