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