Home | History | Annotate | Download | only in widget
      1 // Copyright (c) 2012 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_WIDGET_ROOT_VIEW_H_
      6 #define UI_VIEWS_WIDGET_ROOT_VIEW_H_
      7 
      8 #include <string>
      9 
     10 #include "base/memory/ref_counted.h"
     11 #include "ui/base/events/event_dispatcher.h"
     12 #include "ui/views/focus/focus_manager.h"
     13 #include "ui/views/focus/focus_search.h"
     14 #include "ui/views/view.h"
     15 
     16 namespace views {
     17 
     18 namespace test {
     19 class WidgetTest;
     20 }
     21 
     22 class Widget;
     23 
     24 // This is a views-internal API and should not be used externally.
     25 // Widget exposes this object as a View*.
     26 namespace internal {
     27 
     28 ////////////////////////////////////////////////////////////////////////////////
     29 // RootView class
     30 //
     31 //  The RootView is the root of a View hierarchy. A RootView is attached to a
     32 //  Widget. The Widget is responsible for receiving events from the host
     33 //  environment, converting them to views-compatible events and then forwarding
     34 //  them to the RootView for propagation into the View hierarchy.
     35 //
     36 //  A RootView can have only one child, called its "Contents View" which is
     37 //  sized to fill the bounds of the RootView (and hence the client area of the
     38 //  Widget). Call SetContentsView() after the associated Widget has been
     39 //  initialized to attach the contents view to the RootView.
     40 //  TODO(beng): Enforce no other callers to AddChildView/tree functions by
     41 //              overriding those methods as private here.
     42 //  TODO(beng): Clean up API further, make Widget a friend.
     43 //  TODO(sky): We don't really want to export this class.
     44 //
     45 class VIEWS_EXPORT RootView : public View,
     46                               public FocusTraversable,
     47                               public ui::EventDispatcherDelegate {
     48  public:
     49   static const char kViewClassName[];
     50 
     51   // Creation and lifetime -----------------------------------------------------
     52   explicit RootView(Widget* widget);
     53   virtual ~RootView();
     54 
     55   // Tree operations -----------------------------------------------------------
     56 
     57   // Sets the "contents view" of the RootView. This is the single child view
     58   // that is responsible for laying out the contents of the widget.
     59   void SetContentsView(View* contents_view);
     60   View* GetContentsView();
     61 
     62   // Called when parent of the host changed.
     63   void NotifyNativeViewHierarchyChanged(bool attached,
     64                                         gfx::NativeView native_view);
     65 
     66   // Input ---------------------------------------------------------------------
     67 
     68   // Process a key event. Send the event to the focused view and up the focus
     69   // path, and finally to the default keyboard handler, until someone consumes
     70   // it. Returns whether anyone consumed the event.
     71   void DispatchKeyEvent(ui::KeyEvent* event);
     72   void DispatchScrollEvent(ui::ScrollEvent* event);
     73   void DispatchTouchEvent(ui::TouchEvent* event);
     74   virtual void DispatchGestureEvent(ui::GestureEvent* event);
     75 
     76   // Focus ---------------------------------------------------------------------
     77 
     78   // Used to set the FocusTraversable parent after the view has been created
     79   // (typically when the hierarchy changes and this RootView is added/removed).
     80   virtual void SetFocusTraversableParent(FocusTraversable* focus_traversable);
     81 
     82   // Used to set the View parent after the view has been created.
     83   virtual void SetFocusTraversableParentView(View* view);
     84 
     85   // System events -------------------------------------------------------------
     86 
     87   // Public API for broadcasting theme change notifications to this View
     88   // hierarchy.
     89   void ThemeChanged();
     90 
     91   // Public API for broadcasting locale change notifications to this View
     92   // hierarchy.
     93   void LocaleChanged();
     94 
     95   // Overridden from FocusTraversable:
     96   virtual FocusSearch* GetFocusSearch() OVERRIDE;
     97   virtual FocusTraversable* GetFocusTraversableParent() OVERRIDE;
     98   virtual View* GetFocusTraversableParentView() OVERRIDE;
     99 
    100   // Overridden from View:
    101   virtual const Widget* GetWidget() const OVERRIDE;
    102   virtual Widget* GetWidget() OVERRIDE;
    103   virtual bool IsDrawn() const OVERRIDE;
    104   virtual const char* GetClassName() const OVERRIDE;
    105   virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE;
    106   virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
    107   virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
    108   virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
    109   virtual void OnMouseCaptureLost() OVERRIDE;
    110   virtual void OnMouseMoved(const ui::MouseEvent& event) OVERRIDE;
    111   virtual void OnMouseExited(const ui::MouseEvent& event) OVERRIDE;
    112   virtual bool OnMouseWheel(const ui::MouseWheelEvent& event) OVERRIDE;
    113   virtual void SetMouseHandler(View* new_mouse_handler) OVERRIDE;
    114   virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE;
    115   virtual void UpdateParentLayer() OVERRIDE;
    116 
    117  protected:
    118   // Overridden from View:
    119   virtual void ViewHierarchyChanged(
    120       const ViewHierarchyChangedDetails& details) OVERRIDE;
    121   virtual void VisibilityChanged(View* starting_from, bool is_visible) OVERRIDE;
    122   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
    123   virtual gfx::Vector2d CalculateOffsetToAncestorWithLayer(
    124       ui::Layer** layer_parent) OVERRIDE;
    125   virtual View::DragInfo* GetDragInfo() OVERRIDE;
    126 
    127  private:
    128   friend class ::views::View;
    129   friend class ::views::Widget;
    130   friend class ::views::test::WidgetTest;
    131 
    132   // Input ---------------------------------------------------------------------
    133 
    134   // Update the cursor given a mouse event. This is called by non mouse_move
    135   // event handlers to honor the cursor desired by views located under the
    136   // cursor during drag operations. The location of the mouse should be in the
    137   // current coordinate system (i.e. any necessary transformation should be
    138   // applied to the point prior to calling this).
    139   void UpdateCursor(const ui::MouseEvent& event);
    140 
    141   // Updates the last_mouse_* fields from e. The location of the mouse should be
    142   // in the current coordinate system (i.e. any necessary transformation should
    143   // be applied to the point prior to calling this).
    144   void SetMouseLocationAndFlags(const ui::MouseEvent& event);
    145 
    146   void DispatchEventToTarget(View* target, ui::Event* event);
    147 
    148   // |view| is the view receiving |event|. This function sends the event to all
    149   // the Views up the hierarchy that has |notify_enter_exit_on_child_| flag
    150   // turned on, but does not contain |sibling|.
    151   void NotifyEnterExitOfDescendant(const ui::MouseEvent& event,
    152                                    ui::EventType type,
    153                                    View* view,
    154                                    View* sibling);
    155 
    156   // Overridden from ui::EventDispatcherDelegate:
    157   virtual bool CanDispatchToTarget(ui::EventTarget* target) OVERRIDE;
    158 
    159   //////////////////////////////////////////////////////////////////////////////
    160 
    161   // Tree operations -----------------------------------------------------------
    162 
    163   // The host Widget
    164   Widget* widget_;
    165 
    166   // Input ---------------------------------------------------------------------
    167 
    168   // The view currently handing down - drag - up
    169   View* mouse_pressed_handler_;
    170 
    171   // The view currently handling enter / exit
    172   View* mouse_move_handler_;
    173 
    174   // The last view to handle a mouse click, so that we can determine if
    175   // a double-click lands on the same view as its single-click part.
    176   View* last_click_handler_;
    177 
    178   // true if mouse_pressed_handler_ has been explicitly set
    179   bool explicit_mouse_handler_;
    180 
    181   // Last position/flag of a mouse press/drag. Used if capture stops and we need
    182   // to synthesize a release.
    183   int last_mouse_event_flags_;
    184   int last_mouse_event_x_;
    185   int last_mouse_event_y_;
    186 
    187   // The view currently handling touch events.
    188   View* touch_pressed_handler_;
    189 
    190   // The view currently handling gesture events. When set, this handler receives
    191   // all gesture events, except when there is an event handler for the specific
    192   // gesture (e.g. scroll).
    193   View* gesture_handler_;
    194 
    195   // The view currently handling scroll gesture events.
    196   View* scroll_gesture_handler_;
    197 
    198   // Focus ---------------------------------------------------------------------
    199 
    200   // The focus search algorithm.
    201   FocusSearch focus_search_;
    202 
    203   // Whether this root view belongs to the current active window.
    204   // bool activated_;
    205 
    206   // The parent FocusTraversable, used for focus traversal.
    207   FocusTraversable* focus_traversable_parent_;
    208 
    209   // The View that contains this RootView. This is used when we have RootView
    210   // wrapped inside native components, and is used for the focus traversal.
    211   View* focus_traversable_parent_view_;
    212 
    213   View* event_dispatch_target_;
    214 
    215   // Drag and drop -------------------------------------------------------------
    216 
    217   // Tracks drag state for a view.
    218   View::DragInfo drag_info_;
    219 
    220   DISALLOW_IMPLICIT_CONSTRUCTORS(RootView);
    221 };
    222 
    223 }  // namespace internal
    224 }  // namespace views
    225 
    226 #endif  // UI_VIEWS_WIDGET_ROOT_VIEW_H_
    227