1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef ASH_WM_WINDOW_RESIZER_H_
#define ASH_WM_WINDOW_RESIZER_H_
#include "ash/ash_export.h"
#include "base/basictypes.h"
#include "ui/gfx/rect.h"
namespace aura {
class Window;
}
namespace ash {
// WindowResizer is used by ToplevelWindowEventFilter to handle dragging, moving
// or resizing a window. All coordinates passed to this are in the parent
// windows coordinates.
class ASH_EXPORT WindowResizer {
public:
// Constants to identify the type of resize.
static const int kBoundsChange_None;
static const int kBoundsChange_Repositions;
static const int kBoundsChange_Resizes;
// Used to indicate which direction the resize occurs in.
static const int kBoundsChangeDirection_None;
static const int kBoundsChangeDirection_Horizontal;
static const int kBoundsChangeDirection_Vertical;
WindowResizer();
virtual ~WindowResizer();
// Returns a bitmask of the kBoundsChange_ values.
static int GetBoundsChangeForWindowComponent(int component);
// Returns a location >= |location| that is aligned to fall on increments of
// |grid_size|.
static int AlignToGrid(int location, int grid_size);
// Variant of AlignToGrid that rounds up.
static int AlignToGridRoundUp(int location, int grid_size);
// Variant of AlignToGrid that rounds down.
static int AlignToGridRoundDown(int location, int grid_size);
// Invoked to drag/move/resize the window. |location| is in the coordinates
// of the window supplied to the constructor. |event_flags| is the event
// flags from the event.
virtual void Drag(const gfx::Point& location, int event_flags) = 0;
// Invoked to complete the drag.
virtual void CompleteDrag(int event_flags) = 0;
// Reverts the drag.
virtual void RevertDrag() = 0;
protected:
struct Details {
Details();
Details(aura::Window* window,
const gfx::Point& location,
int window_component);
~Details();
// The window we're resizing.
aura::Window* window;
// Initial bounds of the window.
gfx::Rect initial_bounds;
// Location passed to the constructor, in |window->parent()|'s coordinates.
gfx::Point initial_location_in_parent;
// Initial opacity of the window.
float initial_opacity;
// The component the user pressed on.
int window_component;
// Bitmask of the |kBoundsChange_| constants.
int bounds_change;
// Bitmask of the |kBoundsChangeDirection_| constants.
int position_change_direction;
// Bitmask of the |kBoundsChangeDirection_| constants.
int size_change_direction;
// Will the drag actually modify the window?
bool is_resizable;
};
static gfx::Rect CalculateBoundsForDrag(
const Details& details,
const gfx::Point& location,
int grid_size);
static gfx::Rect AdjustBoundsToGrid(const gfx::Rect& bounds,
int grid_size);
static bool IsBottomEdge(int component);
private:
// Returns the new origin of the window. The arguments are the difference
// between the current location and the initial location.
static gfx::Point GetOriginForDrag(const Details& details,
int delta_x,
int delta_y);
// Returns the size of the window for the drag.
static gfx::Size GetSizeForDrag(const Details& details,
int* delta_x,
int* delta_y,
int grid_size);
// Returns the width of the window.
static int GetWidthForDrag(const Details& details,
int min_width,
int* delta_x,
int grid_size);
// Returns the height of the drag.
static int GetHeightForDrag(const Details& details,
int min_height,
int* delta_y,
int grid_size);
};
} // namespace aura
#endif // ASH_WM_WINDOW_RESIZER_H_
|