diff options
Diffstat (limited to 'ui/views/widget/root_view.h')
-rw-r--r-- | ui/views/widget/root_view.h | 207 |
1 files changed, 207 insertions, 0 deletions
diff --git a/ui/views/widget/root_view.h b/ui/views/widget/root_view.h new file mode 100644 index 0000000..d5df829 --- /dev/null +++ b/ui/views/widget/root_view.h @@ -0,0 +1,207 @@ +// 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_WIDGET_ROOT_VIEW_H_ +#define UI_VIEWS_WIDGET_ROOT_VIEW_H_ +#pragma once + +#include <string> + +#include "base/memory/ref_counted.h" +#include "ui/views/focus/focus_manager.h" +#include "ui/views/focus/focus_search.h" +#include "views/view.h" + +namespace ui { +enum TouchStatus; +} + +namespace views { + +class Widget; +class GestureManager; + +// This is a views-internal API and should not be used externally. +// Widget exposes this object as a View*. +namespace internal { + +//////////////////////////////////////////////////////////////////////////////// +// RootView class +// +// The RootView is the root of a View hierarchy. A RootView is attached to a +// Widget. The Widget is responsible for receiving events from the host +// environment, converting them to views-compatible events and then forwarding +// them to the RootView for propagation into the View hierarchy. +// +// A RootView can have only one child, called its "Contents View" which is +// sized to fill the bounds of the RootView (and hence the client area of the +// Widget). Call SetContentsView() after the associated Widget has been +// initialized to attach the contents view to the RootView. +// TODO(beng): Enforce no other callers to AddChildView/tree functions by +// overriding those methods as private here. +// TODO(beng): Clean up API further, make Widget a friend. +// TODO(sky): We don't really want to export this class. +// +class VIEWS_EXPORT RootView : public View, public FocusTraversable { + public: + static const char kViewClassName[]; + + // Creation and lifetime ----------------------------------------------------- + explicit RootView(Widget* widget); + virtual ~RootView(); + + // Tree operations ----------------------------------------------------------- + + // Sets the "contents view" of the RootView. This is the single child view + // that is responsible for laying out the contents of the widget. + void SetContentsView(View* contents_view); + View* GetContentsView(); + + // Called when parent of the host changed. + void NotifyNativeViewHierarchyChanged(bool attached, + gfx::NativeView native_view); + + // Input --------------------------------------------------------------------- + + // Process a key event. Send the event to the focused view and up the focus + // path, and finally to the default keyboard handler, until someone consumes + // it. Returns whether anyone consumed the event. + bool OnKeyEvent(const KeyEvent& event); + + // Provided only for testing: + void SetGestureManagerForTesting(GestureManager* g) { gesture_manager_ = g; } + + // Focus --------------------------------------------------------------------- + + // Used to set the FocusTraversable parent after the view has been created + // (typically when the hierarchy changes and this RootView is added/removed). + virtual void SetFocusTraversableParent(FocusTraversable* focus_traversable); + + // Used to set the View parent after the view has been created. + virtual void SetFocusTraversableParentView(View* view); + + // System events ------------------------------------------------------------- + + // Public API for broadcasting theme change notifications to this View + // hierarchy. + void ThemeChanged(); + + // Public API for broadcasting locale change notifications to this View + // hierarchy. + void LocaleChanged(); + + // Overridden from FocusTraversable: + virtual FocusSearch* GetFocusSearch() OVERRIDE; + virtual FocusTraversable* GetFocusTraversableParent() OVERRIDE; + virtual View* GetFocusTraversableParentView() OVERRIDE; + + // Overridden from View: + virtual const Widget* GetWidget() const OVERRIDE; + virtual Widget* GetWidget() OVERRIDE; + virtual bool IsVisibleInRootView() const OVERRIDE; + virtual std::string GetClassName() const OVERRIDE; + virtual void SchedulePaintInRect(const gfx::Rect& rect) OVERRIDE; + virtual bool OnMousePressed(const MouseEvent& event) OVERRIDE; + virtual bool OnMouseDragged(const MouseEvent& event) OVERRIDE; + virtual void OnMouseReleased(const MouseEvent& event) OVERRIDE; + virtual void OnMouseCaptureLost() OVERRIDE; + virtual void OnMouseMoved(const MouseEvent& event) OVERRIDE; + virtual void OnMouseExited(const MouseEvent& event) OVERRIDE; + virtual bool OnMouseWheel(const MouseWheelEvent& event) OVERRIDE; + virtual ui::TouchStatus OnTouchEvent(const TouchEvent& event) OVERRIDE; + virtual void SetMouseHandler(View* new_mouse_handler) OVERRIDE; + virtual void GetAccessibleState(ui::AccessibleViewState* state) OVERRIDE; + + protected: + // Overridden from View: + virtual void ViewHierarchyChanged(bool is_add, View* parent, + View* child) OVERRIDE; + virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; + virtual void CalculateOffsetToAncestorWithLayer( + gfx::Point* offset, + ui::Layer** layer_parent) OVERRIDE; + + private: + friend class View; + friend class Widget; + + // Required so the GestureManager can call the Process* entry points + // with synthetic events as necessary. + friend class GestureManager; + + // Input --------------------------------------------------------------------- + + // Update the cursor given a mouse event. This is called by non mouse_move + // event handlers to honor the cursor desired by views located under the + // cursor during drag operations. The location of the mouse should be in the + // current coordinate system (i.e. any necessary transformation should be + // applied to the point prior to calling this). + void UpdateCursor(const MouseEvent& event); + + // Updates the last_mouse_* fields from e. The location of the mouse should be + // in the current coordinate system (i.e. any necessary transformation should + // be applied to the point prior to calling this). + void SetMouseLocationAndFlags(const MouseEvent& event); + + ////////////////////////////////////////////////////////////////////////////// + + // Tree operations ----------------------------------------------------------- + + // The host Widget + Widget* widget_; + + // Input --------------------------------------------------------------------- + + // The view currently handing down - drag - up + View* mouse_pressed_handler_; + + // The view currently handling enter / exit + View* mouse_move_handler_; + + // The last view to handle a mouse click, so that we can determine if + // a double-click lands on the same view as its single-click part. + View* last_click_handler_; + + // true if mouse_pressed_handler_ has been explicitly set + bool explicit_mouse_handler_; + + // Last position/flag of a mouse press/drag. Used if capture stops and we need + // to synthesize a release. + int last_mouse_event_flags_; + int last_mouse_event_x_; + int last_mouse_event_y_; + + // The gesture_manager_ for this. + GestureManager* gesture_manager_; + + // The view currently handling touch events. + View* touch_pressed_handler_; + + // Focus --------------------------------------------------------------------- + + // The focus search algorithm. + FocusSearch focus_search_; + + // Whether this root view belongs to the current active window. + // bool activated_; + + // The parent FocusTraversable, used for focus traversal. + FocusTraversable* focus_traversable_parent_; + + // The View that contains this RootView. This is used when we have RootView + // wrapped inside native components, and is used for the focus traversal. + View* focus_traversable_parent_view_; + + // Drag and drop ------------------------------------------------------------- + + // Tracks drag state for a view. + View::DragInfo drag_info; + + DISALLOW_IMPLICIT_CONSTRUCTORS(RootView); +}; + +} // namespace internal +} // namespace views + +#endif // UI_VIEWS_WIDGET_ROOT_VIEW_H_ |