Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / ui / views / controls / slider.h
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   ~Slider() override;
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   gfx::Size GetPreferredSize() const override;
98   void OnPaint(gfx::Canvas* canvas) override;
99   bool OnMousePressed(const ui::MouseEvent& event) override;
100   bool OnMouseDragged(const ui::MouseEvent& event) override;
101   void OnMouseReleased(const ui::MouseEvent& event) override;
102   bool OnKeyPressed(const ui::KeyEvent& event) override;
103   void GetAccessibleState(ui::AXViewState* state) override;
104   void OnFocus() override;
105   void OnBlur() override;
106
107   // ui::EventHandler overrides:
108   void OnGestureEvent(ui::GestureEvent* event) override;
109
110   // gfx::AnimationDelegate overrides:
111   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_