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