1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef ASH_WM_WINDOW_POSITIONER_H_
6#define ASH_WM_WINDOW_POSITIONER_H_
7
8#include "ash/ash_export.h"
9#include "base/basictypes.h"
10#include "ui/base/ui_base_types.h"
11#include "ui/gfx/rect.h"
12
13namespace aura {
14class Window;
15class RootWindow;
16}
17
18namespace gfx {
19class Display;
20class Rect;
21class Screen;
22}
23
24namespace ash {
25
26namespace test {
27class WindowPositionerTest;
28}
29
30// WindowPositioner is used by the browser to move new popups automatically to
31// a usable position on the closest work area (of the active window).
32class ASH_EXPORT WindowPositioner {
33 public:
34  // When the screen resolution width is smaller then this size, The algorithm
35  // will default to maximized.
36  static int GetForceMaximizedWidthLimit();
37
38  // The number of pixels which are kept free top, left and right when a window
39  // gets positioned to its default location.
40  static const int kDesktopBorderSize;
41
42  // Maximum width of a window even if there is more room on the desktop.
43  static const int kMaximumWindowWidth;
44
45  // Computes and returns the bounds and show state for new window
46  // based on the parameter passed AND existing windows. |window| is
47  // the one this function will generate a bounds for and used to
48  // exclude the self window in making decision how to position the
49  // window. |window| can be (and in most case) NULL.
50  // |is_saved_bounds| indicates the |bounds_in_out| is the saved
51  // bounds.
52  static void GetBoundsAndShowStateForNewWindow(
53      const gfx::Screen* screen,
54      const aura::Window* new_window,
55      bool is_saved_bounds,
56      ui::WindowShowState show_state_in,
57      gfx::Rect* bounds_in_out,
58      ui::WindowShowState* show_state_out);
59
60  // Returns the default bounds for a window to be created in the |display|.
61  static gfx::Rect GetDefaultWindowBounds(const gfx::Display& display);
62
63  // Check if after removal or hide of the given |removed_window| an
64  // automated desktop location management can be performed and
65  // rearrange accordingly.
66  static void RearrangeVisibleWindowOnHideOrRemove(
67      const aura::Window* removed_window);
68
69  // Turn the automatic positioning logic temporarily off. Returns the previous
70  // state.
71  static bool DisableAutoPositioning(bool ignore);
72
73  // Check if after insertion or showing of the given |added_window|
74  // an automated desktop location management can be performed and
75  // rearrange accordingly.
76  static void RearrangeVisibleWindowOnShow(aura::Window* added_window);
77
78  WindowPositioner();
79  ~WindowPositioner();
80
81  // Find a suitable screen position for a popup window and return it. The
82  // passed input position is only used to retrieve the width and height.
83  // The position is determined on the left / right / top / bottom first. If
84  // no smart space is found, the position will follow the standard what other
85  // operating systems do (default cascading style).
86  gfx::Rect GetPopupPosition(const gfx::Rect& old_pos);
87
88  // Accessor to set a flag indicating whether the first window in ASH should
89  // be maximized.
90  static void SetMaximizeFirstWindow(bool maximize);
91
92 protected:
93  friend class test::WindowPositionerTest;
94
95  // Find a smart way to position the popup window. If there is no space this
96  // function will return an empty rectangle.
97  gfx::Rect SmartPopupPosition(const gfx::Rect& old_pos,
98                               const gfx::Rect& work_area,
99                               int grid);
100
101  // Find the next available cascading popup position (on the given screen).
102  gfx::Rect NormalPopupPosition(const gfx::Rect& old_pos,
103                                const gfx::Rect& work_area);
104
105  // Align the location to the grid / snap to the right / bottom corner.
106  gfx::Rect AlignPopupPosition(const gfx::Rect &pos,
107                               const gfx::Rect &work_area,
108                               int grid);
109
110  // Constant exposed for unittest.
111  static const int kMinimumWindowOffset;
112
113  // The offset in X and Y for the next popup which opens.
114  int pop_position_offset_increment_x;
115  int pop_position_offset_increment_y;
116
117  // The position on the screen for the first popup which gets shown if no
118  // empty space can be found.
119  int popup_position_offset_from_screen_corner_x;
120  int popup_position_offset_from_screen_corner_y;
121
122  // The last used position.
123  int last_popup_position_x_;
124  int last_popup_position_y_;
125
126  DISALLOW_COPY_AND_ASSIGN(WindowPositioner);
127};
128
129}  // namespace ash
130
131#endif  // ASH_WM_WINDOW_POSITIONER_H_
132