15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scrollbar/native_scroll_bar_views.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
8d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/path.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/button/custom_button.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/focusable_border.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scrollbar/base_scroll_bar_button.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scrollbar/native_scroll_bar.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/scrollbar/scroll_bar.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wrapper for the scroll buttons.
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollBarButton : public BaseScrollBarButton {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum Type {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UP,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DOWN,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LEFT,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    RIGHT,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScrollBarButton(ButtonListener* listener, Type type);
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ScrollBarButton();
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
35cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual const char* GetClassName() const OVERRIDE {
37b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return "ScrollBarButton";
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams GetNativeThemeParams() const;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::Part GetNativeThemePart() const;
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::State GetNativeThemeState() const;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Type type_;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Wrapper for the scroll thumb
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ScrollBarThumb : public BaseScrollBarThumb {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit ScrollBarThumb(BaseScrollBar* scroll_bar);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ScrollBarThumb();
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
58b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  virtual const char* GetClassName() const OVERRIDE {
59b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    return "ScrollBarThumb";
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams GetNativeThemeParams() const;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::Part GetNativeThemePart() const;
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::State GetNativeThemeState() const;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScrollBar* scroll_bar_;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollBarButton
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
76b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)ScrollBarButton::ScrollBarButton(ButtonListener* listener, Type type)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : BaseScrollBarButton(listener),
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      type_(type) {
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetFocusable(false);
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetAccessibilityFocusable(false);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollBarButton::~ScrollBarButton() {
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ScrollBarButton::GetPreferredSize() const {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetNativeTheme()->GetPartSize(GetNativeThemePart(),
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetNativeThemeState(),
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetNativeThemeParams());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScrollBarButton::OnPaint(gfx::Canvas* canvas) {
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds(GetPreferredSize());
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNativeTheme()->Paint(canvas->sk_canvas(), GetNativeThemePart(),
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetNativeThemeState(), bounds,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetNativeThemeParams());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::NativeTheme::ExtraParams
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollBarButton::GetNativeThemeParams() const {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams params;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state_) {
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_HOVERED:
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.scrollbar_arrow.is_hovering = true;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      params.scrollbar_arrow.is_hovering = false;
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return params;
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::NativeTheme::Part
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollBarButton::GetNativeThemePart() const {
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type_) {
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case UP:
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::NativeTheme::kScrollbarUpArrow;
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case DOWN:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::NativeTheme::kScrollbarDownArrow;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case LEFT:
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::NativeTheme::kScrollbarLeftArrow;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case RIGHT:
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::NativeTheme::kScrollbarRightArrow;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return ui::NativeTheme::kScrollbarUpArrow;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::NativeTheme::State
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollBarButton::GetNativeThemeState() const {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::State state;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (state_) {
1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_HOVERED:
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kHovered;
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_PRESSED:
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kPressed;
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_DISABLED:
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kDisabled;
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_NORMAL:
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kNormal;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// ScrollBarThumb
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollBarThumb::ScrollBarThumb(BaseScrollBar* scroll_bar)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : BaseScrollBarThumb(scroll_bar),
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      scroll_bar_(scroll_bar) {
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetFocusable(false);
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  SetAccessibilityFocusable(false);
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ScrollBarThumb::~ScrollBarThumb() {
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size ScrollBarThumb::GetPreferredSize() const {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GetNativeTheme()->GetPartSize(GetNativeThemePart(),
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetNativeThemeState(),
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                       GetNativeThemeParams());
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ScrollBarThumb::OnPaint(gfx::Canvas* canvas) {
1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const gfx::Rect local_bounds(GetLocalBounds());
1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::NativeTheme::State theme_state = GetNativeThemeState();
1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::NativeTheme::ExtraParams extra_params(GetNativeThemeParams());
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNativeTheme()->Paint(canvas->sk_canvas(),
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                          GetNativeThemePart(),
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          theme_state,
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          local_bounds,
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          extra_params);
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  const ui::NativeTheme::Part gripper_part = scroll_bar_->IsHorizontal() ?
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::NativeTheme::kScrollbarHorizontalGripper :
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ui::NativeTheme::kScrollbarVerticalGripper;
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  GetNativeTheme()->Paint(canvas->sk_canvas(), gripper_part, theme_state,
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          local_bounds, extra_params);
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)ui::NativeTheme::ExtraParams ScrollBarThumb::GetNativeThemeParams() const {
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This gives the behavior we want.
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams params;
1922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  params.scrollbar_thumb.is_hovering =
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      (GetState() != CustomButton::STATE_HOVERED);
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return params;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::NativeTheme::Part ScrollBarThumb::GetNativeThemePart() const {
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (scroll_bar_->IsHorizontal())
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return ui::NativeTheme::kScrollbarHorizontalThumb;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::NativeTheme::kScrollbarVerticalThumb;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::NativeTheme::State ScrollBarThumb::GetNativeThemeState() const {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::State state;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (GetState()) {
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_HOVERED:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kHovered;
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_PRESSED:
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kPressed;
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_DISABLED:
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kDisabled;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case CustomButton::STATE_NORMAL:
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      state = ui::NativeTheme::kNormal;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return state;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeScrollBarViews, public:
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
230b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char NativeScrollBarViews::kViewClassName[] = "NativeScrollBarViews";
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeScrollBarViews::NativeScrollBarViews(NativeScrollBar* scroll_bar)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : BaseScrollBar(scroll_bar->IsHorizontal(),
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    new ScrollBarThumb(this)),
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      native_scroll_bar_(scroll_bar) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_controller(native_scroll_bar_->controller());
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_scroll_bar_->IsHorizontal()) {
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_button_ = new ScrollBarButton(this, ScrollBarButton::LEFT);
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_button_ = new ScrollBarButton(this, ScrollBarButton::RIGHT);
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    part_ = ui::NativeTheme::kScrollbarHorizontalTrack;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    prev_button_ = new ScrollBarButton(this, ScrollBarButton::UP);
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_button_ = new ScrollBarButton(this, ScrollBarButton::DOWN);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    part_ = ui::NativeTheme::kScrollbarVerticalTrack;
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  state_ = ui::NativeTheme::kNormal;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(prev_button_);
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddChildView(next_button_);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prev_button_->set_context_menu_controller(this);
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  next_button_->set_context_menu_controller(this);
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeScrollBarViews::~NativeScrollBarViews() {
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeScrollBarViews, View overrides:
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeScrollBarViews::Layout() {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = prev_button_->GetPreferredSize();
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  prev_button_->SetBounds(0, 0, size.width(), size.height());
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_scroll_bar_->IsHorizontal()) {
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_button_->SetBounds(width() - size.width(), 0,
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size.width(), size.height());
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    next_button_->SetBounds(0, height() - size.height(),
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            size.width(), size.height());
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetThumb()->SetBoundsRect(GetTrackBounds());
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeScrollBarViews::OnPaint(gfx::Canvas* canvas) {
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = GetTrackBounds();
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (bounds.IsEmpty())
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params_.scrollbar_track.track_x = bounds.x();
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params_.scrollbar_track.track_y = bounds.y();
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params_.scrollbar_track.track_width = bounds.width();
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params_.scrollbar_track.track_height = bounds.height();
290c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  params_.scrollbar_track.classic_state = 0;
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GetNativeTheme()->Paint(canvas->sk_canvas(), part_, state_, bounds, params_);
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size NativeScrollBarViews::GetPreferredSize() const {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ui::NativeTheme* theme = native_scroll_bar_->GetNativeTheme();
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_scroll_bar_->IsHorizontal())
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return gfx::Size(0, GetHorizontalScrollBarHeight(theme));
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return gfx::Size(GetVerticalScrollBarWidth(theme), 0);
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
302b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)const char* NativeScrollBarViews::GetClassName() const {
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return kViewClassName;
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeScrollBarViews::GetLayoutSize() const {
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = prev_button_->GetPreferredSize();
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return IsHorizontal() ? size.height() : size.width();
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeScrollBarViews::ScrollToPosition(int position) {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  controller()->ScrollToPosition(native_scroll_bar_, position);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeScrollBarViews::GetScrollIncrement(bool is_page, bool is_positive) {
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return controller()->GetScrollIncrement(native_scroll_bar_,
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          is_page,
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          is_positive);
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BaseButton::ButtonListener overrides:
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeScrollBarViews::ButtonPressed(Button* sender,
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const ui::Event& event) {
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (sender == prev_button_) {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollByAmount(SCROLL_PREV_LINE);
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else if (sender == next_button_) {
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ScrollByAmount(SCROLL_NEXT_LINE);
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeScrollBarViews, NativeScrollBarWrapper overrides:
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeScrollBarViews::GetPosition() const {
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return BaseScrollBar::GetPosition();
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)View* NativeScrollBarViews::GetView() {
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return this;
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void NativeScrollBarViews::Update(int viewport_size,
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int content_size,
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  int current_pos) {
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BaseScrollBar::Update(viewport_size, content_size, current_pos);
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativeScrollBarViews, private:
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::Rect NativeScrollBarViews::GetTrackBounds() const {
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds = GetLocalBounds();
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size size = prev_button_->GetPreferredSize();
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  BaseScrollBarThumb* thumb = GetThumb();
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (native_scroll_bar_->IsHorizontal()) {
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_x(bounds.x() + size.width());
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_width(std::max(0, bounds.width() - 2 * size.width()));
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_height(thumb->GetPreferredSize().height());
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } else {
3635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_y(bounds.y() + size.height());
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_height(std::max(0, bounds.height() - 2 * size.height()));
3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bounds.set_width(thumb->GetPreferredSize().width());
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return bounds;
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)////////////////////////////////////////////////////////////////////////////////
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NativewScrollBarWrapper, public:
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)NativeScrollBarWrapper* NativeScrollBarWrapper::CreateWrapper(
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    NativeScrollBar* scroll_bar) {
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return new NativeScrollBarViews(scroll_bar);
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeScrollBarWrapper::GetHorizontalScrollBarHeight(
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::NativeTheme* theme) {
3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!theme)
3842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    theme = ui::NativeTheme::instance();
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams button_params;
3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_params.scrollbar_arrow.is_hovering = false;
3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size button_size = theme->GetPartSize(
3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kScrollbarLeftArrow,
3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kNormal,
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      button_params);
3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams thumb_params;
3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  thumb_params.scrollbar_thumb.is_hovering = false;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size track_size = theme->GetPartSize(
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kScrollbarHorizontalThumb,
3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kNormal,
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      thumb_params);
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::max(track_size.height(), button_size.height());
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int NativeScrollBarWrapper::GetVerticalScrollBarWidth(
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const ui::NativeTheme* theme) {
4052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (!theme)
4062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    theme = ui::NativeTheme::instance();
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams button_params;
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  button_params.scrollbar_arrow.is_hovering = false;
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size button_size = theme->GetPartSize(
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kScrollbarUpArrow,
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kNormal,
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      button_params);
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::NativeTheme::ExtraParams thumb_params;
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  thumb_params.scrollbar_thumb.is_hovering = false;
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Size track_size = theme->GetPartSize(
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kScrollbarVerticalThumb,
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      ui::NativeTheme::kNormal,
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      thumb_params);
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::max(track_size.width(), button_size.width());
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace views
425