Home | History | Annotate | Download | only in controls
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef UI_VIEWS_CONTROLS_SLIDER_H_
      6 #define UI_VIEWS_CONTROLS_SLIDER_H_
      7 
      8 #include "ui/gfx/animation/animation_delegate.h"
      9 #include "ui/views/view.h"
     10 #include "ui/views/views_export.h"
     11 
     12 typedef unsigned int SkColor;
     13 
     14 namespace gfx {
     15 class ImageSkia;
     16 class SlideAnimation;
     17 }
     18 
     19 namespace views {
     20 
     21 namespace test {
     22 class SliderTestApi;
     23 }
     24 
     25 class Slider;
     26 
     27 enum SliderChangeReason {
     28   VALUE_CHANGED_BY_USER,  // value was changed by the user (by clicking, e.g.)
     29   VALUE_CHANGED_BY_API,   // value was changed by a call to SetValue.
     30 };
     31 
     32 class VIEWS_EXPORT SliderListener {
     33  public:
     34   virtual void SliderValueChanged(Slider* sender,
     35                                   float value,
     36                                   float old_value,
     37                                   SliderChangeReason reason) = 0;
     38 
     39   // Invoked when a drag starts or ends (more specifically, when the mouse
     40   // button is pressed or released).
     41   virtual void SliderDragStarted(Slider* sender) {}
     42   virtual void SliderDragEnded(Slider* sender) {}
     43 
     44  protected:
     45   virtual ~SliderListener() {}
     46 };
     47 
     48 class VIEWS_EXPORT Slider : public View, public gfx::AnimationDelegate {
     49  public:
     50   enum Orientation {
     51     HORIZONTAL,
     52     VERTICAL
     53   };
     54 
     55   Slider(SliderListener* listener, Orientation orientation);
     56   virtual ~Slider();
     57 
     58   float value() const { return value_; }
     59   void SetValue(float value);
     60 
     61   // Set the delta used for changing the value via keyboard.
     62   void SetKeyboardIncrement(float increment);
     63 
     64   void SetAccessibleName(const base::string16& name);
     65 
     66   void set_enable_accessibility_events(bool enabled) {
     67     accessibility_events_enabled_ = enabled;
     68   }
     69 
     70   void set_focus_border_color(SkColor color) { focus_border_color_ = color; }
     71 
     72   // Update UI based on control on/off state.
     73   void UpdateState(bool control_on);
     74 
     75  private:
     76   friend class test::SliderTestApi;
     77 
     78   void SetValueInternal(float value, SliderChangeReason reason);
     79 
     80   // Should be called on the Mouse Down event. Used to calculate relative
     81   // position of the mouse cursor (or the touch point) on the button to
     82   // accurately move the button using the MoveButtonTo() method.
     83   void PrepareForMove(const gfx::Point& point);
     84 
     85   // Moves the button to the specified point and updates the value accordingly.
     86   void MoveButtonTo(const gfx::Point& point);
     87 
     88   void OnPaintFocus(gfx::Canvas* canvas);
     89 
     90   // Notify the listener_, if not NULL, that dragging started.
     91   void OnSliderDragStarted();
     92 
     93   // Notify the listener_, if not NULL, that dragging ended.
     94   void OnSliderDragEnded();
     95 
     96   // views::View overrides:
     97   virtual gfx::Size GetPreferredSize() const OVERRIDE;
     98   virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
     99   virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
    100   virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
    101   virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
    102   virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
    103   virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
    104   virtual void OnFocus() OVERRIDE;
    105   virtual void OnBlur() OVERRIDE;
    106 
    107   // ui::EventHandler overrides:
    108   virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
    109 
    110   // gfx::AnimationDelegate overrides:
    111   virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
    112 
    113   void set_listener(SliderListener* listener) {
    114     listener_ = listener;
    115   }
    116 
    117   SliderListener* listener_;
    118   Orientation orientation_;
    119 
    120   scoped_ptr<gfx::SlideAnimation> move_animation_;
    121 
    122   float value_;
    123   float keyboard_increment_;
    124   float animating_value_;
    125   bool value_is_valid_;
    126   base::string16 accessible_name_;
    127   bool accessibility_events_enabled_;
    128   SkColor focus_border_color_;
    129 
    130   // Relative position of the mouse cursor (or the touch point) on the slider's
    131   // button.
    132   gfx::Point initial_button_offset_;
    133 
    134   const int* bar_active_images_;
    135   const int* bar_disabled_images_;
    136   const gfx::ImageSkia* thumb_;
    137   const gfx::ImageSkia* images_[4];
    138   int bar_height_;
    139 
    140   DISALLOW_COPY_AND_ASSIGN(Slider);
    141 };
    142 
    143 }  // namespace views
    144 
    145 #endif  // UI_VIEWS_CONTROLS_SLIDER_H_
    146