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)