+ mIsPanning = false;
+
+ if( mPanProcessTimer )
+ {
+ // Destroy the timer when pan gesture is finished.
+ mPanProcessTimer.Stop();
+ mPanProcessTimer.TickSignal().Disconnect( this, &ScrollBar::OnPanGestureProcessTick );
+ mPanProcessTimer.Reset();
+ }
+
+ if(itemView)
+ {
+ // Refresh the ItemView cache with extra items
+ GetImpl(itemView).DoRefresh(mCurrentScrollPosition, true);
+ }
+
+ mPanFinishedSignal.Emit();
+
+ break;
+ }
+ }
+
+ if(itemView)
+ {
+ // Disable automatic refresh in ItemView during fast scrolling
+ GetImpl(itemView).SetRefreshEnabled(!mIsPanning);
+ }
+ }
+}
+
+void ScrollBar::OnSizeSet( const Vector3& size )
+{
+ if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
+ {
+ mIndicator.SetSize(size.width, mIndicatorFixedHeight);
+ }
+
+ Control::OnSizeSet( size );
+}
+
+void ScrollBar::SetScrollDirection( Toolkit::ScrollBar::Direction direction )
+{
+ mDirection = direction;
+}
+
+Toolkit::ScrollBar::Direction ScrollBar::GetScrollDirection() const
+{
+ return mDirection;
+}
+
+void ScrollBar::SetIndicatorHeightPolicy( Toolkit::ScrollBar::IndicatorHeightPolicy policy )
+{
+ if( policy != mIndicatorHeightPolicy )
+ {
+ mIndicatorHeightPolicy = policy;
+ ApplyConstraints();
+ }
+}
+
+Toolkit::ScrollBar::IndicatorHeightPolicy ScrollBar::GetIndicatorHeightPolicy() const
+{
+ return mIndicatorHeightPolicy;
+}
+
+void ScrollBar::SetIndicatorFixedHeight( float height )
+{
+ mIndicatorFixedHeight = height;
+
+ if(mIndicatorHeightPolicy == Toolkit::ScrollBar::Fixed)
+ {
+ mIndicator.SetSize(Self().GetCurrentSize().width, mIndicatorFixedHeight);
+ }
+}
+
+float ScrollBar::GetIndicatorFixedHeight() const
+{
+ return mIndicatorFixedHeight;
+}
+
+void ScrollBar::SetIndicatorShowDuration( float durationSeconds )
+{
+ mIndicatorShowDuration = durationSeconds;
+}
+
+float ScrollBar::GetIndicatorShowDuration() const
+{
+ return mIndicatorShowDuration;
+}
+
+void ScrollBar::SetIndicatorHideDuration( float durationSeconds )
+{
+ mIndicatorHideDuration = durationSeconds;
+}
+
+float ScrollBar::GetIndicatorHideDuration() const
+{
+ return mIndicatorHideDuration;
+}
+
+void ScrollBar::OnScrollDirectionPropertySet( Property::Value propertyValue )
+{
+ std::string directionName( propertyValue.Get<std::string>() );
+ if(directionName == "Vertical")
+ {
+ SetScrollDirection(Toolkit::ScrollBar::Vertical);
+ }
+ else if(directionName == "Horizontal")
+ {
+ SetScrollDirection(Toolkit::ScrollBar::Horizontal);
+ }
+ else
+ {
+ DALI_ASSERT_ALWAYS( !"ScrollBar::OnScrollDirectionPropertySet(). Invalid Property value." );
+ }
+}
+
+void ScrollBar::OnIndicatorHeightPolicyPropertySet( Property::Value propertyValue )
+{
+ std::string policyName( propertyValue.Get<std::string>() );
+ if(policyName == "Variable")
+ {
+ SetIndicatorHeightPolicy(Toolkit::ScrollBar::Variable);
+ }
+ else if(policyName == "Fixed")
+ {
+ SetIndicatorHeightPolicy(Toolkit::ScrollBar::Fixed);
+ }
+ else
+ {
+ DALI_ASSERT_ALWAYS( !"ScrollBar::OnIndicatorHeightPolicyPropertySet(). Invalid Property value." );
+ }
+}
+
+bool ScrollBar::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor )
+{
+ Dali::BaseHandle handle( object );
+
+ bool connected( true );
+ Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( handle );
+
+ if( 0 == strcmp( signalName.c_str(), PAN_FINISHED_SIGNAL ) )
+ {
+ scrollBar.PanFinishedSignal().Connect( tracker, functor );
+ }
+ else if( 0 == strcmp( signalName.c_str(), SCROLL_POSITION_INTERVAL_REACHED_SIGNAL ) )
+ {
+ scrollBar.ScrollPositionIntervalReachedSignal().Connect( tracker, functor );
+ }
+ else
+ {
+ // signalName does not match any signal
+ connected = false;
+ }
+
+ return connected;
+}
+
+void ScrollBar::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
+{
+ Toolkit::ScrollBar scrollBar = Toolkit::ScrollBar::DownCast( Dali::BaseHandle( object ) );
+
+ if( scrollBar )
+ {
+ ScrollBar& scrollBarImpl( GetImpl( scrollBar ) );
+ switch( index )
+ {
+ case Toolkit::ScrollBar::Property::SCROLL_DIRECTION:
+ {
+ scrollBarImpl.OnScrollDirectionPropertySet( value );
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_HEIGHT_POLICY:
+ {
+ scrollBarImpl.OnIndicatorHeightPolicyPropertySet( value );
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_FIXED_HEIGHT:
+ {
+ scrollBarImpl.SetIndicatorFixedHeight(value.Get<float>());
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_SHOW_DURATION:
+ {
+ scrollBarImpl.SetIndicatorShowDuration(value.Get<float>());
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_HIDE_DURATION:
+ {
+ scrollBarImpl.SetIndicatorHideDuration(value.Get<float>());
+ break;
+ }
+ case Toolkit::ScrollBar::Property::SCROLL_POSITION_INTERVALS:
+ {
+ Property::Array* array = value.GetArray();
+ if( array )
+ {
+ Dali::Vector<float> positions;
+ size_t positionCount = array->Count();
+ positions.Resize( positionCount );
+ for( size_t i = 0; i != positionCount; ++i )
+ {
+ array->GetElementAt( i ).Get( positions[i] );
+ }
+
+ scrollBarImpl.SetScrollPositionIntervals(positions);
+ }
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_MINIMUM_HEIGHT:
+ {
+ scrollBarImpl.mIndicatorMinimumHeight = value.Get<float>();
+ scrollBarImpl.ApplyConstraints();
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_START_PADDING:
+ {
+ scrollBarImpl.mIndicatorStartPadding = value.Get<float>();
+ scrollBarImpl.ApplyConstraints();
+ break;
+ }
+ case Toolkit::ScrollBar::Property::INDICATOR_END_PADDING:
+ {
+ scrollBarImpl.mIndicatorEndPadding = value.Get<float>();
+ scrollBarImpl.ApplyConstraints();