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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef ASH_WM_BASE_LAYOUT_MANAGER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define ASH_WM_BASE_LAYOUT_MANAGER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <set>
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/ash_export.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/shell_observer.h"
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "ash/wm/window_state_observer.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/aura/client/activation_change_observer.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/layout_manager.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/aura/window_observer.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/ui_base_types.h"
19d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_handler.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace aura {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Window;
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash {
2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace wm {
2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class WindowState;
2868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}
2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BaseLayoutManager is the simplest possible implementation for a window
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// layout manager. It listens for changes to kShowStateKey and resizes the
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// window appropriately.  Subclasses should be sure to invoke the base class
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// for adding and removing windows, otherwise show state will not be tracked
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// properly.
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ASH_EXPORT BaseLayoutManager
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    : public aura::LayoutManager,
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      public aura::WindowObserver,
4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      public aura::client::ActivationChangeObserver,
4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      public ShellObserver,
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)      public wm::WindowStateObserver {
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef std::set<aura::Window*> WindowSet;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
461e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  explicit BaseLayoutManager(aura::Window* root_window);
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~BaseLayoutManager();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const WindowSet& windows() const { return windows_; }
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Given a |window| and tentative |restore_bounds|, returns new bounds that
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ensure that at least a few pixels of the screen background are visible
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // outside the edges of the window.
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static gfx::Rect BoundsWithScreenEdgeVisible(aura::Window* window,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                               const gfx::Rect& restore_bounds);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
5758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // aura::LayoutManager overrides:
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowResized() OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowAddedToLayout(aura::Window* child) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWillRemoveWindowFromLayout(aura::Window* child) OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowRemovedFromLayout(aura::Window* child) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnChildWindowVisibilityChanged(aura::Window* child,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                              bool visible) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void SetChildBounds(aura::Window* child,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const gfx::Rect& requested_bounds) OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // aura::WindowObserver overrides:
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnWindowDestroying(aura::Window* window) OVERRIDE;
697d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void OnWindowBoundsChanged(aura::Window* window,
707d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     const gfx::Rect& old_bounds,
717d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)                                     const gfx::Rect& new_bounds) OVERRIDE;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // aura::client::ActivationChangeObserver overrides:
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnWindowActivated(aura::Window* gained_active,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                 aura::Window* lost_active) OVERRIDE;
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  // ash::ShellObserver overrides:
7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual void OnDisplayWorkAreaInsetsChanged() OVERRIDE;
7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  // wm::WindowStateObserver overrides:
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void OnWindowShowTypeChanged(wm::WindowState* window_state,
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                       wm::WindowShowType type) OVERRIDE;
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
85558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  enum AdjustWindowReason {
86bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    ADJUST_WINDOW_DISPLAY_SIZE_CHANGED,
87bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch    ADJUST_WINDOW_WORK_AREA_INSETS_CHANGED,
88558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  };
89558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Invoked from OnWindowPropertyChanged() if |kShowStateKey| changes.
9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void ShowStateChanged(wm::WindowState* window_state,
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                ui::WindowShowState last_show_state);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
94bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // Adjusts the window's bounds when the display area changes for given
95bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // window. This happens when the display size, work area insets or
96bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // the display on which the window exists has changed.
97bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // If this is called for a display size change (i.e. |reason|
98bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  // is ADJUST_WINDOW_DISPLAY_SIZE_CHANGED), the non-maximized/non-fullscreen
99558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // windows are readjusted to make sure the window is completely within the
100558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // display region. Otherwise, it makes sure at least some parts of the window
101558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // is on display.
102bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch  virtual void AdjustAllWindowsBoundsForWorkAreaChange(
103bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch      AdjustWindowReason reason);
104558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
105558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // Adjusts the sizes of the specific window in respond to a screen change or
106558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch  // display-area size change.
10768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  virtual void AdjustWindowBoundsForWorkAreaChange(
10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      wm::WindowState* window_state,
10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)      AdjustWindowReason reason);
110558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1111e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window() { return root_window_; }
112558790d6acca3451cf3a6b497803a5f07d0bec58Ben Murdoch
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Update window bounds based on a change in show state.
11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  void UpdateBoundsFromShowState(wm::WindowState* controller);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set of windows we're listening to.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WindowSet windows_;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1201e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  aura::Window* root_window_;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(BaseLayoutManager);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace internal
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ash
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // ASH_WM_BASE_LAYOUT_MANAGER_H_
129