summaryrefslogtreecommitdiffstats
path: root/ui/views/widget/root_view.h
diff options
context:
space:
mode:
Diffstat (limited to 'ui/views/widget/root_view.h')
-rw-r--r--ui/views/widget/root_view.h207
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_