(ScrollView) Moved constraint related behaviour into a new class
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / scrollable / scroll-view / scroll-view-impl.h
index 86577c7..c53e3b7 100644 (file)
@@ -1,8 +1,8 @@
-#ifndef __DALI_TOOLKIT_INTERNAL_SCROLL_VIEW_H__
-#define __DALI_TOOLKIT_INTERNAL_SCROLL_VIEW_H__
+#ifndef DALI_TOOLKIT_INTERNAL_SCROLL_VIEW_H
+#define DALI_TOOLKIT_INTERNAL_SCROLL_VIEW_H
 
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
 #include <dali/public-api/adaptor-framework/timer.h>
 #include <dali/public-api/animation/animation.h>
 #include <dali/public-api/object/property-notification.h>
+#include <dali/public-api/object/weak-handle.h>
 
 // INTERNAL INCLUDES
-#include <dali-toolkit/public-api/controls/control-impl.h>
+#include <dali-toolkit/devel-api/controls/scroll-bar/scroll-bar.h>
 #include <dali-toolkit/internal/controls/scrollable/scroll-view/scroll-base-impl.h>
-#include <dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h>
+#include <dali-toolkit/public-api/controls/control-impl.h>
 #include <dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-effect.h>
+#include <dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h>
+#include <dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl-constraints.h>
 
 namespace Dali
 {
-
 namespace Toolkit
 {
-
 namespace Internal
 {
-
 class ScrollView;
-typedef IntrusivePtr<ScrollView>    ScrollViewPtr;
+typedef IntrusivePtr<ScrollView> ScrollViewPtr;
 
 class ScrollInternalConstraints;
-typedef IntrusivePtr<ScrollInternalConstraints>    ScrollInternalConstraintsPtr;
+typedef IntrusivePtr<ScrollInternalConstraints> ScrollInternalConstraintsPtr;
 
 class ScrollOvershootIndicator;
 typedef IntrusivePtr<ScrollOvershootIndicator> ScrollOvershootIndicatorPtr;
@@ -53,20 +53,19 @@ typedef IntrusivePtr<ScrollOvershootIndicator> ScrollOvershootIndicatorPtr;
 class ScrollView : public ScrollBase
 {
 public:
-
   /**
    * FindDirection specifies how searching is conducted within the Find... routines.
    */
   enum FindDirection
   {
-    None = -3,        ///< Includes none within the search query.
-    All = -2,         ///< Includes all within the search query.
-    Left = -1,        ///< Includes only those not right !(>)
-    Right = 1,        ///< Includes only those right (>)
-    Up = -1,          ///< Includes only those not below  !(>)
-    Down = 1,         ///< Includes only those below (>)
-    Out = -1,         ///< Includes only those not infront  !(>)
-    In = 1            ///< Includes only those infront (>)
+    None  = -3, ///< Includes none within the search query.
+    All   = -2, ///< Includes all within the search query.
+    Left  = -1, ///< Includes only those not right !(>)
+    Right = 1,  ///< Includes only those right (>)
+    Up    = -1, ///< Includes only those not below  !(>)
+    Down  = 1,  ///< Includes only those below (>)
+    Out   = -1, ///< Includes only those not infront  !(>)
+    In    = 1   ///< Includes only those infront (>)
   };
 
   enum LockAxis
@@ -85,18 +84,16 @@ public:
     SnappingInternalY  = 0x08, ///< snapping mPropertyY back to mPropertyPreScroll y value to remove y overshoot over time
   };
 
-  static const unsigned int SCROLL_X_STATE_MASK = AnimatingInternalX | SnappingInternalX;
-  static const unsigned int SCROLL_Y_STATE_MASK = AnimatingInternalY | SnappingInternalY;
+  static const unsigned int SCROLL_X_STATE_MASK    = AnimatingInternalX | SnappingInternalX;
+  static const unsigned int SCROLL_Y_STATE_MASK    = AnimatingInternalY | SnappingInternalY;
   static const unsigned int SCROLL_ANIMATION_FLAGS = AnimatingInternalX | AnimatingInternalY;
-  static const unsigned int SNAP_ANIMATION_FLAGS = SnappingInternalX | SnappingInternalY;
+  static const unsigned int SNAP_ANIMATION_FLAGS   = SnappingInternalX | SnappingInternalY;
 
 private:
-
   typedef std::vector<Dali::Toolkit::ScrollViewEffect> ScrollViewEffectContainer; ///< Container of Dali::Toolkit::ScrollViewEffect
-  typedef ScrollViewEffectContainer::iterator ScrollViewEffectIter; ///< Iterator for Dali::Toolkit::ScrollViewEffectContainer
+  typedef ScrollViewEffectContainer::iterator          ScrollViewEffectIter;      ///< Iterator for Dali::Toolkit::ScrollViewEffectContainer
 
 public:
-
   /**
    * Create a new ScrollView.
    * @return A public handle to the newly allocated ScrollView.
@@ -104,7 +101,6 @@ public:
   static Dali::Toolkit::ScrollView New();
 
 public:
-
   /**
    * @copydoc Toolkit::ScrollView::GetScrollSnapAlphaFunction
    */
@@ -191,6 +187,13 @@ public:
   void SetRulerY(RulerPtr ruler);
 
   /**
+   * Retrieve the touch sensitivity.
+   *
+   * @return whether the touch sensitivity is true or false.
+   */
+  bool GetScrollSensitive();
+
+  /**
    * @copydoc Toolkit::ScrollView::SetScrollSensitive
    */
   void SetScrollSensitive(bool sensitive);
@@ -206,11 +209,25 @@ public:
   void SetSnapOvershootAlphaFunction(AlphaFunction alpha);
 
   /**
+   * Retrieve the duartion of Snap Overshoot animation
+   *
+   * @return the duration.
+   */
+  float GetSnapOvershootDuration();
+
+  /**
    * @copydoc Toolkit::ScrollView::SetSnapOvershootDuration
    */
   void SetSnapOvershootDuration(float duration);
 
   /**
+   * Retrieve whether Actor Auto-Snap mode is enabled or not.
+   *
+   * @return Actor Auto-Snap mode Enabled flag.
+   */
+  bool GetActorAutoSnap();
+
+  /**
    * @copydoc Toolkit::ScrollView::SetActorAutoSnap
    */
   void SetActorAutoSnap(bool enable);
@@ -300,7 +317,7 @@ public:
   /**
    * @copydoc Toolkit::ScrollView::SetMinimumDistanceForFlick
    */
-  void SetMinimumDistanceForFlick( const Vector2& distance );
+  void SetMinimumDistanceForFlick(const Vector2& distance);
 
   /**
    * @copydoc Toolkit::ScrollView::GetMinimumSpeedForFlick
@@ -310,7 +327,7 @@ public:
   /**
    * @copydoc Toolkit::ScrollView::SetMinimumSpeedForFlick
    */
-  void SetMinimumSpeedForFlick( float speed );
+  void SetMinimumSpeedForFlick(float speed);
 
   /**
    * @copydoc Toolkit::ScrollView::GetMaxFlickSpeed
@@ -343,26 +360,21 @@ public:
   Vector2 GetCurrentScrollPosition() const;
 
   /**
-   * @copydoc Toolkit::Scrollable::GetDomainSize
-   */
-  Vector2 GetDomainSize() const;
-
-  /**
    * @copydoc ScrollTo(const Vector2&)
    */
   void TransformTo(const Vector2& position,
-                   DirectionBias horizontalBias = DirectionBiasNone, DirectionBias verticalBias = DirectionBiasNone);
+                   DirectionBias  horizontalBias = DIRECTION_BIAS_NONE,
+                   DirectionBias  verticalBias   = DIRECTION_BIAS_NONE);
 
   /**
    * @copydoc ScrollTo(const Vector2&, float, AlhpaFunction, DirectionBias, DirectionBias)
    */
-  void TransformTo(const Vector2& position, float duration, AlphaFunction alpha,
-                   DirectionBias horizontalBias = DirectionBiasNone, DirectionBias verticalBias = DirectionBiasNone);
+  void TransformTo(const Vector2& position, float duration, AlphaFunction alpha, DirectionBias horizontalBias = DIRECTION_BIAS_NONE, DirectionBias verticalBias = DIRECTION_BIAS_NONE);
 
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(const Vector2 &position)
    */
-  void ScrollTo(const Vector2 &position);
+  void ScrollTo(const Vector2position);
 
   /**
    * @copydoc Toolkit::Scrollable::ScrollTo(const Vector2& position, float duration)
@@ -377,14 +389,12 @@ public:
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(const Vector2 &position, float duration, DirectionBias horizontalBias, DirectionBias verticalBias)
    */
-  void ScrollTo(const Vector2& position, float duration,
-                DirectionBias horizontalBias, DirectionBias verticalBias);
+  void ScrollTo(const Vector2& position, float duration, DirectionBias horizontalBias, DirectionBias verticalBias);
 
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(const Vector2 &position, float duration, AlphaFunction alpha, DirectionBias horizontalBias, DirectionBias verticalBias)
    */
-  void ScrollTo(const Vector2& position, float duration, AlphaFunction alpha,
-                DirectionBias horizontalBias, DirectionBias verticalBias);
+  void ScrollTo(const Vector2& position, float duration, AlphaFunction alpha, DirectionBias horizontalBias, DirectionBias verticalBias);
 
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(unsigned int page)
@@ -394,34 +404,34 @@ public:
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(unsigned int page, float duration, DirectionBias bias)
    */
-  void ScrollTo(unsigned int page, float duration, DirectionBias bias = DirectionBiasNone);
+  void ScrollTo(unsigned int page, float duration, DirectionBias bias = DIRECTION_BIAS_NONE);
 
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(Actor& actor)
    */
-  void ScrollTo(Actor &actor);
+  void ScrollTo(Actoractor);
 
   /**
    * @copydoc Toolkit::ScrollView::ScrollTo(Actor& actor, float duration)
    */
-  void ScrollTo(Actor &actor, float duration);
+  void ScrollTo(Actoractor, float duration);
 
   /**
    * @copydoc Toolkit::ScrollView::SetScrollingDirection()
    */
-  void SetScrollingDirection( Radian direction, Radian threshold );
+  void SetScrollingDirection(Radian direction, Radian threshold);
 
   /**
    * @copydoc Toolkit::ScrollView::RemoveScrollingDirection()
    */
-  void RemoveScrollingDirection( Radian angle );
+  void RemoveScrollingDirection(Radian angle);
 
   /**
     * Finds the closest Actor to the current center of the ScrollView.
     *
     * @return A handle to the actor if found, or an empty handle if not.
     */
-   Actor FindClosestActor();
+  Actor FindClosestActor();
 
   /**
    * Finds the closest Actor to position in ScrollView
@@ -462,10 +472,7 @@ public:
    * @param[in] verticalBias (optional) Whether to bias animation to top or bottom (or no biasing)
    * @return True if animation necessary and taking place to reach desired transform.
    */
-  bool AnimateTo(const Vector2& position, const Vector2& positionDuration,
-                             AlphaFunction alpha, bool findShortcuts = true,
-                             DirectionBias horizontalBias = DirectionBiasNone, DirectionBias verticalBias = DirectionBiasNone,
-                             SnapType snapType = Snap);
+  bool AnimateTo(const Vector2& position, const Vector2& positionDuration, AlphaFunction alpha, bool findShortcuts = true, DirectionBias horizontalBias = DIRECTION_BIAS_NONE, DirectionBias verticalBias = DIRECTION_BIAS_NONE, SnapType snapType = SNAP);
 
   /**
    * @copydoc Toolkit::Scrollable::AddOverlay()
@@ -478,13 +485,35 @@ public:
   void RemoveOverlay(Actor actor);
 
   /**
+   * @copydoc Toolkit::Internal::Scrollable::SetOvershootSize
+   */
+  void SetOvershootSize(const Vector2& size);
+
+  /**
    * @copydoc Toolkit::Internal::Scrollable::SetOvershootEffectColor
    */
-  void SetOvershootEffectColor( const Vector4& color );
+  void SetOvershootEffectColor(const Vector4& color);
 
-public: //Signals
+  //properties
+
+  /**
+   * Called when a property of an object of this type is set.
+   * @param[in] object The object whose property is set.
+   * @param[in] index The property index.
+   * @param[in] value The new property value.
+   */
+  static void SetProperty(BaseObject* object, Property::Index index, const Property::Value& value);
 
   /**
+   * Called to retrieve a property of an object of this type.
+   * @param[in] object The object whose property is to be retrieved.
+   * @param[in] index The property index.
+   * @return The current value of the property.
+   */
+  static Property::Value GetProperty(BaseObject* object, Property::Index index);
+
+public: //Signals
+  /**
    * @copydoc Dali::Toolkit::ScrollView::SnapStartedSignal()
    */
   Toolkit::ScrollView::SnapStartedSignalType& SnapStartedSignal();
@@ -498,75 +527,75 @@ public: //Signals
    * @return True if the signal was connected.
    * @post If a signal was connected, ownership of functor was passed to CallbackBase. Otherwise the caller is responsible for deleting the unused functor.
    */
-  static bool DoConnectSignal( BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor );
-
-private: // private overriden functions from CustomActorImpl and Controls
+  static bool DoConnectSignal(BaseObject* object, ConnectionTrackerInterface* tracker, const std::string& signalName, FunctorDelegate* functor);
 
+private: // private overridden functions from CustomActorImpl and Controls
   /**
    * @copydoc Dali::CustomActorImpl::OnSizeAnimation(Animation&, const Vector3&)
    */
-  virtual void OnSizeAnimation(Animation& animation, const Vector3& targetSize);
+  void OnSizeAnimation(Animation& animation, const Vector3& targetSize) override;
 
   /**
    * @copydoc CustomActorImpl::OnSizeSet(const Vector3&)
    */
-  virtual void OnSizeSet( const Vector3& size );
+  void OnSizeSet(const Vector3& size) override;
 
   /**
    * From CustomActorImpl; called after a child has been added to the owning actor.
    * @param[in] child The child which has been added.
    */
-  virtual void OnChildAdd(Actor& child);
+  void OnChildAdd(Actor& child) override;
 
   /**
    * From CustomActorImpl; called shortly before a child is removed from the owning actor.
    * @param[in] child The child being removed.
    */
-  virtual void OnChildRemove(Actor& child);
-
-  /**
-   * From CustomActorImpl; called after a touch-signal is received by the owning actor.
-   *
-   * We don't listen to these events as content within the contain may consume events.
-   *
-   * @param[in] event The touch event.
-   * @return True if the event should be consumed.
-   */
-  virtual bool OnTouchEvent(const TouchEvent& event);
+  void OnChildRemove(Actor& child) override;
 
   /**
-   * From CustomActorImpl; called after a wheel-event is received by the owning actor.
+   * Called after a wheelEvent is received by the owning actor.
+   * @param[in] actor Actor associated with the event.
    * @param[in] event The wheel event.
    * @return True if the event should be consumed.
    */
-  virtual bool OnWheelEvent(const WheelEvent& event);
+  bool OnWheelEvent(Actor actor, const WheelEvent& event);
 
   /**
    * @copydoc Toolkit::Control::OnInitialize()
    */
-  virtual void OnInitialize();
+  void OnInitialize() override;
 
   /**
-   * @copydoc CustomActorImpl::OnStageConnection()
+   * @copydoc CustomActorImpl::OnSceneConnection()
    */
-  virtual void OnStageConnection();
+  void OnSceneConnection(int depth) override;
 
   /**
-   * @copydoc CustomActorImpl::OnStageDisconnection()
+   * @copydoc CustomActorImpl::OnSceneDisconnection()
    */
-  virtual void OnStageDisconnection();
+  void OnSceneDisconnection() override;
 
   /**
    * @copydoc Toolkit::Control::OnAccessibilityPan()
    */
-  virtual bool OnAccessibilityPan(PanGesture gesture);
+  bool OnAccessibilityPan(PanGesture gesture) override;
 
   /**
    * @copydoc Toolkit::Scrollable::EnableScrollOvershoot()
    */
-  virtual void EnableScrollOvershoot(bool enable);
+  void EnableScrollOvershoot(bool enable) override;
 
 private:
+  /**
+   * Called after a touchSignal is received by the owning actor.
+   *
+   * We don't consume these events as content within the container may consume events.
+   *
+   * @param[in] actor The touched actor.
+   * @param[in] touch The touch information.
+   * @return True if the event should be consumed.
+   */
+  bool OnTouch(Actor actor, const TouchEvent& touch);
 
   /**
    * Start a timer which calls OnTouchDownTimeout()
@@ -613,7 +642,7 @@ private:
    * @param[in] duration The time in seconds for animation
    * @param[in] alpha The alpha function to use for animating
    */
-  void AnimateInternalXTo( float position, float duration, AlphaFunction alpha );
+  void AnimateInternalXTo(float position, float duration, AlphaFunction alpha);
 
   /**
    * Animates the internal y property to the given value
@@ -622,39 +651,39 @@ private:
    * @param[in] duration The time in seconds for animation
    * @param[in] alpha The alpha function to use for animating
    */
-  void AnimateInternalYTo( float position, float duration, AlphaFunction alpha );
+  void AnimateInternalYTo(float position, float duration, AlphaFunction alpha);
 
   /**
    * Called whenever a snap animation on the x-axis has completed
    * @param[in] source the Animation instance that has completed.
    */
-  void OnScrollAnimationFinished( Animation& source );
+  void OnScrollAnimationFinished(Animation& source);
 
   /**
    * Called when either the X or Y internal scroll positions have finished snapping back to SCROLL_PRE_POSITION
    *
    * @param[in] source the Animation instance that has completed.
    */
-  void OnSnapInternalPositionFinished( Animation& source );
+  void OnSnapInternalPositionFinished(Animation& source);
 
   /**
    * Called whenever a snap animation on the x-axis has completed and we need to snap pre scroll
    * position to our clamped position
    * @param[in] position The x position to snap pre scroll property to
    */
-  void SnapInternalXTo( float position );
+  void SnapInternalXTo(float position);
 
   /**
    * Called whenever a snap animation on the y-axis has completed and we need to snap pre scroll
    * position to our clamped position
    * @param[in] position The y position to snap pre scroll property to
    */
-  void SnapInternalYTo( float position );
+  void SnapInternalYTo(float position);
 
   /**
    * This is called internally whenever the Scroll Rulers are
-   * modified. This will update the properties: 'scroll-position-min'
-   * and 'scroll-position-max' to reflect the changes.
+   * modified. This will update the properties: 'scrollPositionMin'
+   * and 'scrollPositionMax' to reflect the changes.
    */
   void UpdatePropertyDomain();
 
@@ -675,14 +704,14 @@ private:
    *
    * @param[in] gesture The gesture event.
    */
-  void OnPan( const PanGesture& pan);
+  void OnPan(const PanGesture& pan);
 
   /**
    * Extension of the above gestures.
    *
    * @param[in] gesture The gesture event.
    */
-  void OnGestureEx(Gesture::State state);
+  void OnGestureEx(GestureState state);
 
   /**
    * Performs snapping while taking into account Velocity of gesture
@@ -725,7 +754,7 @@ private:
    * @param[in,out] position The position you wish to clamp
    * @param[out] clamped The results of the clamping.
    */
-  void ClampPosition(Vector2& position, ClampState2D &clamped) const;
+  void ClampPosition(Vector2& position, ClampState2Dclamped) const;
 
   /**
    * Wraps position within the domain set up by X/Y Rulers
@@ -737,27 +766,13 @@ private:
    */
   void WrapPosition(Vector2& position) const;
 
-  /**
-   * Updates the main internal scroll constraints with new ruler and domain
-   * values
-   */
-  void UpdateMainInternalConstraint();
-
-  /**
-   * Enables/disables the overshoot constraints
-   *
-   * @param[in] enabled whether to enable or disable the overshoot constraints
-   */
-  void SetOvershootConstraintsEnabled(bool enabled);
-
-  /**
-   * Sets internal constraints for this ScrollView.
-   * Many of these internal constraints are based on properties within
-   * ScrollView.
-   */
-  void SetInternalConstraints();
-
 protected:
+  struct AccessibleImpl : public Scrollable::AccessibleImpl
+  {
+    using Scrollable::AccessibleImpl::AccessibleImpl;
+
+    bool ScrollToChild(Actor child) override;
+  };
 
   /**
    * Construct a new ScrollView.
@@ -770,14 +785,13 @@ protected:
   virtual ~ScrollView();
 
 private:
-
   /**
    * Searches this ScrollView, and attempts to Unbind
    * systematically this Actor from the ScrollView attached.
    *
    * @param[in] child The actor to be unbound.
    */
-  virtual void FindAndUnbindActor(Actor child);
+  void FindAndUnbindActor(Actor child) override;
 
   /**
    * Gets position property.
@@ -809,7 +823,7 @@ private:
   /**
    * Checks if the property notifications are active and adds them if not
    */
-  void SetScrollUpdateNotification( bool enabled );
+  void SetScrollUpdateNotification(bool enabled);
 
   /**
    * Refresh the ScrollView (used when animating to update application developer of changes)
@@ -817,8 +831,14 @@ private:
    */
   void OnScrollUpdateNotification(Dali::PropertyNotification& source);
 
-private:
+  /**
+   * Set up default rulers using a property map
+   * @param[in] scrollModeMap A map defining the characteristics of X and Y scrolling
+   * using either FixedRuler or DefaultRuler.
+   */
+  void SetScrollMode(const Property::Map& scrollModeMap);
 
+private:
   // Undefined
   ScrollView(const ScrollView&);
 
@@ -826,19 +846,20 @@ private:
   ScrollView& operator=(const ScrollView& rhs);
 
 private:
+  ScrollViewConstraints mConstraints;
 
-  unsigned long mTouchDownTime;         ///< The touch down time
+  unsigned long mTouchDownTime; ///< The touch down time
 
-  int mGestureStackDepth;               ///< How many gestures are currently occuring.
-  Vector2 mPanStartPosition;            ///< Where the pan gesture's touch down occured
-  Vector2 mPanDelta;                    ///< Amount currently panned.
+  int     mGestureStackDepth; ///< How many gestures are currently occuring.
+  Vector2 mPanStartPosition;  ///< Where the pan gesture's touch down occured
+  Vector2 mPanDelta;          ///< Amount currently panned.
 
-  unsigned int mScrollStateFlags;       ///< flags indicating current state of scrolling
+  unsigned int mScrollStateFlags; ///< flags indicating current state of scrolling
   // Scroll delegate pre and post position properties...
-  Vector2 mScrollPrePosition;           ///< Wrapped scroll position, but not clamped
-  Vector2 mScrollPostPosition;          ///< Wrapped and clamped, this is the final scroll position used
-  Vector2 mScrollTargetPosition;        ///< Final target position for an animated scroll
-  Vector2 mDomainOffset;                ///< Domain offset (this keeps track of the domain boundaries that scroll positions traverses)
+  Vector2 mScrollPrePosition;    ///< Wrapped scroll position, but not clamped
+  Vector2 mScrollPostPosition;   ///< Wrapped and clamped, this is the final scroll position used
+  Vector2 mScrollTargetPosition; ///< Final target position for an animated scroll
+  Vector2 mDomainOffset;         ///< Domain offset (this keeps track of the domain boundaries that scroll positions traverses)
 
   // Rulers for each axes...
   RulerPtr mRulerX;
@@ -848,75 +869,77 @@ private:
   Vector2 mMinScroll;
   Vector2 mMaxScroll;
 
-  Animation mInternalXAnimation;        ///< Animates mPropertyX to a snap position or application requested scroll position
-  Animation mInternalYAnimation;        ///< Animates mPropertyY to a snap position or application requested scroll position
-
+  Animation mInternalXAnimation; ///< Animates mPropertyX to a snap position or application requested scroll position
+  Animation mInternalYAnimation; ///< Animates mPropertyY to a snap position or application requested scroll position
 
-  Vector2 mLastVelocity;                ///< Record the last velocity from PanGesture (Finish event doesn't have correct velocity)
+  Vector2  mLastVelocity; ///< Record the last velocity from PanGesture (Finish event doesn't have correct velocity)
   LockAxis mLockAxis;
 
-  Timer mTouchDownTimer;                ///< Used to interrupt snap-animation. This cannot be done in OnTouchEvent without breaking fast flick behavior.
+  Timer mTouchDownTimer; ///< Used to interrupt snap-animation. This cannot be done in OnTouch without breaking fast flick behavior.
 
-  float mScrollUpdateDistance;          ///< Distance for scrolling to travel for the scroll update notifications
+  float                      mScrollUpdateDistance;      ///< Distance for scrolling to travel for the scroll update notifications
   Dali::PropertyNotification mScrollXUpdateNotification; ///< scroll x position update notification
   Dali::PropertyNotification mScrollYUpdateNotification; ///< scroll y position update notification
 
-  Actor mInternalActor;                 ///< Internal actor (we keep internal actors in here e.g. scrollbars, so we can ignore it in searches)
+  Actor mInternalActor; ///< Internal actor (we keep internal actors in here e.g. scrollbars, so we can ignore it in searches)
 
-  ScrollViewEffectContainer mEffects;   ///< Container keeping track of all the applied effects.
+  ScrollViewEffectContainer mEffects; ///< Container keeping track of all the applied effects.
 
-  Vector2   mMaxOvershoot;                      ///< Number of scrollable pixels that will take overshoot from 0.0f to 1.0f
-  Vector2   mUserMaxOvershoot;                  ///< Set by user, allows overriding of default max overshoot for the scroll indicator
-  float     mSnapOvershootDuration;             ///< Duration for overshoot snapping back to Vector2::ZERO
-  AlphaFunction mSnapOvershootAlphaFunction;    ///< AlphaFunction to be used for this overshoot.
+  Vector2       mMaxOvershoot;               ///< Number of scrollable pixels that will take overshoot from 0.0f to 1.0f
+  Vector2       mUserMaxOvershoot;           ///< Set by user, allows overriding of default max overshoot for the scroll indicator
+  float         mSnapOvershootDuration;      ///< Duration for overshoot snapping back to Vector2::ZERO
+  AlphaFunction mSnapOvershootAlphaFunction; ///< AlphaFunction to be used for this overshoot.
 
-  float mSnapDuration;                          ///< Time for the snap animation to take (in seconds).
-  AlphaFunction mSnapAlphaFunction;             ///< AlphaFunction to be used for the Snap Animation.
+  float         mSnapDuration;      ///< Time for the snap animation to take (in seconds).
+  AlphaFunction mSnapAlphaFunction; ///< AlphaFunction to be used for the Snap Animation.
 
-  Vector2 mMinFlickDistance;                      ///< Minimum pan distance required for a flick
-  float mFlickSpeedThreshold;                   ///< Minimum pan speed required for a flick in pixels/ms
-  float mFlickDuration;                         ///< Time for the flick animation to take (in seconds).
-  AlphaFunction mFlickAlphaFunction;            ///< AlphaFunction to be used for the Flick Animation.
+  Vector2       mMinFlickDistance;    ///< Minimum pan distance required for a flick
+  float         mFlickSpeedThreshold; ///< Minimum pan speed required for a flick in pixels/ms
+  float         mFlickDuration;       ///< Time for the flick animation to take (in seconds).
+  AlphaFunction mFlickAlphaFunction;  ///< AlphaFunction to be used for the Flick Animation.
 
-  float mAxisAutoLockGradient;                  ///< Axis Auto-lock gradient threshold. Above this gradient and it will lock scrolling to closest axis.
-  float mFrictionCoefficient;                   ///< Friction coefficient. Amount of friction to apply to free panning flick animation. in stage.lengths/sec
-  float mFlickSpeedCoefficient;                 ///< Flick velocity coefficient. Input touch velocity is multiplied by this.
-  float mMaxFlickSpeed;                         ///< Maximum flick speed. Maximum speed of flick in stage.lengths/sec.
+  float mAxisAutoLockGradient;  ///< Axis Auto-lock gradient threshold. Above this gradient and it will lock scrolling to closest axis.
+  float mFrictionCoefficient;   ///< Friction coefficient. Amount of friction to apply to free panning flick animation. in stage.lengths/sec
+  float mFlickSpeedCoefficient; ///< Flick velocity coefficient. Input touch velocity is multiplied by this.
+  float mMaxFlickSpeed;         ///< Maximum flick speed. Maximum speed of flick in stage.lengths/sec.
 
-  Vector2 mWheelScrollDistanceStep;        ///< The step of scroll distance in actor coordinates in X and Y axes for each wheel event received.
+  Vector2 mWheelScrollDistanceStep; ///< The step of scroll distance in actor coordinates in X and Y axes for each wheel event received.
 
-  //ScrollInternalConstraintsPtr mScrollInternalConstraints;
-  Constraint mScrollMainInternalPrePositionConstraint;
-  Constraint mScrollMainInternalPositionConstraint;
-  Constraint mScrollMainInternalOvershootXConstraint;
-  Constraint mScrollMainInternalOvershootYConstraint;
-  Constraint mScrollMainInternalDeltaConstraint;
-  Constraint mScrollMainInternalFinalConstraint;
-  Constraint mScrollMainInternalRelativeConstraint;
-  Constraint mScrollMainInternalDomainConstraint;
-  Constraint mScrollMainInternalPrePositionMaxConstraint;
-
-  ScrollOvershootIndicatorPtr mOvershootIndicator;
+  ScrollOvershootIndicatorPtr    mOvershootIndicator;
+  WeakHandle<Toolkit::ScrollBar> mScrollBar;
 
   Toolkit::ScrollView::SnapStartedSignalType mSnapStartedSignal;
 
-  bool mInAccessibilityPan : 1;           ///< With AccessibilityPan its easier to move between snap positions
-  bool mInitialized:1;
-  bool mScrolling:1;                      ///< Flag indicating whether the scroll view is being scrolled (by user or animation)
-  bool mScrollInterrupted:1;              ///< Flag set for when a down event interrupts a scroll
-  bool mPanning:1;                        ///< Whether scroll view is currently panning or not
-  bool mSensitive:1;                      ///< Scroll Sensitivity Flag.
-  bool mTouchDownTimeoutReached:1;        ///< Indicates when down event timeout occured without corresponding up event (touch still down)
-  bool mActorAutoSnapEnabled:1;           ///< Whether to automatically snap to closest actor.
-  bool mAutoResizeContainerEnabled:1;     ///< Whether to automatically resize container (affects RulerDomain's on X/Y axes)
-  bool mWrapMode:1;                       ///< Whether to wrap contents based on container size.
-  bool mAxisAutoLock:1;                   ///< Whether to automatically lock axis when panning.
-  bool mAlterChild:1;                     ///< Internal flag to control behavior of OnChildAdd/OnChildRemove when Adding internal Actors.
-  bool mDefaultMaxOvershoot:1;            ///< Whether to use default max overshoot or application defined one
-  bool mCanScrollHorizontal:1;            ///< Local value of our property to check against
-  bool mCanScrollVertical:1;              ///< Local value of our property to check against
+  bool mInAccessibilityPan : 1;         ///< With AccessibilityPan its easier to move between snap positions
+  bool mScrolling : 1;                  ///< Flag indicating whether the scroll view is being scrolled (by user or animation)
+  bool mScrollInterrupted : 1;          ///< Flag set for when a down event interrupts a scroll
+  bool mPanning : 1;                    ///< Whether scroll view is currently panning or not
+  bool mSensitive : 1;                  ///< Scroll Sensitivity Flag.
+  bool mTouchDownTimeoutReached : 1;    ///< Indicates when down event timeout occured without corresponding up event (touch still down)
+  bool mActorAutoSnapEnabled : 1;       ///< Whether to automatically snap to closest actor.
+  bool mAutoResizeContainerEnabled : 1; ///< Whether to automatically resize container (affects RulerDomain's on X/Y axes)
+  bool mWrapMode : 1;                   ///< Whether to wrap contents based on container size.
+  bool mAxisAutoLock : 1;               ///< Whether to automatically lock axis when panning.
+  bool mAlterChild : 1;                 ///< Internal flag to control behavior of OnChildAdd/OnChildRemove when Adding internal Actors.
+  bool mDefaultMaxOvershoot : 1;        ///< Whether to use default max overshoot or application defined one
+  bool mCanScrollHorizontal : 1;        ///< Local value of our property to check against
+  bool mCanScrollVertical : 1;          ///< Local value of our property to check against
+  bool mTransientScrollBar : 1;         ///< True if scroll-bar should be automatically show/hidden during/after panning
+
+  friend ScrollViewConstraints;
 };
 
+/**
+ * Returns whether to lock scrolling to a particular axis
+ *
+ * @param[in] panDelta Distance panned since gesture started
+ * @param[in] currentLockAxis The current lock axis value
+ * @param[in] lockGradient How quickly to lock to a particular axis
+ *
+ * @return The new axis lock state
+ */
+ScrollView::LockAxis GetLockAxis(const Vector2& panDelta, ScrollView::LockAxis currentLockAxis, float lockGradient);
+
 } // namespace Internal
 
 // Helpers for public-api forwarding methods
@@ -943,4 +966,4 @@ inline const Toolkit::Internal::ScrollView& GetImpl(const Toolkit::ScrollView& s
 
 } // namespace Dali
 
-#endif // __DALI_TOOLKIT_INTERNAL_SCROLL_VIEW_H__
+#endif // DALI_TOOLKIT_INTERNAL_SCROLL_VIEW_H