Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(27)

Side by Side Diff: ui/views/view.h

Issue 6286013: V2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « ui/views/run_all_unittests.cc ('k') | ui/views/view.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Property Changes:
Added: svn:eol-style
+ LF
OLDNEW
(Empty)
1 // Copyright (c) 2011 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 UI_VIEWS_VIEW_H_
6 #define UI_VIEWS_VIEW_H_
7
8 #include <vector>
9
10 #include "base/logging.h"
11 #include "base/scoped_ptr.h"
12 #include "gfx/rect.h"
13 #include "ui/views/events/event.h"
14
15 namespace gfx {
16 class Canvas;
17 class Point;
18 class Rect;
19 class Size;
20 }
21
22 namespace ui {
23 namespace internal {
24 class RootView;
25 }
26 class Accelerator;
27 class Border;
28 class ContextMenuController;
29 class DragController;
30 class FocusManager;
31 class FocusTraversable;
32 class LayoutManager;
33 class ThemeProvider;
34 class Widget;
35
36 ////////////////////////////////////////////////////////////////////////////////
37 // View class
38 //
39 // View encapsulates rendering, layout and event handling for rectangles within
40 // a view hierarchy.
41 //
42 // Client code typically subclasses View and overrides virtual methods to
43 // handle painting, child view positioning and handle certain types of events.
44 //
45 // Views are owned by their parent View unless specified otherwise. This means
46 // that in most cases Views are automatically destroyed when the window that
47 // contains them is destroyed.
48 //
49 // TODO(beng): consider the visibility of many of these methods.
50 // consider making RootView a friend and making many private or
51 // protected.
52 class View {
53 public:
54 typedef std::vector<View*> ViewVector;
55
56 // Creation and lifetime -----------------------------------------------------
57 View();
58 virtual ~View();
59
60 // By default a View is owned by its parent unless specified otherwise here.
61 bool parent_owned() const { return parent_owned_; }
62 void set_parent_owned(bool parent_owned) { parent_owned_ = parent_owned; }
63
64 void set_drag_controller(DragController* drag_controller) {
65 drag_controller_ = drag_controller;
66 }
67
68 // Size and disposition ------------------------------------------------------
69
70 void SetBounds(int x, int y, int width, int height);
71 void SetBoundsRect(const gfx::Rect& bounds);
72 void SetSize(const gfx::Size& size);
73 void SetPosition(const gfx::Point& position);
74 gfx::Rect bounds() const { return bounds_; }
75 gfx::Rect GetVisibleBounds() const;
76 int x() const { return bounds_.x(); }
77 int y() const { return bounds_.y(); }
78 int width() const { return bounds_.width(); }
79 int height() const { return bounds_.height(); }
80
81 // Owned by the view.
82 void SetBorder(Border* border);
83 Border* border() { return border_.get(); }
84
85 // Returns the bounds of the content area of the view, i.e. the rectangle
86 // enclosed by the view's border.
87 gfx::Rect GetContentsBounds() const;
88
89 // Override to be notified when the bounds of a view have changed.
90 virtual void OnBoundsChanged();
91
92 virtual gfx::Size GetPreferredSize() const;
93 virtual gfx::Size GetMinimumSize() const;
94
95 void SetLayoutManager(LayoutManager* layout_manager);
96 virtual void Layout();
97
98 // If a View is not visible, it will not be rendered, focused, etc.
99 bool visible() const { return visible_; }
100 void SetVisible(bool visible);
101
102 // Disabled Views will not receive mouse press/release events, nor can they be
103 // focused.
104 bool enabled() const { return enabled_; }
105 void SetEnabled(bool enabled);
106
107 // Coordinate conversion -----------------------------------------------------
108
109 // Converts a point from the coordinate system of |source| to |target|.
110 static void ConvertPointToView(View* source, View* target, gfx::Point* point);
111
112 // Converts a point from the coordinate system of |source| to the screen.
113 // If |source| is not attached to a Widget that is in screen space, |point| is
114 // not modified.
115 static void ConvertPointToScreen(View* source, gfx::Point* point);
116
117 // Converts a point from the coordinate system of |source| to the Widget that
118 // most closely contains it.
119 static void ConvertPointToWidget(View* source, gfx::Point* point);
120
121 // Tree operations -----------------------------------------------------------
122
123 // Returns the Widget that contains this View, or NULL if it is not contained
124 // within a Widget.
125 virtual Widget* GetWidget() const;
126
127 // Adds a View as a child of this one, optionally at |index|.
128 void AddChildView(View* view);
129 void AddChildViewAt(View* view, size_t index);
130
131 // Removes a View as a child of this View. Does not delete the child.
132 View* RemoveChildView(View* view);
133
134 // Removes all View children of this View. Deletes the children if
135 // |delete_children| is true.
136 void RemoveAllChildViews(bool delete_children);
137
138 // Returns the View at the specified |index|.
139 View* GetChildViewAt(size_t index);
140
141 // Returns the number of child views.
142 size_t child_count() const { return children_.size(); }
143
144 // Returns the parent View, or NULL if this View has no parent.
145 View* parent() const { return parent_; }
146
147 // Returns true if |child| is contained within this View's hierarchy, even as
148 // an indirect descendant. Will return true if child is also this View.
149 bool Contains(View* child);
150
151 // Returns the visible View that most closely contains the specified point.
152 // |point| is in this View's coordinates.
153 // This function is used by the event processing system in the Widget to
154 // locate views for event targeting. Override this function if you wish to
155 // specify a view other than the one most closely enclosing |point| to receive
156 // notifications for events within it.
157 // TODO(beng): This is [ab]used primarily for event handling. Should be
158 // renamed to something like GetViewForEvent().
159 virtual View* GetViewForPoint(const gfx::Point& point) const;
160
161 // Returns true if the specified point is contained within this View or its
162 // hit test mask. |point| is in this View's coordinates.
163 bool HitTest(const gfx::Point& point) const;
164
165 int id() const { return id_; }
166 void set_id(int id) { id_ = id; }
167 int group() const { return group_; }
168 void set_group(int group) { group_ = group; }
169
170 // Returns the View within this View's hierarchy whose id matches that
171 // specified.
172 View* GetViewById(int id) const;
173
174 // Populates a ViewVector with the Views within this View's hierarchy that
175 // match the specified group id.
176 void GetViewsWithGroup(int group, ViewVector* vec) const;
177
178 // Called on every view in the hierarchy when a view is added or removed.
179 virtual void OnViewAdded(View* parent, View* child);
180 virtual void OnViewRemoved(View* parent, View* child);
181
182 // Called on a View when it is added or removed from a Widget.
183 virtual void OnViewAddedToWidget();
184 virtual void OnViewRemovedFromWidget();
185
186 // Accelerators --------------------------------------------------------------
187
188 // Accelerator Registration.
189 void AddAccelerator(const Accelerator& accelerator);
190 void RemoveAccelerator(const Accelerator& accelerator);
191 void RemoveAllAccelerators();
192
193 virtual bool OnAcceleratorPressed(const Accelerator& accelerator);
194
195 // Focus ---------------------------------------------------------------------
196
197 // Manager.
198 FocusManager* GetFocusManager() const;
199
200 // Traversal.
201 virtual FocusTraversable* GetFocusTraversable() const;
202 View* GetNextFocusableView() const;
203 View* GetPreviousFocusableView() const;
204
205 // Attributes.
206 virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& event) const;
207 void set_focusable(bool focusable) { focusable_ = focusable; }
208 bool IsFocusable() const;
209
210 bool HasFocus() const;
211 void RequestFocus();
212
213 virtual void OnFocus(/* const FocusEvent& event */);
214 virtual void OnBlur();
215
216 // Input ---------------------------------------------------------------------
217
218 virtual bool OnKeyPressed(const KeyEvent& event);
219 virtual bool OnKeyReleased(const KeyEvent& event);
220 virtual bool OnMouseWheel(const MouseWheelEvent& event);
221 // To receive OnMouseDragged() or OnMouseReleased() events, overriding classes
222 // must return true from this function.
223 virtual bool OnMousePressed(const MouseEvent& event);
224 virtual bool OnMouseDragged(const MouseEvent& event);
225 virtual void OnMouseReleased(const MouseEvent& event);
226 virtual void OnMouseCaptureLost();
227 virtual void OnMouseMoved(const MouseEvent& event);
228 virtual void OnMouseEntered(const MouseEvent& event);
229 virtual void OnMouseExited(const MouseEvent& event);
230
231 virtual gfx::NativeCursor GetCursorForPoint(const gfx::Point& point);
232
233 // Painting ------------------------------------------------------------------
234
235 // Add all or part of a View's bounds to the enclosing Widget's invalid
236 // rectangle. This will result in those areas being re-painted on the next
237 // update.
238 void Invalidate();
239 virtual void InvalidateRect(const gfx::Rect& invalid_rect);
240
241 // Called by the framework to paint a View. Performs translation and clipping
242 // for View coordinates and language direction as required, allows the View
243 // to paint itself via the various OnPaint*() event handlers and then paints
244 // the hierarchy beneath it.
245 // TODO(beng): Make private?
246 void Paint(gfx::Canvas* canvas);
247
248 // Responsible for calling Paint() on child Views. Override to control the
249 // order child Views are painted.
250 virtual void PaintChildren(gfx::Canvas* canvas);
251
252 // Override to provide rendering in any part of the View's bounds. Typically
253 // this is the "contents" of the view. If you override this method you will
254 // have to call the subsequent OnPaint*() methods manually.
255 virtual void OnPaint(gfx::Canvas* canvas);
256
257 // Override to paint a background before any content is drawn. Typically this
258 // is done if you are satisfied with a default OnPaint handler but wish to
259 // supply a different background.
260 virtual void OnPaintBackground(gfx::Canvas* canvas);
261
262 // Override to paint a border not specified by SetBorder().
263 virtual void OnPaintBorder(gfx::Canvas* canvas);
264
265 // Override to paint a focus border (usually a dotted rectangle) around
266 // relevant contents.
267 virtual void OnPaintFocusBorder(gfx::Canvas* canvas);
268
269 // Context menus -------------------------------------------------------------
270
271 void set_context_menu_controller(
272 ContextMenuController* context_menu_controller) {
273 context_menu_controller_ = context_menu_controller;
274 }
275
276 // Resources -----------------------------------------------------------------
277
278 ThemeProvider* GetThemeProvider() const;
279
280 private:
281 friend internal::RootView;
282
283 // State collected during a MousePressed event to detect possible drag
284 // operations.
285 struct DragInfo {
286 // Sets possible_drag to false and start_x/y to 0. This is invoked by
287 // RootView prior to invoke MousePressed().
288 void Reset();
289
290 // Sets possible_drag to true and start_pt to the specified point.
291 // This is invoked by the target view if it detects the press may generate
292 // a drag.
293 void PossibleDrag(const gfx::Point& point);
294
295 // Whether the press may generate a drag.
296 bool possible_drag;
297
298 // Position of the mouse press in screen coordinates.
299 gfx::Point press_point;
300 };
301
302 // Drag & Drop ---------------------------------------------------------------
303 int GetDragOperations(const gfx::Point& point);
304 void WriteDragData(const gfx::Point& point, OSExchangeData* data);
305 void StartShellDrag(const MouseEvent& event, const gfx::Point& press_point);
306
307 // RootView API --------------------------------------------------------------
308 // These methods are designed to be called by the RootView. The RootView
309 // should limit its interaction with the View to these methods and the public
310 // API.
311 bool MousePressed(const MouseEvent& event, DragInfo* drag_info);
312 bool MouseDragged(const MouseEvent& event, DragInfo* drag_info);
313 void MouseReleased(const MouseEvent& event);
314
315 // Tree operations -----------------------------------------------------------
316 void NotifyHierarchyChanged(View* parent, View* child, bool is_add);
317 void NotifyHierarchyChangedUp(View* parent, View* child, bool is_add);
318 void NotifyHierarchyChangedDown(View* parent, View* child, bool is_add,
319 bool has_widget);
320 void CallViewNotification(View* target,
321 View* parent,
322 View* child,
323 bool is_add,
324 bool has_widget);
325
326 // The View's parent view. This is set and reset when the View is added and
327 // removed from a hierarchy.
328 View* parent_;
329
330 // The View's children.
331 ViewVector children_;
332
333 // True if the hierarchy (i.e. the parent View) is responsible for deleting
334 // this View. Default is true.
335 bool parent_owned_;
336
337 // The bounds of the View, in its parent's coordinates.
338 gfx::Rect bounds_;
339
340 scoped_ptr<Border> border_;
341
342 // Whether or not this View is visible. The view still participates in layout
343 // but will not be painted.
344 bool visible_;
345
346 // Whether or not this View is enabled. When disabled, the event system will
347 // not propagate un-handled events beyond the View in the hierarchy.
348 bool enabled_;
349
350 // An identifier for this View. Caller must guarantee uniqueness.
351 int id_;
352
353 // An identifier for a group of potentially related Views.
354 int group_;
355
356 // True if this View is focusable by the FocusManager.
357 bool focusable_;
358
359 // An optional helper that handles layout for child views.
360 scoped_ptr<LayoutManager> layout_manager_;
361
362 // Shows the context menu.
363 ContextMenuController* context_menu_controller_;
364
365 // Delegate for drag and drop related functionality.
366 DragController* drag_controller_;
367
368 DISALLOW_COPY_AND_ASSIGN(View);
369 };
370
371 } // namespace ui
372
373 #endif // UI_VIEWS_VIEW_H_
374
375 /*
376
377 TODO(beng):
378 - focus
379 - accessibility
380 - scrolling
381 - cursors
382 - tooltips
383 - rtl
384 - l10n
385 - mousewheel
386 - more on painting
387 - layer stuff
388 - investigate why assorted notifications are necessary
389 - native_widget_views
390 - native_widget_gtk
391 - pick a name
392
393 */
OLDNEW
« no previous file with comments | « ui/views/run_all_unittests.cc ('k') | ui/views/view.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698