| Index: ui/views/controls/scroll_view.h
 | 
| diff --git a/ui/views/controls/scroll_view.h b/ui/views/controls/scroll_view.h
 | 
| index af9111a05cae1a2dd25daba64afe629560c7751e..0dea574a81bc1462a0f209c771f7514c570fc1f6 100644
 | 
| --- a/ui/views/controls/scroll_view.h
 | 
| +++ b/ui/views/controls/scroll_view.h
 | 
| @@ -1,282 +1,299 @@
 | 
| -// Copyright (c) 2012 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_CONTROLS_SCROLL_VIEW_H_
 | 
| -#define UI_VIEWS_CONTROLS_SCROLL_VIEW_H_
 | 
| -
 | 
| -#include <string>
 | 
| -
 | 
| -#include "base/compiler_specific.h"
 | 
| -#include "base/gtest_prod_util.h"
 | 
| -#include "base/macros.h"
 | 
| -#include "ui/views/controls/scrollbar/scroll_bar.h"
 | 
| -
 | 
| -namespace gfx {
 | 
| -class ScrollOffset;
 | 
| -}
 | 
| -
 | 
| -namespace views {
 | 
| -namespace test {
 | 
| -class ScrollViewTestApi;
 | 
| -}
 | 
| -
 | 
| -/////////////////////////////////////////////////////////////////////////////
 | 
| -//
 | 
| -// ScrollView class
 | 
| -//
 | 
| -// A ScrollView is used to make any View scrollable. The view is added to
 | 
| -// a viewport which takes care of clipping.
 | 
| -//
 | 
| -// In this current implementation both horizontal and vertical scrollbars are
 | 
| -// added as needed.
 | 
| -//
 | 
| -// The scrollview supports keyboard UI and mousewheel.
 | 
| -//
 | 
| -/////////////////////////////////////////////////////////////////////////////
 | 
| -
 | 
| -class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
 | 
| - public:
 | 
| -  static const char kViewClassName[];
 | 
| -
 | 
| -  ScrollView();
 | 
| -
 | 
| -  ~ScrollView() override;
 | 
| -
 | 
| -  // Creates a ScrollView with a theme specific border.
 | 
| -  static ScrollView* CreateScrollViewWithBorder();
 | 
| -
 | 
| -  // Returns the ScrollView for which |contents| is its contents, or null if
 | 
| -  // |contents| is not in a ScrollView.
 | 
| -  static ScrollView* GetScrollViewForContents(View* contents);
 | 
| -
 | 
| -  // Set the contents. Any previous contents will be deleted. The contents
 | 
| -  // is the view that needs to scroll.
 | 
| -  void SetContents(View* a_view);
 | 
| -  const View* contents() const { return contents_; }
 | 
| -  View* contents() { return contents_; }
 | 
| -
 | 
| -  // Sets the header, deleting the previous header.
 | 
| -  void SetHeader(View* header);
 | 
| -
 | 
| -  // Sets the background color. The default is white when scrolling with layers,
 | 
| -  // otherwise transparent. An opaque color when scrolling with layers ensures
 | 
| -  // fonts can be drawn with subpixel antialiasing.
 | 
| -  void SetBackgroundColor(SkColor color);
 | 
| -
 | 
| -  // Returns the visible region of the content View.
 | 
| -  gfx::Rect GetVisibleRect() const;
 | 
| -
 | 
| -  void set_hide_horizontal_scrollbar(bool visible) {
 | 
| -    hide_horizontal_scrollbar_ = visible;
 | 
| -  }
 | 
| -
 | 
| -  // Turns this scroll view into a bounded scroll view, with a fixed height.
 | 
| -  // By default, a ScrollView will stretch to fill its outer container.
 | 
| -  void ClipHeightTo(int min_height, int max_height);
 | 
| -
 | 
| -  // Returns whether or not the ScrollView is bounded (as set by ClipHeightTo).
 | 
| -  bool is_bounded() const { return max_height_ >= 0 && min_height_ >= 0; }
 | 
| -
 | 
| -  // Retrieves the width/height reserved for scrollbars. These return 0 if the
 | 
| -  // scrollbar has not yet been created or in the case of overlay scrollbars.
 | 
| -  int GetScrollBarLayoutWidth() const;
 | 
| -  int GetScrollBarLayoutHeight() const;
 | 
| -
 | 
| -  // Returns the horizontal/vertical scrollbar. This may return NULL.
 | 
| -  const ScrollBar* horizontal_scroll_bar() const { return horiz_sb_; }
 | 
| -  const ScrollBar* vertical_scroll_bar() const { return vert_sb_; }
 | 
| -
 | 
| -  // Customize the scrollbar design. ScrollView takes the ownership of the
 | 
| -  // specified ScrollBar. |horiz_sb| and |vert_sb| cannot be NULL.
 | 
| -  void SetHorizontalScrollBar(ScrollBar* horiz_sb);
 | 
| -  void SetVerticalScrollBar(ScrollBar* vert_sb);
 | 
| -
 | 
| -  // Sets whether this ScrollView has a focus indicator or not.
 | 
| -  void SetHasFocusIndicator(bool has_focus_indicator);
 | 
| -
 | 
| -  // View overrides:
 | 
| -  gfx::Size GetPreferredSize() const override;
 | 
| -  int GetHeightForWidth(int width) const override;
 | 
| -  void Layout() override;
 | 
| -  bool OnKeyPressed(const ui::KeyEvent& event) override;
 | 
| -  bool OnMouseWheel(const ui::MouseWheelEvent& e) override;
 | 
| -  void OnScrollEvent(ui::ScrollEvent* event) override;
 | 
| -  void OnGestureEvent(ui::GestureEvent* event) override;
 | 
| -  const char* GetClassName() const override;
 | 
| -  void OnNativeThemeChanged(const ui::NativeTheme* theme) override;
 | 
| -
 | 
| -  // ScrollBarController overrides:
 | 
| -  void ScrollToPosition(ScrollBar* source, int position) override;
 | 
| -  int GetScrollIncrement(ScrollBar* source,
 | 
| -                         bool is_page,
 | 
| -                         bool is_positive) override;
 | 
| -
 | 
| -  // TODO(djacobo): Remove this method when http://crbug.com/656198  is closed.
 | 
| -  // Force |contents_viewport_| to enable a Layer().
 | 
| -  void EnableViewPortLayer();
 | 
| -
 | 
| - private:
 | 
| -  friend class test::ScrollViewTestApi;
 | 
| -
 | 
| -  class Viewport;
 | 
| -
 | 
| -  // Used internally by SetHeader() and SetContents() to reset the view.  Sets
 | 
| -  // |member| to |new_view|. If |new_view| is non-null it is added to |parent|.
 | 
| -  void SetHeaderOrContents(View* parent, View* new_view, View** member);
 | 
| -
 | 
| -  // Scrolls the minimum amount necessary to make the specified rectangle
 | 
| -  // visible, in the coordinates of the contents view. The specified rectangle
 | 
| -  // is constrained by the bounds of the contents view. This has no effect if
 | 
| -  // the contents have not been set.
 | 
| -  void ScrollContentsRegionToBeVisible(const gfx::Rect& rect);
 | 
| -
 | 
| -  // Computes the visibility of both scrollbars, taking in account the view port
 | 
| -  // and content sizes.
 | 
| -  void ComputeScrollBarsVisibility(const gfx::Size& viewport_size,
 | 
| -                                   const gfx::Size& content_size,
 | 
| -                                   bool* horiz_is_shown,
 | 
| -                                   bool* vert_is_shown) const;
 | 
| -
 | 
| -  // Shows or hides the scrollbar/corner_view based on the value of
 | 
| -  // |should_show|.
 | 
| -  void SetControlVisibility(View* control, bool should_show);
 | 
| -
 | 
| -  // Update the scrollbars positions given viewport and content sizes.
 | 
| -  void UpdateScrollBarPositions();
 | 
| -
 | 
| -  // Helpers to get and set the current scroll offset (either from the ui::Layer
 | 
| -  // or from the |contents_| origin offset).
 | 
| -  gfx::ScrollOffset CurrentOffset() const;
 | 
| -  void ScrollToOffset(const gfx::ScrollOffset& offset);
 | 
| -
 | 
| -  // Whether the ScrollView scrolls using ui::Layer APIs.
 | 
| -  bool ScrollsWithLayers() const;
 | 
| -
 | 
| -  // Callback entrypoint when hosted Layers are scrolled by the Compositor.
 | 
| -  void OnLayerScrolled(const gfx::ScrollOffset& offset);
 | 
| -
 | 
| -  // Horizontally scrolls the header (if any) to match the contents.
 | 
| -  void ScrollHeader();
 | 
| -
 | 
| -  void AddBorder();
 | 
| -  void UpdateBorder();
 | 
| -
 | 
| -  // The current contents and its viewport. |contents_| is contained in
 | 
| -  // |contents_viewport_|.
 | 
| -  View* contents_;
 | 
| -  View* contents_viewport_;
 | 
| -
 | 
| -  // The current header and its viewport. |header_| is contained in
 | 
| -  // |header_viewport_|.
 | 
| -  View* header_;
 | 
| -  View* header_viewport_;
 | 
| -
 | 
| -  // Horizontal scrollbar.
 | 
| -  ScrollBar* horiz_sb_;
 | 
| -
 | 
| -  // Vertical scrollbar.
 | 
| -  ScrollBar* vert_sb_;
 | 
| -
 | 
| -  // Corner view.
 | 
| -  View* corner_view_;
 | 
| -
 | 
| -  // The min and max height for the bounded scroll view. These are negative
 | 
| -  // values if the view is not bounded.
 | 
| -  int min_height_;
 | 
| -  int max_height_;
 | 
| -
 | 
| -  // The background color given to the viewport (for overscroll), and to the
 | 
| -  // contents when scrolling with layers.
 | 
| -  SkColor background_color_;
 | 
| -
 | 
| -  // If true, never show the horizontal scrollbar (even if the contents is wider
 | 
| -  // than the viewport).
 | 
| -  bool hide_horizontal_scrollbar_;
 | 
| -
 | 
| -  // In Harmony, the indicator is a focus ring. Pre-Harmony, the indicator is a
 | 
| -  // different border painter.
 | 
| -  bool draw_focus_indicator_ = false;
 | 
| -
 | 
| -  // Only needed for pre-Harmony. Remove when Harmony is default.
 | 
| -  bool draw_border_ = false;
 | 
| -
 | 
| -  // Focus ring, if one is installed.
 | 
| -  View* focus_ring_ = nullptr;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(ScrollView);
 | 
| -};
 | 
| -
 | 
| -// VariableRowHeightScrollHelper is intended for views that contain rows of
 | 
| -// varying height. To use a VariableRowHeightScrollHelper create one supplying
 | 
| -// a Controller and delegate GetPageScrollIncrement and GetLineScrollIncrement
 | 
| -// to the helper. VariableRowHeightScrollHelper calls back to the
 | 
| -// Controller to determine row boundaries.
 | 
| -class VariableRowHeightScrollHelper {
 | 
| - public:
 | 
| -  // The origin and height of a row.
 | 
| -  struct RowInfo {
 | 
| -    RowInfo(int origin, int height) : origin(origin), height(height) {}
 | 
| -
 | 
| -    // Origin of the row.
 | 
| -    int origin;
 | 
| -
 | 
| -    // Height of the row.
 | 
| -    int height;
 | 
| -  };
 | 
| -
 | 
| -  // Used to determine row boundaries.
 | 
| -  class Controller {
 | 
| -   public:
 | 
| -    // Returns the origin and size of the row at the specified location.
 | 
| -    virtual VariableRowHeightScrollHelper::RowInfo GetRowInfo(int y) = 0;
 | 
| -  };
 | 
| -
 | 
| -  // Creates a new VariableRowHeightScrollHelper. Controller is
 | 
| -  // NOT deleted by this VariableRowHeightScrollHelper.
 | 
| -  explicit VariableRowHeightScrollHelper(Controller* controller);
 | 
| -  virtual ~VariableRowHeightScrollHelper();
 | 
| -
 | 
| -  // Delegate the View methods of the same name to these. The scroll amount is
 | 
| -  // determined by querying the Controller for the appropriate row to scroll
 | 
| -  // to.
 | 
| -  int GetPageScrollIncrement(ScrollView* scroll_view,
 | 
| -                             bool is_horizontal, bool is_positive);
 | 
| -  int GetLineScrollIncrement(ScrollView* scroll_view,
 | 
| -                             bool is_horizontal, bool is_positive);
 | 
| -
 | 
| - protected:
 | 
| -  // Returns the row information for the row at the specified location. This
 | 
| -  // calls through to the method of the same name on the controller.
 | 
| -  virtual RowInfo GetRowInfo(int y);
 | 
| -
 | 
| - private:
 | 
| -  Controller* controller_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(VariableRowHeightScrollHelper);
 | 
| -};
 | 
| -
 | 
| -// FixedRowHeightScrollHelper is intended for views that contain fixed height
 | 
| -// height rows. To use a FixedRowHeightScrollHelper delegate
 | 
| -// GetPageScrollIncrement and GetLineScrollIncrement to it.
 | 
| -class FixedRowHeightScrollHelper : public VariableRowHeightScrollHelper {
 | 
| - public:
 | 
| -  // Creates a FixedRowHeightScrollHelper. top_margin gives the distance from
 | 
| -  // the top of the view to the first row, and may be 0. row_height gives the
 | 
| -  // height of each row.
 | 
| -  FixedRowHeightScrollHelper(int top_margin, int row_height);
 | 
| -
 | 
| - protected:
 | 
| -  // Calculates the bounds of the row from the top margin and row height.
 | 
| -  RowInfo GetRowInfo(int y) override;
 | 
| -
 | 
| - private:
 | 
| -  int top_margin_;
 | 
| -  int row_height_;
 | 
| -
 | 
| -  DISALLOW_COPY_AND_ASSIGN(FixedRowHeightScrollHelper);
 | 
| -};
 | 
| -
 | 
| -}  // namespace views
 | 
| -
 | 
| -#endif  // UI_VIEWS_CONTROLS_SCROLL_VIEW_H_
 | 
| +// Copyright (c) 2012 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_CONTROLS_SCROLL_VIEW_H_
 | 
| +#define UI_VIEWS_CONTROLS_SCROLL_VIEW_H_
 | 
| +
 | 
| +#include <string>
 | 
| +
 | 
| +#include "base/compiler_specific.h"
 | 
| +#include "base/gtest_prod_util.h"
 | 
| +#include "base/macros.h"
 | 
| +#include "ui/views/controls/scrollbar/scroll_bar.h"
 | 
| +
 | 
| +namespace gfx {
 | 
| +class ScrollOffset;
 | 
| +}
 | 
| +
 | 
| +namespace views {
 | 
| +class ViewObserverTest;
 | 
| +
 | 
| +namespace test {
 | 
| +class ScrollViewTestApi;
 | 
| +}
 | 
| +
 | 
| +/////////////////////////////////////////////////////////////////////////////
 | 
| +//
 | 
| +// ScrollView class
 | 
| +//
 | 
| +// A ScrollView is used to make any View scrollable. The view is added to
 | 
| +// a viewport which takes care of clipping.
 | 
| +//
 | 
| +// In this current implementation both horizontal and vertical scrollbars are
 | 
| +// added as needed.
 | 
| +//
 | 
| +// The scrollview supports keyboard UI and mousewheel.
 | 
| +//
 | 
| +/////////////////////////////////////////////////////////////////////////////
 | 
| +
 | 
| +class VIEWS_EXPORT ScrollView : public View, public ScrollBarController {
 | 
| + public:
 | 
| +  static const char kViewClassName[];
 | 
| +
 | 
| +  ScrollView();
 | 
| +
 | 
| +  ~ScrollView() override;
 | 
| +
 | 
| +  // Creates a ScrollView with a theme specific border.
 | 
| +  static ScrollView* CreateScrollViewWithBorder();
 | 
| +
 | 
| +  // Returns the ScrollView for which |contents| is its contents, or null if
 | 
| +  // |contents| is not in a ScrollView.
 | 
| +  static ScrollView* GetScrollViewForContents(View* contents);
 | 
| +
 | 
| +  // Set the contents. Any previous contents will be deleted. The contents
 | 
| +  // is the view that needs to scroll.
 | 
| +  void SetContents(View* a_view);
 | 
| +  const View* contents() const { return contents_; }
 | 
| +  View* contents() { return contents_; }
 | 
| +
 | 
| +  // Sets the header, deleting the previous header.
 | 
| +  void SetHeader(View* header);
 | 
| +
 | 
| +  // Sets the background color. The default is white when scrolling with layers,
 | 
| +  // otherwise transparent. An opaque color when scrolling with layers ensures
 | 
| +  // fonts can be drawn with subpixel antialiasing.
 | 
| +  void SetBackgroundColor(SkColor color);
 | 
| +
 | 
| +  // Returns the visible region of the content View.
 | 
| +  gfx::Rect GetVisibleRect() const;
 | 
| +
 | 
| +  void set_hide_horizontal_scrollbar(bool visible) {
 | 
| +    hide_horizontal_scrollbar_ = visible;
 | 
| +  }
 | 
| +
 | 
| +  // Turns this scroll view into a bounded scroll view, with a fixed height.
 | 
| +  // By default, a ScrollView will stretch to fill its outer container.
 | 
| +  void ClipHeightTo(int min_height, int max_height);
 | 
| +
 | 
| +  // Returns whether or not the ScrollView is bounded (as set by ClipHeightTo).
 | 
| +  bool is_bounded() const { return max_height_ >= 0 && min_height_ >= 0; }
 | 
| +
 | 
| +  // Retrieves the width/height reserved for scrollbars. These return 0 if the
 | 
| +  // scrollbar has not yet been created or in the case of overlay scrollbars.
 | 
| +  int GetScrollBarLayoutWidth() const;
 | 
| +  int GetScrollBarLayoutHeight() const;
 | 
| +
 | 
| +  // Returns the horizontal/vertical scrollbar. This may return NULL.
 | 
| +  const ScrollBar* horizontal_scroll_bar() const { return horiz_sb_; }
 | 
| +  const ScrollBar* vertical_scroll_bar() const { return vert_sb_; }
 | 
| +
 | 
| +  // Customize the scrollbar design. ScrollView takes the ownership of the
 | 
| +  // specified ScrollBar. |horiz_sb| and |vert_sb| cannot be NULL.
 | 
| +  void SetHorizontalScrollBar(ScrollBar* horiz_sb);
 | 
| +  void SetVerticalScrollBar(ScrollBar* vert_sb);
 | 
| +
 | 
| +  // Sets whether this ScrollView has a focus indicator or not.
 | 
| +  void SetHasFocusIndicator(bool has_focus_indicator);
 | 
| +
 | 
| +  // View overrides:
 | 
| +  gfx::Size GetPreferredSize() const override;
 | 
| +  int GetHeightForWidth(int width) const override;
 | 
| +  void Layout() override;
 | 
| +  bool OnKeyPressed(const ui::KeyEvent& event) override;
 | 
| +  bool OnMouseWheel(const ui::MouseWheelEvent& e) override;
 | 
| +  void OnScrollEvent(ui::ScrollEvent* event) override;
 | 
| +  void OnGestureEvent(ui::GestureEvent* event) override;
 | 
| +  const char* GetClassName() const override;
 | 
| +  void OnNativeThemeChanged(const ui::NativeTheme* theme) override;
 | 
| +  void ViewHierarchyChanged(
 | 
| +      const ViewHierarchyChangedDetails& details) override;
 | 
| +  void OnChildLayerChanged(View* child) override;
 | 
| +
 | 
| +  // ScrollBarController overrides:
 | 
| +  void ScrollToPosition(ScrollBar* source, int position) override;
 | 
| +  int GetScrollIncrement(ScrollBar* source,
 | 
| +                         bool is_page,
 | 
| +                         bool is_positive) override;
 | 
| +
 | 
| +  // TODO(djacobo): Remove this method when http://crbug.com/656198  is closed.
 | 
| +  // Force |contents_viewport_| to enable a Layer().
 | 
| +  void EnableViewPortLayer();
 | 
| +
 | 
| + private:
 | 
| +  friend class test::ScrollViewTestApi;
 | 
| +  FRIEND_TEST_ALL_PREFIXES(ViewObserverTest, ScrollViewChildAddLayerTest);
 | 
| +
 | 
| +  class Viewport;
 | 
| +
 | 
| +  // Used internally by SetHeader() and SetContents() to reset the view.  Sets
 | 
| +  // |member| to |new_view|. If |new_view| is non-null it is added to |parent|.
 | 
| +  void SetHeaderOrContents(View* parent, View* new_view, View** member);
 | 
| +
 | 
| +  // Scrolls the minimum amount necessary to make the specified rectangle
 | 
| +  // visible, in the coordinates of the contents view. The specified rectangle
 | 
| +  // is constrained by the bounds of the contents view. This has no effect if
 | 
| +  // the contents have not been set.
 | 
| +  void ScrollContentsRegionToBeVisible(const gfx::Rect& rect);
 | 
| +
 | 
| +  // Computes the visibility of both scrollbars, taking in account the view port
 | 
| +  // and content sizes.
 | 
| +  void ComputeScrollBarsVisibility(const gfx::Size& viewport_size,
 | 
| +                                   const gfx::Size& content_size,
 | 
| +                                   bool* horiz_is_shown,
 | 
| +                                   bool* vert_is_shown) const;
 | 
| +
 | 
| +  // Shows or hides the scrollbar/corner_view based on the value of
 | 
| +  // |should_show|.
 | 
| +  void SetControlVisibility(View* control, bool should_show);
 | 
| +
 | 
| +  // Update the scrollbars positions given viewport and content sizes.
 | 
| +  void UpdateScrollBarPositions();
 | 
| +
 | 
| +  // Helpers to get and set the current scroll offset (either from the ui::Layer
 | 
| +  // or from the |contents_| origin offset).
 | 
| +  gfx::ScrollOffset CurrentOffset() const;
 | 
| +  void ScrollToOffset(const gfx::ScrollOffset& offset);
 | 
| +
 | 
| +  // Whether the ScrollView scrolls using ui::Layer APIs.
 | 
| +  bool ScrollsWithLayers() const;
 | 
| +
 | 
| +  // Callback entrypoint when hosted Layers are scrolled by the Compositor.
 | 
| +  void OnLayerScrolled(const gfx::ScrollOffset& offset);
 | 
| +
 | 
| +  // Horizontally scrolls the header (if any) to match the contents.
 | 
| +  void ScrollHeader();
 | 
| +
 | 
| +  void AddBorder();
 | 
| +  void UpdateBorder();
 | 
| +
 | 
| +  // Enables view port layering if |child| or any of its descendants has a
 | 
| +  // layer. Returns true if yes. We short circuit the recursion if we enabled
 | 
| +  // layering.
 | 
| +  bool EnableLayeringRecursivelyForChild(View* child);
 | 
| +
 | 
| +  // The current contents and its viewport. |contents_| is contained in
 | 
| +  // |contents_viewport_|.
 | 
| +  View* contents_;
 | 
| +  View* contents_viewport_;
 | 
| +
 | 
| +  // The current header and its viewport. |header_| is contained in
 | 
| +  // |header_viewport_|.
 | 
| +  View* header_;
 | 
| +  View* header_viewport_;
 | 
| +
 | 
| +  // Horizontal scrollbar.
 | 
| +  ScrollBar* horiz_sb_;
 | 
| +
 | 
| +  // Vertical scrollbar.
 | 
| +  ScrollBar* vert_sb_;
 | 
| +
 | 
| +  // Corner view.
 | 
| +  View* corner_view_;
 | 
| +
 | 
| +  // The min and max height for the bounded scroll view. These are negative
 | 
| +  // values if the view is not bounded.
 | 
| +  int min_height_;
 | 
| +  int max_height_;
 | 
| +
 | 
| +  // The background color given to the viewport (for overscroll), and to the
 | 
| +  // contents when scrolling with layers.
 | 
| +  SkColor background_color_;
 | 
| +
 | 
| +  // If true, never show the horizontal scrollbar (even if the contents is wider
 | 
| +  // than the viewport).
 | 
| +  bool hide_horizontal_scrollbar_;
 | 
| +
 | 
| +  // In Harmony, the indicator is a focus ring. Pre-Harmony, the indicator is a
 | 
| +  // different border painter.
 | 
| +  bool draw_focus_indicator_ = false;
 | 
| +
 | 
| +  // Only needed for pre-Harmony. Remove when Harmony is default.
 | 
| +  bool draw_border_ = false;
 | 
| +
 | 
| +  // Focus ring, if one is installed.
 | 
| +  View* focus_ring_ = nullptr;
 | 
| +
 | 
| +  // Set to true if we enabled layering for the viewport.
 | 
| +  bool viewport_layer_enabled_ = false;
 | 
| +
 | 
| +  // Set to true if the scroll with layers feature is enabled.
 | 
| +  const bool scroll_with_layers_enabled_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(ScrollView);
 | 
| +};
 | 
| +
 | 
| +// VariableRowHeightScrollHelper is intended for views that contain rows of
 | 
| +// varying height. To use a VariableRowHeightScrollHelper create one supplying
 | 
| +// a Controller and delegate GetPageScrollIncrement and GetLineScrollIncrement
 | 
| +// to the helper. VariableRowHeightScrollHelper calls back to the
 | 
| +// Controller to determine row boundaries.
 | 
| +class VariableRowHeightScrollHelper {
 | 
| + public:
 | 
| +  // The origin and height of a row.
 | 
| +  struct RowInfo {
 | 
| +    RowInfo(int origin, int height) : origin(origin), height(height) {}
 | 
| +
 | 
| +    // Origin of the row.
 | 
| +    int origin;
 | 
| +
 | 
| +    // Height of the row.
 | 
| +    int height;
 | 
| +  };
 | 
| +
 | 
| +  // Used to determine row boundaries.
 | 
| +  class Controller {
 | 
| +   public:
 | 
| +    // Returns the origin and size of the row at the specified location.
 | 
| +    virtual VariableRowHeightScrollHelper::RowInfo GetRowInfo(int y) = 0;
 | 
| +  };
 | 
| +
 | 
| +  // Creates a new VariableRowHeightScrollHelper. Controller is
 | 
| +  // NOT deleted by this VariableRowHeightScrollHelper.
 | 
| +  explicit VariableRowHeightScrollHelper(Controller* controller);
 | 
| +  virtual ~VariableRowHeightScrollHelper();
 | 
| +
 | 
| +  // Delegate the View methods of the same name to these. The scroll amount is
 | 
| +  // determined by querying the Controller for the appropriate row to scroll
 | 
| +  // to.
 | 
| +  int GetPageScrollIncrement(ScrollView* scroll_view,
 | 
| +                             bool is_horizontal, bool is_positive);
 | 
| +  int GetLineScrollIncrement(ScrollView* scroll_view,
 | 
| +                             bool is_horizontal, bool is_positive);
 | 
| +
 | 
| + protected:
 | 
| +  // Returns the row information for the row at the specified location. This
 | 
| +  // calls through to the method of the same name on the controller.
 | 
| +  virtual RowInfo GetRowInfo(int y);
 | 
| +
 | 
| + private:
 | 
| +  Controller* controller_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(VariableRowHeightScrollHelper);
 | 
| +};
 | 
| +
 | 
| +// FixedRowHeightScrollHelper is intended for views that contain fixed height
 | 
| +// height rows. To use a FixedRowHeightScrollHelper delegate
 | 
| +// GetPageScrollIncrement and GetLineScrollIncrement to it.
 | 
| +class FixedRowHeightScrollHelper : public VariableRowHeightScrollHelper {
 | 
| + public:
 | 
| +  // Creates a FixedRowHeightScrollHelper. top_margin gives the distance from
 | 
| +  // the top of the view to the first row, and may be 0. row_height gives the
 | 
| +  // height of each row.
 | 
| +  FixedRowHeightScrollHelper(int top_margin, int row_height);
 | 
| +
 | 
| + protected:
 | 
| +  // Calculates the bounds of the row from the top margin and row height.
 | 
| +  RowInfo GetRowInfo(int y) override;
 | 
| +
 | 
| + private:
 | 
| +  int top_margin_;
 | 
| +  int row_height_;
 | 
| +
 | 
| +  DISALLOW_COPY_AND_ASSIGN(FixedRowHeightScrollHelper);
 | 
| +};
 | 
| +
 | 
| +}  // namespace views
 | 
| +
 | 
| +#endif  // UI_VIEWS_CONTROLS_SCROLL_VIEW_H_
 | 
| 
 |