12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/scrollbar/kennedy_scroll_bar.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkColor.h" 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/skia/include/core/SkXfermode.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/canvas.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/background.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/border.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/scrollbar/base_scroll_bar_thumb.h" 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace views { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace { 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kScrollbarWidth = 10; 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int kThumbMinimumSize = kScrollbarWidth * 2; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kBorderColor = SkColorSetARGB(32, 0, 0, 0); 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kThumbHoverColor = SkColorSetARGB(128, 0, 0, 0); 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kThumbDefaultColor = SkColorSetARGB(64, 0, 0, 0); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const SkColor kTrackHoverColor = SkColorSetARGB(32, 0, 0, 0); 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class KennedyScrollBarThumb : public BaseScrollBarThumb { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) explicit KennedyScrollBarThumb(BaseScrollBar* scroll_bar); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~KennedyScrollBarThumb(); 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // View overrides: 31cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual gfx::Size GetPreferredSize() const OVERRIDE; 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE; 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(KennedyScrollBarThumb); 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KennedyScrollBarThumb::KennedyScrollBarThumb(BaseScrollBar* scroll_bar) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : BaseScrollBarThumb(scroll_bar) { 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KennedyScrollBarThumb::~KennedyScrollBarThumb() { 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size KennedyScrollBarThumb::GetPreferredSize() const { 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return gfx::Size(kThumbMinimumSize, kThumbMinimumSize); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KennedyScrollBarThumb::OnPaint(gfx::Canvas* canvas) { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect local_bounds(GetLocalBounds()); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(local_bounds, 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (GetState() == CustomButton::STATE_HOVERED || 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetState() == CustomButton::STATE_PRESSED) ? 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kThumbHoverColor : kThumbDefaultColor); 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawRect(local_bounds, kBorderColor); 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KennedyScrollBar::KennedyScrollBar(bool horizontal) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : BaseScrollBar(horizontal, new KennedyScrollBarThumb(this)) { 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) set_notify_enter_exit_on_child(true); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)KennedyScrollBar::~KennedyScrollBar() { 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)gfx::Rect KennedyScrollBar::GetTrackBounds() const { 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect local_bounds(GetLocalBounds()); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Size track_size = local_bounds.size(); 71868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) track_size.SetToMax(GetThumb()->size()); 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) local_bounds.set_size(track_size); 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return local_bounds; 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)int KennedyScrollBar::GetLayoutSize() const { 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kScrollbarWidth; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)gfx::Size KennedyScrollBar::GetPreferredSize() const { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return GetTrackBounds().size(); 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KennedyScrollBar::Layout() { 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect thumb_bounds = GetTrackBounds(); 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) BaseScrollBarThumb* thumb = GetThumb(); 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (IsHorizontal()) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumb_bounds.set_x(thumb->x()); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumb_bounds.set_width(thumb->width()); 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumb_bounds.set_y(thumb->y()); 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumb_bounds.set_height(thumb->height()); 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) thumb->SetBoundsRect(thumb_bounds); 952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void KennedyScrollBar::OnPaint(gfx::Canvas* canvas) { 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CustomButton::ButtonState state = GetThumbTrackState(); 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if ((state == CustomButton::STATE_HOVERED) || 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (state == CustomButton::STATE_PRESSED)) { 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) gfx::Rect local_bounds(GetLocalBounds()); 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->FillRect(local_bounds, kTrackHoverColor); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) canvas->DrawRect(local_bounds, kBorderColor); 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace views 108