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
|
// Copyright (c) 2006-2008 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 VIEWS_WIDGET_WIDGET_H_
#define VIEWS_WIDGET_WIDGET_H_
#pragma once
#include <vector>
#include "gfx/native_widget_types.h"
class ThemeProvider;
namespace gfx {
class Path;
class Point;
class Rect;
}
namespace menus {
class Accelerator;
}
namespace views {
class FocusManager;
class RootView;
class TooltipManager;
class View;
class WidgetDelegate;
class Window;
////////////////////////////////////////////////////////////////////////////////
//
// Widget interface
//
// Widget is an abstract class that defines the API that should be implemented
// by a native window in order to host a view hierarchy.
//
// Widget wraps a hierarchy of View objects (see view.h) that implement
// painting and flexible layout within the bounds of the Widget's window.
//
// The Widget is responsible for handling various system events and forwarding
// them to the appropriate view.
//
/////////////////////////////////////////////////////////////////////////////
class Widget {
public:
virtual ~Widget() { }
enum TransparencyParam {
Transparent,
NotTransparent
};
enum EventsParam {
AcceptEvents,
NotAcceptEvents
};
enum DeleteParam {
DeleteOnDestroy,
NotDeleteOnDestroy
};
enum MirroringParam {
MirrorOriginInRTL,
DontMirrorOriginInRTL
};
// Creates a transient popup widget specific to the current platform.
// If |mirror_in_rtl| is set to MirrorOriginInRTL, the contents of the
// popup will be mirrored if the current locale is RTL. You should use
// DontMirrorOriginInRTL if you are aleady handling the RTL layout within
// the widget.
static Widget* CreatePopupWidget(TransparencyParam transparent,
EventsParam accept_events,
DeleteParam delete_on_destroy,
MirroringParam mirror_in_rtl);
// Returns the root view for |native_window|. If |native_window| does not have
// a rootview, this recurses through all of |native_window|'s children until
// one is found. If a root view isn't found, null is returned.
static RootView* FindRootView(gfx::NativeWindow native_window);
// Returns list of all root views for the native window and its
// children.
static void FindAllRootViews(gfx::NativeWindow native_window,
std::vector<RootView*>* root_views);
// Retrieve the Widget corresponding to the specified native_view, or NULL
// if there is no such Widget.
static Widget* GetWidgetFromNativeView(gfx::NativeView native_view);
static Widget* GetWidgetFromNativeWindow(gfx::NativeWindow native_window);
// Enumerates all windows pertaining to us and notifies their
// view hierarchies that the locale has changed.
static void NotifyLocaleChanged();
// Initialize the Widget with a parent and an initial desired size.
// |contents_view| is the view that will be the single child of RootView
// within this Widget. As contents_view is inserted into RootView's tree,
// RootView assumes ownership of this view and cleaning it up. If you remove
// this view, you are responsible for its destruction. If this value is NULL,
// the caller is responsible for populating the RootView, and sizing its
// contents as the window is sized.
virtual void Init(gfx::NativeView parent, const gfx::Rect& bounds) = 0;
// Initialize the widget with a views::Widget parent and an initial
// desired size. This internally invokes |Init(gfx::NativeView,
// const gfx::Rect&)| but it determines the correct native view
// for each platform and the type of widget. Passing NULL to
// |parent| is same as invoking |Init(NULL, bounds)|.
virtual void InitWithWidget(Widget* parent, const gfx::Rect& bounds) = 0;
// Returns the WidgetDelegate for delegating certain events.
virtual WidgetDelegate* GetWidgetDelegate() = 0;
// Sets the WidgetDelegate.
virtual void SetWidgetDelegate(WidgetDelegate* delegate) = 0;
// Sets the specified view as the contents of this Widget. There can only
// be one contents view child of this Widget's RootView. This view is sized to
// fit the entire size of the RootView. The RootView takes ownership of this
// View, unless it is set as not being parent-owned.
virtual void SetContentsView(View* view) = 0;
// Returns the bounds of this Widget in the screen coordinate system.
// If the receiving Widget is a frame which is larger than its client area,
// this method returns the client area if including_frame is false and the
// frame bounds otherwise. If the receiving Widget is not a frame,
// including_frame is ignored.
virtual void GetBounds(gfx::Rect* out, bool including_frame) const = 0;
// Sizes and/or places the widget to the specified bounds, size or position.
virtual void SetBounds(const gfx::Rect& bounds) = 0;
// Places the widget in front of the specified widget in z-order.
virtual void MoveAbove(Widget* widget) = 0;
// Sets a shape on the widget. This takes ownership of shape.
virtual void SetShape(gfx::NativeRegion shape) = 0;
// Hides the widget then closes it after a return to the message loop.
virtual void Close() = 0;
// Closes the widget immediately. Compare to |Close|. This will destroy the
// window handle associated with this Widget, so should not be called from
// any code that expects it to be valid beyond this call.
virtual void CloseNow() = 0;
// Shows or hides the widget, without changing activation state.
virtual void Show() = 0;
virtual void Hide() = 0;
// Returns the gfx::NativeView associated with this Widget.
virtual gfx::NativeView GetNativeView() const = 0;
// Forces a paint of a specified rectangle immediately.
virtual void PaintNow(const gfx::Rect& update_rect) = 0;
// Sets the opacity of the widget. This may allow widgets behind the widget
// in the Z-order to become visible, depending on the capabilities of the
// underlying windowing system. Note that the caller must then schedule a
// repaint to allow this change to take effect.
virtual void SetOpacity(unsigned char opacity) = 0;
// Sets the widget to be on top of all other widgets in the windowing system.
virtual void SetAlwaysOnTop(bool on_top) = 0;
// Returns the RootView contained by this Widget.
virtual RootView* GetRootView() = 0;
// Returns the Widget associated with the root ancestor.
virtual Widget* GetRootWidget() const = 0;
// Returns whether the Widget is visible to the user.
virtual bool IsVisible() const = 0;
// Returns whether the Widget is the currently active window.
virtual bool IsActive() const = 0;
// Starts a drag operation for the specified view. |point| is a position in
// |view| coordinates that the drag was initiated from.
virtual void GenerateMousePressedForView(View* view,
const gfx::Point& point) = 0;
// Returns the TooltipManager for this Widget. If this Widget does not support
// tooltips, NULL is returned.
virtual TooltipManager* GetTooltipManager() = 0;
// Returns the accelerator given a command id. Returns false if there is
// no accelerator associated with a given id, which is a common condition.
virtual bool GetAccelerator(int cmd_id,
menus::Accelerator* accelerator) = 0;
// Returns the Window containing this Widget, or NULL if not contained in a
// window.
virtual Window* GetWindow() = 0;
virtual const Window* GetWindow() const = 0;
// Sets/Gets a native window property on the underlying native window object.
// Returns NULL if the property does not exist. Setting the property value to
// NULL removes the property.
virtual void SetNativeWindowProperty(const std::wstring& name,
void* value) = 0;
virtual void* GetNativeWindowProperty(const std::wstring& name) = 0;
// Gets the theme provider.
virtual ThemeProvider* GetThemeProvider() const = 0;
// Gets the default theme provider; this is necessary for when a widget has
// no profile (and ThemeProvider) associated with it. The default theme
// provider provides a default set of bitmaps that such widgets can use.
virtual ThemeProvider* GetDefaultThemeProvider() const = 0;
// Returns the FocusManager for this widget.
// Note that all widgets in a widget hierarchy share the same focus manager.
virtual FocusManager* GetFocusManager() = 0;
// Forwarded from the RootView so that the widget can do any cleanup.
virtual void ViewHierarchyChanged(bool is_add, View *parent,
View *child) = 0;
// Returns true if the native view |native_view| is contained in the
// views::View hierarchy rooted at this widget.
virtual bool ContainsNativeView(gfx::NativeView native_view) = 0;
};
} // namespace views
#endif // VIEWS_WIDGET_WIDGET_H_
|