12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2012 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)
5868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#ifndef UI_VIEWS_CONTROLS_SLIDER_H_
62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define UI_VIEWS_CONTROLS_SLIDER_H_
72a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/gfx/animation/animation_delegate.h"
92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/view.h"
102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/views_export.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
12c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef unsigned int SkColor;
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)namespace gfx {
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class ImageSkia;
16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)class SlideAnimation;
172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace views {
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class SliderTestApi;
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class Slider;
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)enum SliderChangeReason {
28ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  VALUE_CHANGED_BY_USER,  // value was changed by the user (by clicking, e.g.)
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  VALUE_CHANGED_BY_API,   // value was changed by a call to SetValue.
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
31ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass VIEWS_EXPORT SliderListener {
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) public:
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual void SliderValueChanged(Slider* sender,
354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                                  float value,
362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  float old_value,
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  SliderChangeReason reason) = 0;
382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Invoked when a drag starts or ends (more specifically, when the mouse
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // button is pressed or released).
412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SliderDragStarted(Slider* sender) {}
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void SliderDragEnded(Slider* sender) {}
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) protected:
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  virtual ~SliderListener() {}
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VIEWS_EXPORT Slider : public View, public gfx::AnimationDelegate {
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public:
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  enum Orientation {
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    HORIZONTAL,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    VERTICAL
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  Slider(SliderListener* listener, Orientation orientation);
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~Slider();
57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  float value() const { return value_; }
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SetValue(float value);
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Set the delta used for changing the value via keyboard.
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void SetKeyboardIncrement(float increment);
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
64010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  void SetAccessibleName(const base::string16& name);
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  void set_enable_accessibility_events(bool enabled) {
6790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)    accessibility_events_enabled_ = enabled;
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  }
6990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void set_focus_border_color(SkColor color) { focus_border_color_ = color; }
7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  // Update UI based on control on/off state.
7390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  void UpdateState(bool control_on);
7490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private:
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  friend class test::SliderTestApi;
77ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
78ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void SetValueInternal(float value, SliderChangeReason reason);
79ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
80ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Should be called on the Mouse Down event. Used to calculate relative
81ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // position of the mouse cursor (or the touch point) on the button to
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // accurately move the button using the MoveButtonTo() method.
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  void PrepareForMove(const gfx::Point& point);
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Moves the button to the specified point and updates the value accordingly.
862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MoveButtonTo(const gfx::Point& point);
870f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
880f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void OnPaintFocus(gfx::Canvas* canvas);
890f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
900f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Notify the listener_, if not NULL, that dragging started.
910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void OnSliderDragStarted();
920f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
930f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // Notify the listener_, if not NULL, that dragging ended.
940f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  void OnSliderDragEnded();
950f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
960f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  // views::View overrides:
970f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual gfx::Size GetPreferredSize() const OVERRIDE;
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
990f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual bool OnMousePressed(const ui::MouseEvent& event) OVERRIDE;
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  virtual bool OnMouseDragged(const ui::MouseEvent& event) OVERRIDE;
1010f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual void OnMouseReleased(const ui::MouseEvent& event) OVERRIDE;
1020f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  virtual bool OnKeyPressed(const ui::KeyEvent& event) OVERRIDE;
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void GetAccessibleState(ui::AXViewState* state) OVERRIDE;
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnFocus() OVERRIDE;
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnBlur() OVERRIDE;
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // ui::EventHandler overrides:
108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual void OnGestureEvent(ui::GestureEvent* event) OVERRIDE;
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1108bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  // gfx::AnimationDelegate overrides:
111c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void AnimationProgressed(const gfx::Animation* animation) OVERRIDE;
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  void set_listener(SliderListener* listener) {
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    listener_ = listener;
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  }
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SliderListener* listener_;
118a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  Orientation orientation_;
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  scoped_ptr<gfx::SlideAnimation> move_animation_;
121a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
122a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  float value_;
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  float keyboard_increment_;
124a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  float animating_value_;
125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool value_is_valid_;
126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 accessible_name_;
127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  bool accessibility_events_enabled_;
128a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  SkColor focus_border_color_;
129a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
130a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // Relative position of the mouse cursor (or the touch point) on the slider's
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  // button.
132a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  gfx::Point initial_button_offset_;
133eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  const int* bar_active_images_;
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  const int* bar_disabled_images_;
1361e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::ImageSkia* thumb_;
1371e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  const gfx::ImageSkia* images_[4];
1381e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  int bar_height_;
1391e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(Slider);
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)};
142a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
143a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)}  // namespace views
144a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)
145a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif  // UI_VIEWS_CONTROLS_SLIDER_H_
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)