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

Unified Diff: ui/views/view.h

Issue 6286013: V2 (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 11 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/views/run_all_unittests.cc ('k') | ui/views/view.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/views/view.h
===================================================================
--- ui/views/view.h (revision 0)
+++ ui/views/view.h (revision 0)
@@ -0,0 +1,393 @@
+// Copyright (c) 2011 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 UI_VIEWS_VIEW_H_
+#define UI_VIEWS_VIEW_H_
+
+#include <vector>
+
+#include "base/logging.h"
+#include "base/scoped_ptr.h"
+#include "gfx/rect.h"
+#include "ui/views/events/event.h"
+
+namespace gfx {
+class Canvas;
+class Point;
+class Rect;
+class Size;
+}
+
+namespace ui {
+namespace internal {
+class RootView;
+}
+class Accelerator;
+class Border;
+class ContextMenuController;
+class DragController;
+class FocusManager;
+class FocusTraversable;
+class LayoutManager;
+class ThemeProvider;
+class Widget;
+
+////////////////////////////////////////////////////////////////////////////////
+// View class
+//
+// View encapsulates rendering, layout and event handling for rectangles within
+// a view hierarchy.
+//
+// Client code typically subclasses View and overrides virtual methods to
+// handle painting, child view positioning and handle certain types of events.
+//
+// Views are owned by their parent View unless specified otherwise. This means
+// that in most cases Views are automatically destroyed when the window that
+// contains them is destroyed.
+//
+// TODO(beng): consider the visibility of many of these methods.
+// consider making RootView a friend and making many private or
+// protected.
+class View {
+ public:
+ typedef std::vector<View*> ViewVector;
+
+ // Creation and lifetime -----------------------------------------------------
+ View();
+ virtual ~View();
+
+ // By default a View is owned by its parent unless specified otherwise here.
+ bool parent_owned() const { return parent_owned_; }
+ void set_parent_owned(bool parent_owned) { parent_owned_ = parent_owned; }
+
+ void set_drag_controller(DragController* drag_controller) {
+ drag_controller_ = drag_controller;
+ }
+
+ // Size and disposition ------------------------------------------------------
+
+ void SetBounds(int x, int y, int width, int height);
+ void SetBoundsRect(const gfx::Rect& bounds);
+ void SetSize(const gfx::Size& size);
+ void SetPosition(const gfx::Point& position);
+ gfx::Rect bounds() const { return bounds_; }
+ gfx::Rect GetVisibleBounds() const;
+ int x() const { return bounds_.x(); }
+ int y() const { return bounds_.y(); }
+ int width() const { return bounds_.width(); }
+ int height() const { return bounds_.height(); }
+
+ // Owned by the view.
+ void SetBorder(Border* border);
+ Border* border() { return border_.get(); }
+
+ // Returns the bounds of the content area of the view, i.e. the rectangle
+ // enclosed by the view's border.
+ gfx::Rect GetContentsBounds() const;
+
+ // Override to be notified when the bounds of a view have changed.
+ virtual void OnBoundsChanged();
+
+ virtual gfx::Size GetPreferredSize() const;
+ virtual gfx::Size GetMinimumSize() const;
+
+ void SetLayoutManager(LayoutManager* layout_manager);
+ virtual void Layout();
+
+ // If a View is not visible, it will not be rendered, focused, etc.
+ bool visible() const { return visible_; }
+ void SetVisible(bool visible);
+
+ // Disabled Views will not receive mouse press/release events, nor can they be
+ // focused.
+ bool enabled() const { return enabled_; }
+ void SetEnabled(bool enabled);
+
+ // Coordinate conversion -----------------------------------------------------
+
+ // Converts a point from the coordinate system of |source| to |target|.
+ static void ConvertPointToView(View* source, View* target, gfx::Point* point);
+
+ // Converts a point from the coordinate system of |source| to the screen.
+ // If |source| is not attached to a Widget that is in screen space, |point| is
+ // not modified.
+ static void ConvertPointToScreen(View* source, gfx::Point* point);
+
+ // Converts a point from the coordinate system of |source| to the Widget that
+ // most closely contains it.
+ static void ConvertPointToWidget(View* source, gfx::Point* point);
+
+ // Tree operations -----------------------------------------------------------
+
+ // Returns the Widget that contains this View, or NULL if it is not contained
+ // within a Widget.
+ virtual Widget* GetWidget() const;
+
+ // Adds a View as a child of this one, optionally at |index|.
+ void AddChildView(View* view);
+ void AddChildViewAt(View* view, size_t index);
+
+ // Removes a View as a child of this View. Does not delete the child.
+ View* RemoveChildView(View* view);
+
+ // Removes all View children of this View. Deletes the children if
+ // |delete_children| is true.
+ void RemoveAllChildViews(bool delete_children);
+
+ // Returns the View at the specified |index|.
+ View* GetChildViewAt(size_t index);
+
+ // Returns the number of child views.
+ size_t child_count() const { return children_.size(); }
+
+ // Returns the parent View, or NULL if this View has no parent.
+ View* parent() const { return parent_; }
+
+ // Returns true if |child| is contained within this View's hierarchy, even as
+ // an indirect descendant. Will return true if child is also this View.
+ bool Contains(View* child);
+
+ // Returns the visible View that most closely contains the specified point.
+ // |point| is in this View's coordinates.
+ // This function is used by the event processing system in the Widget to
+ // locate views for event targeting. Override this function if you wish to
+ // specify a view other than the one most closely enclosing |point| to receive
+ // notifications for events within it.
+ // TODO(beng): This is [ab]used primarily for event handling. Should be
+ // renamed to something like GetViewForEvent().
+ virtual View* GetViewForPoint(const gfx::Point& point) const;
+
+ // Returns true if the specified point is contained within this View or its
+ // hit test mask. |point| is in this View's coordinates.
+ bool HitTest(const gfx::Point& point) const;
+
+ int id() const { return id_; }
+ void set_id(int id) { id_ = id; }
+ int group() const { return group_; }
+ void set_group(int group) { group_ = group; }
+
+ // Returns the View within this View's hierarchy whose id matches that
+ // specified.
+ View* GetViewById(int id) const;
+
+ // Populates a ViewVector with the Views within this View's hierarchy that
+ // match the specified group id.
+ void GetViewsWithGroup(int group, ViewVector* vec) const;
+
+ // Called on every view in the hierarchy when a view is added or removed.
+ virtual void OnViewAdded(View* parent, View* child);
+ virtual void OnViewRemoved(View* parent, View* child);
+
+ // Called on a View when it is added or removed from a Widget.
+ virtual void OnViewAddedToWidget();
+ virtual void OnViewRemovedFromWidget();
+
+ // Accelerators --------------------------------------------------------------
+
+ // Accelerator Registration.
+ void AddAccelerator(const Accelerator& accelerator);
+ void RemoveAccelerator(const Accelerator& accelerator);
+ void RemoveAllAccelerators();
+
+ virtual bool OnAcceleratorPressed(const Accelerator& accelerator);
+
+ // Focus ---------------------------------------------------------------------
+
+ // Manager.
+ FocusManager* GetFocusManager() const;
+
+ // Traversal.
+ virtual FocusTraversable* GetFocusTraversable() const;
+ View* GetNextFocusableView() const;
+ View* GetPreviousFocusableView() const;
+
+ // Attributes.
+ virtual bool SkipDefaultKeyEventProcessing(const KeyEvent& event) const;
+ void set_focusable(bool focusable) { focusable_ = focusable; }
+ bool IsFocusable() const;
+
+ bool HasFocus() const;
+ void RequestFocus();
+
+ virtual void OnFocus(/* const FocusEvent& event */);
+ virtual void OnBlur();
+
+ // Input ---------------------------------------------------------------------
+
+ virtual bool OnKeyPressed(const KeyEvent& event);
+ virtual bool OnKeyReleased(const KeyEvent& event);
+ virtual bool OnMouseWheel(const MouseWheelEvent& event);
+ // To receive OnMouseDragged() or OnMouseReleased() events, overriding classes
+ // must return true from this function.
+ virtual bool OnMousePressed(const MouseEvent& event);
+ virtual bool OnMouseDragged(const MouseEvent& event);
+ virtual void OnMouseReleased(const MouseEvent& event);
+ virtual void OnMouseCaptureLost();
+ virtual void OnMouseMoved(const MouseEvent& event);
+ virtual void OnMouseEntered(const MouseEvent& event);
+ virtual void OnMouseExited(const MouseEvent& event);
+
+ virtual gfx::NativeCursor GetCursorForPoint(const gfx::Point& point);
+
+ // Painting ------------------------------------------------------------------
+
+ // Add all or part of a View's bounds to the enclosing Widget's invalid
+ // rectangle. This will result in those areas being re-painted on the next
+ // update.
+ void Invalidate();
+ virtual void InvalidateRect(const gfx::Rect& invalid_rect);
+
+ // Called by the framework to paint a View. Performs translation and clipping
+ // for View coordinates and language direction as required, allows the View
+ // to paint itself via the various OnPaint*() event handlers and then paints
+ // the hierarchy beneath it.
+ // TODO(beng): Make private?
+ void Paint(gfx::Canvas* canvas);
+
+ // Responsible for calling Paint() on child Views. Override to control the
+ // order child Views are painted.
+ virtual void PaintChildren(gfx::Canvas* canvas);
+
+ // Override to provide rendering in any part of the View's bounds. Typically
+ // this is the "contents" of the view. If you override this method you will
+ // have to call the subsequent OnPaint*() methods manually.
+ virtual void OnPaint(gfx::Canvas* canvas);
+
+ // Override to paint a background before any content is drawn. Typically this
+ // is done if you are satisfied with a default OnPaint handler but wish to
+ // supply a different background.
+ virtual void OnPaintBackground(gfx::Canvas* canvas);
+
+ // Override to paint a border not specified by SetBorder().
+ virtual void OnPaintBorder(gfx::Canvas* canvas);
+
+ // Override to paint a focus border (usually a dotted rectangle) around
+ // relevant contents.
+ virtual void OnPaintFocusBorder(gfx::Canvas* canvas);
+
+ // Context menus -------------------------------------------------------------
+
+ void set_context_menu_controller(
+ ContextMenuController* context_menu_controller) {
+ context_menu_controller_ = context_menu_controller;
+ }
+
+ // Resources -----------------------------------------------------------------
+
+ ThemeProvider* GetThemeProvider() const;
+
+ private:
+ friend internal::RootView;
+
+ // State collected during a MousePressed event to detect possible drag
+ // operations.
+ struct DragInfo {
+ // Sets possible_drag to false and start_x/y to 0. This is invoked by
+ // RootView prior to invoke MousePressed().
+ void Reset();
+
+ // Sets possible_drag to true and start_pt to the specified point.
+ // This is invoked by the target view if it detects the press may generate
+ // a drag.
+ void PossibleDrag(const gfx::Point& point);
+
+ // Whether the press may generate a drag.
+ bool possible_drag;
+
+ // Position of the mouse press in screen coordinates.
+ gfx::Point press_point;
+ };
+
+ // Drag & Drop ---------------------------------------------------------------
+ int GetDragOperations(const gfx::Point& point);
+ void WriteDragData(const gfx::Point& point, OSExchangeData* data);
+ void StartShellDrag(const MouseEvent& event, const gfx::Point& press_point);
+
+ // RootView API --------------------------------------------------------------
+ // These methods are designed to be called by the RootView. The RootView
+ // should limit its interaction with the View to these methods and the public
+ // API.
+ bool MousePressed(const MouseEvent& event, DragInfo* drag_info);
+ bool MouseDragged(const MouseEvent& event, DragInfo* drag_info);
+ void MouseReleased(const MouseEvent& event);
+
+ // Tree operations -----------------------------------------------------------
+ void NotifyHierarchyChanged(View* parent, View* child, bool is_add);
+ void NotifyHierarchyChangedUp(View* parent, View* child, bool is_add);
+ void NotifyHierarchyChangedDown(View* parent, View* child, bool is_add,
+ bool has_widget);
+ void CallViewNotification(View* target,
+ View* parent,
+ View* child,
+ bool is_add,
+ bool has_widget);
+
+ // The View's parent view. This is set and reset when the View is added and
+ // removed from a hierarchy.
+ View* parent_;
+
+ // The View's children.
+ ViewVector children_;
+
+ // True if the hierarchy (i.e. the parent View) is responsible for deleting
+ // this View. Default is true.
+ bool parent_owned_;
+
+ // The bounds of the View, in its parent's coordinates.
+ gfx::Rect bounds_;
+
+ scoped_ptr<Border> border_;
+
+ // Whether or not this View is visible. The view still participates in layout
+ // but will not be painted.
+ bool visible_;
+
+ // Whether or not this View is enabled. When disabled, the event system will
+ // not propagate un-handled events beyond the View in the hierarchy.
+ bool enabled_;
+
+ // An identifier for this View. Caller must guarantee uniqueness.
+ int id_;
+
+ // An identifier for a group of potentially related Views.
+ int group_;
+
+ // True if this View is focusable by the FocusManager.
+ bool focusable_;
+
+ // An optional helper that handles layout for child views.
+ scoped_ptr<LayoutManager> layout_manager_;
+
+ // Shows the context menu.
+ ContextMenuController* context_menu_controller_;
+
+ // Delegate for drag and drop related functionality.
+ DragController* drag_controller_;
+
+ DISALLOW_COPY_AND_ASSIGN(View);
+};
+
+} // namespace ui
+
+#endif // UI_VIEWS_VIEW_H_
+
+/*
+
+TODO(beng):
+- focus
+- accessibility
+- scrolling
+- cursors
+- tooltips
+- rtl
+- l10n
+- mousewheel
+- more on painting
+- layer stuff
+- investigate why assorted notifications are necessary
+- native_widget_views
+- native_widget_gtk
+- pick a name
+
+*/
Property changes on: ui\views\view.h
___________________________________________________________________
Added: svn:eol-style
+ LF
« 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