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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
|
// Copyright 2008, Google Inc.
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#ifndef CHROME_VIEWS_WINDOW_H__
#define CHROME_VIEWS_WINDOW_H__
#include "chrome/views/hwnd_view_container.h"
namespace gfx {
class Size;
class Path;
class Point;
};
class PrefService;
namespace ChromeViews {
class ClientView;
class Client;
class WindowDelegate;
////////////////////////////////////////////////////////////////////////////////
//
// Window
//
// A Window is a HWNDViewContainer that has a caption and a border. The frame
// is rendered by the operating system.
//
////////////////////////////////////////////////////////////////////////////////
class Window : public HWNDViewContainer {
public:
// TODO(beng): (Cleanup) move these into private section, effectively making
// this class "final" to all but designated friends within
// ChromeViews. Users in browser/ should always construct with
// CreateChromeWindow which will give the right version,
// depending on platform & configuration.
Window();
virtual ~Window();
// Creates the appropriate Window class for a Chrome dialog or window. This
// means a ChromeWindow or a standard Windows frame.
static Window* CreateChromeWindow(HWND parent,
const gfx::Rect& bounds,
View* contents_view,
WindowDelegate* window_delegate);
// Create the Window.
// If parent is NULL, this Window is top level on the desktop.
// |contents_view| is a ChromeView that will be displayed in the client area
// of the Window, as the sole child view of the RootView.
// |window_delegate| is an object implementing WindowDelegate that can perform
// controller-like tasks for this window, such as obtaining its preferred
// placement and state from preferences (which override the default position
// and size specified in |bounds|) and executing commands. Can be NULL.
// If |bounds| is empty, the view is queried for its preferred size and
// centered on screen.
void Init(HWND parent,
const gfx::Rect& bounds,
View* contents_view,
WindowDelegate* window_delegate);
// Return the size of window (including non-client area) required to contain
// a window of the specified client size.
virtual gfx::Size CalculateWindowSizeForClientSize(
const gfx::Size& client_size) const;
// Return the maximum size possible size the window should be have if it is
// to be positioned within the bounds of the current "work area" (screen or
// parent window).
gfx::Size CalculateMaximumSize() const;
// Show the window.
virtual void Show();
// Activate the window, assuming it already exists and is visible.
void Activate();
// Sizes and/or places the window to the specified bounds, size or position.
void SetBounds(const gfx::Rect& bounds);
// As above, except the window is inserted after |other_hwnd| in the window
// Z-order. If this window's HWND is not yet visible, other_hwnd's monitor
// is used as the constraining rectangle, rather than this window's hwnd's
// monitor.
void SetBounds(const gfx::Rect& bounds, HWND other_hwnd);
// Closes the window, ultimately destroying it.
virtual void Close();
// Whether or not the window is maximized or minimized.
bool IsMaximized() const;
bool IsMinimized() const;
// Toggles the enable state for the Close button (and the Close menu item in
// the system menu).
virtual void EnableClose(bool enable);
WindowDelegate* window_delegate() const { return window_delegate_; }
void set_window_delegate(WindowDelegate* delegate) {
window_delegate_ = delegate;
}
// Set whether or not we should insert a client view. See comment below.
void set_use_client_view(bool use_client_view) {
use_client_view_ = use_client_view;
}
void set_focus_on_creation(bool focus_on_creation) {
focus_on_creation_ = focus_on_creation;
}
// Updates the enabled state and label of the dialog buttons visible in this
// window.
void UpdateDialogButtons();
// Called when the window should be canceled or accepted, if it is a dialog
// box.
void AcceptWindow();
void CancelWindow();
// Tell the window to update its title from the delegate.
virtual void UpdateWindowTitle();
// The parent of this window.
HWND owning_window() const {
return owning_hwnd_;
}
// Convenience methods for storing/retrieving window location information
// to/from a PrefService using the specified |entry| name.
// WindowDelegate instances can use these methods in their implementation of
// SaveWindowPosition/RestoreWindowPosition to save windows' location to
// preferences.
static bool SaveWindowPositionToPrefService(PrefService* pref_service,
const std::wstring& entry,
const CRect& bounds,
bool maximized,
bool always_on_top);
// Returns true if the window location was retrieved from the PrefService and
// set in |bounds|, |maximized| and |always_on_top|.
static bool RestoreWindowPositionFromPrefService(PrefService* pref_service,
const std::wstring& entry,
CRect* bounds,
bool* maximized,
bool* always_on_top);
// Returns the preferred size of the contents view of this window based on
// its localized size data. The width in cols is held in a localized string
// resource identified by |col_resource_id|, the height in the same fashion.
// TODO(beng): This should eventually live somewhere else, probably closer to
// ClientView.
static gfx::Size GetLocalizedContentsSize(int col_resource_id,
int row_resource_id);
protected:
virtual void SizeWindowToDefault();
// Sets-up the focus manager with the view that should have focus when the
// window is shown the first time. If NULL is returned, the focus goes to the
// button if there is one, otherwise the to the Cancel button.
void SetInitialFocus();
// Overridden from HWNDViewContainer:
virtual void OnActivate(UINT action, BOOL minimized, HWND window);
virtual void OnCommand(UINT notification_code, int command_id, HWND window);
virtual void OnDestroy();
virtual LRESULT OnEraseBkgnd(HDC dc);
virtual LRESULT OnNCHitTest(const CPoint& point);
virtual LRESULT OnSetCursor(HWND window, UINT hittest_code, UINT message);
virtual void OnSize(UINT size_param, const CSize& new_size);
virtual void OnSysCommand(UINT notification_code, CPoint click);
// The client view object that contains the client area of the window,
// including optional dialog buttons.
ClientView* client_view_;
// Our window delegate (see Init method for documentation).
WindowDelegate* window_delegate_;
private:
// Set the window as modal (by disabling all the other windows).
void BecomeModal();
// Add an item for "Always on Top" to the System Menu.
void AddAlwaysOnTopSystemMenuItem();
// If necessary, enables all ancestors.
void RestoreEnabledIfNecessary();
// Update the window style to reflect the always on top state.
void AlwaysOnTopChanged();
// Calculate the appropriate window styles for this window.
DWORD CalculateWindowStyle();
DWORD CalculateWindowExStyle();
// Asks the delegate if any to save the window's location and size.
void SaveWindowPosition();
// Static resource initialization.
static void InitClass();
static HCURSOR nwse_cursor_;
// Whether we should SetFocus() on a newly created window after
// Init(). Defaults to true.
bool focus_on_creation_;
// We need to save the parent window that spawned us, since GetParent()
// returns NULL for dialogs.
HWND owning_hwnd_;
// The smallest size the window can be.
CSize minimum_size_;
// Whether or not the window is modal. This comes from the delegate and is
// cached at Init time to avoid calling back to the delegate from the
// destructor.
bool is_modal_;
// Whether all ancestors have been enabled. This is only used if is_modal_ is
// true.
bool restored_enabled_;
// Whether the window is currently always on top.
bool is_always_on_top_;
// We need to own the text of the menu, the Windows API does not copy it.
std::wstring always_on_top_menu_text_;
// Whether or not the client view should be inserted into the Window's view
// hierarchy.
// TODO(beng): (Cleanup) This is probably a short term measure until I figure
// out a way to make other Window subclasses (e.g.
// ConstrainedWindowImpl) and their users jive with the new
// dialog framework.
bool use_client_view_;
// True if the window was Accepted by the user using the OK button.
bool accepted_;
// Set to true if the window is in the process of closing .
bool window_closed_;
DISALLOW_EVIL_CONSTRUCTORS(Window);
};
}
#endif // CHROME_VIEWS_WINDOW_H__
|