0b4c34441a976a29a7f2460c58ebd0b5c272de46
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / internal / controls / scroll-bar / scroll-bar-impl.h
1 #ifndef __DALI_TOOLKIT_INTERNAL_SCROLL_BAR_H__
2 #define __DALI_TOOLKIT_INTERNAL_SCROLL_BAR_H__
3
4 //
5 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 //
7 // Licensed under the Flora License, Version 1.0 (the License);
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
10 //
11 //     http://floralicense.org/license/
12 //
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an AS IS BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
18 //
19
20 // INTERNAL INCLUDES
21 #include <dali-toolkit/public-api/controls/scrollable/scroll-component-impl.h>
22 #include <dali-toolkit/public-api/controls/scrollable/scroll-connector.h>
23 #include <dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h>
24
25 namespace Dali
26 {
27
28 namespace Toolkit
29 {
30
31 namespace Internal
32 {
33
34 class ScrollBar;
35
36 typedef IntrusivePtr<ScrollBar> ScrollBarPtr;
37
38 /**
39  * ScrollBar is a UI component that can be added to the scrollable controls
40  * indicating the current scroll position of the scrollable content.
41  */
42 class ScrollBar : public ScrollComponentImpl
43 {
44
45 public:
46
47   // Properties
48   enum
49   {
50     SCROLLBAR_PROPERTY_START_INDEX = ControlImpl::CONTROL_PROPERTY_END_INDEX + 1,
51     SCROLLBAR_PROPERTY_END_INDEX = SCROLLBAR_PROPERTY_START_INDEX + 1000 ///< Reserving 1000 property indices
52   };
53
54   // Signals
55   typedef Toolkit::ScrollBar::ScrollPositionNotifiedSignalType ScrollPositionNotifiedSignalType;
56
57 public:
58
59   /**
60    * @copydoc Toolkit::ScrollBar::ScrollBar()
61    */
62   ScrollBar();
63
64   /**
65    * @copydoc Toolkit::ScrollBar::~ScrollBar()
66    */
67   virtual ~ScrollBar();
68
69   /**
70    * @copydoc Toolkit::ScrollBar::New()
71    */
72   static Toolkit::ScrollBar New();
73
74   /**
75    * @copydoc Toolkit::ScrollComponentImpl::OnScrollConnectorSet()
76    */
77   void OnScrollConnectorSet( Toolkit::ScrollConnector connector );
78
79   /**
80    * @copydoc Toolkit::ScrollBar::SetBackgroundImage()
81    */
82   void SetBackgroundImage( Image image, const Vector4& border );
83
84   /**
85    * @copydoc Toolkit::ScrollBar::SetIndicatorImage()
86    */
87   void SetIndicatorImage( Image image, const Vector4& border );
88
89   /**
90    * @copydoc Toolkit::ScrollBar::GetScrollIndicator()
91    */
92   Actor GetScrollIndicator();
93
94   /**
95    * @copydoc Toolkit::ScrollBar::SetPositionNotifications()
96    */
97   void SetPositionNotifications( const std::vector<float>& positions );
98
99   /**
100    * @copydoc Toolkit::ScrollBar::SetIndicatorHeightPolicy()
101    */
102   void SetIndicatorHeightPolicy( Toolkit::ScrollBar::IndicatorHeightPolicy policy );
103
104   /**
105    * @copydoc Toolkit::ScrollBar::GetIndicatorHeightPolicy()
106    */
107   Toolkit::ScrollBar::IndicatorHeightPolicy GetIndicatorHeightPolicy();
108
109   /**
110    * @copydoc Toolkit::ScrollBar::SetIndicatorFixedHeight()
111    */
112   void SetIndicatorFixedHeight( float height );
113
114   /**
115    * @copydoc Toolkit::ScrollBar::GetIndicatorFixedHeight()
116    */
117   float GetIndicatorFixedHeight();
118
119   /**
120    * @copydoc Toolkit::ScrollBar::Show()
121    */
122   void Show();
123
124   /**
125    * @copydoc Toolkit::ScrollBar::Hide()
126    */
127  void Hide();
128
129  /**
130   * Signal emitted after the SetScrollDomain() method has been called.
131   */
132  ScrollPositionNotifiedSignalType& ScrollPositionNotifiedSignal()
133  {
134    return mScrollPositionNotifiedSignal;
135  }
136
137  // Properties
138
139  /**
140   * Called when a property of an object of this type is set.
141   * @param[in] object The object whose property is set.
142   * @param[in] index The property index.
143   * @param[in] value The new property value.
144   */
145  static void SetProperty( BaseObject* object, Property::Index index, const Property::Value& value );
146
147  /**
148   * Called to retrieve a property of an object of this type.
149   * @param[in] object The object whose property is to be retrieved.
150   * @param[in] index The property index.
151   * @return The current value of the property.
152   */
153  static Property::Value GetProperty( BaseObject* object, Property::Index index );
154
155 private: // from Control
156
157   /**
158    * @copydoc Toolkit::Control::OnInitialize
159    */
160   virtual void OnInitialize();
161
162   /**
163    * @copydoc Toolkit::Control::OnPan
164    */
165   virtual void OnPan( PanGesture gesture );
166
167 private:
168
169   /**
170    * Apply constraints for background and indicator.
171    * These constraints are based on values from the scroll connector.
172    */
173   void ApplyConstraints();
174
175   /**
176    * Callback when the start & end position and size of the scrollable content are changed.
177    * @param[in] minPosition The minimum position.
178    * @param[in] maxPosition The maximum position.
179    * @param[in] contentSize The size of scrollable content.
180    */
181   void OnScrollDomainChanged(float minPosition, float maxPosition, float contentSize);
182
183   /**
184    * Callback when the current scroll position of the scrollable content goes above or
185    * below the values specified by SetPositionNotifications().
186    * @param[in] source the property notification that triggered this callback
187    */
188   void OnScrollPositionNotified(PropertyNotification& source);
189
190   /**
191    * Process the pan gesture per predefined timeout until the gesture is finished.
192    * @return True if the timer should be kept running.
193    */
194   bool OnPanGestureProcessTick();
195
196   /**
197    * Handle SetProperty for scroll indicator height policy.
198    * @param[in] propertyValue The new property value.
199    */
200   void OnIndicatorHeightPolicyPropertySet(Property::Value propertyValue);
201
202 private:
203
204   Constrainable mScrollPositionObject;                               ///< From mScrollConnector
205
206   ImageActor mBackground;                                            ///< Background image of scroll bar.
207   ImageActor mIndicator;                                             ///< Image of scroll indicator.
208   Animation mAnimation;                                              ///< Scroll indicator Show/Hide Animation.
209
210   float mScrollStart;                                               ///< Scroll Start position (start of drag)
211   Vector3 mGestureDisplacement;                                      ///< Gesture Displacement.
212
213   bool mIsPanning;                                                  ///< Whether the scroll bar is being panned.
214   float mCurrentScrollPosition;                                     ///< The current scroll position updated by the pan gesture
215
216   Toolkit::ScrollBar::IndicatorHeightPolicy mIndicatorHeightPolicy;  ///< The height policy of scroll indicator (variable or fixed)
217   float mIndicatorFixedHeight;                                      ///< The fixed height of scroll indicator
218
219   Timer mTimer;                                                      ///< The timer to process the pan gesture after the gesture is started.
220
221   Property::Index mPropertyIndicatorPosition;                        ///< Indicatore Position ("indicator-position")
222
223   PropertyNotification mPositionNotification;                        ///< Stores the property notification used for scroll position changes
224
225   ScrollPositionNotifiedSignalType mScrollPositionNotifiedSignal;
226
227   ActiveConstraint mIndicatorSizeConstraint;
228   ActiveConstraint mIndicatorPositionConstraint;
229 };
230
231 } // namespace Internal
232
233 // Helpers for public-api forwarding methods
234
235 inline Toolkit::Internal::ScrollBar& GetImpl(Toolkit::ScrollBar& scrollBar)
236 {
237   DALI_ASSERT_ALWAYS(scrollBar);
238
239   Dali::RefObject& handle = scrollBar.GetImplementation();
240
241   return static_cast<Toolkit::Internal::ScrollBar&>(handle);
242 }
243
244 inline const Toolkit::Internal::ScrollBar& GetImpl(const Toolkit::ScrollBar& scrollBar)
245 {
246   DALI_ASSERT_ALWAYS(scrollBar);
247
248   const Dali::RefObject& handle = scrollBar.GetImplementation();
249
250   return static_cast<const Toolkit::Internal::ScrollBar&>(handle);
251 }
252
253 } // namespace Toolkit
254
255 } // namespace Dali
256
257 #endif // __DALI_TOOLKIT_INTERNAL_SCROLL_BAR_H__