| Index: ui/views/controls/slider.cc
 | 
| diff --git a/ui/views/controls/slider.cc b/ui/views/controls/slider.cc
 | 
| index 6929fb0016b03556015d7476b3a13625bbc0f368..97b5eaf1756883b667133f3470a067a82c79c1b5 100644
 | 
| --- a/ui/views/controls/slider.cc
 | 
| +++ b/ui/views/controls/slider.cc
 | 
| @@ -8,11 +8,13 @@
 | 
|  #include "base/message_loop.h"
 | 
|  #include "base/stringprintf.h"
 | 
|  #include "base/utf_string_conversions.h"
 | 
| +#include "grit/ui_resources.h"
 | 
|  #include "third_party/skia/include/core/SkCanvas.h"
 | 
|  #include "third_party/skia/include/core/SkColor.h"
 | 
|  #include "third_party/skia/include/core/SkPaint.h"
 | 
|  #include "ui/base/accessibility/accessible_view_state.h"
 | 
|  #include "ui/base/animation/slide_animation.h"
 | 
| +#include "ui/base/resource/resource_bundle.h"
 | 
|  #include "ui/gfx/canvas.h"
 | 
|  #include "ui/gfx/point.h"
 | 
|  #include "ui/gfx/rect.h"
 | 
| @@ -20,6 +22,28 @@
 | 
|  
 | 
|  namespace {
 | 
|  const int kSlideValueChangeDurationMS = 150;
 | 
| +
 | 
| +const int kBarImagesActive[] = {
 | 
| +    IDR_SLIDER_ACTIVE_LEFT,
 | 
| +    IDR_SLIDER_ACTIVE_CENTER,
 | 
| +    IDR_SLIDER_PRESSED_CENTER,
 | 
| +    IDR_SLIDER_PRESSED_RIGHT,
 | 
| +};
 | 
| +
 | 
| +const int kBarImagesDisabled[] = {
 | 
| +    IDR_SLIDER_DISABLED_LEFT,
 | 
| +    IDR_SLIDER_DISABLED_CENTER,
 | 
| +    IDR_SLIDER_DISABLED_CENTER,
 | 
| +    IDR_SLIDER_DISABLED_RIGHT,
 | 
| +};
 | 
| +
 | 
| +// The image chunks.
 | 
| +enum BorderElements {
 | 
| +  LEFT,
 | 
| +  CENTER_LEFT,
 | 
| +  CENTER_RIGHT,
 | 
| +  RIGHT,
 | 
| +};
 | 
|  }
 | 
|  
 | 
|  namespace views {
 | 
| @@ -32,9 +56,12 @@ Slider::Slider(SliderListener* listener, Orientation orientation)
 | 
|        animating_value_(0.f),
 | 
|        value_is_valid_(false),
 | 
|        accessibility_events_enabled_(true),
 | 
| -      focus_border_color_(0) {
 | 
| +      focus_border_color_(0),
 | 
| +      bar_active_images_(kBarImagesActive),
 | 
| +      bar_disabled_images_(kBarImagesDisabled) {
 | 
|    EnableCanvasFlippingForRTLUI(true);
 | 
|    set_focusable(true);
 | 
| +  UpdateState(true);
 | 
|  }
 | 
|  
 | 
|  Slider::~Slider() {
 | 
| @@ -93,6 +120,21 @@ void Slider::MoveButtonTo(const gfx::Point& point) {
 | 
|    }
 | 
|  }
 | 
|  
 | 
| +void Slider::UpdateState(bool control_on) {
 | 
| +  ResourceBundle& rb = ResourceBundle::GetSharedInstance();
 | 
| +  if (control_on) {
 | 
| +    thumb_ = rb.GetImageNamed(IDR_SLIDER_ACTIVE_THUMB).ToImageSkia();
 | 
| +    for (int i = 0; i < 4; ++i)
 | 
| +      images_[i] = rb.GetImageNamed(bar_active_images_[i]).ToImageSkia();
 | 
| +  } else {
 | 
| +    thumb_ = rb.GetImageNamed(IDR_SLIDER_DISABLED_THUMB).ToImageSkia();
 | 
| +    for (int i = 0; i < 4; ++i)
 | 
| +      images_[i] = rb.GetImageNamed(bar_disabled_images_[i]).ToImageSkia();
 | 
| +  }
 | 
| +  bar_height_ = images_[LEFT]->height();
 | 
| +  SchedulePaint();
 | 
| +}
 | 
| +
 | 
|  void Slider::SetAccessibleName(const string16& name) {
 | 
|    accessible_name_ = name;
 | 
|  }
 | 
| @@ -107,33 +149,56 @@ gfx::Size Slider::GetPreferredSize() {
 | 
|  }
 | 
|  
 | 
|  void Slider::OnPaint(gfx::Canvas* canvas) {
 | 
| -  // TODO(sad): The painting code should use NativeTheme for various platforms.
 | 
| -  const int kButtonRadius = 5;
 | 
| -  const int kLineThickness = 5;
 | 
| -  const SkColor kFullColor = SkColorSetARGB(125, 0, 0, 0);
 | 
| -  const SkColor kEmptyColor = SkColorSetARGB(50, 0, 0, 0);
 | 
| -  const SkColor kButtonColor = SK_ColorBLACK;
 | 
| -
 | 
|    gfx::Rect content = GetContentsBounds();
 | 
|    float value = move_animation_.get() && move_animation_->is_animating() ?
 | 
|        animating_value_ : value_;
 | 
| -
 | 
| -  int button_cx = 0, button_cy = 0;
 | 
|    if (orientation_ == HORIZONTAL) {
 | 
| -    int w = content.width() - kButtonRadius * 2;
 | 
| +    // Paint slider bar with image resources.
 | 
| +
 | 
| +    // Inset the slider bar a little bit, so that the left or the right end of
 | 
| +    // the slider bar will not be exposed under the thumb button when the thumb
 | 
| +    // button slides to the left most or right most position.
 | 
| +    const int kBarInsetX = 2;
 | 
| +    int bar_width = content.width() - kBarInsetX * 2;
 | 
| +    int bar_cy = content.height() / 2 - bar_height_ / 2;
 | 
| +
 | 
| +    int w = content.width() - thumb_->width();
 | 
|      int full = value * w;
 | 
| -    int empty = w - full;
 | 
| -    int y = content.height() / 2 - kLineThickness / 2;
 | 
| -    canvas->FillRect(gfx::Rect(content.x() + kButtonRadius, y,
 | 
| -                               full, kLineThickness),
 | 
| -                     kFullColor);
 | 
| -    canvas->FillRect(gfx::Rect(content.x() + full + 2 * kButtonRadius, y,
 | 
| -                          std::max(0, empty - kButtonRadius), kLineThickness),
 | 
| -                     kEmptyColor);
 | 
| +    int middle = std::max(full, images_[LEFT]->width());
 | 
|  
 | 
| -    button_cx = content.x() + full + kButtonRadius;
 | 
| -    button_cy = y + kLineThickness / 2;
 | 
| +    canvas->Save();
 | 
| +    canvas->Translate(gfx::Point(kBarInsetX, bar_cy));
 | 
| +    canvas->DrawImageInt(*images_[LEFT], 0, 0);
 | 
| +    canvas->DrawImageInt(*images_[RIGHT],
 | 
| +                         bar_width - images_[RIGHT]->width(),
 | 
| +                         0);
 | 
| +    canvas->TileImageInt(*images_[CENTER_LEFT],
 | 
| +                         images_[LEFT]->width(),
 | 
| +                         0,
 | 
| +                         middle - images_[LEFT]->width(),
 | 
| +                         bar_height_);
 | 
| +    canvas->TileImageInt(*images_[CENTER_RIGHT],
 | 
| +                         middle,
 | 
| +                         0,
 | 
| +                         bar_width - middle - images_[RIGHT]->width(),
 | 
| +                         bar_height_);
 | 
| +    canvas->Restore();
 | 
| +
 | 
| +    // Paint slider thumb.
 | 
| +    int button_cx = content.x() + full;
 | 
| +    int thumb_y = content.height() / 2 - thumb_->height() / 2;
 | 
| +    canvas->DrawImageInt(*thumb_, button_cx, thumb_y);
 | 
|    } else {
 | 
| +    // TODO(jennyz): draw vertical slider bar with resources.
 | 
| +    // TODO(sad): The painting code should use NativeTheme for various
 | 
| +    // platforms.
 | 
| +    const int kButtonRadius = 5;
 | 
| +    const int kLineThickness = 5;
 | 
| +    const SkColor kFullColor = SkColorSetARGB(125, 0, 0, 0);
 | 
| +    const SkColor kEmptyColor = SkColorSetARGB(50, 0, 0, 0);
 | 
| +    const SkColor kButtonColor = SK_ColorBLACK;
 | 
| +
 | 
| +    int button_cx = 0, button_cy = 0;
 | 
|      int h = content.height() - kButtonRadius * 2;
 | 
|      int full = value * h;
 | 
|      int empty = h - full;
 | 
| @@ -147,14 +212,14 @@ void Slider::OnPaint(gfx::Canvas* canvas) {
 | 
|  
 | 
|      button_cx = x + kLineThickness / 2;
 | 
|      button_cy = content.y() + empty + kButtonRadius;
 | 
| -  }
 | 
|  
 | 
| -  SkPaint paint;
 | 
| -  paint.setStyle(SkPaint::kFill_Style);
 | 
| -  paint.setAntiAlias(true);
 | 
| -  paint.setColor(kButtonColor);
 | 
| -  canvas->sk_canvas()->drawCircle(button_cx, button_cy, kButtonRadius, paint);
 | 
| -  View::OnPaint(canvas);
 | 
| +    SkPaint paint;
 | 
| +    paint.setStyle(SkPaint::kFill_Style);
 | 
| +    paint.setAntiAlias(true);
 | 
| +    paint.setColor(kButtonColor);
 | 
| +    canvas->sk_canvas()->drawCircle(button_cx, button_cy, kButtonRadius, paint);
 | 
| +    View::OnPaint(canvas);
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  bool Slider::OnMousePressed(const views::MouseEvent& event) {
 | 
| 
 |