Tizen 2.4.0 rev3 SDK Public Release
authorjk7744.park <jk7744.park@samsung.com>
Sun, 21 Feb 2016 05:52:27 +0000 (14:52 +0900)
committerjk7744.park <jk7744.park@samsung.com>
Sun, 21 Feb 2016 05:52:27 +0000 (14:52 +0900)
57 files changed:
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-imf-manager.cpp
automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-imf-manager.h
automated-tests/src/dali-toolkit/utc-Dali-ScrollView.cpp
dali-toolkit/devel-api/controls/text-controls/text-selection-toolbar.h
dali-toolkit/images/core_contextual_popup_bg_stroke_color.9.png [new file with mode: 0644]
dali-toolkit/internal/controls/image-view/image-view-impl.cpp
dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.cpp
dali-toolkit/internal/controls/scroll-bar/scroll-bar-impl.h
dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.cpp
dali-toolkit/internal/controls/scrollable/item-view/item-view-impl.h
dali-toolkit/internal/controls/scrollable/scroll-view/scroll-overshoot-indicator-impl.cpp
dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.cpp
dali-toolkit/internal/controls/scrollable/scroll-view/scroll-view-impl.h
dali-toolkit/internal/controls/table-view/table-view-impl.cpp
dali-toolkit/internal/controls/text-controls/text-label-impl.cpp
dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.cpp
dali-toolkit/internal/controls/text-controls/text-selection-popup-impl.h
dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.cpp
dali-toolkit/internal/controls/text-controls/text-selection-toolbar-impl.h
dali-toolkit/internal/focus-manager/keyboard-focus-manager-impl.cpp
dali-toolkit/internal/text/decorator/text-decorator.cpp
dali-toolkit/internal/text/layouts/layout-engine.cpp
dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp
dali-toolkit/internal/text/text-controller-impl.cpp
dali-toolkit/internal/text/text-controller-impl.h
dali-toolkit/internal/text/text-controller.cpp
dali-toolkit/public-api/accessibility-manager/accessibility-manager.h
dali-toolkit/public-api/controls/alignment/alignment.h
dali-toolkit/public-api/controls/buttons/button.h
dali-toolkit/public-api/controls/buttons/check-box-button.h
dali-toolkit/public-api/controls/buttons/push-button.h
dali-toolkit/public-api/controls/buttons/radio-button.h
dali-toolkit/public-api/controls/control-impl.cpp
dali-toolkit/public-api/controls/control-impl.h
dali-toolkit/public-api/controls/control.h
dali-toolkit/public-api/controls/default-controls/solid-color-actor.h
dali-toolkit/public-api/controls/gaussian-blur-view/gaussian-blur-view.h
dali-toolkit/public-api/controls/image-view/image-view.h
dali-toolkit/public-api/controls/scroll-bar/scroll-bar.h
dali-toolkit/public-api/controls/scrollable/item-view/default-item-layout.h
dali-toolkit/public-api/controls/scrollable/item-view/item-factory.h
dali-toolkit/public-api/controls/scrollable/item-view/item-layout.h
dali-toolkit/public-api/controls/scrollable/item-view/item-view-declarations.h
dali-toolkit/public-api/controls/scrollable/item-view/item-view.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view-page-path-effect.h
dali-toolkit/public-api/controls/scrollable/scroll-view/scroll-view.h
dali-toolkit/public-api/controls/scrollable/scrollable.h
dali-toolkit/public-api/controls/table-view/table-view.h
dali-toolkit/public-api/controls/text-controls/text-field.h
dali-toolkit/public-api/controls/text-controls/text-label.h
dali-toolkit/public-api/enums.h
dali-toolkit/public-api/focus-manager/keyboard-focus-manager.h
dali-toolkit/public-api/text/rendering-backend.h
dali-toolkit/styles/480x800/dali-toolkit-default-theme.json
dali-toolkit/styles/720x1280/dali-toolkit-default-theme.json
doc/dali-toolkit_doc.h
doc/images/dali-modules.png [new file with mode: 0755]

index 0aee8ec..e35ce05 100644 (file)
@@ -21,7 +21,6 @@
 // EXTERNAL INCLUDES
 #include <dali/public-api/object/base-object.h>
 #include <dali/integration-api/debug.h>
-#include <dali/integration-api/events/key-event-integ.h>
 
 namespace Dali
 {
@@ -51,10 +50,10 @@ public:
   bool RestoreAfterFocusLost() const;
   void SetRestoreAfterFocusLost( bool toggle );
   void NotifyCursorPosition();
-  int GetCursorPosition();
   void SetCursorPosition( unsigned int cursorPosition );
-  void SetSurroundingText( std::string text );
-  std::string GetSurroundingText();
+  unsigned int GetCursorPosition() const;
+  void SetSurroundingText( const std::string& text );
+  const std::string& GetSurroundingText() const;
 
 public:  // Signals
   ImfManagerSignalType& ActivatedSignal() { return mActivatedSignal; }
@@ -78,7 +77,6 @@ private:
   bool mRestoreAfterFocusLost:1;             ///< Whether the keyboard needs to be restored (activated ) after focus regained.
   bool mIdleCallbackConnected:1;             ///< Whether the idle callback is already connected.
 
-  std::vector<Dali::Integration::KeyEvent> mKeyEvents; ///< Stores key events to be sent from idle call-back.
   ImfManagerSignalType      mActivatedSignal;
   ImfEventSignalType        mEventSignal;
 
@@ -120,10 +118,9 @@ Dali::ImfManager ImfManager::Get()
 
 ImfManager::ImfManager( /*Ecore_X_Window ecoreXwin*/ )
 : mIMFCursorPosition( 0 ),
-  mSurroundingText(""),
+  mSurroundingText(),
   mRestoreAfterFocusLost( false ),
-  mIdleCallbackConnected( false ),
-  mKeyEvents()
+  mIdleCallbackConnected( false )
 {
   CreateContext( /*ecoreXwin*/ );
   ConnectCallbacks();
@@ -178,22 +175,22 @@ void ImfManager::NotifyCursorPosition()
 {
 }
 
-int ImfManager::GetCursorPosition()
+void ImfManager::SetCursorPosition( unsigned int cursorPosition )
 {
-  return mIMFCursorPosition;
+  mIMFCursorPosition = static_cast< int >( cursorPosition );
 }
 
-void ImfManager::SetCursorPosition( unsigned int cursorPosition )
+unsigned int ImfManager::GetCursorPosition() const
 {
-  mIMFCursorPosition = ( int )cursorPosition;
+  return static_cast<unsigned int>( mIMFCursorPosition );
 }
 
-void ImfManager::SetSurroundingText( std::string text )
+void ImfManager::SetSurroundingText( const std::string& text )
 {
   mSurroundingText = text;
 }
 
-std::string ImfManager::GetSurroundingText()
+const std::string& ImfManager::GetSurroundingText() const
 {
   return mSurroundingText;
 }
@@ -220,11 +217,6 @@ ImfManager ImfManager::Get()
   return Internal::Adaptor::ImfManager::Get();
 }
 
-ImfContext ImfManager::GetContext()
-{
-  return NULL;
-}
-
 void ImfManager::Activate()
 {
   Internal::Adaptor::ImfManager::GetImplementation(*this).Activate();
@@ -260,17 +252,17 @@ void ImfManager::SetCursorPosition( unsigned int SetCursorPosition )
   Internal::Adaptor::ImfManager::GetImplementation(*this).SetCursorPosition( SetCursorPosition );
 }
 
-int ImfManager::GetCursorPosition()
+unsigned int ImfManager::GetCursorPosition() const
 {
   return Internal::Adaptor::ImfManager::GetImplementation(*this).GetCursorPosition();
 }
 
-void ImfManager::SetSurroundingText( std::string text )
+void ImfManager::SetSurroundingText( const std::string& text )
 {
   Internal::Adaptor::ImfManager::GetImplementation(*this).SetSurroundingText( text );
 }
 
-std::string ImfManager::GetSurroundingText()
+const std::string& ImfManager::GetSurroundingText() const
 {
   return Internal::Adaptor::ImfManager::GetImplementation(*this).GetSurroundingText();
 }
index 842078b..d90e9d4 100644 (file)
@@ -34,171 +34,198 @@ class ImfManager;
 }
 }
 
-typedef void* ImfContext;
-
 /**
  * @brief The ImfManager class
+ *
  * Specifically manages the ecore input method framework which enables the virtual or hardware keyboards.
  */
 class ImfManager : public BaseHandle
 {
 public:
 
+  /**
+   * @brief Events that are generated by the IMF.
+   */
   enum ImfEvent
   {
-    VOID,
-    PREEDIT,
-    COMMIT,
-    DELETESURROUNDING,
-    GETSURROUNDING
+    VOID,                ///< No event
+    PREEDIT,             ///< Pre-Edit changed
+    COMMIT,              ///< Commit recieved
+    DELETESURROUNDING,   ///< Event to delete a range of characters from the string
+    GETSURROUNDING       ///< Event to query string and cursor position
   };
 
   /**
-   * This structure is used to pass on data from the IMF regarding predictive text.
+   * @brief This structure is used to pass on data from the IMF regarding predictive text.
    */
   struct ImfEventData
   {
     /**
-     * Default Constructor.
+     * @brief Default Constructor.
      */
     ImfEventData()
-    : eventName( VOID ),
-      predictiveString(""),
+    : predictiveString(),
+      eventName( VOID ),
       cursorOffset( 0 ),
       numberOfChars ( 0 )
     {
     };
 
     /**
-     * Constructor
+     * @brief Constructor
+     *
      * @param[in] aEventName The name of the event from the IMF.
      * @param[in] aPredictiveString The pre-edit or commit string.
      * @param[in] aCursorOffset Start position from the current cursor position to start deleting characters.
      * @param[in] aNumberOfChars The number of characters to delete from the cursorOffset.
      */
-    ImfEventData(ImfEvent aEventName, const std::string& aPredictiveString, int aCursorOffset,int aNumberOfChars  )
-    : eventName(aEventName), predictiveString(aPredictiveString), cursorOffset( aCursorOffset ), numberOfChars( aNumberOfChars )
+    ImfEventData( ImfEvent aEventName, const std::string& aPredictiveString, int aCursorOffset, int aNumberOfChars )
+    : predictiveString( aPredictiveString ),
+      eventName( aEventName ),
+      cursorOffset( aCursorOffset ),
+      numberOfChars( aNumberOfChars )
     {
     }
 
     // Data
-    ImfEvent eventName; // The name of the event from the IMF.
-    std::string predictiveString; // The pre-edit or commit string.
-    int cursorOffset; // Start position from the current cursor position to start deleting characters.
-    int numberOfChars; //number of characters to delete from the cursorOffset.
+    std::string predictiveString; ///< The pre-edit or commit string.
+    ImfEvent eventName;           ///< The name of the event from the IMF.
+    int cursorOffset;             ///< Start position from the current cursor position to start deleting characters.
+    int numberOfChars;            ///< number of characters to delete from the cursorOffset.
   };
 
   /**
-   * Data required my IMF from the callback
+   * @brief Data required by IMF from the callback
    */
   struct ImfCallbackData
   {
-    ImfCallbackData( )
-    : update( false ), cursorPosition( 0 ), preeditResetRequired ( false )
+    /**
+     * @brief Constructor
+     */
+    ImfCallbackData()
+    : currentText(),
+      cursorPosition( 0 ),
+      update( false ),
+      preeditResetRequired( false )
     {
     }
 
-    ImfCallbackData(bool aUpdate, int aCursorPosition, std::string aCurrentText, bool aPreeditResetRequired )
-    : update(aUpdate), cursorPosition(aCursorPosition), currentText( aCurrentText ), preeditResetRequired( aPreeditResetRequired )
+    /**
+     * @brief Constructor
+     * @param[in] aUpdate True if cursor position needs to be updated
+     * @param[in] aCursorPosition new position of cursor
+     * @param[in] aCurrentText current text string
+     * @param[in] aPreeditResetRequired flag if preedit reset is required.
+     */
+    ImfCallbackData( bool aUpdate, int aCursorPosition, const std::string& aCurrentText, bool aPreeditResetRequired )
+    : currentText( aCurrentText ),
+      cursorPosition( aCursorPosition ),
+      update( aUpdate ),
+      preeditResetRequired( aPreeditResetRequired )
     {
     }
 
-    bool update; // if cursor position needs to be updated
-    int cursorPosition; // new position of cursor
-    std::string currentText; // current text string
-    bool preeditResetRequired; // flag if preedit reset is required.
+    std::string currentText;      ///< current text string
+    int cursorPosition;           ///< new position of cursor
+    bool update               :1; ///< if cursor position needs to be updated
+    bool preeditResetRequired :1; ///< flag if preedit reset is required.
   };
 
-  typedef Signal< void (ImfManager&) > ImfManagerSignalType;
-
-  typedef Signal< ImfCallbackData ( ImfManager&, const ImfEventData& ) > ImfEventSignalType;
+  typedef Signal< void (ImfManager&) > ImfManagerSignalType; ///< Keyboard actived signal
+  typedef Signal< ImfCallbackData ( ImfManager&, const ImfEventData& ) > ImfEventSignalType; ///< keyboard events
 
 public:
 
   /**
-   * Retrieve a handle to the instance of ImfManager.
+   * @brief Retrieve a handle to the instance of ImfManager.
    * @return A handle to the ImfManager.
    */
   static ImfManager Get();
 
   /**
-   * Get the current imf context.
-   * @return current imf context.
-   */
-  ImfContext GetContext();
-
-  /**
-   * Activate the IMF.
+   * @brief Activate the IMF.
+   *
    * It means that the text editing is started at somewhere.
    * If the H/W keyboard isn't connected then it will show the virtual keyboard.
    */
   void Activate();
 
   /**
-   * Deactivate the IMF.
+   * @brief Deactivate the IMF.
+   *
    * It means that the text editing is finished at somewhere.
    */
   void Deactivate();
 
   /**
-   * Get the restoration status, which controls if the keyboard is restored after the focus lost then regained.
+   * @brief Get the restoration status, which controls if the keyboard is restored after the focus lost then regained.
+   *
    * If true then keyboard will be restored (activated) after focus is regained.
    * @return restoration status.
    */
   bool RestoreAfterFocusLost() const;
 
   /**
-   * Set status whether the IMF has to restore the keyboard after losing focus.
+   * @brief Set status whether the IMF has to restore the keyboard after losing focus.
+   *
    * @param[in] toggle True means that keyboard should be restored after focus lost and regained.
    */
   void SetRestoreAfterFocusLost( bool toggle );
 
   /**
-   * Send message reset the pred-edit state / imf module.  Used to interupt pre-edit state maybe due to a touch input.
+   * @brief Send message reset the pred-edit state / imf module.
+   *
+   * Used to interupt pre-edit state maybe due to a touch input.
    */
   void Reset();
 
   /**
-   * Notifies IMF context that the cursor position has changed, required for features like auto-capitalisation
+   * @brief Notifies IMF context that the cursor position has changed, required for features like auto-capitalisation.
    */
   void NotifyCursorPosition();
 
   /**
-   * Sets cursor position stored in VirtualKeyboard, this is required by the IMF context
+   * @brief Sets cursor position stored in VirtualKeyboard, this is required by the IMF context.
+   *
    * @param[in] cursorPosition position of cursor
    */
   void SetCursorPosition( unsigned int cursorPosition );
 
   /**
-   * Gets cursor position stored in VirtualKeyboard, this is required by the IMF context
+   * @brief Gets cursor position stored in VirtualKeyboard, this is required by the IMF context.
+   *
    * @return current position of cursor
    */
-  int GetCursorPosition();
+  unsigned int GetCursorPosition() const;
 
   /**
-   * Method to store the string required by the IMF, this is used to provide predictive word suggestions.
+   * @brief Method to store the string required by the IMF, this is used to provide predictive word suggestions.
+   *
    * @param[in] text The text string surrounding the current cursor point.
    */
-  void SetSurroundingText( std::string text );
+  void SetSurroundingText( const std::string& text );
 
   /**
-   * Gets current text string set within the IMF manager, this is used to offer predictive suggestions
+   * @brief Gets current text string set within the IMF manager, this is used to offer predictive suggestions.
+   *
    * @return current position of cursor
    */
-  std::string GetSurroundingText();
+  const std::string& GetSurroundingText() const;
 
 public:
 
   // Signals
 
   /**
-   * This is emitted when the virtual keyboard is connected to or the hardware keyboard is activated.
+   * @brief This is emitted when the virtual keyboard is connected to or the hardware keyboard is activated.
+   *
    * @return The IMF Activated signal.
    */
   ImfManagerSignalType& ActivatedSignal();
 
   /**
-   * This is emitted when the IMF manager receives an event from the IMF
+   * @brief This is emitted when the IMF manager receives an event from the IMF.
+   *
    * @return The Event signal containing the event data.
    */
   ImfEventSignalType& EventReceivedSignal();
@@ -206,20 +233,23 @@ public:
   // Construction & Destruction
 
   /**
-   * Constructor
+   * @brief Constructor.
    */
   ImfManager();
 
   /**
-   * Non virtual destructor.
+   * @brief Destructor
+   *
+   * This is non-virtual since derived Handle types must not contain data or virtual methods.
    */
   ~ImfManager();
 
   /**
-   * This constructor is used by ImfManager::Get().
+   * @brief This constructor is used by ImfManager::Get().
+   *
    * @param[in] imfManager A pointer to the imf Manager.
    */
-  ImfManager( Internal::Adaptor::ImfManager* imfManager );
+  explicit ImfManager( Internal::Adaptor::ImfManager* imfManager );
 };
 
 } // namespace Dali
index dd631c6..3f9879e 100644 (file)
@@ -2287,3 +2287,63 @@ int UtcDaliToolkitScrollViewConstraintsWrap(void)
 
   END_TEST;
 }
+
+// Non-API test (so no P or N variant).
+int UtcDaliToolkitScrollViewGesturePageLimit(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline( " UtcDaliToolkitScrollViewGesturePageLimit" );
+
+  // Set up a scrollView.
+  ScrollView scrollView = ScrollView::New();
+
+  // Do not rely on stage size for UTC tests.
+  Vector2 pageSize( 720.0f, 1280.0f );
+  scrollView.SetResizePolicy( ResizePolicy::FIXED, Dimension::ALL_DIMENSIONS );
+  scrollView.SetSize( pageSize );
+  scrollView.SetParentOrigin( ParentOrigin::CENTER );
+  scrollView.SetAnchorPoint( AnchorPoint::CENTER );
+  scrollView.SetPosition( 0.0f, 0.0f, 0.0f );
+
+  // Position rulers.
+  // We set the X ruler to fixed to give us pages to snap to.
+  Dali::Toolkit::FixedRuler* rulerX = new Dali::Toolkit::FixedRuler( pageSize.width );
+  // Note: The 3x page width is arbitary, but we need enough to show that we are
+  // capping page movement by the page limiter, and not the domain.
+  rulerX->SetDomain( Dali::Toolkit::RulerDomain( 0.0f, pageSize.width * 3.0f, false ) );
+  Dali::Toolkit::RulerPtr rulerY = new Dali::Toolkit::DefaultRuler();
+  rulerY->Disable();
+  scrollView.SetRulerX( rulerX );
+  scrollView.SetRulerY( rulerY );
+
+  scrollView.SetWrapMode( false );
+  scrollView.SetScrollSensitive( true );
+
+  Stage::GetCurrent().Add( scrollView );
+
+  // Set up a gesture to perform.
+  Vector2 startPos( 50.0f, 0.0f );
+  Vector2 direction( -5.0f, 0.0f );
+  int frames = 200;
+
+  // Force starting position.
+  scrollView.ScrollTo( startPos, 0.0f );
+  Wait( application );
+
+  // Deliberately skip the "Finished" part of the gesture, so we can read the coordinates before the snap begins.
+  Vector2 currentPos( PerformGestureDiagonalSwipe( application, startPos, direction, frames - 1, false ) );
+
+  // Confirm the final X coord has not moved more than one page from the start X position.
+  DALI_TEST_GREATER( ( startPos.x + pageSize.width ), scrollView.GetCurrentScrollPosition().x, TEST_LOCATION );
+
+  // Finish the gesture and wait for the snap.
+  currentPos += direction;
+  SendPan( application, Gesture::Finished, currentPos );
+  // We add RENDER_FRAME_INTERVAL on to wait for an extra frame (for the last "finished" gesture to complete first.
+  Wait( application, RENDER_DELAY_SCROLL + RENDER_FRAME_INTERVAL );
+
+  // Confirm the final X coord has snapped to exactly one page ahead of the start page.
+  DALI_TEST_EQUALS( pageSize.width, scrollView.GetCurrentScrollPosition().x, Math::MACHINE_EPSILON_0, TEST_LOCATION );
+
+  END_TEST;
+}
index 011c989..0d25c56 100644 (file)
@@ -64,7 +64,8 @@ public:
     {
       MAX_SIZE = PROPERTY_START_INDEX, ///< name "max-size",                 The maximum size the Popup can be,              type VECTOR2
       ENABLE_OVERSHOOT,                ///< name "enable-overshoot",         Whether the overshoot image is enabled,         type BOOLEAN
-      SCROLL_BAR_PADDING               ///< name "scroll-bar-padding",       The padding used to position the scroll bar,    type VECTOR2
+      SCROLL_BAR_PADDING,              ///< name "scroll-bar-padding",       The padding used to position the scroll bar,    type VECTOR2
+      SCROLL_VIEW                      ///< name "scroll-view",             Properties to set on scroll view                type Property::Map
     };
   };
 
diff --git a/dali-toolkit/images/core_contextual_popup_bg_stroke_color.9.png b/dali-toolkit/images/core_contextual_popup_bg_stroke_color.9.png
new file mode 100644 (file)
index 0000000..136abce
Binary files /dev/null and b/dali-toolkit/images/core_contextual_popup_bg_stroke_color.9.png differ
index 7cfdb07..3773078 100644 (file)
@@ -250,6 +250,7 @@ void ImageView::OnStageConnection( int depth )
   if( mImage )
   {
     AttachImage();
+    Control::OnStageConnection( depth );
   }
 }
 
index 692ff75..100f4f0 100755 (executable)
@@ -150,6 +150,7 @@ const char* INDICATOR_HEIGHT_POLICY_NAME[] = {"Variable", "Fixed"};
 
 ScrollBar::ScrollBar(Toolkit::ScrollBar::Direction direction)
 : Control( ControlBehaviour( REQUIRES_TOUCH_EVENTS | REQUIRES_STYLE_CHANGE_SIGNALS ) ),
+  mIndicatorShowAlpha(1.0f),
   mDirection(direction),
   mScrollableObject(WeakHandleBase()),
   mPropertyScrollPosition(Property::INVALID_INDEX),
@@ -159,10 +160,11 @@ ScrollBar::ScrollBar(Toolkit::ScrollBar::Direction direction)
   mIndicatorShowDuration(DEFAULT_INDICATOR_SHOW_DURATION),
   mIndicatorHideDuration(DEFAULT_INDICATOR_HIDE_DURATION),
   mScrollStart(0.0f),
-  mIsPanning(false),
   mCurrentScrollPosition(0.0f),
   mIndicatorHeightPolicy(Toolkit::ScrollBar::Variable),
-  mIndicatorFixedHeight(DEFAULT_INDICATOR_FIXED_HEIGHT)
+  mIndicatorFixedHeight(DEFAULT_INDICATOR_FIXED_HEIGHT),
+  mIsPanning(false),
+  mIndicatorFirstShow(true)
 {
 }
 
@@ -217,6 +219,7 @@ void ScrollBar::SetScrollIndicator( Actor indicator )
   if( indicator )
   {
     mIndicator = indicator;
+    mIndicatorFirstShow = true;
     Self().Add(mIndicator);
 
     EnableGestureDetection(Gesture::Type(Gesture::Pan));
@@ -327,15 +330,22 @@ void ScrollBar::ShowIndicator()
     mAnimation.Reset();
   }
 
+  if( mIndicatorFirstShow )
+  {
+    // Preserve the alpha value from the stylesheet
+    mIndicatorShowAlpha = Self().GetCurrentColor().a;
+    mIndicatorFirstShow = false;
+  }
+
   if(mIndicatorShowDuration > 0.0f)
   {
     mAnimation = Animation::New( mIndicatorShowDuration );
-    mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), 1.0f, AlphaFunction::EASE_IN );
+    mAnimation.AnimateTo( Property( mIndicator, Actor::Property::COLOR_ALPHA ), mIndicatorShowAlpha, AlphaFunction::EASE_IN );
     mAnimation.Play();
   }
   else
   {
-    mIndicator.SetOpacity(1.0f);
+    mIndicator.SetOpacity(mIndicatorShowAlpha);
   }
 }
 
index 23d3fa7..1f9691d 100755 (executable)
@@ -265,6 +265,7 @@ private:
 private:
 
   Actor mIndicator;                                                  ///< Image of scroll indicator.
+  float mIndicatorShowAlpha;                                         ///< The alpha value when the indicator is fully shown
   Animation mAnimation;                                              ///< Scroll indicator Show/Hide Animation.
 
   Toolkit::ScrollBar::Direction mDirection;                          ///< The direction of scroll bar (vertical or horizontal)
@@ -282,7 +283,6 @@ private:
   float mScrollStart;                                                ///< Scroll Start position (start of drag)
   Vector3 mGestureDisplacement;                                      ///< Gesture Displacement.
 
-  bool mIsPanning;                                                  ///< Whether the scroll bar is being panned.
   float mCurrentScrollPosition;                                     ///< The current scroll position updated by the pan gesture
 
   Toolkit::ScrollBar::IndicatorHeightPolicy mIndicatorHeightPolicy;  ///< The height policy of scroll indicator (variable or fixed)
@@ -300,6 +300,9 @@ private:
   Constraint mIndicatorPositionConstraint;
   Constraint mIndicatorSizeConstraint;
   Constraint mScrollPositionInCurrentAxisConstraint;
+
+  bool mIsPanning          : 1;                                      ///< Whether the scroll bar is being panned.
+  bool mIndicatorFirstShow : 1;                                      ///< True if the indicator has never been shown
 };
 
 } // namespace Internal
index 3ae741d..b981110 100644 (file)
@@ -289,26 +289,27 @@ Dali::Toolkit::ItemView ItemView::New(ItemFactory& factory)
 ItemView::ItemView(ItemFactory& factory)
 : Scrollable( ControlBehaviour( DISABLE_SIZE_NEGOTIATION | REQUIRES_WHEEL_EVENTS | REQUIRES_KEYBOARD_NAVIGATION_SUPPORT ) ),
   mItemFactory(factory),
+  mItemsParentOrigin(ParentOrigin::CENTER),
+  mItemsAnchorPoint(AnchorPoint::CENTER),
+  mTotalPanDisplacement(Vector2::ZERO),
   mActiveLayout(NULL),
-  mAnimatingOvershootOn(false),
-  mAnimateOvershootOff(false),
-  mAnchoringEnabled(false),
   mAnchoringDuration(DEFAULT_ANCHORING_DURATION),
   mRefreshIntervalLayoutPositions(0.0f),
-  mRefreshOrderHint(true/*Refresh item 0 first*/),
   mMinimumSwipeSpeed(DEFAULT_MINIMUM_SWIPE_SPEED),
   mMinimumSwipeDistance(DEFAULT_MINIMUM_SWIPE_DISTANCE),
   mWheelScrollDistanceStep(0.0f),
   mScrollDistance(0.0f),
   mScrollSpeed(0.0f),
-  mTotalPanDisplacement(Vector2::ZERO),
   mScrollOvershoot(0.0f),
-  mIsFlicking(false),
   mGestureState(Gesture::Clear),
+  mAnimatingOvershootOn(false),
+  mAnimateOvershootOff(false),
+  mAnchoringEnabled(false),
+  mRefreshOrderHint(true/*Refresh item 0 first*/),
+  mIsFlicking(false),
   mAddingItems(false),
   mRefreshEnabled(true),
-  mItemsParentOrigin( ParentOrigin::CENTER),
-  mItemsAnchorPoint( AnchorPoint::CENTER)
+  mInAnimation(false)
 {
 }
 
@@ -1180,13 +1181,39 @@ void ItemView::OnPan( const PanGesture& gesture )
 
       self.SetProperty(Toolkit::ItemView::Property::LAYOUT_POSITION, firstItemScrollPosition );
 
-      if( (firstItemScrollPosition >= 0.0f && currentOvershoot < 1.0f) || (firstItemScrollPosition >= mActiveLayout->GetMinimumLayoutPosition(mItemFactory.GetNumberOfItems(), layoutSize) && currentOvershoot > -1.0f) )
+      if( ( firstItemScrollPosition >= 0.0f &&
+            currentOvershoot < 1.0f ) ||
+          ( firstItemScrollPosition <= mActiveLayout->GetMinimumLayoutPosition(mItemFactory.GetNumberOfItems(), layoutSize) &&
+            currentOvershoot > -1.0f ) )
       {
         mTotalPanDisplacement += gesture.displacement;
       }
 
       mScrollOvershoot = CalculateScrollOvershoot();
-      self.SetProperty( Toolkit::ItemView::Property::OVERSHOOT, mScrollOvershoot );
+
+      // If the view is moved in a direction against the overshoot indicator, then the indicator should be animated off.
+      // First make sure we are not in an animation, otherwise a previously started
+      // off-animation will be overwritten as the user continues scrolling.
+      if( !mInAnimation )
+      {
+        // Check if the movement is against the current overshoot amount (if we are currently displaying the indicator).
+        if( ( ( mScrollOvershoot > Math::MACHINE_EPSILON_0 ) && ( mScrollDistance < -Math::MACHINE_EPSILON_0 ) ) ||
+          ( ( mScrollOvershoot < Math::MACHINE_EPSILON_0 ) && ( mScrollDistance > Math::MACHINE_EPSILON_0 ) ) )
+        {
+          // The user has moved against the indicator direction.
+          // First, we reset the total displacement. This means the overshoot amount will become zero the next frame,
+          // and if the user starts dragging in the overshoot direction again, the indicator will appear once more.
+          mTotalPanDisplacement = Vector2::ZERO;
+          // Animate the overshoot indicator off.
+          AnimateScrollOvershoot( 0.0f, false );
+        }
+        else
+        {
+          // Only set the property directly if we are not animating the overshoot away,
+          // as otherwise this will overwrite the animation generated value.
+          self.SetProperty( Toolkit::ItemView::Property::OVERSHOOT, mScrollOvershoot );
+        }
+      }
     }
     break;
 
@@ -1317,6 +1344,7 @@ void ItemView::OnOvershootOnFinished(Animation& animation)
   {
     AnimateScrollOvershoot(0.0f);
   }
+  mInAnimation = false;
 }
 
 void ItemView::ScrollToItem(unsigned int itemId, float durationSeconds)
@@ -1471,42 +1499,45 @@ void ItemView::EnableScrollOvershoot( bool enable )
   Actor self = Self();
   if( enable )
   {
-    Property::Index effectOvershootPropertyIndex = Property::INVALID_INDEX;
-    mOvershootOverlay = CreateBouncingEffectActor( effectOvershootPropertyIndex );
-    mOvershootOverlay.SetColor(mOvershootEffectColor);
-    mOvershootOverlay.SetParentOrigin(ParentOrigin::TOP_LEFT);
-    mOvershootOverlay.SetAnchorPoint(AnchorPoint::TOP_LEFT);
-    mOvershootOverlay.SetDrawMode( DrawMode::OVERLAY_2D );
-    self.Add(mOvershootOverlay);
-
-    Constraint constraint = Constraint::New<Vector3>( mOvershootOverlay, Actor::Property::SIZE, OvershootOverlaySizeConstraint(mOvershootSize.height) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_DIRECTION ) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_ORIENTATION ) );
-    constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
-    constraint.Apply();
-
-    mOvershootOverlay.SetSize(mOvershootSize.width, mOvershootSize.height);
-
-    constraint = Constraint::New<Quaternion>( mOvershootOverlay, Actor::Property::ORIENTATION, OvershootOverlayRotationConstraint );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_DIRECTION ) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_ORIENTATION ) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::OVERSHOOT ) );
-    constraint.Apply();
-
-    constraint = Constraint::New<Vector3>( mOvershootOverlay, Actor::Property::POSITION, OvershootOverlayPositionConstraint );
-    constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_DIRECTION ) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_ORIENTATION ) );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::OVERSHOOT ) );
-    constraint.Apply();
-
-    constraint = Constraint::New<bool>( mOvershootOverlay, Actor::Property::VISIBLE, OvershootOverlayVisibilityConstraint );
-    constraint.AddSource( ParentSource( Toolkit::Scrollable::Property::CAN_SCROLL_VERTICAL ) );
-    constraint.Apply();
-
-    constraint = Constraint::New<float>( mOvershootOverlay, effectOvershootPropertyIndex, EqualToConstraint() );
-    constraint.AddSource( ParentSource( Toolkit::ItemView::Property::OVERSHOOT ) );
-    constraint.Apply();
+    if( !mOvershootOverlay )
+    {
+      Property::Index effectOvershootPropertyIndex = Property::INVALID_INDEX;
+      mOvershootOverlay = CreateBouncingEffectActor( effectOvershootPropertyIndex );
+      mOvershootOverlay.SetColor(mOvershootEffectColor);
+      mOvershootOverlay.SetParentOrigin(ParentOrigin::TOP_LEFT);
+      mOvershootOverlay.SetAnchorPoint(AnchorPoint::TOP_LEFT);
+      mOvershootOverlay.SetDrawMode( DrawMode::OVERLAY_2D );
+      self.Add(mOvershootOverlay);
+
+      Constraint constraint = Constraint::New<Vector3>( mOvershootOverlay, Actor::Property::SIZE, OvershootOverlaySizeConstraint(mOvershootSize.height) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_DIRECTION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_ORIENTATION ) );
+      constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
+      constraint.Apply();
+
+      mOvershootOverlay.SetSize(mOvershootSize.width, mOvershootSize.height);
+
+      constraint = Constraint::New<Quaternion>( mOvershootOverlay, Actor::Property::ORIENTATION, OvershootOverlayRotationConstraint );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_DIRECTION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_ORIENTATION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::OVERSHOOT ) );
+      constraint.Apply();
+
+      constraint = Constraint::New<Vector3>( mOvershootOverlay, Actor::Property::POSITION, OvershootOverlayPositionConstraint );
+      constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::SCROLL_DIRECTION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::LAYOUT_ORIENTATION ) );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::OVERSHOOT ) );
+      constraint.Apply();
+
+      constraint = Constraint::New<bool>( mOvershootOverlay, Actor::Property::VISIBLE, OvershootOverlayVisibilityConstraint );
+      constraint.AddSource( ParentSource( Toolkit::Scrollable::Property::CAN_SCROLL_VERTICAL ) );
+      constraint.Apply();
+
+      constraint = Constraint::New<float>( mOvershootOverlay, effectOvershootPropertyIndex, EqualToConstraint() );
+      constraint.AddSource( ParentSource( Toolkit::ItemView::Property::OVERSHOOT ) );
+      constraint.Apply();
+    }
   }
   else
   {
@@ -1567,13 +1598,14 @@ void ItemView::AnimateScrollOvershoot(float overshootAmount, bool animateBack)
       duration = mOvershootOverlay.GetCurrentSize().height * (animatingOn ? (1.0f - fabsf(currentOvershoot)) : fabsf(currentOvershoot)) / mOvershootAnimationSpeed;
     }
 
+    // Mark the animation as in progress to prevent manual property sets overwriting it.
+    mInAnimation = true;
+    mAnimatingOvershootOn = animatingOn;
     RemoveAnimation(mScrollOvershootAnimation);
     mScrollOvershootAnimation = Animation::New(duration);
     mScrollOvershootAnimation.FinishedSignal().Connect(this, &ItemView::OnOvershootOnFinished);
     mScrollOvershootAnimation.AnimateTo( Property(self, Toolkit::ItemView::Property::OVERSHOOT), overshootAmount, TimePeriod(0.0f, duration) );
     mScrollOvershootAnimation.Play();
-
-    mAnimatingOvershootOn = animatingOn;
   }
   else
   {
index 9fc58aa..2fe5e09 100644 (file)
@@ -561,58 +561,44 @@ private:
 
 private:
 
-  ItemFactory& mItemFactory;
-
   typedef std::map<unsigned int, Actor> ItemPool;
   typedef ItemPool::iterator            ItemPoolIter;
   typedef ItemPool::const_iterator      ConstItemPoolIter;
 
   ItemPool mItemPool;
-
-  std::vector< ItemLayoutPtr >  mLayouts;  ///<  Container of Dali::Toolkit::ItemLayout objects
-  ItemLayout* mActiveLayout;
-  Vector3 mActiveLayoutTargetSize;
-
+  ItemFactory& mItemFactory;
+  std::vector< ItemLayoutPtr > mLayouts;            ///< Container of Dali::Toolkit::ItemLayout objects
+  Actor mOvershootOverlay;                          ///< The overlay actor for overshoot effect
   Animation mResizeAnimation;
   Animation mScrollAnimation;
   Animation mScrollOvershootAnimation;
-  bool      mAnimatingOvershootOn;          ///< whether we are currently animating overshoot to 1.0f/-1.0f (on) or to 0.0f (off)
-  bool      mAnimateOvershootOff;         ///< whether we are currently animating overshoot to 1.0f/-1.0f (on) or to 0.0f (off)
+  Timer mWheelEventFinishedTimer;                   ///< The timer to determine whether there is no wheel event received for a certain period of time.
+  PropertyNotification mRefreshNotification;        ///< Stores the property notification used for item view refresh
+  LayoutActivatedSignalType mLayoutActivatedSignal;
+  Vector3 mActiveLayoutTargetSize;
+  Vector3 mItemsParentOrigin;
+  Vector3 mItemsAnchorPoint;
+  Vector2 mTotalPanDisplacement;
+  ItemLayout* mActiveLayout;
 
-  bool mAnchoringEnabled;
   float mAnchoringDuration;
-
-  float mRefreshIntervalLayoutPositions;  ///< Refresh item view when the layout position changes by this interval in both positive and negative directions.
-  PropertyNotification mRefreshNotification; // stores the property notification used for item view refresh
-  bool mRefreshOrderHint; ///< True if scrolling towards the last item
-
-  // Input handling
-
+  float mRefreshIntervalLayoutPositions;            ///< Refresh item view when the layout position changes by this interval in both positive and negative directions.
   float mMinimumSwipeSpeed;
   float mMinimumSwipeDistance;
-  float mWheelScrollDistanceStep; ///< The step of scroll distance in actor coordinates for each wheel event received.
-
+  float mWheelScrollDistanceStep;                   ///< The step of scroll distance in actor coordinates for each wheel event received.
   float mScrollDistance;
   float mScrollSpeed;
-  Vector2 mTotalPanDisplacement;
-
   float mScrollOvershoot;
-  bool mIsFlicking;
-
-  Timer mWheelEventFinishedTimer; ///< The timer to determine whether there is no wheel event received for a certain period of time.
-
-  Dali::Gesture::State mGestureState;
 
-  Actor mOvershootOverlay;           ///< The overlay actor for overshoot effect
-
-  bool mAddingItems;
-
-  bool mRefreshEnabled; ///< Whether to refresh the cache automatically
-
-  Vector3 mItemsParentOrigin;
-  Vector3 mItemsAnchorPoint;
-
-  LayoutActivatedSignalType mLayoutActivatedSignal;
+  Dali::Gesture::State mGestureState    : 3;
+  bool mAnimatingOvershootOn            : 1;        ///< Whether we are currently animating overshoot to 1.0f/-1.0f (on) or to 0.0f (off)
+  bool mAnimateOvershootOff             : 1;        ///< Whether we are currently animating overshoot to 1.0f/-1.0f (on) or to 0.0f (off)
+  bool mAnchoringEnabled                : 1;
+  bool mRefreshOrderHint                : 1;        ///< True if scrolling towards the last item
+  bool mIsFlicking                      : 1;
+  bool mAddingItems                     : 1;
+  bool mRefreshEnabled                  : 1;        ///< Whether to refresh the cache automatically
+  bool mInAnimation                     : 1;        ///< Keeps track of whether an animation is controlling the overshoot property.
 };
 
 } // namespace Internal
index bfc49c0..eff1b08 100644 (file)
@@ -146,6 +146,7 @@ void ScrollOvershootEffectRipple::Apply()
   mOvershootProperty = IsVertical() ? Toolkit::ScrollView::Property::OVERSHOOT_Y : Toolkit::ScrollView::Property::OVERSHOOT_X;
 
   // make sure height is set, since we only create a constraint for image width
+  mOvershootSize = mAttachedScrollView.GetOvershootSize();
   mOvershootOverlay.SetSize( mOvershootSize );
 
   mAttachedScrollView.AddOverlay(mOvershootOverlay);
index 23a1710..c07f6ff 100644 (file)
@@ -312,93 +312,132 @@ ScrollView::LockAxis GetLockAxis(const Vector2& panDelta, ScrollView::LockAxis c
  */
 struct InternalPrePositionConstraint
 {
-  InternalPrePositionConstraint(const Vector2& initialPanPosition,
-                                const Vector2& initialPanMask,
-                                bool axisAutoLock,
-                                float axisAutoLockGradient,
-                                ScrollView::LockAxis initialLockAxis,
-                                const Vector2& maxOvershoot,
-                                const RulerDomain& domainX, const RulerDomain& domainY)
-  : mLocalStart(initialPanPosition),
-    mInitialPanMask(initialPanMask),
-    mDomainMin( -domainX.min, -domainY.min ),
-    mDomainMax( -domainX.max, -domainY.max ),
-    mMaxOvershoot(maxOvershoot),
-    mAxisAutoLockGradient(axisAutoLockGradient),
-    mLockAxis(initialLockAxis),
-    mAxisAutoLock(axisAutoLock),
-    mWasPanning(false),
-    mClampX( domainX.enabled ),
-    mClampY( domainY.enabled )
-  {
+  InternalPrePositionConstraint( const Vector2& initialPanPosition,
+                                 const Vector2& initialPanMask,
+                                 bool axisAutoLock,
+                                 float axisAutoLockGradient,
+                                 ScrollView::LockAxis initialLockAxis,
+                                 const Vector2& maxOvershoot,
+                                 const RulerPtr& rulerX, const RulerPtr& rulerY )
+  : mLocalStart( initialPanPosition ),
+    mInitialPanMask( initialPanMask ),
+    mMaxOvershoot( maxOvershoot ),
+    mAxisAutoLockGradient( axisAutoLockGradient ),
+    mLockAxis( initialLockAxis ),
+    mAxisAutoLock( axisAutoLock ),
+    mWasPanning( false )
+  {
+    const RulerDomain& rulerDomainX = rulerX->GetDomain();
+    const RulerDomain& rulerDomainY = rulerY->GetDomain();
+    mDomainMin = Vector2( rulerDomainX.min, -rulerDomainY.min );
+    mDomainMax = Vector2( -rulerDomainX.max, -rulerDomainY.max );
+    mClampX = rulerDomainX.enabled;
+    mClampY = rulerDomainY.enabled;
+    mFixedRulerX = rulerX->GetType() == Ruler::Fixed;
+    mFixedRulerY = rulerY->GetType() == Ruler::Fixed;
   }
 
   void operator()( Vector2& scrollPostPosition, const PropertyInputContainer& inputs )
   {
     const Vector2& panPosition = inputs[0]->GetVector2();
+    const bool& inGesture = inputs[1]->GetBoolean();
 
-    if(!mWasPanning)
-    {
-      mPrePosition = scrollPostPosition;
-      mCurrentPanMask = mInitialPanMask;
-      mWasPanning = true;
-    }
-
-    // Calculate Deltas...
-    const Vector2& currentPosition = panPosition;
-    Vector2 panDelta( currentPosition - mLocalStart );
-
-    // Axis Auto Lock - locks the panning to the horizontal or vertical axis if the pan
-    // appears mostly horizontal or mostly vertical respectively...
-    if( mAxisAutoLock )
+    // First check if we are within a gesture.
+    // The ScrollView may have received a start gesture from ::OnPan()
+    // while the finish gesture is received now in this constraint.
+    // This gesture must then be rejected as the value will be "old".
+    // Typically the last value from the end of the last gesture.
+    // If we are rejecting the gesture, we simply don't modify the constraint target.
+    if( inGesture )
     {
-      mLockAxis = GetLockAxis(panDelta, mLockAxis, mAxisAutoLockGradient);
-      if( mLockAxis == ScrollView::LockVertical )
+      if( !mWasPanning )
       {
-        mCurrentPanMask.y = 0.0f;
+        mPrePosition = scrollPostPosition;
+        mStartPosition = mPrePosition;
+        mCurrentPanMask = mInitialPanMask;
+        mWasPanning = true;
       }
-      else if( mLockAxis == ScrollView::LockHorizontal )
+
+      // Calculate Deltas...
+      const Vector2& currentPosition = panPosition;
+      Vector2 panDelta( currentPosition - mLocalStart );
+
+      // Axis Auto Lock - locks the panning to the horizontal or vertical axis if the pan
+      // appears mostly horizontal or mostly vertical respectively...
+      if( mAxisAutoLock )
       {
-        mCurrentPanMask.x = 0.0f;
+        mLockAxis = GetLockAxis( panDelta, mLockAxis, mAxisAutoLockGradient );
+        if( mLockAxis == ScrollView::LockVertical )
+        {
+          mCurrentPanMask.y = 0.0f;
+        }
+        else if( mLockAxis == ScrollView::LockHorizontal )
+        {
+          mCurrentPanMask.x = 0.0f;
+        }
       }
-    }
 
-    // Restrict deltas based on ruler enable/disable and axis-lock state...
-    panDelta *= mCurrentPanMask;
+      // Restrict deltas based on ruler enable/disable and axis-lock state...
+      panDelta *= mCurrentPanMask;
 
-    // Perform Position transform based on input deltas...
-    scrollPostPosition = mPrePosition;
-    scrollPostPosition += panDelta;
+      // Perform Position transform based on input deltas...
+      scrollPostPosition = mPrePosition;
+      scrollPostPosition += panDelta;
 
-    // if no wrapping then clamp preposition to maximum overshoot amount
-    const Vector3& size = inputs[1]->GetVector3();
-    if( mClampX )
-    {
-      float newXPosition = Clamp(scrollPostPosition.x, (mDomainMax.x + size.x) - mMaxOvershoot.x, mDomainMin.x + mMaxOvershoot.x );
-      if( (newXPosition < scrollPostPosition.x - Math::MACHINE_EPSILON_1)
-              || (newXPosition > scrollPostPosition.x + Math::MACHINE_EPSILON_1) )
+      // if no wrapping then clamp preposition to maximum overshoot amount
+      const Vector3& size = inputs[2]->GetVector3();
+      if( mClampX )
       {
-        mPrePosition.x = newXPosition;
-        mLocalStart.x = panPosition.x;
+        float newXPosition = Clamp( scrollPostPosition.x, ( mDomainMax.x + size.x ) - mMaxOvershoot.x, mDomainMin.x + mMaxOvershoot.x );
+        if( (newXPosition < scrollPostPosition.x - Math::MACHINE_EPSILON_1)
+          || (newXPosition > scrollPostPosition.x + Math::MACHINE_EPSILON_1) )
+        {
+          mPrePosition.x = newXPosition;
+          mLocalStart.x = panPosition.x;
+        }
+        scrollPostPosition.x = newXPosition;
       }
-      scrollPostPosition.x = newXPosition;
-    }
-    if( mClampY )
-    {
-      float newYPosition = Clamp(scrollPostPosition.y, (mDomainMax.y + size.y) - mMaxOvershoot.y, mDomainMin.y + mMaxOvershoot.y );
-      if( (newYPosition < scrollPostPosition.y - Math::MACHINE_EPSILON_1)
-              || (newYPosition > scrollPostPosition.y + Math::MACHINE_EPSILON_1) )
+      if( mClampY )
+      {
+        float newYPosition = Clamp( scrollPostPosition.y, ( mDomainMax.y + size.y ) - mMaxOvershoot.y, mDomainMin.y + mMaxOvershoot.y );
+        if( ( newYPosition < scrollPostPosition.y - Math::MACHINE_EPSILON_1 )
+          || ( newYPosition > scrollPostPosition.y + Math::MACHINE_EPSILON_1 ) )
+        {
+          mPrePosition.y = newYPosition;
+          mLocalStart.y = panPosition.y;
+        }
+        scrollPostPosition.y = newYPosition;
+      }
+
+      // If we are using a fixed ruler in a particular axis, limit the maximum pages scrolled on that axis.
+      if( mFixedRulerX || mFixedRulerY )
       {
-        mPrePosition.y = newYPosition;
-        mLocalStart.y = panPosition.y;
+        // Here we limit the maximum amount that can be moved from the starting position of the gesture to one page.
+        // We do this only if we have a fixed ruler (on that axis) and the mode is enabled.
+        // Note: 1.0f is subtracted to keep the value within one page size (otherwise we stray on to the page after).
+        // Note: A further 1.0f is subtracted to handle a compensation that happens later within the flick handling code in SnapWithVelocity().
+        //       When a flick is completed, an adjustment of 1.0f is sometimes made to allow for the scenario where:
+        //       A flick finishes before the update thread has advanced the scroll position past the previous snap point.
+        Vector2 pageSizeLimit( size.x - ( 1.0f + 1.0f ), size.y - ( 1.0f - 1.0f ) );
+        Vector2 minPosition( mStartPosition.x - pageSizeLimit.x, mStartPosition.y - pageSizeLimit.y );
+        Vector2 maxPosition( mStartPosition.x + pageSizeLimit.x, mStartPosition.y + pageSizeLimit.y );
+
+        if( mFixedRulerX )
+        {
+          scrollPostPosition.x = Clamp( scrollPostPosition.x, minPosition.x, maxPosition.x );
+        }
+        if( mFixedRulerY )
+        {
+          scrollPostPosition.y = Clamp( scrollPostPosition.y, minPosition.y, maxPosition.y );
+        }
       }
-      scrollPostPosition.y = newYPosition;
     }
   }
 
   Vector2 mPrePosition;
   Vector2 mLocalStart;
-  Vector2 mInitialPanMask;              ///< Initial pan mask (based on ruler settings)
+  Vector2 mStartPosition;               ///< The start position of the gesture - used to limit scroll amount (not modified by clamping).
+  Vector2 mInitialPanMask;              ///< Initial pan mask (based on ruler settings).
   Vector2 mCurrentPanMask;              ///< Current pan mask that can be altered by axis lock mode.
   Vector2 mDomainMin;
   Vector2 mDomainMax;
@@ -407,10 +446,12 @@ struct InternalPrePositionConstraint
   float mAxisAutoLockGradient;          ///< Set by ScrollView
   ScrollView::LockAxis mLockAxis;
 
-  bool mAxisAutoLock:1;                   ///< Set by ScrollView
+  bool mAxisAutoLock:1;                 ///< Set by ScrollView
   bool mWasPanning:1;
   bool mClampX:1;
   bool mClampY:1;
+  bool mFixedRulerX:1;
+  bool mFixedRulerY:1;
 };
 
 /**
@@ -599,7 +640,6 @@ ScrollView::ScrollView()
   mMaxFlickSpeed(DEFAULT_MAX_FLICK_SPEED),
   mWheelScrollDistanceStep(Vector2::ZERO),
   mInAccessibilityPan(false),
-  mInitialized(false),
   mScrolling(false),
   mScrollInterrupted(false),
   mPanning(false),
@@ -635,8 +675,6 @@ void ScrollView::OnInitialize()
 
   mWheelScrollDistanceStep = Stage::GetCurrent().GetSize() * DEFAULT_WHEEL_SCROLL_DISTANCE_STEP_PROPORTION;
 
-  mInitialized = true;
-
   mGestureStackDepth = 0;
 
   EnableGestureDetection( Gesture::Type( Gesture::Pan ) );
@@ -2684,9 +2722,10 @@ void ScrollView::UpdateMainInternalConstraint()
                                                                                                         mAxisAutoLockGradient,
                                                                                                         mLockAxis,
                                                                                                         mMaxOvershoot,
-                                                                                                        mRulerX->GetDomain(),
-                                                                                                        mRulerY->GetDomain() ) );
+                                                                                                        mRulerX,
+                                                                                                        mRulerY ) );
     mScrollMainInternalPrePositionConstraint.AddSource( Source( detector, PanGestureDetector::Property::LOCAL_POSITION ) );
+    mScrollMainInternalPrePositionConstraint.AddSource( Source( detector, PanGestureDetector::Property::PANNING ) );
     mScrollMainInternalPrePositionConstraint.AddSource( Source( self, Actor::Property::SIZE ) );
     mScrollMainInternalPrePositionConstraint.Apply();
   }
index 5593a63..49ff741 100644 (file)
@@ -902,8 +902,7 @@ private:
 
   Toolkit::ScrollView::SnapStartedSignalType mSnapStartedSignal;
 
-  bool mInAccessibilityPan : 1;           ///< With AccessibilityPan its easier to move between snap positions
-  bool mInitialized:1;
+  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
index ae35484..dd9c5fb 100644 (file)
@@ -412,7 +412,7 @@ void TableView::DeleteRow( unsigned int rowIndex, std::vector<Actor>& removed )
       else if( row >= rowIndex )    // If below of or at the inserted row, decrease row index
       {
         // Decrement index
-        if( position.rowIndex > 1 )
+        if( position.rowIndex > 0 )
         {
           position.rowIndex--;
         }
index ab52f3a..7159160 100644 (file)
@@ -284,7 +284,7 @@ void TextLabel::SetProperty( BaseObject* object, Property::Index index, const Pr
         if( impl.mController )
         {
           float height = value.Get< float >();
-          if ( impl.mController->GetUnderlineHeight() != height )
+          if( fabsf( impl.mController->GetUnderlineHeight() - height ) > Math::MACHINE_EPSILON_1000 )
           {
             impl.mController->SetUnderlineHeight( height );
             impl.mRenderer.Reset();
index ff80372..adb29ed 100644 (file)
@@ -507,7 +507,7 @@ void TextSelectionPopup::OnStageConnection( int depth )
 void TextSelectionPopup::HideAnimationFinished( Animation& animation )
 {
   Actor self = Self();
-  if ( !mPopupShowing ) // During the Hide/Fade animation there could be a call to Show the Popup again, mPopupShowing will be true in this case.
+  if( !mPopupShowing ) // During the Hide/Fade animation there could be a call to Show the Popup again, mPopupShowing will be true in this case.
   {
     DALI_LOG_INFO( gLogFilter, Debug::General, "TextSelectionPopup::HideAnimationFinished\n" );
     UnparentAndReset( mToolbar );
@@ -882,7 +882,7 @@ std::string TextSelectionPopup::GetPressedImage() const
    CreateOrderedListOfPopupOptions();
 
    mButtonsChanged = false;
-   UnparentAndReset( mToolbar);
+   UnparentAndReset( mToolbar );
 
    if( !mToolbar )
    {
@@ -924,64 +924,93 @@ void TextSelectionPopup::SetPopupBackgroundImage( Image image,
     mNinePatchBorder = static_cast<float>( ninePatch.GetChildRectangle().x );
     mNinePatchBorderPercentage = mNinePatchBorder / static_cast<float>( ninePatch.GetWidth() );
 
-    if( !mBackgoundVertexBuffer )
+    if( !mBackgroundVertexBuffer )
     {
       Property::Map vertexFormat;
       vertexFormat["aPosition"] = Property::VECTOR2;
       vertexFormat["aTextCoord"] = Property::VECTOR2;
 
       //Create a vertex buffer for vertex positions
-      mBackgoundVertexBuffer = PropertyBuffer::New( vertexFormat, 16u );
+      mBackgroundVertexBuffer = PropertyBuffer::New( vertexFormat, 16u );
 
       Vector<Vector2> geometry;
       geometry.Resize( 32u );
-      mBackgoundVertexBuffer.SetData( geometry.Begin() );
+      mBackgroundVertexBuffer.SetData( geometry.Begin() );
     }
 
-    Shader shader = Shader::New( VERTEX_SHADER_COLOR, FRAGMENT_SHADER_COLOR );
-    Material material = Material::New( shader );
+    if( !mBackgroundRenderer )
+    {
+      Image croppedImage = ninePatch.CreateCroppedBufferImage();
+      if( croppedImage )
+      {
+        Shader shader = Shader::New( VERTEX_SHADER_COLOR, FRAGMENT_SHADER_COLOR, Shader::HINT_OUTPUT_IS_TRANSPARENT );
+
+        Material material = Material::New( shader );
+
+        Sampler sampler = Sampler::New( croppedImage, TEXTURE_UNIFORM_NAME );
+        sampler.SetAffectsTransparency( true );
+
+        material.AddSampler( sampler );
 
-    Sampler sampler = Sampler::New( image, TEXTURE_UNIFORM_NAME );
-    material.AddSampler( sampler );
+        //Create the index buffer
+        Property::Map indexFormat;
+        indexFormat["indices"] = Property::INTEGER;
+        PropertyBuffer indexBuffer = PropertyBuffer::New( indexFormat, 54u );
+        indexBuffer.SetData( gBackgroundQuadIndex );
 
-    //Create the index buffer
-    Property::Map indexFormat;
-    indexFormat["indices"] = Property::INTEGER;
-    PropertyBuffer indexBuffer = PropertyBuffer::New( indexFormat, 54u );
-    indexBuffer.SetData( gBackgroundQuadIndex );
+        //Create the geometry
+        Geometry mesh = Geometry::New();
+        mesh.AddVertexBuffer( mBackgroundVertexBuffer );
+        mesh.SetIndexBuffer( indexBuffer );
 
-    //Create the geometry
-    Geometry mesh = Geometry::New();
-    mesh.AddVertexBuffer( mBackgoundVertexBuffer );
-    mesh.SetIndexBuffer( indexBuffer );
+        //Add uniforms to the shader
+        mBackgroundColorIndex = shader.RegisterProperty( "uBackgroundColor", backgroundColor );
+        mStrokeColorIndex = shader.RegisterProperty( "uStrokeColor", strokeColor );
 
-    //Add uniforms to the shader
-    shader.RegisterProperty( "uBackgroundColor", backgroundColor );
-    shader.RegisterProperty( "uStrokeColor", strokeColor );
+        Actor parent = Self();
 
-    Actor parent = Self();
+        //Create the renderer
+        mBackgroundRenderer = Renderer::New( mesh, material );
+        mBackgroundRenderer.SetDepthIndex( parent.GetHierarchyDepth() + BACKGROUND_DEPTH_INDEX );
 
-    //Create the renderer
-    Renderer renderer = Renderer::New( mesh, material );
-    renderer.SetDepthIndex( parent.GetHierarchyDepth() + BACKGROUND_DEPTH_INDEX );
+        //Create the actor
+        Actor backgroundActor = Actor::New();
+        backgroundActor.SetSize( Vector3::ONE );
 
-    //Create the actor
-    mBackgroundActor = Actor::New();
-    mBackgroundActor.SetSize( Vector3::ONE );
-    mBackgroundActor.AddRenderer( renderer );
-    mBackgroundActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
-    mBackgroundActor.SetColorMode( USE_PARENT_COLOR );
+        backgroundActor.SetPositionInheritanceMode( USE_PARENT_POSITION_PLUS_LOCAL_POSITION );
+        backgroundActor.SetColorMode( USE_OWN_MULTIPLY_PARENT_ALPHA );
 
-    //Constraint scale of the mesh actor to the size of the control
-    Constraint constraint = Constraint::New<Vector3>( mBackgroundActor,
-                                                      Actor::Property::SCALE,
-                                                      EqualToConstraint() );
+        backgroundActor.AddRenderer( mBackgroundRenderer );
 
-    constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
-    constraint.Apply();
+        //Constraint scale of the mesh actor to the size of the control
+        Constraint constraint = Constraint::New<Vector3>( backgroundActor,
+                                                          Actor::Property::SCALE,
+                                                          EqualToConstraint() );
+
+        constraint.AddSource( ParentSource( Actor::Property::SIZE ) );
+        constraint.Apply();
+
+        // The actor does not need to be inserted to guarantee order.
+        parent.Add( backgroundActor );
+      }
+    }
+    else
+    {
+      // Set the new image to the sampler.
+      Image croppedImage = ninePatch.CreateCroppedBufferImage();
 
-    // The actor does not need to be inserted to guarantee order.
-    parent.Add( mBackgroundActor );
+      if( croppedImage )
+      {
+        Material material = mBackgroundRenderer.GetMaterial();
+        Sampler sampler = material.GetSamplerAt( 0u );
+        sampler.SetImage( croppedImage );
+
+        // Set the new colors to the shader.
+        Shader shader = material.GetShader();
+        shader.SetProperty( mBackgroundColorIndex, backgroundColor );
+        shader.SetProperty( mStrokeColorIndex, strokeColor );
+      }
+    }
   }
   else
   {
@@ -991,54 +1020,59 @@ void TextSelectionPopup::SetPopupBackgroundImage( Image image,
 
 void TextSelectionPopup::RelayoutComplete( Actor actor )
 {
-  Actor self = Self();
+  if( mBackgroundVertexBuffer )
+  {
+    Actor self = Self();
 
-  const float width = mNinePatchBorder / self.GetRelayoutSize( Dimension::WIDTH );
-  const float height = mNinePatchBorder / self.GetRelayoutSize( Dimension::HEIGHT );
+    const float width = mNinePatchBorder / self.GetRelayoutSize( Dimension::WIDTH );
+    const float height = mNinePatchBorder / self.GetRelayoutSize( Dimension::HEIGHT );
 
-  const float textCoord = mNinePatchBorderPercentage;
+    const float textCoord = mNinePatchBorderPercentage;
 
-  Vector2 geometry[] =
-  {
-    Vector2( -0.5f,             -0.5f ),             //  0
-    Vector2(  0.0f,              0.0f ),
-    Vector2( -0.5f + width,     -0.5f ),             //  1
-    Vector2(  0.0f + textCoord,  0.0f ),
-    Vector2(  0.5f - width,     -0.5f ),             //  2
-    Vector2(  1.0f - textCoord,  0.0f ),
-    Vector2(  0.5f,             -0.5f ),             //  3
-    Vector2(  1.0f,              0.0f ),
-    Vector2( -0.5f,             -0.5f + height ),    //  4
-    Vector2(  0.0f,              0.0f + textCoord ),
-    Vector2( -0.5f + width,     -0.5f + height ),    //  5
-    Vector2(  0.0f + textCoord,  0.0f + textCoord ),
-    Vector2(  0.5f - width,     -0.5f + height ),    //  6
-    Vector2(  1.0f - textCoord,  0.0f + textCoord ),
-    Vector2(  0.5f,             -0.5f + height ),    //  7
-    Vector2(  1.0f,              0.0f + textCoord ),
-    Vector2( -0.5f,              0.5f - height ),    //  8
-    Vector2(  0.0f,              1.0f - textCoord ),
-    Vector2( -0.5f + width,      0.5f - height ),    //  9
-    Vector2(  0.0f + textCoord,  1.0f - textCoord ),
-    Vector2(  0.5f - width,      0.5f - height ),    // 10
-    Vector2(  1.0f - textCoord,  1.0f - textCoord ),
-    Vector2(  0.5f,              0.5f - height ),    // 11
-    Vector2(  1.0f,              1.0f - textCoord ),
-    Vector2( -0.5f,              0.5f ),             // 12
-    Vector2(  0.0f,              1.0f ),
-    Vector2( -0.5f + width,      0.5f ),             // 13
-    Vector2(  0.0f + textCoord,  1.0f ),
-    Vector2(  0.5f - width,      0.5f ),             // 14
-    Vector2(  1.0f - textCoord,  1.0f ),
-    Vector2(  0.5f,              0.5f ),             // 15
-    Vector2(  1.0f,              1.0f )
-  };
-  mBackgoundVertexBuffer.SetData( geometry );
+    Vector2 geometry[] =
+    {
+      Vector2( -0.5f,             -0.5f ),             //  0
+      Vector2(  0.0f,              0.0f ),
+      Vector2( -0.5f + width,     -0.5f ),             //  1
+      Vector2(  0.0f + textCoord,  0.0f ),
+      Vector2(  0.5f - width,     -0.5f ),             //  2
+      Vector2(  1.0f - textCoord,  0.0f ),
+      Vector2(  0.5f,             -0.5f ),             //  3
+      Vector2(  1.0f,              0.0f ),
+      Vector2( -0.5f,             -0.5f + height ),    //  4
+      Vector2(  0.0f,              0.0f + textCoord ),
+      Vector2( -0.5f + width,     -0.5f + height ),    //  5
+      Vector2(  0.0f + textCoord,  0.0f + textCoord ),
+      Vector2(  0.5f - width,     -0.5f + height ),    //  6
+      Vector2(  1.0f - textCoord,  0.0f + textCoord ),
+      Vector2(  0.5f,             -0.5f + height ),    //  7
+      Vector2(  1.0f,              0.0f + textCoord ),
+      Vector2( -0.5f,              0.5f - height ),    //  8
+      Vector2(  0.0f,              1.0f - textCoord ),
+      Vector2( -0.5f + width,      0.5f - height ),    //  9
+      Vector2(  0.0f + textCoord,  1.0f - textCoord ),
+      Vector2(  0.5f - width,      0.5f - height ),    // 10
+      Vector2(  1.0f - textCoord,  1.0f - textCoord ),
+      Vector2(  0.5f,              0.5f - height ),    // 11
+      Vector2(  1.0f,              1.0f - textCoord ),
+      Vector2( -0.5f,              0.5f ),             // 12
+      Vector2(  0.0f,              1.0f ),
+      Vector2( -0.5f + width,      0.5f ),             // 13
+      Vector2(  0.0f + textCoord,  1.0f ),
+      Vector2(  0.5f - width,      0.5f ),             // 14
+      Vector2(  1.0f - textCoord,  1.0f ),
+      Vector2(  0.5f,              0.5f ),             // 15
+      Vector2(  1.0f,              1.0f )
+    };
+    mBackgroundVertexBuffer.SetData( geometry );
+  }
 }
 
 TextSelectionPopup::TextSelectionPopup( TextSelectionPopupCallbackInterface* callbackInterface )
 : Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ),
   mToolbar(),
+  mBackgroundColorIndex( 0 ),
+  mStrokeColorIndex( 0 ),
   mPopupMaxSize(),
   mOptionMaxSize(),
   mOptionMinSize(),
index d52fd18..589063f 100644 (file)
@@ -39,9 +39,6 @@ namespace Toolkit
 namespace Internal
 {
 
-namespace
-{
-
 enum PopupCustomisations
 {
   POPUP_MAXIMUM_SIZE,
@@ -50,8 +47,6 @@ enum PopupCustomisations
   OPTION_DIVIDER_SIZE
 };
 
-} // namespace
-
 class TextSelectionPopup : public Control
 {
 public:
@@ -297,8 +292,10 @@ private: // Data
   Image mSelectIconImage;
   Image mSelectAllIconImage;
 
-  Actor mBackgroundActor;
-  PropertyBuffer mBackgoundVertexBuffer;
+  Renderer mBackgroundRenderer;
+  PropertyBuffer mBackgroundVertexBuffer;
+  Property::Index mBackgroundColorIndex;
+  Property::Index mStrokeColorIndex;
   Property::Map mBackgroundMap;
 
   Size mPopupMaxSize;                   // Maximum size of the Popup
index 7698e3b..80d4b66 100644 (file)
@@ -26,6 +26,7 @@
 #include <dali/public-api/images/resource-image.h>
 #include <dali/public-api/math/vector2.h>
 #include <dali/public-api/math/vector4.h>
+#include <dali/public-api/object/property-map.h>
 #include <dali/devel-api/object/type-registry-helper.h>
 #include <cfloat>
 
@@ -40,7 +41,6 @@ namespace Internal
 
 namespace
 {
-const Dali::Vector2 DEFAULT_MAX_SIZE( 400.0f, 65.0f ); ///< The maximum size of the Toolbar.
 const Dali::Vector2 DEFAULT_SCROLL_BAR_PADDING( 8.f, 6.f );
 
 BaseHandle Create()
@@ -55,6 +55,7 @@ DALI_TYPE_REGISTRATION_BEGIN( Toolkit::TextSelectionToolbar, Toolkit::Control, C
 DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "max-size", VECTOR2, MAX_SIZE )
 DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "enable-overshoot", BOOLEAN, ENABLE_OVERSHOOT )
 DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "scroll-bar-padding", VECTOR2, SCROLL_BAR_PADDING )
+DALI_PROPERTY_REGISTRATION( Toolkit, TextSelectionToolbar, "scroll-view", MAP, SCROLL_VIEW )
 
 DALI_TYPE_REGISTRATION_END()
 
@@ -92,6 +93,10 @@ void TextSelectionToolbar::SetProperty( BaseObject* object, Property::Index inde
       }
       case Toolkit::TextSelectionToolbar::Property::ENABLE_OVERSHOOT:
       {
+        if( !impl.mScrollView )
+        {
+          impl.mScrollView  = Toolkit::ScrollView::New();
+        }
         impl.mScrollView.SetOvershootEnabled( value.Get< bool >() );
         break;
       }
@@ -100,6 +105,16 @@ void TextSelectionToolbar::SetProperty( BaseObject* object, Property::Index inde
         impl.SetScrollBarPadding( value.Get< Vector2 >() );
         break;
       }
+      case Toolkit::TextSelectionToolbar::Property::SCROLL_VIEW:
+      {
+        // Get a Property::Map from the property if possible.
+        Property::Map setPropertyMap;
+        if( value.Get( setPropertyMap ) )
+        {
+          impl.ConfigureScrollview( setPropertyMap );
+        }
+        break;
+      }
     } // switch
   } // TextSelectionToolbar
 }
@@ -217,6 +232,7 @@ void TextSelectionToolbar::SetUpScrollView()
   mScrollBarHorizontal.SetPosition( mScrollBarPadding.x, -mScrollBarPadding.y );
   mScrollBarHorizontal.SetResizePolicy( Dali::ResizePolicy::FIT_TO_CHILDREN, Dali::Dimension::WIDTH );
   mScrollBarHorizontal.SetOrientation( Quaternion( Radian( 1.5f * Math::PI ), Vector3::ZAXIS ) );
+  mScrollBarHorizontal.GetPanGestureDetector().DetachAll();
   mScrollView.Add( mScrollBarHorizontal );
 }
 
@@ -236,7 +252,10 @@ void TextSelectionToolbar::SetUp()
   stencil.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
   stencil.SetParentOrigin( ParentOrigin::CENTER );
 
-  mScrollView  = Toolkit::ScrollView::New();
+  if ( !mScrollView )
+  {
+    mScrollView  = Toolkit::ScrollView::New();
+  }
   SetUpScrollView();
 
   // Toolbar must start with at least one option, adding further options with increase it's size
@@ -245,7 +264,6 @@ void TextSelectionToolbar::SetUp()
   mTableOfButtons.SetParentOrigin( ParentOrigin::CENTER_LEFT );
   mTableOfButtons.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
 
-
   mStencilLayer.Add( stencil );
   mStencilLayer.Add( mScrollView );
   mScrollView.Add( mTableOfButtons );
@@ -301,6 +319,27 @@ void TextSelectionToolbar::SetScrollBarPadding( const Vector2& padding )
   RelayoutRequest();
 }
 
+void TextSelectionToolbar::ConfigureScrollview( const Property::Map& properties )
+{
+  // Set any properties specified for the label by iterating through all property key-value pairs.
+  for( unsigned int i = 0, mapCount = properties.Count(); i < mapCount; ++i )
+  {
+    const StringValuePair& propertyPair( properties.GetPair( i ) );
+
+    // Convert the property string to a property index.
+    Property::Index setPropertyIndex = mScrollView.GetPropertyIndex( propertyPair.first );
+    if( setPropertyIndex != Property::INVALID_INDEX )
+    {
+      // If the conversion worked, we have a valid property index,
+      // Set the property to the new value.
+      mScrollView.SetProperty( setPropertyIndex, propertyPair.second );
+    }
+  }
+
+  RelayoutRequest();
+}
+
+
 const Vector2& TextSelectionToolbar::GetScrollBarPadding() const
 {
   return mScrollBarPadding;
index 1327caa..a8575f9 100644 (file)
@@ -37,11 +37,6 @@ namespace Toolkit
 namespace Internal
 {
 
-namespace
-{
-
-} // namespace
-
 class TextSelectionToolbar : public Control
 {
 public:
@@ -119,6 +114,13 @@ private: // From Control
    */
   const Dali::Vector2& GetPopupMaxSize() const;
 
+private: // Implementation
+
+  /**
+   * @copydoc Toolkit::TextSelectionToolbar::ConfigureScrollview()
+   */
+  void ConfigureScrollview( const Property::Map& properties );
+
   /**
    * @brief Set up scrollview to scroll Toolbar horizontally
    */
index 0c37f7c..524500f 100644 (file)
@@ -152,7 +152,7 @@ bool KeyboardFocusManager::DoSetCurrentFocusActor(const unsigned int actorID)
     if(actor.IsKeyboardFocusable())
     {
       // Draw the focus indicator upon the focused actor
-      if(mIsFocusIndicatorEnabled && mFocusIndicatorActor)
+      if(mFocusIndicatorActor)
       {
         actor.Add(mFocusIndicatorActor);
       }
index c5d3dc0..53b3583 100644 (file)
@@ -85,7 +85,6 @@ Integration::Log::Filter* gLogFilter( Integration::Log::Filter::New(Debug::NoLog
 // Local Data
 namespace
 {
-
 const Dali::Vector3 DEFAULT_GRAB_HANDLE_RELATIVE_SIZE( 1.25f, 1.5f, 1.0f );
 const Dali::Vector3 DEFAULT_SELECTION_HANDLE_RELATIVE_SIZE( 1.25f, 1.5f, 1.0f );
 
@@ -284,7 +283,7 @@ struct Decorator::Impl : public ConnectionTracker
   {
     mQuadVertexFormat[ "aPosition" ] = Property::VECTOR2;
     mQuadIndexFormat[ "indices" ] = Property::INTEGER;
-    mHighlightMaterial = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
+    mHighlightMaterial = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, Shader::HINT_MODIFIES_GEOMETRY) ); // HINT_MODIFIES_GEOMETRY used to disable culling optimisations
 
     SetupTouchEvents();
   }
@@ -295,6 +294,8 @@ struct Decorator::Impl : public ConnectionTracker
    */
   void Relayout( const Vector2& size )
   {
+    mControlSize = size;
+
     // TODO - Remove this if nothing is active
     CreateActiveLayer();
 
@@ -304,7 +305,7 @@ struct Decorator::Impl : public ConnectionTracker
     if( mPrimaryCursor )
     {
       const CursorImpl& cursor = mCursor[PRIMARY_CURSOR];
-      mPrimaryCursorVisible = ( cursor.position.x + mCursorWidth <= size.width ) && ( cursor.position.x >= 0.f );
+      mPrimaryCursorVisible = ( cursor.position.x + mCursorWidth <= mControlSize.width ) && ( cursor.position.x >= 0.f );
       if( mPrimaryCursorVisible )
       {
         mPrimaryCursor.SetPosition( cursor.position.x,
@@ -316,7 +317,7 @@ struct Decorator::Impl : public ConnectionTracker
     if( mSecondaryCursor )
     {
       const CursorImpl& cursor = mCursor[SECONDARY_CURSOR];
-      mSecondaryCursorVisible = ( cursor.position.x + mCursorWidth <= size.width ) && ( cursor.position.x >= 0.f );
+      mSecondaryCursorVisible = ( cursor.position.x + mCursorWidth <= mControlSize.width ) && ( cursor.position.x >= 0.f );
       if( mSecondaryCursorVisible )
       {
         mSecondaryCursor.SetPosition( cursor.position.x,
@@ -328,9 +329,10 @@ struct Decorator::Impl : public ConnectionTracker
 
     // Show or hide the grab handle
     HandleImpl& grabHandle = mHandle[GRAB_HANDLE];
+    bool newGrabHandlePosition = false;
     if( grabHandle.active )
     {
-      const bool isVisible = ( grabHandle.position.x + floor( 0.5f * mCursorWidth ) <= size.width ) && ( grabHandle.position.x >= 0.f );
+      const bool isVisible = ( grabHandle.position.x + floor( 0.5f * mCursorWidth ) <= mControlSize.width ) && ( grabHandle.position.x >= 0.f );
 
       if( isVisible )
       {
@@ -341,6 +343,8 @@ struct Decorator::Impl : public ConnectionTracker
 
         // Sets the grab handle image according if it's pressed, flipped, etc.
         SetHandleImage( GRAB_HANDLE );
+
+        newGrabHandlePosition = true;
       }
 
       if( grabHandle.actor )
@@ -356,10 +360,12 @@ struct Decorator::Impl : public ConnectionTracker
     // Show or hide the selection handles/highlight
     HandleImpl& primary = mHandle[ LEFT_SELECTION_HANDLE ];
     HandleImpl& secondary = mHandle[ RIGHT_SELECTION_HANDLE ];
+    bool newPrimaryHandlePosition = false;
+    bool newSecondaryHandlePosition = false;
     if( primary.active || secondary.active )
     {
-      const bool isPrimaryVisible = ( primary.position.x <= size.width ) && ( primary.position.x >= 0.f );
-      const bool isSecondaryVisible = ( secondary.position.x <= size.width ) && ( secondary.position.x >= 0.f );
+      const bool isPrimaryVisible = ( primary.position.x <= mControlSize.width ) && ( primary.position.x >= 0.f );
+      const bool isSecondaryVisible = ( secondary.position.x <= mControlSize.width ) && ( secondary.position.x >= 0.f );
 
       if( isPrimaryVisible || isSecondaryVisible )
       {
@@ -373,6 +379,8 @@ struct Decorator::Impl : public ConnectionTracker
           SetHandleImage( LEFT_SELECTION_HANDLE );
 
           SetSelectionHandleMarkerSize( primary );
+
+          newPrimaryHandlePosition = true;
         }
 
         if( isSecondaryVisible )
@@ -383,6 +391,8 @@ struct Decorator::Impl : public ConnectionTracker
           SetHandleImage( RIGHT_SELECTION_HANDLE );
 
           SetSelectionHandleMarkerSize( secondary );
+
+          newSecondaryHandlePosition = true;
         }
       }
 
@@ -414,9 +424,18 @@ struct Decorator::Impl : public ConnectionTracker
       }
     }
 
+    if( newGrabHandlePosition    ||
+        newPrimaryHandlePosition ||
+        newSecondaryHandlePosition )
+    {
+      // Setup property notifications to find whether the handles leave the boundaries of the current display.
+      SetupActiveLayerPropertyNotifications();
+    }
+
     if( mActiveCopyPastePopup )
     {
       ShowPopup();
+      mPopupSetNewPosition = true;
     }
     else
     {
@@ -462,7 +481,7 @@ struct Decorator::Impl : public ConnectionTracker
     }
 
     // Retrieves the popup's size after relayout.
-    Vector3 popupSize = Vector3( mCopyPastePopup.actor.GetRelayoutSize( Dimension::WIDTH ), mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT ), 0.0f );
+    const Vector3 popupSize = Vector3( mCopyPastePopup.actor.GetRelayoutSize( Dimension::WIDTH ), mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT ), 0.0f );
 
     if( mPopupSetNewPosition )
     {
@@ -489,7 +508,7 @@ struct Decorator::Impl : public ConnectionTracker
     }
 
     // Checks if there is enough space above the text control. If not it places the popup under it.
-    GetConstrainedPopupPosition( mCopyPastePopup.position, popupSize, AnchorPoint::CENTER, mActiveLayer, mBoundingBox );
+    GetConstrainedPopupPosition( mCopyPastePopup.position, popupSize * AnchorPoint::CENTER, mActiveLayer, mBoundingBox );
 
     SetUpPopupPositionNotifications();
 
@@ -774,16 +793,14 @@ struct Decorator::Impl : public ConnectionTracker
 
   void CalculateHandleWorldCoordinates( HandleImpl& handle, Vector2& position )
   {
-    // Get the world position of the active layer
+    // Gets the world position of the active layer. The active layer is where the handles are added.
     const Vector3 parentWorldPosition = mActiveLayer.GetCurrentWorldPosition();
 
-    // Get the size of the UI control.
-    Vector2 targetSize;
-    mController.GetTargetSize( targetSize );
-
     // The grab handle position in world coords.
-    position.x = parentWorldPosition.x - 0.5f * targetSize.width + handle.position.x;
-    position.y = parentWorldPosition.y - 0.5f * targetSize.height + handle.position.y + handle.lineHeight;
+    // The active layer's world position is the center of the active layer. The origin of the
+    // coord system of the handles is the top left of the active layer.
+    position.x = parentWorldPosition.x - 0.5f * mControlSize.width + handle.position.x;
+    position.y = parentWorldPosition.y - 0.5f * mControlSize.height + handle.position.y;
   }
 
   void SetGrabHandlePosition()
@@ -791,7 +808,12 @@ struct Decorator::Impl : public ConnectionTracker
     // Reference to the grab handle.
     HandleImpl& grabHandle = mHandle[GRAB_HANDLE];
 
-    // The grab handle position in world coords.
+    // Transforms the handle position into world coordinates.
+    // @note This is not the same value as grabHandle.actor.GetCurrentWorldPosition()
+    // as it's transforming the handle's position set by the text-controller and not
+    // the final position set to the actor. Another difference is the GetCurrentWorldPosition()
+    // retrieves the position of the center of the actor but the handle's position set
+    // by the text controller is not the center of the actor.
     Vector2 grabHandleWorldPosition;
     CalculateHandleWorldCoordinates( grabHandle, grabHandleWorldPosition );
 
@@ -799,8 +821,8 @@ struct Decorator::Impl : public ConnectionTracker
     // At the moment only the height is checked for the grab handle.
 
     grabHandle.verticallyFlipped = ( grabHandle.verticallyFlippedPreferred &&
-                                     ( ( grabHandleWorldPosition.y - grabHandle.lineHeight - grabHandle.size.height ) > mBoundingBox.y ) ) ||
-                                   ( grabHandleWorldPosition.y + grabHandle.size.height > mBoundingBox.w );
+                                     ( ( grabHandleWorldPosition.y - grabHandle.size.height ) > mBoundingBox.y ) ) ||
+                                   ( grabHandleWorldPosition.y + grabHandle.lineHeight + grabHandle.size.height > mBoundingBox.w );
 
     // The grab handle 'y' position in local coords.
     // If the grab handle exceeds the bottom of the decoration box,
@@ -819,7 +841,12 @@ struct Decorator::Impl : public ConnectionTracker
     // Reference to the selection handle.
     HandleImpl& handle = mHandle[type];
 
-    // Get the world coordinates of the handle position.
+    // Transforms the handle position into world coordinates.
+    // @note This is not the same value as handle.actor.GetCurrentWorldPosition()
+    // as it's transforming the handle's position set by the text-controller and not
+    // the final position set to the actor. Another difference is the GetCurrentWorldPosition()
+    // retrieves the position of the center of the actor but the handle's position set
+    // by the text controller is not the center of the actor.
     Vector2 handleWorldPosition;
     CalculateHandleWorldCoordinates( handle, handleWorldPosition );
 
@@ -853,7 +880,6 @@ struct Decorator::Impl : public ConnectionTracker
 
     // Check if the selection handle exceeds the boundaries of the decoration box.
     const bool exceedsLeftEdge = ( isPrimaryHandle ? !flipHandle : flipHandle ) && ( handleWorldPosition.x - handle.size.width < mBoundingBox.x );
-
     const bool exceedsRightEdge = ( isPrimaryHandle ? flipHandle : !flipHandle ) && ( handleWorldPosition.x + handle.size.width > mBoundingBox.z );
 
     // Does not flip if both conditions are true (double flip)
@@ -882,8 +908,8 @@ struct Decorator::Impl : public ConnectionTracker
 
     // Whether to flip the handle vertically.
     handle.verticallyFlipped = ( verticallyFlippedPreferred &&
-                                 ( ( handleWorldPosition.y - handle.lineHeight - handle.size.height ) > mBoundingBox.y ) ) ||
-                               ( handleWorldPosition.y + handle.size.height > mBoundingBox.w );
+                                 ( ( handleWorldPosition.y - handle.size.height ) > mBoundingBox.y ) ) ||
+                               ( handleWorldPosition.y + handle.lineHeight + handle.size.height > mBoundingBox.w );
 
     // The primary selection handle 'y' position in local coords.
     // If the handle exceeds the bottom of the decoration box,
@@ -1220,6 +1246,213 @@ struct Decorator::Impl : public ConnectionTracker
     return true;
   }
 
+  void HandleResetPosition( PropertyNotification& source )
+  {
+    const HandleImpl& grabHandle = mHandle[GRAB_HANDLE];
+
+    if( grabHandle.active )
+    {
+      // Sets the grab handle position and calculates if it needs to be vertically flipped if it exceeds the boundary box.
+      SetGrabHandlePosition();
+
+      // Sets the grab handle image according if it's pressed, flipped, etc.
+      SetHandleImage( GRAB_HANDLE );
+    }
+    else
+    {
+      // Sets the primary selection handle position and calculates if it needs to be vertically flipped if it exceeds the boundary box.
+      SetSelectionHandlePosition( LEFT_SELECTION_HANDLE );
+
+      // Sets the primary handle image according if it's pressed, flipped, etc.
+      SetHandleImage( LEFT_SELECTION_HANDLE );
+
+      // Sets the secondary selection handle position and calculates if it needs to be vertically flipped if it exceeds the boundary box.
+      SetSelectionHandlePosition( RIGHT_SELECTION_HANDLE );
+
+      // Sets the secondary handle image according if it's pressed, flipped, etc.
+      SetHandleImage( RIGHT_SELECTION_HANDLE );
+    }
+  }
+
+  void SetupActiveLayerPropertyNotifications()
+  {
+    if( !mActiveLayer )
+    {
+      return;
+    }
+
+    // Vertical notifications.
+
+    // Disconnect any previous connected callback.
+    if( mVerticalLessThanNotification )
+    {
+      mVerticalLessThanNotification.NotifySignal().Disconnect( this, &Decorator::Impl::HandleResetPosition );
+      mActiveLayer.RemovePropertyNotification( mVerticalLessThanNotification );
+    }
+
+    if( mVerticalGreaterThanNotification )
+    {
+      mVerticalGreaterThanNotification.NotifySignal().Disconnect( this, &Decorator::Impl::HandleResetPosition );
+      mActiveLayer.RemovePropertyNotification( mVerticalGreaterThanNotification );
+    }
+
+    const HandleImpl& grabHandle = mHandle[GRAB_HANDLE];
+    const HandleImpl& primaryHandle = mHandle[LEFT_SELECTION_HANDLE];
+    const HandleImpl& secondaryHandle = mHandle[RIGHT_SELECTION_HANDLE];
+
+    if( grabHandle.active )
+    {
+      if( grabHandle.verticallyFlipped )
+      {
+        // The grab handle is vertically flipped. Never is going to exceed the bottom edje of the display.
+        mVerticalGreaterThanNotification.Reset();
+
+        // The vertical distance from the center of the active layer to the top edje of the display.
+        const float topHeight = 0.5f * mControlSize.height - grabHandle.position.y + grabHandle.size.height;
+
+        mVerticalLessThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
+                                                                              LessThanCondition( mBoundingBox.y + topHeight ) );
+
+        // Notifies the change from false to true and from true to false.
+        mVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+        // Connects the signals with the callbacks.
+        mVerticalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+      }
+      else
+      {
+        // The grab handle is not vertically flipped. Never is going to exceed the top edje of the display.
+        mVerticalLessThanNotification.Reset();
+
+        // The vertical distance from the center of the active layer to the bottom edje of the display.
+        const float bottomHeight = -0.5f * mControlSize.height + grabHandle.position.y + grabHandle.lineHeight + grabHandle.size.height;
+
+        mVerticalGreaterThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
+                                                                                 GreaterThanCondition( mBoundingBox.w - bottomHeight ) );
+
+        // Notifies the change from false to true and from true to false.
+        mVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+        // Connects the signals with the callbacks.
+        mVerticalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+      }
+    }
+    else // The selection handles are active
+    {
+      if( primaryHandle.verticallyFlipped && secondaryHandle.verticallyFlipped )
+      {
+        // Both selection handles are vertically flipped. Never are going to exceed the bottom edje of the display.
+        mVerticalGreaterThanNotification.Reset();
+
+        // The vertical distance from the center of the active layer to the top edje of the display.
+        const float topHeight = 0.5f * mControlSize.height + std::max( -primaryHandle.position.y + primaryHandle.size.height, -secondaryHandle.position.y + secondaryHandle.size.height );
+
+        mVerticalLessThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
+                                                                              LessThanCondition( mBoundingBox.y + topHeight ) );
+
+        // Notifies the change from false to true and from true to false.
+        mVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+        // Connects the signals with the callbacks.
+        mVerticalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+      }
+      else if( !primaryHandle.verticallyFlipped && !secondaryHandle.verticallyFlipped )
+      {
+        // Both selection handles aren't vertically flipped. Never are going to exceed the top edje of the display.
+        mVerticalLessThanNotification.Reset();
+
+        // The vertical distance from the center of the active layer to the bottom edje of the display.
+        const float bottomHeight = -0.5f * mControlSize.height + std::max( primaryHandle.position.y + primaryHandle.lineHeight + primaryHandle.size.height,
+                                                                           secondaryHandle.position.y + secondaryHandle.lineHeight + secondaryHandle.size.height );
+
+        mVerticalGreaterThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
+                                                                                 GreaterThanCondition( mBoundingBox.w - bottomHeight ) );
+
+        // Notifies the change from false to true and from true to false.
+        mVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+        // Connects the signals with the callbacks.
+        mVerticalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+      }
+      else
+      {
+        // Only one of the selection handles is vertically flipped. Both vertical notifications are needed.
+
+        // The vertical distance from the center of the active layer to the top edje of the display.
+        const float topHeight = 0.5f * mControlSize.height + ( primaryHandle.verticallyFlipped                              ?
+                                                               -primaryHandle.position.y + primaryHandle.size.height        :
+                                                               -secondaryHandle.position.y + secondaryHandle.size.height );
+
+        mVerticalLessThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
+                                                                              LessThanCondition( mBoundingBox.y + topHeight ) );
+
+        // Notifies the change from false to true and from true to false.
+        mVerticalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+        // Connects the signals with the callbacks.
+        mVerticalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+
+        // The vertical distance from the center of the active layer to the bottom edje of the display.
+        const float bottomHeight = -0.5f * mControlSize.height + ( primaryHandle.verticallyFlipped                                                       ?
+                                                                   secondaryHandle.position.y + secondaryHandle.lineHeight + secondaryHandle.size.height :
+                                                                   primaryHandle.position.y + primaryHandle.lineHeight + primaryHandle.size.height );
+
+        mVerticalGreaterThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
+                                                                                 GreaterThanCondition( mBoundingBox.w - bottomHeight ) );
+
+        // Notifies the change from false to true and from true to false.
+        mVerticalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+        // Connects the signals with the callbacks.
+        mVerticalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+      }
+    }
+
+    // Horizontal notifications.
+
+    // Disconnect any previous connected callback.
+    if( mHorizontalLessThanNotification )
+    {
+      mHorizontalLessThanNotification.NotifySignal().Disconnect( this, &Decorator::Impl::HandleResetPosition );
+      mActiveLayer.RemovePropertyNotification( mHorizontalLessThanNotification );
+    }
+
+    if( mHorizontalGreaterThanNotification )
+    {
+      mHorizontalGreaterThanNotification.NotifySignal().Disconnect( this, &Decorator::Impl::HandleResetPosition );
+      mActiveLayer.RemovePropertyNotification( mHorizontalGreaterThanNotification );
+    }
+
+    if( primaryHandle.active || secondaryHandle.active )
+    {
+      // The horizontal distance from the center of the active layer to the left edje of the display.
+      const float leftWidth = 0.5f * mControlSize.width + std::max( -primaryHandle.position.x + primaryHandle.size.width,
+                                                                    -secondaryHandle.position.x + secondaryHandle.size.width );
+
+      mHorizontalLessThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_X,
+                                                                              LessThanCondition( mBoundingBox.x + leftWidth ) );
+
+      // Notifies the change from false to true and from true to false.
+      mHorizontalLessThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+      // Connects the signals with the callbacks.
+      mHorizontalLessThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+
+      // The horizontal distance from the center of the active layer to the right edje of the display.
+      const float rightWidth = -0.5f * mControlSize.width + std::max( primaryHandle.position.x + primaryHandle.size.width,
+                                                                      secondaryHandle.position.x + secondaryHandle.size.width );
+
+      mHorizontalGreaterThanNotification = mActiveLayer.AddPropertyNotification( Actor::Property::WORLD_POSITION_X,
+                                                                                 GreaterThanCondition( mBoundingBox.z - rightWidth ) );
+
+      // Notifies the change from false to true and from true to false.
+      mHorizontalGreaterThanNotification.SetNotifyMode( PropertyNotification::NotifyOnChanged );
+
+      // Connects the signals with the callbacks.
+      mHorizontalGreaterThanNotification.NotifySignal().Connect( this, &Decorator::Impl::HandleResetPosition );
+    }
+  }
+
   // Popup
 
   float AlternatePopUpPositionRelativeToCursor()
@@ -1256,30 +1489,28 @@ struct Decorator::Impl : public ConnectionTracker
     mCopyPastePopup.actor.SetY( alternativeYPosition );
   }
 
-  void SetUpPopupPositionNotifications( )
+  void SetUpPopupPositionNotifications()
   {
     // Note Property notifications ignore any set anchor point so conditions must allow for this.  Default is Top Left.
 
     // Exceeding vertical boundary
 
-    float popupHeight = mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT);
+    const float popupHeight = mCopyPastePopup.actor.GetRelayoutSize( Dimension::HEIGHT );
 
     PropertyNotification verticalExceedNotification = mCopyPastePopup.actor.AddPropertyNotification( Actor::Property::WORLD_POSITION_Y,
-                                                      OutsideCondition( mBoundingBox.y + popupHeight * 0.5f,
-                                                                        mBoundingBox.w - popupHeight * 0.5f ) );
+                                                                                                     OutsideCondition( mBoundingBox.y + popupHeight * 0.5f,
+                                                                                                                       mBoundingBox.w - popupHeight * 0.5f ) );
 
     verticalExceedNotification.NotifySignal().Connect( this, &Decorator::Impl::PopUpLeavesVerticalBoundary );
   }
 
-  void GetConstrainedPopupPosition( Vector3& requiredPopupPosition, Vector3& popupSize, Vector3 anchorPoint, Actor& parent, const Vector4& boundingRectangleWorld )
+  void GetConstrainedPopupPosition( Vector3& requiredPopupPosition, const Vector3& popupDistanceFromAnchorPoint, Actor parent, const Vector4& boundingRectangleWorld )
   {
     DALI_ASSERT_DEBUG ( "Popup parent not on stage" && parent.OnStage() )
 
     // Parent must already by added to Stage for these Get calls to work
-    Vector3 parentAnchorPoint = parent.GetCurrentAnchorPoint();
-    Vector3 parentWorldPositionLeftAnchor = parent.GetCurrentWorldPosition() - parent.GetCurrentSize()*parentAnchorPoint;
-    Vector3 popupWorldPosition = parentWorldPositionLeftAnchor + requiredPopupPosition;  // Parent World position plus popup local position gives World Position
-    Vector3 popupDistanceFromAnchorPoint = popupSize*anchorPoint;
+    const Vector3 parentWorldPositionLeftAnchor = parent.GetCurrentWorldPosition() - parent.GetCurrentSize() * parent.GetCurrentAnchorPoint();
+    const Vector3 popupWorldPosition = parentWorldPositionLeftAnchor + requiredPopupPosition;  // Parent World position plus popup local position gives World Position
 
     // Calculate distance to move popup (in local space) so fits within the boundary
     float xOffSetToKeepWithinBounds = 0.0f;
@@ -1287,13 +1518,13 @@ struct Decorator::Impl : public ConnectionTracker
     {
       xOffSetToKeepWithinBounds = boundingRectangleWorld.x - ( popupWorldPosition.x - popupDistanceFromAnchorPoint.x );
     }
-    else if ( popupWorldPosition.x +  popupDistanceFromAnchorPoint.x > boundingRectangleWorld.z )
+    else if( popupWorldPosition.x +  popupDistanceFromAnchorPoint.x > boundingRectangleWorld.z )
     {
       xOffSetToKeepWithinBounds = boundingRectangleWorld.z - ( popupWorldPosition.x +  popupDistanceFromAnchorPoint.x );
     }
 
     // Ensure initial display of Popup is in alternative position if can not fit above. As Property notification will be a frame behind.
-    if ( popupWorldPosition.y - popupDistanceFromAnchorPoint.y < boundingRectangleWorld.y )
+    if( popupWorldPosition.y - popupDistanceFromAnchorPoint.y < boundingRectangleWorld.y )
     {
       requiredPopupPosition.y = AlternatePopUpPositionRelativeToCursor();
     }
@@ -1301,8 +1532,8 @@ struct Decorator::Impl : public ConnectionTracker
     requiredPopupPosition.x = requiredPopupPosition.x + xOffSetToKeepWithinBounds;
 
     // Prevent pixel mis-alignment by rounding down.
-    requiredPopupPosition.x = static_cast<int>( requiredPopupPosition.x );
-    requiredPopupPosition.y = static_cast<int>( requiredPopupPosition.y );
+    requiredPopupPosition.x = floor( requiredPopupPosition.x );
+    requiredPopupPosition.y = floor( requiredPopupPosition.y );
   }
 
   void SetHandleImage( HandleType handleType, HandleImageType handleImageType, Dali::Image image )
@@ -1399,11 +1630,15 @@ struct Decorator::Impl : public ConnectionTracker
   Timer               mCursorBlinkTimer;          ///< Timer to signal cursor to blink
   Timer               mScrollTimer;               ///< Timer used to scroll the text when the grab handle is moved close to the edges.
 
-  Layer               mActiveLayer;               ///< Layer for active handles and alike that ensures they are above all else.
-  ImageActor          mPrimaryCursor;
-  ImageActor          mSecondaryCursor;
+  Layer                mActiveLayer;                       ///< Layer for active handles and alike that ensures they are above all else.
+  PropertyNotification mVerticalLessThanNotification;      ///< Notifies when the 'y' coord of the active layer is less than a given value.
+  PropertyNotification mVerticalGreaterThanNotification;   ///< Notifies when the 'y' coord of the active layer is grater than a given value.
+  PropertyNotification mHorizontalLessThanNotification;    ///< Notifies when the 'x' coord of the active layer is less than a given value.
+  PropertyNotification mHorizontalGreaterThanNotification; ///< Notifies when the 'x' coord of the active layer is grater than a given value.
+  ImageActor           mPrimaryCursor;
+  ImageActor           mSecondaryCursor;
 
-  Actor               mHighlightActor;        ///< Actor to display highlight
+  Actor               mHighlightActor;            ///< Actor to display highlight
   Renderer            mHighlightRenderer;
   Material            mHighlightMaterial;         ///< Material used for highlight
   Property::Map       mQuadVertexFormat;
@@ -1426,6 +1661,7 @@ struct Decorator::Impl : public ConnectionTracker
   Vector4             mBoundingBox;               ///< The bounding box in world coords.
   Vector4             mHighlightColor;            ///< Color of the highlight
   Vector2             mHighlightPosition;         ///< The position of the highlight actor.
+  Vector2             mControlSize;               ///< The control's size. Set by the Relayout.
 
   unsigned int        mActiveCursor;
   unsigned int        mCursorBlinkInterval;
@@ -1637,7 +1873,7 @@ const Vector4& Decorator::GetHandleColor() const
 
 void Decorator::SetPosition( HandleType handleType, float x, float y, float height )
 {
-  // Adjust grab handle displacement
+  // Adjust handle's displacement
   Impl::HandleImpl& handle = mImpl->mHandle[handleType];
 
   handle.grabDisplacementX -= x - handle.position.x;
index 54a957c..ad513a8 100644 (file)
@@ -766,10 +766,12 @@ struct LayoutEngine::Impl
       {
         if( isLastLine && !isRTL )
         {
+          // Add the length of the white saces at the end of the line.
           lineLength += line.extraLength;
           if( lineLength > boxWidth )
           {
-            lineLength = boxWidth;
+            // The line's length is longer than the box's width.
+            // Set the line's offset to 0 and nothing else to do.
             line.alignmentOffset = 0.f;
             break;
           }
index bb64540..7e55978 100644 (file)
@@ -238,7 +238,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker
           currentUnderlinePosition = ceil( fabsf( fontMetrics.underlinePosition ) );
           const float descender = ceil( fabsf( fontMetrics.descender ) );
 
-          if ( underlineHeight == ZERO )
+          if( fabsf( underlineHeight ) < Math::MACHINE_EPSILON_1000 )
           {
             currentUnderlineThickness = fontMetrics.underlineThickness;
 
@@ -258,7 +258,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker
           {
             currentUnderlinePosition = descender;
           }
-          if ( ZERO == currentUnderlinePosition )
+          if( fabsf( currentUnderlinePosition ) < Math::MACHINE_EPSILON_1000 )
           {
             // Move offset down by one ( EFL behavior )
             currentUnderlinePosition = ONE;
@@ -812,6 +812,7 @@ struct AtlasRenderer::Impl : public ConnectionTracker
     {
       RemoveShadowRenderTask( *shadowIterator );
     }
+    mShadowTasks.clear();
   }
 
   Actor mActor;                                       ///< The actor parent which renders the text
@@ -858,6 +859,13 @@ Actor AtlasRenderer::Render( Text::ViewInterface& view, int depth )
                       positions,
                       glyphs,
                       depth );
+
+    /* In the case where AddGlyphs does not create a renderable Actor for example when glyphs are all whitespace create a new Actor.  */
+    /* This renderable actor is used to position the text, other "decorations" can rely on there always being an Actor regardless of it is whitespace or regular text*/
+    if ( !mImpl->mActor )
+    {
+      mImpl->mActor = Actor::New();
+    }
   }
 
   return mImpl->mActor;
index 9c17f01..680df81 100644 (file)
@@ -107,6 +107,7 @@ void GetGlyphsMetrics( GlyphIndex glyphIndex,
 
 EventData::EventData( DecoratorPtr decorator )
 : mDecorator( decorator ),
+  mImfManager(),
   mPlaceholderTextActive(),
   mPlaceholderTextInactive(),
   mPlaceholderTextColor( 0.8f, 0.8f, 0.8f, 0.8f ),
@@ -133,7 +134,9 @@ EventData::EventData( DecoratorPtr decorator )
   mScrollAfterUpdatePosition( false ),
   mScrollAfterDelete( false ),
   mAllTextSelected( false )
-{}
+{
+  mImfManager = ImfManager::Get();
+}
 
 EventData::~EventData()
 {}
@@ -483,7 +486,7 @@ void Controller::Impl::GetDefaultFonts( Vector<FontRun>& fonts, Length numberOfC
 {
   if( mFontDefaults )
   {
-    DALI_LOG_INFO( gLogFilter, Debug::Concise, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() );
+    DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() );
     FontRun fontRun;
     fontRun.characterRun.characterIndex = 0;
     fontRun.characterRun.numberOfCharacters = numberOfCharacters;
@@ -578,6 +581,13 @@ void Controller::Impl::OnTapEvent( const Event& event )
 
       mEventData->mUpdateCursorPosition = true;
       mEventData->mScrollAfterUpdatePosition = true;
+
+      // Notify the cursor position to the imf manager.
+      if( mEventData->mImfManager )
+      {
+        mEventData->mImfManager.SetCursorPosition( mEventData->mPrimaryCursorPosition );
+        mEventData->mImfManager.NotifyCursorPosition();
+      }
     }
   }
 }
@@ -623,6 +633,8 @@ void Controller::Impl::OnPanEvent( const Event& event )
 
 void Controller::Impl::OnLongPressEvent( const Event& event )
 {
+  DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::OnLongPressEvent\n" );
+
   if  ( EventData::EDITING == mEventData->mState )
   {
     feedback_play_type( FEEDBACK_TYPE_SOUND, FEEDBACK_PATTERN_TAP );
@@ -703,7 +715,10 @@ void Controller::Impl::OnHandleEvent( const Event& event )
     {
       mEventData->mUpdateCursorPosition = true;
 
-      ChangeState( EventData::EDITING_WITH_POPUP );
+      if ( !IsClipboardEmpty() )
+      {
+        ChangeState( EventData::EDITING_WITH_PASTE_POPUP ); // Moving grabhandle will show Paste Popup
+      }
 
       if( handleStopScrolling )
       {
@@ -862,6 +877,8 @@ void Controller::Impl::OnSelectEvent( const Event& event )
 
 void Controller::Impl::OnSelectAllEvent()
 {
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "OnSelectAllEvent mEventData->mSelectionEnabled%s \n", mEventData->mSelectionEnabled?"true":"false");
+
   if( NULL == mEventData )
   {
     // Nothing to do if there is no text.
@@ -1176,7 +1193,7 @@ void Controller::Impl::SetPopupButtons()
       buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::SELECT_ALL ) );
     }
   }
-  else if  ( EventData::EDITING_WITH_POPUP == mEventData->mState )
+  else if ( EventData::EDITING_WITH_POPUP == mEventData->mState )
   {
     if ( mLogicalModel->mText.Count() && !IsShowingPlaceholderText())
     {
@@ -1189,6 +1206,14 @@ void Controller::Impl::SetPopupButtons()
       buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::CLIPBOARD ) );
     }
   }
+  else if ( EventData::EDITING_WITH_PASTE_POPUP == mEventData->mState )
+  {
+    if ( !IsClipboardEmpty() )
+    {
+      buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::PASTE ) );
+      buttonsToShow = TextSelectionPopup::Buttons ( ( buttonsToShow | TextSelectionPopup::CLIPBOARD ) );
+    }
+  }
 
   mEventData->mDecorator->SetEnabledPopupButtons( buttonsToShow );
 }
@@ -1201,6 +1226,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     return;
   }
 
+  DALI_LOG_INFO( gLogFilter, Debug::General, "ChangeState state:%d  newstate:%d\n", mEventData->mState, newState );
+
   if( mEventData->mState != newState )
   {
     mEventData->mState = newState;
@@ -1259,6 +1286,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     }
     else if( EventData::EDITING_WITH_POPUP == mEventData->mState )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_POPUP \n", newState );
+
       mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
       if( mEventData->mCursorBlinkEnabled )
       {
@@ -1283,6 +1312,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     }
     else if( EventData::EDITING_WITH_GRAB_HANDLE == mEventData->mState )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_GRAB_HANDLE \n", newState );
+
       mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
       if( mEventData->mCursorBlinkEnabled )
       {
@@ -1314,6 +1345,8 @@ void Controller::Impl::ChangeState( EventData::State newState )
     }
     else if ( EventData::GRAB_HANDLE_PANNING == mEventData->mState )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "GRAB_HANDLE_PANNING \n", newState );
+
       mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
       if( mEventData->mCursorBlinkEnabled )
       {
@@ -1328,6 +1361,28 @@ void Controller::Impl::ChangeState( EventData::State newState )
       }
       mEventData->mDecoratorUpdated = true;
     }
+    else if ( EventData::EDITING_WITH_PASTE_POPUP == mEventData->mState )
+    {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "EDITING_WITH_PASTE_POPUP \n", newState );
+
+      mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY );
+      if( mEventData->mCursorBlinkEnabled )
+      {
+        mEventData->mDecorator->StartCursorBlink();
+      }
+
+      mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true );
+      mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false );
+      mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false );
+
+      if( mEventData->mGrabHandlePopupEnabled )
+      {
+        SetPopupButtons();
+        mEventData->mDecorator->SetPopupActive( true );
+      }
+      HideClipboard();
+      mEventData->mDecoratorUpdated = true;
+    }
   }
 }
 
@@ -1383,26 +1438,22 @@ void Controller::Impl::FindSelectionIndices( float visualX, float visualY, Chara
 
   startIndex = hitCharacter;
   endIndex = hitCharacter;
+  bool isHitCharacterWhitespace = TextAbstraction::IsWhiteSpace( mLogicalModel->mText[hitCharacter] );
 
-  if( !TextAbstraction::IsWhiteSpace( mLogicalModel->mText[hitCharacter] ) )
+  // Find the start and end of the text
+  for( startIndex = hitCharacter; startIndex > 0; --startIndex )
   {
-    // Find the start and end of the text
-    for( startIndex = hitCharacter; startIndex > 0; --startIndex )
+    if( isHitCharacterWhitespace != TextAbstraction::IsWhiteSpace( mLogicalModel->mText[ startIndex-1 ] ) )
     {
-      Character charCode = mLogicalModel->mText[ startIndex-1 ];
-      if( TextAbstraction::IsWhiteSpace( charCode ) )
-      {
-        break;
-      }
+      break;
     }
-    const CharacterIndex pastTheEnd = mLogicalModel->mText.Count();
-    for( endIndex = hitCharacter + 1u; endIndex < pastTheEnd; ++endIndex )
+  }
+  const CharacterIndex pastTheEnd = mLogicalModel->mText.Count();
+  for( endIndex = hitCharacter + 1u; endIndex < pastTheEnd; ++endIndex )
+  {
+    if( isHitCharacterWhitespace != TextAbstraction::IsWhiteSpace( mLogicalModel->mText[ endIndex ] ) )
     {
-      Character charCode = mLogicalModel->mText[ endIndex ];
-      if( TextAbstraction::IsWhiteSpace( charCode ) )
-      {
-        break;
-      }
+      break;
     }
   }
 }
@@ -1445,7 +1496,6 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX,
 
   // Get the glyphs per character table.
   const Length* const glyphsPerCharacterBuffer = mVisualModel->mGlyphsPerCharacter.Begin();
-  const Length* const charactersPerGlyphBuffer = mVisualModel->mCharactersPerGlyph.Begin();
 
   // If the vector is void, there is no right to left characters.
   const bool hasRightToLeftCharacters = NULL != visualToLogicalBuffer;
@@ -1459,6 +1509,7 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX,
 
   // Traverses glyphs in visual order. To do that use the visual to logical conversion table.
   CharacterIndex visualIndex = startCharacter;
+  Length numberOfCharacters = 0u;
   for( ; !matched && ( visualIndex < endCharacter ); ++visualIndex )
   {
     // The character in logical order.
@@ -1467,44 +1518,59 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX,
     // Get the script of the character.
     const Script script = mLogicalModel->GetScript( characterLogicalOrderIndex );
 
-    // The first glyph for that character in logical order.
-    const GlyphIndex glyphLogicalOrderIndex = *( charactersToGlyphBuffer + characterLogicalOrderIndex );
     // The number of glyphs for that character
     const Length numberOfGlyphs = *( glyphsPerCharacterBuffer + characterLogicalOrderIndex );
+    ++numberOfCharacters;
 
-    // Get the metrics for the group of glyphs.
-    GlyphMetrics glyphMetrics;
-    GetGlyphsMetrics( glyphLogicalOrderIndex,
-                      numberOfGlyphs,
-                      glyphMetrics,
-                      mVisualModel,
-                      mMetrics );
 
-    const Vector2& position = *( positionsBuffer + glyphLogicalOrderIndex );
+    if( 0u != numberOfGlyphs )
+    {
+      // Get the first character/glyph of the group of glyphs.
+      const CharacterIndex firstVisualCharacterIndex = 1u + visualIndex - numberOfCharacters;
+      const CharacterIndex firstLogicalCharacterIndex = hasRightToLeftCharacters ? *( visualToLogicalBuffer + firstVisualCharacterIndex ) : firstVisualCharacterIndex;
+      const GlyphIndex firstLogicalGlyphIndex = *( charactersToGlyphBuffer + firstLogicalCharacterIndex );
 
-    // Prevents to jump the whole Latin ligatures like fi, ff, or Arabic ï»»...
-    const Length numberOfCharactersInLigature = HasLigatureMustBreak( script ) ? *( charactersPerGlyphBuffer + glyphLogicalOrderIndex ) : 1u;
-    const float glyphAdvance = glyphMetrics.advance / static_cast<float>( numberOfCharactersInLigature );
+      // Get the metrics for the group of glyphs.
+      GlyphMetrics glyphMetrics;
+      GetGlyphsMetrics( firstLogicalGlyphIndex,
+                        numberOfGlyphs,
+                        glyphMetrics,
+                        mVisualModel,
+                        mMetrics );
 
-    for( GlyphIndex index = 0u; !matched && ( index < numberOfCharactersInLigature ); ++index )
-    {
-      // Find the mid-point of the area containing the glyph
-      const float glyphCenter = -glyphMetrics.xBearing + position.x + ( static_cast<float>( index ) + 0.5f ) * glyphAdvance;
+      // Get the position of the first glyph.
+      const Vector2& position = *( positionsBuffer + firstLogicalGlyphIndex );
 
-      if( visualX < glyphCenter )
+      // Whether the glyph can be split, like Latin ligatures fi, ff or Arabic ï»». 
+      const bool isInterglyphIndex = ( numberOfCharacters > numberOfGlyphs ) && HasLigatureMustBreak( script );
+      const Length numberOfBlocks = isInterglyphIndex ? numberOfCharacters : 1u;
+      const float glyphAdvance = glyphMetrics.advance / static_cast<float>( numberOfBlocks );
+
+      GlyphIndex index = 0u;
+      for( ; !matched && ( index < numberOfBlocks ); ++index )
       {
-        visualIndex += index;
-        matched = true;
+        // Find the mid-point of the area containing the glyph
+        const float glyphCenter = -glyphMetrics.xBearing + position.x + ( static_cast<float>( index ) + 0.5f ) * glyphAdvance;
+
+        if( visualX < glyphCenter )
+        {
+          matched = true;
+          break;
+        }
+      }
+
+      if( matched )
+      {
+        visualIndex = firstVisualCharacterIndex + index;
         break;
       }
-    }
 
-    if( matched )
-    {
-      break;
+      numberOfCharacters = 0u;
     }
+
   }
 
+
   // Return the logical position of the cursor in characters.
 
   if( !matched )
@@ -1840,10 +1906,7 @@ void Controller::Impl::UpdateCursorPosition( const CursorInfo& cursorInfo )
   }
 
   // Set which cursors are active according the state.
-  if( ( EventData::EDITING == mEventData->mState )                  ||
-      ( EventData::EDITING_WITH_POPUP == mEventData->mState )       ||
-      ( EventData::EDITING_WITH_GRAB_HANDLE == mEventData->mState ) ||
-      ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) )
+  if( EventData::IsEditingState( mEventData->mState ) || ( EventData::GRAB_HANDLE_PANNING == mEventData->mState ) )
   {
     if( cursorInfo.isSecondaryCursor )
     {
@@ -1873,7 +1936,7 @@ void Controller::Impl::UpdateSelectionHandle( HandleType handleType,
 
   const Vector2 cursorPosition = cursorInfo.primaryPosition + mEventData->mScrollPosition + mAlignmentOffset;
 
-  // Sets the grab handle position.
+  // Sets the handle's position.
   mEventData->mDecorator->SetPosition( handleType,
                                        cursorPosition.x,
                                        cursorPosition.y,
index 50164c5..77f7f39 100644 (file)
@@ -108,6 +108,7 @@ struct EventData
     EDITING,
     EDITING_WITH_POPUP,
     EDITING_WITH_GRAB_HANDLE,
+    EDITING_WITH_PASTE_POPUP,
     GRAB_HANDLE_PANNING,
     SELECTION_HANDLE_PANNING
   };
@@ -116,10 +117,16 @@ struct EventData
 
   ~EventData();
 
-  DecoratorPtr       mDecorator;               ///< Pointer to the decorator
-  std::string        mPlaceholderTextActive;   ///< The text to display when the TextField is empty with key-input focus
-  std::string        mPlaceholderTextInactive; ///< The text to display when the TextField is empty and inactive
-  Vector4            mPlaceholderTextColor;    ///< The in/active placeholder text color
+  static bool IsEditingState( State stateToCheck )
+  {
+    return ( stateToCheck == EDITING || stateToCheck == EDITING_WITH_POPUP || stateToCheck == EDITING_WITH_GRAB_HANDLE || stateToCheck == EDITING_WITH_PASTE_POPUP );
+  }
+
+  DecoratorPtr       mDecorator;               ///< Pointer to the decorator.
+  ImfManager         mImfManager;              ///< The Input Method Framework Manager.
+  std::string        mPlaceholderTextActive;   ///< The text to display when the TextField is empty with key-input focus.
+  std::string        mPlaceholderTextInactive; ///< The text to display when the TextField is empty and inactive.
+  Vector4            mPlaceholderTextColor;    ///< The in/active placeholder text color.
 
   /**
    * This is used to delay handling events until after the model has been updated.
@@ -333,10 +340,9 @@ struct Controller::Impl
     if( mEventData )
     {
       // Reset incase we are in a pre-edit state.
-      ImfManager imfManager = ImfManager::Get();
-      if ( imfManager )
+      if( mEventData->mImfManager )
       {
-        imfManager.Reset(); // Will trigger a commit message
+        mEventData->mImfManager.Reset(); // Will trigger a message ( commit, get surrounding )
       }
 
       ClearPreEditFlag();
@@ -507,6 +513,7 @@ struct Controller::Impl
 
   bool mRecalculateNaturalSize:1;          ///< Whether the natural size needs to be recalculated.
   bool mUserDefinedFontFamily:1;           ///< Whether the Font family was set by the user instead of being left as sytem default.
+
 };
 
 } // namespace Text
index 4babaf3..4ed0231 100644 (file)
@@ -90,7 +90,8 @@ void Controller::SetText( const std::string& text )
     // If popup shown then hide it by switching to Editing state
     if( ( EventData::SELECTING == mImpl->mEventData->mState )          ||
         ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-        ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) )
+        ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) ||
+        ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState ) )
     {
       mImpl->ChangeState( EventData::EDITING );
     }
@@ -452,12 +453,12 @@ bool Controller::RemoveText( int cursorOffset, int numberOfChars )
       cursorIndex = oldCursorIndex + cursorOffset;
     }
 
-    if( (cursorIndex + numberOfChars) > currentText.Count() )
+    if( ( cursorIndex + numberOfChars ) > currentText.Count() )
     {
       numberOfChars = currentText.Count() - cursorIndex;
     }
 
-    if( (cursorIndex + numberOfChars) <= currentText.Count() )
+    if( ( cursorIndex + numberOfChars ) <= currentText.Count() )
     {
       Vector<Character>::Iterator first = currentText.Begin() + cursorIndex;
       Vector<Character>::Iterator last  = first + numberOfChars;
@@ -666,7 +667,7 @@ float Controller::GetHeightForWidth( float width )
   ProcessModifyEvents();
 
   Size layoutSize;
-  if( width != mImpl->mVisualModel->mControlSize.width )
+  if( fabsf( width - mImpl->mVisualModel->mControlSize.width ) > Math::MACHINE_EPSILON_1000 )
   {
     // Operations that can be done only once until the text changes.
     const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( CONVERT_TO_UTF32  |
@@ -842,9 +843,7 @@ void Controller::ResetCursorPosition( CharacterIndex cursorIndex )
     mImpl->mEventData->mPrimaryCursorPosition = cursorIndex;
 
     // Update the cursor if it's in editing mode.
-    if( ( EventData::EDITING == mImpl->mEventData->mState )            ||
-        ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-        ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) )
+    if ( EventData::IsEditingState( mImpl->mEventData->mState )  )
     {
       mImpl->mEventData->mUpdateCursorPosition = true;
     }
@@ -897,9 +896,7 @@ void Controller::TextInsertedEvent()
                                                            REORDER );
 
   // Queue a cursor reposition event; this must wait until after DoRelayout()
-  if( ( EventData::EDITING == mImpl->mEventData->mState )            ||
-      ( EventData::EDITING_WITH_POPUP == mImpl->mEventData->mState ) ||
-      ( EventData::EDITING_WITH_GRAB_HANDLE == mImpl->mEventData->mState ) )
+  if ( EventData::IsEditingState( mImpl->mEventData->mState )  )
   {
     mImpl->mEventData->mUpdateCursorPosition = true;
     mImpl->mEventData->mScrollAfterUpdatePosition = true;
@@ -1505,33 +1502,48 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
 
   if( NULL != mImpl->mEventData )
   {
+    DALI_LOG_INFO( gLogFilter, Debug::Concise, "TapEvent state:%d \n", mImpl->mEventData->mState );
+
     if( 1u == tapCount )
     {
       // This is to avoid unnecessary relayouts when tapping an empty text-field
       bool relayoutNeeded( false );
 
-      if( mImpl->IsShowingRealText() &&
-          EventData::EDITING == mImpl->mEventData->mState )
+      if ( EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState || EventData::EDITING_WITH_PASTE_POPUP == mImpl->mEventData->mState )
       {
-        // Show grab handle on second tap
-        mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
-        relayoutNeeded = true;
+        mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE);  // If Popup shown hide it here so can be shown again if required.
       }
-      else if( EventData::EDITING                  != mImpl->mEventData->mState &&
-               EventData::EDITING_WITH_GRAB_HANDLE != mImpl->mEventData->mState )
+
+      if( mImpl->IsShowingRealText() && ( EventData::INACTIVE !=  mImpl->mEventData->mState ) )
       {
-        if( mImpl->IsShowingPlaceholderText() &&  ! mImpl->IsFocusedPlaceholderAvailable() )
+        // Already in an active state so show a popup
+        if ( !mImpl->IsClipboardEmpty() )
         {
-          // Hide placeholder text
-          ResetText();
+          // Shows Paste popup but could show full popup with Selection options. ( EDITING_WITH_POPUP )
+          mImpl->ChangeState( EventData::EDITING_WITH_PASTE_POPUP );
+        }
+        else
+        {
+          mImpl->ChangeState( EventData::EDITING_WITH_GRAB_HANDLE );
         }
-        // Show cursor on first tap
-        mImpl->ChangeState( EventData::EDITING );
         relayoutNeeded = true;
       }
-      else if( mImpl->IsShowingRealText() )
+      else
       {
-        // Move the cursor
+        if( mImpl->IsShowingPlaceholderText() &&  !mImpl->IsFocusedPlaceholderAvailable() )
+        {
+          // Hide placeholder text
+          ResetText();
+        }
+
+        if ( EventData::INACTIVE == mImpl->mEventData->mState )
+        {
+          mImpl->ChangeState( EventData::EDITING );
+        }
+        else if ( !mImpl->IsClipboardEmpty() )
+        {
+          mImpl->ChangeState( EventData::EDITING_WITH_POPUP );
+        }
         relayoutNeeded = true;
       }
 
@@ -1562,6 +1574,7 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
 }
 
 void Controller::PanEvent( Gesture::State state, const Vector2& displacement )
+        // Show cursor and grabhandle on first tap, this matches the behaviour of tapping when already editing
 {
   DALI_ASSERT_DEBUG( mImpl->mEventData && "Unexpected PanEvent" );
 
@@ -1619,6 +1632,8 @@ void Controller::LongPressEvent( Gesture::State state, float x, float y  )
 
 void Controller::SelectEvent( float x, float y, bool selectAll )
 {
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SelectEvent\n" );
+
   if( mImpl->mEventData )
   {
     mImpl->ChangeState( EventData::SELECTING );
@@ -1709,12 +1724,21 @@ void Controller::PasteText( const std::string& stringToPaste )
   InsertText( stringToPaste, Text::Controller::COMMIT );
   mImpl->ChangeState( EventData::EDITING );
   mImpl->RequestRelayout();
+
+  // Do this last since it provides callbacks into application code
+  mImpl->mControlInterface.TextChanged();
 }
 
 void Controller::PasteClipboardItemEvent()
 {
+  // Retrieve the clipboard contents first
   ClipboardEventNotifier notifier( ClipboardEventNotifier::Get() );
   std::string stringToPaste( notifier.GetContent() );
+
+  // Commit the current pre-edit text; the contents of the clipboard should be appended
+  mImpl->ResetImfManager();
+
+  // Paste
   PasteText( stringToPaste );
 }
 
@@ -1797,7 +1821,7 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt
 
 ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, const ImfManager::ImfEventData& imfEvent )
 {
-  bool update( false );
+  bool update = false;
   bool requestRelayout = false;
 
   std::string text;
@@ -1923,17 +1947,15 @@ void Controller::NotifyImfManager()
 {
   if( mImpl->mEventData )
   {
-    ImfManager imfManager = ImfManager::Get();
-
-    if( imfManager )
+    if( mImpl->mEventData->mImfManager )
     {
       // Notifying IMF of a cursor change triggers a surrounding text request so updating it now.
       std::string text;
       GetText( text );
-      imfManager.SetSurroundingText( text );
+      mImpl->mEventData->mImfManager.SetSurroundingText( text );
 
-      imfManager.SetCursorPosition( GetLogicalCursorPosition() );
-      imfManager.NotifyCursorPosition();
+      mImpl->mEventData->mImfManager.SetCursorPosition( GetLogicalCursorPosition() );
+      mImpl->mEventData->mImfManager.NotifyCursorPosition();
     }
   }
 }
index 0108d6c..48c2d70 100644 (file)
@@ -48,12 +48,6 @@ class AccessibilityManager;
  * focus and moving the focus forward and backward. It also draws a highlight for the
  * focused actor and emits a signal when the focus is changed.
  *
- * Signals
- * | %Signal Name            | Method                             |
- * |-------------------------|------------------------------------|
- * | focus-changed           | @ref FocusChangedSignal()          |
- * | focus-overshot          | @ref FocusOvershotSignal()         |
- * | focused-actor-activated | @ref FocusedActorActivatedSignal() |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API AccessibilityManager : public BaseHandle
@@ -63,13 +57,20 @@ public:
   // Typedefs
 
   /**
-   * @brief Accessibility Action Signal.
+   * @brief General accessibility action signal.
    *
    * The connected signal callback should return true if handled.
    * @since_tizen 2.4
    */
-  typedef Signal< bool ( AccessibilityManager& ) > AccessibilityActionSignalType; ///< Generic signal type
-  typedef Signal< bool ( AccessibilityManager&, const Dali::TouchEvent& )> AccessibilityActionScrollSignalType; ///< Scroll signal type
+  typedef Signal< bool ( AccessibilityManager& ) > AccessibilityActionSignalType;
+
+  /**
+   * @brief Scroll accessibility action signal.
+   *
+   * The connected signal callback should return true if handled.
+   * @since_tizen 2.4
+   */
+  typedef Signal< bool ( AccessibilityManager&, const Dali::TouchEvent& )> AccessibilityActionScrollSignalType;
 
   /**
    * @brief Accessibility needs four information which will be read by screen-reader.
@@ -79,11 +80,11 @@ public:
    */
   enum AccessibilityAttribute
   {
-    ACCESSIBILITY_LABEL = 0, ///< Simple text which contained in ui-control
-    ACCESSIBILITY_TRAIT,     ///< Description of ui-control trait
-    ACCESSIBILITY_VALUE,     ///< Current value of ui-control (Optional)
-    ACCESSIBILITY_HINT,      ///< Hint for action (Optional)
-    ACCESSIBILITY_ATTRIBUTE_NUM ///< Number of attributes
+    ACCESSIBILITY_LABEL = 0, ///< Simple text which contained in ui-control @since_tizen 2.4
+    ACCESSIBILITY_TRAIT,     ///< Description of ui-control trait @since_tizen 2.4
+    ACCESSIBILITY_VALUE,     ///< Current value of ui-control (Optional) @since_tizen 2.4
+    ACCESSIBILITY_HINT,      ///< Hint for action (Optional) @since_tizen 2.4
+    ACCESSIBILITY_ATTRIBUTE_NUM ///< Number of attributes @since_tizen 2.4
   };
 
    /**
@@ -92,8 +93,8 @@ public:
     */
   enum FocusOvershotDirection
   {
-    OVERSHOT_PREVIOUS = -1, ///< Try to move previous of the first actor
-    OVERSHOT_NEXT = 1,      ///< Try to move next of the last actor
+    OVERSHOT_PREVIOUS = -1, ///< Try to move previous of the first actor @since_tizen 2.4
+    OVERSHOT_NEXT = 1,      ///< Try to move next of the last actor @since_tizen 2.4
   };
 
  public:
index 7d988a5..331ad10 100644 (file)
@@ -55,12 +55,12 @@ public:
    */
   enum Type
   {
-    HorizontalLeft   = 1,
-    HorizontalCenter = 2,
-    HorizontalRight  = 4,
-    VerticalTop      = 8,
-    VerticalCenter   = 16,
-    VerticalBottom   = 32
+    HorizontalLeft   = 1, ///< Horizontal left alignment @since_tizen 2.4
+    HorizontalCenter = 2, ///< Horizontal center alignment @since_tizen 2.4
+    HorizontalRight  = 4, ///< Horizontal right alignment @since_tizen 2.4
+    VerticalTop      = 8, ///< Vertical top alignment @since_tizen 2.4
+    VerticalCenter   = 16, ///< Vertical center alignment @since_tizen 2.4
+    VerticalBottom   = 32 ///< Vertical bottom alignment @since_tizen 2.4
   };
 
   /**
@@ -69,12 +69,12 @@ public:
    */
   enum Scaling
   {
-    ScaleNone,             ///< The original size is kept.
-    ScaleToFill,           ///< Scale added actors to fill alignment's boundary. Aspect ratio is not maintained.
-    ScaleToFitKeepAspect,  ///< Scale added actors to fit within the alignment's boundary. Aspect ratio is maintained.
-    ScaleToFillKeepAspect, ///< Scale added actors to fill the alignment's boundary. Aspect ratio is maintained, and the actor may exceed the alignment's boundary.
-    ShrinkToFit,           ///< If added actors are larger than the alignment's boundary it will be shrunk down to fit. Aspect ratio is not maintained
-    ShrinkToFitKeepAspect, ///< If added actors are larger than the alignment's boundary it will be shrunk down to fit. Aspect ratio is maintained
+    ScaleNone,             ///< The original size is kept. @since_tizen 2.4
+    ScaleToFill,           ///< Scale added actors to fill alignment's boundary. Aspect ratio is not maintained. @since_tizen 2.4
+    ScaleToFitKeepAspect,  ///< Scale added actors to fit within the alignment's boundary. Aspect ratio is maintained. @since_tizen 2.4
+    ScaleToFillKeepAspect, ///< Scale added actors to fill the alignment's boundary. Aspect ratio is maintained, and the actor may exceed the alignment's boundary. @since_tizen 2.4
+    ShrinkToFit,           ///< If added actors are larger than the alignment's boundary it will be shrunk down to fit. Aspect ratio is not maintained @since_tizen 2.4
+    ShrinkToFitKeepAspect, ///< If added actors are larger than the alignment's boundary it will be shrunk down to fit. Aspect ratio is maintained @since_tizen 2.4
   };
 
   /**
@@ -153,7 +153,7 @@ public:
   ~Alignment();
 
   /**
-   * @brief Downcast an Object handle to Alignment.
+   * @brief Downcast a handle to Alignment handle.
    *
    * If handle points to a Alignment the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
index 2094e96..64f353c 100644 (file)
@@ -68,18 +68,7 @@ class Button;
  *
  * Is not mandatory set all images. A button could be defined only by setting its \e background image or by setting its \e background and \e selected images.
  *
- * Signals
- * | %Signal Name      | Method                      |
- * |-------------------|-----------------------------|
- * | pressed           | @ref PressedSignal()        |
- * | released          | @ref ReleasedSignal()       |
- * | clicked           | @ref ClickedSignal()        |
- * | state-changed     | @ref StateChangedSignal()   |
  *
- * Actions
- * | %Action Name      | %Button method called       |
- * |-------------------|-----------------------------|
- * | button-click      | %DoClickAction()            |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API Button : public Control
@@ -93,7 +82,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices @since_tizen 2.4
   };
 
   /**
@@ -104,21 +93,21 @@ public:
   {
     enum
     {
-      DISABLED = PROPERTY_START_INDEX, ///< name "disabled",                     @see SetDisabled(),                  type bool
-      AUTO_REPEATING,                  ///< name "auto-repeating",               @see SetAutoRepeating(),             type bool
-      INITIAL_AUTO_REPEATING_DELAY,    ///< name "initial-auto-repeating-delay", @see SetInitialAutoRepeatingDelay(), type float
-      NEXT_AUTO_REPEATING_DELAY,       ///< name "next-auto-repeating-delay",    @see SetNextAutoRepeatingDelay(),    type float
-      TOGGLABLE,                       ///< name "togglable",                    @see SetTogglableButton(),           type bool
-      SELECTED,                        ///< name "selected",                     @see SetSelected(),                  type bool
-      UNSELECTED_STATE_IMAGE,          ///< name "unselected-state-image",       @see SetUnselectedImage(),           type std::string
-      SELECTED_STATE_IMAGE,            ///< name "selected-state-image",         @see SetSelectedImage(),             type std::string
-      DISABLED_STATE_IMAGE,            ///< name "disabled-state-image",         @see SetDisabledImage(),             type std::string
-      UNSELECTED_COLOR,                ///< name "unselected-color",                                                  type Vector4
-      SELECTED_COLOR,                  ///< name "selected-color",                                                    type Vector4
-      LABEL,                           ///< name "label",                                                             type Property::Map
+      DISABLED = PROPERTY_START_INDEX, ///< type bool @since_tizen 2.4        @see SetDisabled()
+      AUTO_REPEATING,                  ///< type bool @since_tizen 2.4        @see SetAutoRepeating()
+      INITIAL_AUTO_REPEATING_DELAY,    ///< type float @since_tizen 2.4       @see SetInitialAutoRepeatingDelay()
+      NEXT_AUTO_REPEATING_DELAY,       ///< type float @since_tizen 2.4       @see SetNextAutoRepeatingDelay()
+      TOGGLABLE,                       ///< type bool @since_tizen 2.4        @see SetTogglableButton()
+      SELECTED,                        ///< type bool @since_tizen 2.4        @see SetSelected()
+      UNSELECTED_STATE_IMAGE,          ///< type std::string @since_tizen 2.4 @see SetUnselectedImage()
+      SELECTED_STATE_IMAGE,            ///< type std::string @since_tizen 2.4 @see SetSelectedImage()
+      DISABLED_STATE_IMAGE,            ///< type std::string @since_tizen 2.4 @see SetDisabledImage()
+      UNSELECTED_COLOR,                ///< type Vector4 @since_tizen 2.4
+      SELECTED_COLOR,                  ///< type Vector4 @since_tizen 2.4
+      LABEL,                           ///< type Property::Map @since_tizen 2.4
 
       // Deprecated properties:
-      LABEL_TEXT,                      ///< name "label-text",                   @see SetLabelText(),                 type std::string
+      LABEL_TEXT,                      ///< type std::string @since_tizen 2.4 @see SetLabelText()
     };
   };
 
@@ -146,7 +135,7 @@ public:
   Button& operator=( const Button& button );
 
   /**
-   * @brief Downcast an Object handle to Button.
+   * @brief Downcast a handle to Button handle.
    *
    * If handle points to a Button the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -194,7 +183,7 @@ public:
   void SetAutoRepeating( bool autoRepeating );
 
   /**
-   * @brief Returns fi the autorepeating property is set.
+   * @brief Returns if the autorepeating property is set.
    * @since_tizen 2.4
    * @return \e true if the \e autorepeating property is set.
    */
@@ -268,7 +257,7 @@ public:
   /**
    * @brief Returns if the selected property is set and the button is togglable.
    * @since_tizen 2.4
-   * @return \e true if the \e selected property is set and the button is togglable.
+   * @return \e true if the button is \e selected.
    */
   bool IsSelected() const;
 
@@ -360,49 +349,45 @@ public:
    */
   void SetDisabledSelectedImage( const std::string& filename );
 
-  /// @cond INTERNAL
-  // Deprecated API
-
   /**
-   * @deprecated Sets the label with an actor.
    * @brief Sets the label with an actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use @ref SetLabelText.
    * @param[in]  label The actor to use as a label
    */
   void SetLabel( Actor label );
 
   /**
-   * @deprecated Sets the button image.
    * @brief Sets the button image.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use @ref SetUnselectedImage.
    * @param[in]  image The button image.
    */
   void SetButtonImage( Image image );
 
   /**
-   * @deprecated Sets the selected image.
    * @brief Sets the selected image.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use SetSelectedImage( const std::string& filename ).
    * @param[in]  image The selected image.
    */
   void SetSelectedImage( Image image );
 
   /**
-   * @deprecated Gets the button image.
    * @brief Gets the button image.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code.
    * @return     An actor with the button image.
    */
   Actor GetButtonImage() const;
 
   /**
-   * @deprecated Gets the selected image.
    * @brief Gets the selected image.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code.
    * @return     An actor with the selected image.
    */
   Actor GetSelectedImage() const;
-  /// @endcond
 
 public: //Signals
 
@@ -450,6 +435,7 @@ public: //Signals
 
   /**
    * @brief This signal is emitted when the button's state is changed.
+   *
    * The application can get the state by calling IsSelected().
    *
    * A callback of the following type may be connected:
index 1dd14e7..6b121e1 100644 (file)
@@ -43,16 +43,15 @@ class CheckBoxButton;
  *
  * By default a CheckBoxButton emits a Button::ClickedSignal() signal when the button changes its state to selected or unselected.
  *
- * The button's appearance could be modified by setting images or actors with CheckBoxButton::SetBackgroundImage,
- * CheckBoxButton::SetSelectedImage, CheckBoxButton::SetDisabledBackgroundImage and CheckBoxButton::SetDisabledSelectedImage.
+ * The button's appearance could be modified by Button::SetUnselectedImage, Button::SetBackgroundImage,
+ * Button::SetSelectedImage, Button::SetSelectedBackgroundImage, Button::SetDisabledBackgroundImage,
+ * Button::SetDisabledImage, and Button::SetDisabledSelectedImage.
  *
  * When the button is not disabled, if it's not selected it only shows the \e background image. The \e selected image is shown over the
  * \e background image when the box is selected (\e background image is not replaced by \e selected image).
  *
  * When the button is disabled, \e background image and \e selected image are replaced by \e disabled images.
  *
- * CheckBoxButton doesn't have a text. However, a Dali::Toolkit::TableView with a Dali::TextActor or a Dali::Toolkit::TextView
- * and a CheckBoxButton could be used instead.
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API CheckBoxButton : public Button
@@ -94,7 +93,9 @@ public:
   static CheckBoxButton New();
 
   /**
-   * @brief Downcast an Object handle to CheckBoxButton. If handle points to a CheckBoxButton the
+   * @brief Downcast a handle to CheckBoxButton handle.
+   *
+   * If handle points to a CheckBoxButton the
    * downcast produces valid handle. If not the returned handle is left uninitialized.
    * @since_tizen 2.4
    * @param[in] handle Handle to an object
index 0ca9c45..9a3d7cf 100644 (file)
@@ -60,7 +60,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Button::PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserving 1000 property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserving 1000 property indices @since_tizen 2.4
   };
 
   /**
@@ -71,11 +71,11 @@ public:
   {
     enum
     {
-      UNSELECTED_ICON = PROPERTY_START_INDEX, ///< Property, name "unselected-icon", type std::string
-      SELECTED_ICON,                          ///< Property, name "selected-icon",   type std::string
-      ICON_ALIGNMENT,                         ///< Property, name "icon-alignment",  type std::string
-      LABEL_PADDING,                          ///< Property, name "label-padding",   type Vector4
-      ICON_PADDING,                           ///< Property, name "icon-padding",    type Vector4
+      UNSELECTED_ICON = PROPERTY_START_INDEX, ///< Property, name "unselected-icon", type std::string @since_tizen 2.4
+      SELECTED_ICON,                          ///< Property, name "selected-icon",   type std::string @since_tizen 2.4
+      ICON_ALIGNMENT,                         ///< Property, name "icon-alignment",  type std::string @since_tizen 2.4
+      LABEL_PADDING,                          ///< Property, name "label-padding",   type Vector4 @since_tizen 2.4
+      ICON_PADDING,                           ///< Property, name "icon-padding",    type Vector4 @since_tizen 2.4
     };
   };
 
@@ -118,7 +118,7 @@ public:
   static PushButton New();
 
   /**
-   * @brief Downcast an Object handle to PushButton.
+   * @brief Downcast a handle to PushButton handle.
    *
    * If handle points to a PushButton the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -130,15 +130,12 @@ public:
   static PushButton DownCast( BaseHandle handle );
 
 
-  /// @cond INTERNAL
-  // Deprecated API
-
   using Button::SetButtonImage;
 
   /**
-   * @deprecated Sets the unselected image with an Actor.
    * @brief Sets the unselected image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetUnselectedImage.
    * @param[in] image The Actor to use.
    */
   void SetButtonImage( Actor image );
@@ -146,9 +143,9 @@ public:
   using Button::SetBackgroundImage;
 
   /**
-   * @deprecated Sets the background image with an Actor.
    * @brief Sets the background image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetBackgroundImage.
    * @param[in] image The Actor to use.
    */
   void SetBackgroundImage( Actor image );
@@ -156,9 +153,9 @@ public:
   using Button::SetSelectedImage;
 
   /**
-   * @deprecated Sets the selected image with an Actor.
    * @brief Sets the selected image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetSelectedImage( const std::string& filename ).
    * @param[in] image The Actor to use.
    */
   void SetSelectedImage( Actor image );
@@ -166,9 +163,9 @@ public:
   using Button::SetSelectedBackgroundImage;
 
   /**
-   * @deprecated Sets the selected background image with an Actor.
    * @brief Sets the selected background image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetSelectedBackgroundImage.
    * @param[in] image The Actor to use.
    */
   void SetSelectedBackgroundImage( Actor image );
@@ -176,9 +173,9 @@ public:
   using Button::SetDisabledBackgroundImage;
 
   /**
-   * @deprecated Sets the disabled background image with an Actor.
    * @brief Sets the disabled background image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetDisabledBackgroundImage.
    * @param[in] image The Actor to use.
    */
   void SetDisabledBackgroundImage( Actor image );
@@ -186,9 +183,9 @@ public:
   using Button::SetDisabledImage;
 
   /**
-   * @deprecated Sets the disabled image with an Actor.
    * @brief Sets the disabled image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetDisabledImage.
    * @param[in] image The Actor to use.
    */
   void SetDisabledImage( Actor image );
@@ -196,13 +193,12 @@ public:
   using Button::SetDisabledSelectedImage;
 
   /**
-   * @deprecated Sets the disabled selected image with an Actor.
    * @brief Sets the disabled selected image with an Actor.
    * @since_tizen 2.4
+   * @remarks Avoid using this method as it's a legacy code. Instead, use Button::SetDisabledSelectedImage.
    * @param[in] image The Actor to use.
    */
   void SetDisabledSelectedImage( Actor image );
-  /// @endcond
 
 
 public: // Not intended for application developers
index d4d0dbd..442fdbe 100644 (file)
@@ -45,7 +45,7 @@ class RadioButton;
  *
  * Radio buttons are designed to select one of many option at the same time.
  *
- * Every button have its own \e label and \e state, which can be modified by RadioButton::SetLabel and Button::SetSelected.
+ * Every button have its own \e label and \e state, which can be modified by Button::SetLabelText and Button::SetSelected.
  *
  * RadioButton can change its current state using Button::SetSelected.
  *
@@ -108,7 +108,7 @@ class DALI_IMPORT_API RadioButton: public Button
   static RadioButton New( const std::string& label );
 
   /**
-   * @brief Downcast an Object handle to RadioButton.
+   * @brief Downcast a handle to RadioButton handle.
    *
    * If handle points to a RadioButton the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
index b4b9cdb..26c5087 100644 (file)
@@ -234,7 +234,7 @@ Actor CreateBackground( Actor parent, const Vector4& color, Image image = Image(
     vertexBuffer = PropertyBuffer::New( vertexFormat, 4u );
     vertexBuffer.SetData( gQuad );
 
-    shader = Shader::New( VERTEX_SHADER_COLOR, FRAGMENT_SHADER_COLOR );
+    shader = Shader::New( VERTEX_SHADER_COLOR, FRAGMENT_SHADER_COLOR, Shader::HINT_OUTPUT_IS_TRANSPARENT );
     material = Material::New( shader );
 
     //Create the index buffer
@@ -975,7 +975,8 @@ void Control::OnStageConnection( int depth )
       Renderer backgroundRenderer = mImpl->mBackground->actor.GetRendererAt( 0 );
       if(backgroundRenderer)
       {
-        backgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX+depth );
+        // lower background actor's depth to make visible behind of control
+        backgroundRenderer.SetDepthIndex( BACKGROUND_DEPTH_INDEX+depth - Layer::TREE_DEPTH_MULTIPLIER );
       }
     }
     else
@@ -984,7 +985,8 @@ void Control::OnStageConnection( int depth )
       ImageActor imageActor = ImageActor::DownCast( mImpl->mBackground->actor );
       if ( imageActor )
       {
-        imageActor.SetSortModifier( BACKGROUND_DEPTH_INDEX+depth );
+        // lower background actor's depth to make visible behind of control
+        imageActor.SetSortModifier( BACKGROUND_DEPTH_INDEX+depth - Layer::TREE_DEPTH_MULTIPLIER );
       }
     }
   }
index 735c1ea..e63cece 100644 (file)
@@ -42,6 +42,10 @@ namespace Toolkit
 
 class StyleManager;
 
+/**
+ * @brief Internal namespace for Control
+ * @since_tizen 2.4
+ */
 namespace Internal
 {
 /**
@@ -393,8 +397,8 @@ protected: // Helpers for deriving classes
   // Flags for the constructor
   enum ControlBehaviour
   {
-    REQUIRES_STYLE_CHANGE_SIGNALS        = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 0 ),     ///< True if needs to monitor style change signals such as theme/font change
-    REQUIRES_KEYBOARD_NAVIGATION_SUPPORT = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 1 ),     ///< True if needs to support keyboard navigation
+    REQUIRES_STYLE_CHANGE_SIGNALS        = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 0 ),     ///< True if needs to monitor style change signals such as theme/font change @since_tizen 2.4
+    REQUIRES_KEYBOARD_NAVIGATION_SUPPORT = 1 << ( CustomActorImpl::ACTOR_FLAG_COUNT + 1 ),     ///< True if needs to support keyboard navigation @since_tizen 2.4
 
     LAST_CONTROL_BEHAVIOUR_FLAG
   };
index 4fead33..bdf20dc 100644 (file)
@@ -52,21 +52,7 @@ class Control;
  * @since_tizen 2.4
  * @see Internal::Control
  *
- * Signals
- * | %Signal Name           | Method                                              |
- * |------------------------|-----------------------------------------------------|
- * | key-event              | @ref KeyEventSignal()                               |
- * | key-input-focus-gained | @ref KeyInputFocusGainedSignal()                    |
- * | key-input-focus-lost   | @ref KeyInputFocusLostSignal()                      |
- * | tapped                 | @ref GetTapGestureDetector().DetectedSignal()       |
- * | panned                 | @ref GetPanGestureDetector().DetectedSignal()       |
- * | pinched                | @ref GetPinchGestureDetector().DetectedSignal()     |
- * | long-pressed           | @ref GetLongPressGestureDetector().DetectedSignal() |
  *
- * Actions
- * | %Action Name            | %Control method called                             |
- * |-------------------------|----------------------------------------------------|
- * | accessibility-activated | %OnAccessibilityActivated()                        |
  */
 class DALI_IMPORT_API Control : public CustomActor
 {
@@ -78,9 +64,9 @@ public:
    */
   enum PropertyRange
   {
-    PROPERTY_START_INDEX = PROPERTY_REGISTRATION_START_INDEX,        ///< Start index is used by the property registration macro.
-    CONTROL_PROPERTY_START_INDEX = PROPERTY_START_INDEX,             ///< Start index of Control properties.
-    CONTROL_PROPERTY_END_INDEX = CONTROL_PROPERTY_START_INDEX + 1000 ///< Reserving 1000 property indices.
+    PROPERTY_START_INDEX = PROPERTY_REGISTRATION_START_INDEX,        ///< Start index is used by the property registration macro. @since_tizen 2.4
+    CONTROL_PROPERTY_START_INDEX = PROPERTY_START_INDEX,             ///< Start index of Control properties. @since_tizen 2.4
+    CONTROL_PROPERTY_END_INDEX = CONTROL_PROPERTY_START_INDEX + 1000 ///< Reserving 1000 property indices. @since_tizen 2.4
   };
 
   /**
@@ -91,10 +77,10 @@ public:
   {
     enum
     {
-      STYLE_NAME = PROPERTY_START_INDEX,       ///< name "style-name",       @see SetStyleName,       type std::string
-      BACKGROUND_COLOR,                        ///< name "background-color", @see SetBackgroundColor, type Vector4
-      BACKGROUND_IMAGE,                        ///< name "background-image", @see SetBackgroundImage, type Map
-      KEY_INPUT_FOCUS,                         ///< name "key-input-focus",  @see SetKeyInputFocus,   type bool
+      STYLE_NAME = PROPERTY_START_INDEX,       ///< type std::string @since_tizen 2.4 @see SetStyleName
+      BACKGROUND_COLOR,                        ///< type Vector4 @since_tizen 2.4     @see SetBackgroundColor
+      BACKGROUND_IMAGE,                        ///< type Map @since_tizen 2.4         @see SetBackgroundImage
+      KEY_INPUT_FOCUS,                         ///< type bool @since_tizen 2.4        @see SetKeyInputFocus
     };
   };
 
@@ -106,10 +92,10 @@ public:
   {
     enum Direction
     {
-      LEFT,   ///< Move keyboard focus towards the left direction
-      RIGHT,  ///< Move keyboard focus towards the right direction
-      UP,     ///< Move keyboard focus towards the up direction
-      DOWN    ///< Move keyboard focus towards the down direction
+      LEFT,   ///< Move keyboard focus towards the left direction @since_tizen 2.4
+      RIGHT,  ///< Move keyboard focus towards the right direction @since_tizen 2.4
+      UP,     ///< Move keyboard focus towards the up direction @since_tizen 2.4
+      DOWN    ///< Move keyboard focus towards the down direction @since_tizen 2.4
     };
   };
 
@@ -174,7 +160,7 @@ public: // operators
 public:
 
   /**
-   * @brief Downcast an Object handle to Control.
+   * @brief Downcast a handle to Control handle.
    *
    * If handle points to a Control the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -201,15 +187,15 @@ public:
   /**
    * @brief Quries whether the control has key input focus.
    *
-   * Note: The control can be set to have the focus and still not receive all the key events if another control has over ridden it.
-   * As the key input focus mechanism works like a stack, the top most control receives all the key events, and passes on the
-   * unhandled events to the controls below in the stack. A control in the stack will regain key input focus when there are no more
-   * controls above it in the focus stack.
-   * To query for the conrol which is on top of the focus stack use Dali::Toolkit::KeyInputFocusManager::GetCurrentKeyboardFocusActor()
    * @since_tizen 2.4
    * @return true if this control has keyboard input focus
    * @pre The Control has been initialized.
    * @pre The Control should be on the stage before setting keyboard focus.
+   * @note The control can be set to have the focus and still not receive all the key events if another control has over ridden it.
+   * As the key input focus mechanism works like a stack, the top most control receives all the key events, and passes on the
+   * unhandled events to the controls below in the stack. A control in the stack will regain key input focus when there are no more
+   * controls above it in the focus stack.
+   * To query for the conrol which is on top of the focus stack use Dali::Toolkit::KeyInputFocusManager::GetCurrentKeyboardFocusActor()
    */
   bool HasKeyInputFocus();
 
index e399fbc..39e1a22 100644 (file)
@@ -28,23 +28,23 @@ namespace Dali
 namespace Toolkit
 {
 /**
- * @internal
- * @addtogroup dali_toolkit_controls_default_controls
+ * @addtogroup dali_toolkit_controls
  * @{
  */
 
 /**
- * @deprecated
  * @brief Creates a Dali::ImageActor with a solid color, optionally it creates a border.
  *
  * If the \e border parameter is set to \e true, the Dali::ImageActor's style is set to Dali::ImageActor::STYLE_NINE_PATCH.
  *
  * @since_tizen 2.4
+ * @remarks Avoid using this function as it's a legacy code. Instead, use Control with background color.
  * @param[in] color The ImageActor's color.
  * @param[in] border If \e true, a border is created. By default, the value is set to \e false.
  * @param[in] borderColor The color for the ImageActor's border. By default, the value is set to Color::WHITE.
  * @param[in] borderSize The size for the ImageActor's border. By default, the value is set to 1 pixel. It supports under 10 pixel for clear result of gl blend
  * @return a handle to the new ImageActor
+ * @see Control
  */
 DALI_IMPORT_API ImageActor CreateSolidColorActor( const Vector4& color, bool border = false, const Vector4& borderColor = Color::WHITE, const unsigned int borderSize = 1 );
 
index 0d283f5..16487bd 100644 (file)
@@ -76,6 +76,7 @@ class BloomView;
  *
  * Usage example:-
  *
+ * @code
  *  // initialise\n
  *  GaussianBlurView gaussianBlurView = GaussianBlurView::New();\n
  *
@@ -99,7 +100,10 @@ class BloomView;
  *  // Stop rendering the GaussianBlurView\n
  *  Stage::GetCurrent().Remove(gaussianBlurView);\n
  *  gaussianBlurView.Deactivate();\n
+ * @endcode
  * @since_tizen 2.4
+ * @remarks This is an experimental feature and might not be supported in the next release.
+ * We do recommend not to use this class.
  */
 class DALI_IMPORT_API GaussianBlurView : public Control
 {
@@ -138,7 +142,9 @@ public:
   ~GaussianBlurView();
 
   /**
-   * @brief Downcast an Object handle to GaussianBlurView. If handle points to a GaussianBlurView the
+   * @brief Downcast a handle to GaussianBlurView handle.
+   *
+   * If handle points to a GaussianBlurView the
    * downcast produces valid handle. If not the returned handle is left uninitialized.
    * @since_tizen 2.4
    * @param[in] handle Handle to an object
@@ -184,9 +190,6 @@ public:
 
   /**
    * @brief Adds a child Actor to this Actor.
-   * NOTE! if the child already has a parent, it will be removed from old parent
-   * and reparented to this actor. This may change childs position, color, shader effect,
-   * scale etc as it now inherits them from this actor
    * @since_tizen 2.4
    * @param [in] child The child.
    * @pre This Actor (the parent) has been initialized.
@@ -195,11 +198,15 @@ public:
    * @pre The actor is not the Root actor
    * @post The child will be referenced by its parent. This means that the child will be kept alive,
    * even if the handle passed into this method is reset or destroyed.
+   * @note if the child already has a parent, it will be removed from old parent
+   * and reparented to this actor. This may change childs position, color, shader effect,
+   * scale etc as it now inherits them from this actor
    */
   void Add(Actor child);
 
   /**
    * @brief Removes a child Actor from this Actor.
+   *
    * If the actor was not a child of this actor, this is a no-op.
    * @since_tizen 2.4
    * @param [in] child The child.
@@ -215,7 +222,9 @@ public:
   void Activate();
 
   /**
-   * @brief Render the GaussianBlurView once. Must be called after you Add() it to the stage.
+   * @brief Render the GaussianBlurView once.
+   *
+   * Must be called after you Add() it to the stage.
    * Only works with a gaussian blur view created with blurUserImage = true.
    * Listen to the Finished signal to determine when the rendering has completed.
    * @since_tizen 2.4
@@ -229,7 +238,9 @@ public:
   void Deactivate();
 
   /**
-   * @brief Sets a custom image to be blurred and a render target to receive the blurred result. If this is called the children of the GaussianBlurObject will not be rendered blurred,
+   * @brief Sets a custom image to be blurred and a render target to receive the blurred result.
+   *
+   * If this is called the children of the GaussianBlurObject will not be rendered blurred,
    * instead the inputImage will get blurred.
    * To retrieve the blurred image the user can either pass a handle on a render target they own as the second parameter to SetUserImageAndOutputRenderTarget( ... ), or they
    * can pass NULL for this parameter and instead call GetBlurredRenderTarget() which will return a handle on a render target created internally to the GaussianBlurView object.
@@ -241,7 +252,9 @@ public:
   void SetUserImageAndOutputRenderTarget(Image inputImage, FrameBufferImage outputRenderTarget);
 
   /**
-   * @brief Get the index of the property that can be used to fade the blur in / out. This is the overall strength of the blur.
+   * @brief Get the index of the property that can be used to fade the blur in / out.
+   *
+   * This is the overall strength of the blur.
    * User can use this to animate the blur. A value of 0.0 is zero blur and 1.0 is full blur. Default is 1.0.
    * Note that if you set the blur to 0.0, the result will be no blur BUT the internal rendering will still be happening. If you wish to turn the blur off, you should remove
    * the GaussianBlurView object from the stage also.
@@ -252,6 +265,7 @@ public:
 
   /**
    * @brief Get the final blurred image.
+   *
    * Use can call this function to get the blurred result as an image, to use as they wish. It is not necessary to call this unless you specifically require it.
    * @since_tizen 2.4
    * @return A handle on the blurred image, contained in a render target.
index d6e8417..89861de 100644 (file)
@@ -51,7 +51,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices @since_tizen 2.4
   };
 
   /**
@@ -62,7 +62,7 @@ public:
   {
     enum
     {
-      RESOURCE_URL = PROPERTY_START_INDEX, ///< name "resource-url", @see SetImage(), type string
+      RESOURCE_URL = PROPERTY_START_INDEX, ///< type string @since_tizen 2.4 @see SetImage()
     };
   };
 
@@ -128,7 +128,7 @@ public:
   ImageView& operator=( const ImageView& imageView );
 
   /**
-   * @brief Downcast an Object handle to ImageView.
+   * @brief Downcast a handle to ImageView handle.
    *
    * If handle points to a ImageView the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -152,6 +152,7 @@ public:
    * @brief Gets the Image
    *
    * @since_tizen 2.4
+   * @remarks Calls to this method should be avoided as this may return an empty handle if the image has not been created yet.
    * @return The Image currently set to this ImageView
    */
   Image GetImage() const;
index 5f6af56..b67b744 100755 (executable)
@@ -42,11 +42,6 @@ class ScrollBar;
  * @brief ScrollBar is a UI component that can be linked to the scrollable objects
  * indicating the current scroll position of the scrollable object.
  *
- * Signals
- * | %Signal Name                     | Method                                     |
- * |----------------------------------|--------------------------------------------|
- * | pan-finished                     | @ref PanFinishedSignal()                   |
- * | scroll-position-interval-reached | @ref ScrollPositionIntervalReachedSignal() |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API ScrollBar : public Control
@@ -62,7 +57,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices @since_tizen 2.4
   };
 
   /**
@@ -73,19 +68,19 @@ public:
   {
     enum
     {
-      SCROLL_DIRECTION = PROPERTY_START_INDEX, ///< name "scroll-direction",         @see SetScrollDirection(),        type std::string
-      INDICATOR_HEIGHT_POLICY,                 ///< name "indicator-height-policy",  @see SetIndicatorHeightPolicy(),  type std::string
-      INDICATOR_FIXED_HEIGHT,                  ///< name "indicator-fixed-height",   @see SetIndicatorFixedHeight(),   type float
-      INDICATOR_SHOW_DURATION,                 ///< name "indicator-show-duration",  @see SetIndicatorShowDuration(),  type float
-      INDICATOR_HIDE_DURATION,                 ///< name "indicator-hide-duration",  @see SetIndicatorHideDuration(),  type float
-      SCROLL_POSITION_INTERVALS                ///< name "scroll-position-intervals",@see SetScrollPositionIntervals() type Property::Array
+      SCROLL_DIRECTION = PROPERTY_START_INDEX, ///< type std::string @since_tizen 2.4 @see SetScrollDirection()
+      INDICATOR_HEIGHT_POLICY,                 ///< type std::string @since_tizen 2.4 @see SetIndicatorHeightPolicy()
+      INDICATOR_FIXED_HEIGHT,                  ///< type float @since_tizen 2.4       @see SetIndicatorFixedHeight()
+      INDICATOR_SHOW_DURATION,                 ///< type float @since_tizen 2.4       @see SetIndicatorShowDuration()
+      INDICATOR_HIDE_DURATION,                 ///< type float @since_tizen 2.4       @see SetIndicatorHideDuration()
+      SCROLL_POSITION_INTERVALS                ///< type Property::Array @since_tizen 2.4 @see SetScrollPositionIntervals()
     };
   };
 
   // Signals
 
-  typedef Signal< void () > PanFinishedSignalType;
-  typedef Signal< void ( float ) > ScrollPositionIntervalReachedSignalType;
+  typedef Signal< void () > PanFinishedSignalType;  ///< Pan finished signal type @since_tizen 2.4
+  typedef Signal< void ( float ) > ScrollPositionIntervalReachedSignalType; ///< Scroll position interval reached signal type @since_tizen 2.4
 
 public:
 
@@ -95,8 +90,8 @@ public:
    */
   enum Direction
   {
-    Vertical = 0,   ///< Scroll in the vertical direction
-    Horizontal      ///< Scroll in the horizontal direction
+    Vertical = 0,   ///< Scroll in the vertical direction @since_tizen 2.4
+    Horizontal      ///< Scroll in the horizontal direction @since_tizen 2.4
   };
 
   /**
@@ -105,8 +100,8 @@ public:
    */
   enum IndicatorHeightPolicy
   {
-    Variable = 0,  ///< Variable height changed dynamically according to the length of scroll content
-    Fixed          ///< Fixed height regardless of the length of scroll content
+    Variable = 0,  ///< Variable height changed dynamically according to the length of scroll content @since_tizen 2.4
+    Fixed          ///< Fixed height regardless of the length of scroll content @since_tizen 2.4
   };
 
   /**
@@ -145,7 +140,9 @@ public:
   static ScrollBar New(Direction direction = Vertical);
 
   /**
-   * @brief Downcast an Object handle to ScrollBar. If handle points to a ScrollBar the
+   * @brief Downcast a handle to ScrollBar handle.
+   *
+   * If handle points to a ScrollBar the
    * downcast produces valid handle. If not the returned handle is left uninitialized.
    * @since_tizen 2.4
    * @param[in] handle Handle to an object
@@ -247,6 +244,7 @@ public:
 
   /**
    * @brief Sets the fixed height of scroll indicator.
+   *
    * Normally the height of scroll indicator is changed dynamically according to the length of scroll content.
    * However, when the height policy of scroll indicator is set to be fixed, the height will keep fixed
    * regardless of the length of scroll content.
@@ -315,6 +313,7 @@ public: // Signals
 
   /**
    * @brief Signal emitted when panning is finished on the scroll indicator.
+   *
    * Signal only emitted when the source of the scroll position properties are set.
    *
    * A callback of the following type may be connected:
@@ -330,6 +329,7 @@ public: // Signals
   /**
    * @brief Signal emitted when the current scroll position of the scrollable content
    * goes above or below the values specified by SCROLL_POSITION_INTERVALS property.
+   *
    * Signal only emitted when the source of the scroll position properties are set.
    *
    * A callback of the following type may be connected:
index 936c806..93bd192 100644 (file)
@@ -31,15 +31,19 @@ namespace Toolkit
  * @{
  */
 
+/**
+ * @brief Default item layout mode.
+ * @since_tizen 2.4
+ */
 namespace DefaultItemLayout
 {
 
 enum Type
 {
-  DEPTH,     ///< Items arranged in a grid, scrolling along the Z-Axis.
-  GRID,      ///< Items arranged in a grid, scrolling along the Y-Axis.
-  LIST,      ///< One item per line, scrolling along the Y-Axis.
-  SPIRAL     ///< Items arranged in a spiral, centered around the Y-Axis.
+  DEPTH,     ///< Items arranged in a grid, scrolling along the Z-Axis. @since_tizen 2.4
+  GRID,      ///< Items arranged in a grid, scrolling along the Y-Axis. @since_tizen 2.4
+  LIST,      ///< One item per line, scrolling along the Y-Axis. @since_tizen 2.4
+  SPIRAL     ///< Items arranged in a spiral, centered around the Y-Axis. @since_tizen 2.4
 };
 
 /**
index 041934f..6f59ae3 100644 (file)
@@ -33,6 +33,7 @@ namespace Toolkit
 
 /**
  * @brief ItemFactory is for providing actors to ItemView.
+ *
  * Each actor is identified by a unique ID, and has a linear order from 0 to GetNumberOfItems()-1.
  * @since_tizen 2.4
  */
index 78bc646..c93a61d 100644 (file)
@@ -37,7 +37,7 @@ namespace Toolkit
 
 class ItemLayout;
 
-typedef IntrusivePtr<ItemLayout> ItemLayoutPtr; ///< Pointer to a Dali::Toolkit::ItemLayout object
+typedef IntrusivePtr<ItemLayout> ItemLayoutPtr; ///< Pointer to ItemLayout object @since_tizen 2.4
 
 /**
  * @brief A support class for managing ranges of items.
index 0f79dc2..f67ff54 100644 (file)
@@ -33,17 +33,17 @@ namespace Toolkit
  * @{
  */
 
-typedef unsigned int ItemId; ///< Unique identity for each item in the view.
+typedef unsigned int ItemId; ///< Unique identity for each item in the view. @since_tizen 2.4
 
-typedef std::vector<ItemId> ItemIdContainer;
-typedef ItemIdContainer::iterator ItemIdIter;
-typedef ItemIdContainer::const_iterator ConstItemIdIter;
+typedef std::vector<ItemId> ItemIdContainer;  ///< Item id container type @since_tizen 2.4
+typedef ItemIdContainer::iterator ItemIdIter; ///< Item id iterator type @since_tizen 2.4
+typedef ItemIdContainer::const_iterator ConstItemIdIter;  ///< Item id const iterator type @since_tizen 2.4
 
-typedef std::pair<ItemId, Actor> Item;
+typedef std::pair<ItemId, Actor> Item;  ///< Item type @since_tizen 2.4
 
-typedef std::vector<Item> ItemContainer;
-typedef ItemContainer::iterator ItemIter;
-typedef ItemContainer::const_iterator ConstItemIter;
+typedef std::vector<Item> ItemContainer;  ///< Item container type @since_tizen 2.4
+typedef ItemContainer::iterator ItemIter; ///< Item iterator type @since_tizen 2.4
+typedef ItemContainer::const_iterator ConstItemIter;  ///< Item const iterator type @since_tizen 2.4
 
 class ItemView;
 class ItemLayout;
index beabda5..5f5df80 100644 (file)
@@ -43,7 +43,7 @@ class ItemFactory;
 class ItemLayout;
 struct ItemRange;
 
-typedef IntrusivePtr<ItemLayout> ItemLayoutPtr;
+typedef IntrusivePtr<ItemLayout> ItemLayoutPtr; ///< Pointer to ItemLayout object @since_tizen 2.4
 
 /**
  * @brief ItemView is a scrollable layout container.
@@ -51,10 +51,6 @@ typedef IntrusivePtr<ItemLayout> ItemLayoutPtr;
  * Multiple ItemLayouts may be provided, to determine the logical position of each item a layout.
  * Actors are provided from an external ItemFactory, to display the currently visible items.
  *
- * Signals
- * | %Signal Name                     | Method                                     |
- * |----------------------------------|--------------------------------------------|
- * | layout-activated                 | @ref LayoutActivatedSignal()               |
  * @since_tizen 2.4
  */
 
@@ -62,10 +58,14 @@ class DALI_IMPORT_API ItemView : public Scrollable
 {
 public:
 
+  /**
+   * @brief The start and end property ranges for this control.
+   * @since_tizen 2.4
+   */
   enum PropertyRange
   {
     ANIMATABLE_PROPERTY_START_INDEX = Toolkit::Scrollable::ANIMATABLE_PROPERTY_END_INDEX + 1,
-    ANIMATABLE_PROPERTY_END_INDEX   = ANIMATABLE_PROPERTY_START_INDEX + 1000                   ///< Reserve animatable property indices
+    ANIMATABLE_PROPERTY_END_INDEX   = ANIMATABLE_PROPERTY_START_INDEX + 1000                   ///< Reserve animatable property indices @since_tizen 2.4
   };
 
   /**
@@ -76,18 +76,18 @@ public:
   {
     enum
     {
-      LAYOUT_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "layout-position",       type float
-      SCROLL_SPEED,                                      ///< Property, name "scroll-speed",          type float
-      OVERSHOOT,                                         ///< Property, name "overshoot",             type float
-      SCROLL_DIRECTION,                                  ///< Property, name "scroll-direction",      type Vector2
-      LAYOUT_ORIENTATION,                                ///< Property, name "layout-orientation",    type integer
-      SCROLL_CONTENT_SIZE                                ///< Property, name "scroll-content-size",   type float
+      LAYOUT_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "layout-position",       type float @since_tizen 2.4
+      SCROLL_SPEED,                                      ///< Property, name "scroll-speed",          type float @since_tizen 2.4
+      OVERSHOOT,                                         ///< Property, name "overshoot",             type float @since_tizen 2.4
+      SCROLL_DIRECTION,                                  ///< Property, name "scroll-direction",      type Vector2 @since_tizen 2.4
+      LAYOUT_ORIENTATION,                                ///< Property, name "layout-orientation",    type integer @since_tizen 2.4
+      SCROLL_CONTENT_SIZE                                ///< Property, name "scroll-content-size",   type float @since_tizen 2.4
     };
   };
 
   // Signals
 
-  typedef Signal< void () > LayoutActivatedSignalType;
+  typedef Signal< void () > LayoutActivatedSignalType;  ///< Layout activated signal type @since_tizen 2.4
 
 public:
 
@@ -129,7 +129,7 @@ public:
   static ItemView New(ItemFactory& factory);
 
   /**
-   * @brief Downcast an Object handle to ItemView.
+   * @brief Downcast a handle to ItemView handle.
    *
    * If handle points to a ItemView the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -319,7 +319,9 @@ public:
   void ScrollToItem(ItemId itemId, float durationSeconds);
 
   /**
-   * @brief Set the interval between refreshes. When the layout-position of items is changed by this interval,
+   * @brief Set the interval between refreshes.
+   *
+   * When the layout-position of items is changed by this interval,
    * new items are requested from ItemFactory.
    *
    * @since_tizen 2.4
index 24cecb5..8199a8f 100644 (file)
@@ -41,13 +41,13 @@ class ScrollViewPagePathEffect;
 
 /**
  * @brief ScrollView Page Path Effect.
+ *
  * This effect causes Actors to follow a given path. The opacity of the actor will be 0.0 at
  * the beginning of the path and will go to 1.0 as it is approximating to half of the path to return
  * to 0.0 at the end of the path
  *
  *
  * ScrollView
- * |
  * Page (1..n)
  *
  * You should ensure ScrollView's default constraints have been removed,
@@ -86,7 +86,9 @@ public:
   ScrollViewPagePathEffect();
 
   /**
-   * @brief Downcast an Object handle to ScrollViewPagePathEffect. If handle points to a ScrollViewPagePathEffect the
+   * @brief Downcast a handle to ScrollViewPagePathEffect handle.
+   *
+   * If handle points to a ScrollViewPagePathEffect the
    * downcast produces valid handle. If not the returned handle is left uninitialized.
    * @since_tizen 2.4
    * @param[in] handle Handle to an object
index 14b1d21..fde83ee 100644 (file)
@@ -45,9 +45,9 @@ class ScrollView;
  */
 enum ClampState
 {
-  NotClamped,   ///< The quantity isn't clamped
-  ClampedToMin, ///< The quantity is clamped to the min value
-  ClampedToMax  ///< The quantity is clamped to the max value
+  NotClamped,   ///< The quantity isn't clamped @since_tizen 2.4
+  ClampedToMin, ///< The quantity is clamped to the min value @since_tizen 2.4
+  ClampedToMax  ///< The quantity is clamped to the max value @since_tizen 2.4
 };
 
 /**
@@ -66,8 +66,8 @@ struct ClampState2D
  */
 enum SnapType
 {
-  Snap,  ///< Snap
-  Flick  ///< Flick
+  Snap,  ///< Snap @since_tizen 2.4
+  Flick  ///< Flick @since_tizen 2.4
 };
 
 /**
@@ -76,9 +76,9 @@ enum SnapType
  */
 enum DirectionBias
 {
-  DirectionBiasLeft  = -1,  ///< Bias scroll snap to Left
-  DirectionBiasNone  =  0,  ///< Don't bias scroll snap
-  DirectionBiasRight =  1   ///< Bias scroll snap to Right
+  DirectionBiasLeft  = -1,  ///< Bias scroll snap to Left @since_tizen 2.4
+  DirectionBiasNone  =  0,  ///< Don't bias scroll snap @since_tizen 2.4
+  DirectionBiasRight =  1   ///< Bias scroll snap to Right @since_tizen 2.4
 };
 
 /**
@@ -160,8 +160,8 @@ public:
   /// @brief The type of the ruler
   /// @since_tizen 2.4
   enum RulerType {
-    Fixed,  ///< A fixed ruler
-    Free    ///< A free ruler
+    Fixed,  ///< A fixed ruler @since_tizen 2.4
+    Free    ///< A free ruler @since_tizen 2.4
   };
 
 public:
@@ -364,7 +364,7 @@ protected:
 
 };
 
-typedef IntrusivePtr<Ruler> RulerPtr; ///< Pointer to Dali::Toolkit::Ruler object
+typedef IntrusivePtr<Ruler> RulerPtr; ///< Pointer to Ruler object @since_tizen 2.4
 
 /**
  * @brief Concrete implementation of Ruler that has no snapping and has one single page.
@@ -446,10 +446,6 @@ class ScrollView;
  * @brief ScrollView contains actors that can be scrolled manually (via touch)
  * or automatically.
  *
- * Signals
- * | %Signal Name      | Method                     |
- * |-------------------|----------------------------|
- * | snap-started      | @ref SnapStartedSignal()   |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API ScrollView : public Scrollable
@@ -486,7 +482,7 @@ public:
   enum PropertyRange
   {
     ANIMATABLE_PROPERTY_START_INDEX = Toolkit::Scrollable::ANIMATABLE_PROPERTY_END_INDEX + 1,
-    ANIMATABLE_PROPERTY_END_INDEX   = ANIMATABLE_PROPERTY_START_INDEX + 1000                   ///< Reserve animatable property indices
+    ANIMATABLE_PROPERTY_END_INDEX   = ANIMATABLE_PROPERTY_START_INDEX + 1000                   ///< Reserve animatable property indices @since_tizen 2.4
   };
 
   /**
@@ -497,33 +493,33 @@ public:
   {
     enum
     {
-      SCROLL_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "scroll-position",           type Vector2
-      SCROLL_PRE_POSITION,                               ///< Property, name "scroll-pre-position",       type Vector2
-      SCROLL_PRE_POSITION_X,                             ///< Property, name "scroll-pre-position-x",     type float
-      SCROLL_PRE_POSITION_Y,                             ///< Property, name "scroll-pre-position-y",     type float
-      SCROLL_PRE_POSITION_MAX,                           ///< Property, name "scroll-pre-position-max",   type Vector2
-      SCROLL_PRE_POSITION_MAX_X,                         ///< Property, name "scroll-pre-position-max-x", type float
-      SCROLL_PRE_POSITION_MAX_Y,                         ///< Property, name "scroll-pre-position-max-y", type float
-      OVERSHOOT_X,                                       ///< Property, name "overshoot-x",               type float
-      OVERSHOOT_Y,                                       ///< Property, name "overshoot-y",               type float
-      SCROLL_FINAL,                                      ///< Property, name "scroll-final",              type Vector2
-      SCROLL_FINAL_X,                                    ///< Property, name "scroll-final-x",            type float
-      SCROLL_FINAL_Y,                                    ///< Property, name "scroll-final-y",            type float
-      WRAP,                                              ///< Property, name "wrap",                      type bool
-      PANNING,                                           ///< Property, name "panning",                   type bool
-      SCROLLING,                                         ///< Property, name "scrolling",                 type bool
-      SCROLL_DOMAIN_SIZE,                                ///< Property, name "scroll-domain-size"         type Vector2
-      SCROLL_DOMAIN_SIZE_X,                              ///< Property, name "scroll-domain-size-x"       type float
-      SCROLL_DOMAIN_SIZE_Y,                              ///< Property, name "scroll-domain-size-y"       type float
-      SCROLL_DOMAIN_OFFSET,                              ///< Property, name "scroll-domain-offset"       type Vector2
-      SCROLL_POSITION_DELTA,                             ///< Property, name "scroll-position-delta"      type Vector2
-      START_PAGE_POSITION                                ///< Property, name "start-page-position"        type Vector3
+      SCROLL_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "scroll-position",           type Vector2 @since_tizen 2.4
+      SCROLL_PRE_POSITION,                               ///< Property, name "scroll-pre-position",       type Vector2 @since_tizen 2.4
+      SCROLL_PRE_POSITION_X,                             ///< Property, name "scroll-pre-position-x",     type float @since_tizen 2.4
+      SCROLL_PRE_POSITION_Y,                             ///< Property, name "scroll-pre-position-y",     type float @since_tizen 2.4
+      SCROLL_PRE_POSITION_MAX,                           ///< Property, name "scroll-pre-position-max",   type Vector2 @since_tizen 2.4
+      SCROLL_PRE_POSITION_MAX_X,                         ///< Property, name "scroll-pre-position-max-x", type float @since_tizen 2.4
+      SCROLL_PRE_POSITION_MAX_Y,                         ///< Property, name "scroll-pre-position-max-y", type float @since_tizen 2.4
+      OVERSHOOT_X,                                       ///< Property, name "overshoot-x",               type float @since_tizen 2.4
+      OVERSHOOT_Y,                                       ///< Property, name "overshoot-y",               type float @since_tizen 2.4
+      SCROLL_FINAL,                                      ///< Property, name "scroll-final",              type Vector2 @since_tizen 2.4
+      SCROLL_FINAL_X,                                    ///< Property, name "scroll-final-x",            type float @since_tizen 2.4
+      SCROLL_FINAL_Y,                                    ///< Property, name "scroll-final-y",            type float @since_tizen 2.4
+      WRAP,                                              ///< Property, name "wrap",                      type bool @since_tizen 2.4
+      PANNING,                                           ///< Property, name "panning",                   type bool @since_tizen 2.4
+      SCROLLING,                                         ///< Property, name "scrolling",                 type bool @since_tizen 2.4
+      SCROLL_DOMAIN_SIZE,                                ///< Property, name "scroll-domain-size"         type Vector2 @since_tizen 2.4
+      SCROLL_DOMAIN_SIZE_X,                              ///< Property, name "scroll-domain-size-x"       type float @since_tizen 2.4
+      SCROLL_DOMAIN_SIZE_Y,                              ///< Property, name "scroll-domain-size-y"       type float @since_tizen 2.4
+      SCROLL_DOMAIN_OFFSET,                              ///< Property, name "scroll-domain-offset"       type Vector2 @since_tizen 2.4
+      SCROLL_POSITION_DELTA,                             ///< Property, name "scroll-position-delta"      type Vector2 @since_tizen 2.4
+      START_PAGE_POSITION                                ///< Property, name "start-page-position"        type Vector3 @since_tizen 2.4
     };
   };
 
   // Typedefs
 
-  typedef Signal< void ( const SnapEvent& ) > SnapStartedSignalType; ///< SnapStarted signal type
+  typedef Signal< void ( const SnapEvent& ) > SnapStartedSignalType; ///< SnapStarted signal type @since_tizen 2.4
 
 public:
 
@@ -570,7 +566,7 @@ public:
   static ScrollView New();
 
   /**
-   * @brief Downcast an Object handle to ScrollView.
+   * @brief Downcast a handle to ScrollView handle.
    *
    * If handle points to a ScrollView the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -800,11 +796,11 @@ public:
    * By default this is 0.36 (0.36:1) which means angles less than 20
    * degrees to an axis will lock to that axis.
    *
-   * @note: Specifying a value of 1.0 (the maximum value accepted) indicates that
-   * all panning gestures will auto-lock. Either to the horizontal or vertical axis.
-   *
    * @since_tizen 2.4
    * @param[in] gradient A value between 0.0 and 1.0 (auto-lock for all angles)
+   * @note Specifying a value of 1.0 (the maximum value accepted) indicates that
+   * all panning gestures will auto-lock. Either to the horizontal or vertical axis.
+   *
    */
   void SetAxisAutoLockGradient(float gradient);
 
@@ -934,7 +930,7 @@ public:
    * @since_tizen 2.4
    * @param[in] step The step of scroll distance(pixel) in X and Y axes.
    *
-   * @note: If snap points are defined in the rulers, it will always
+   * @note If snap points are defined in the rulers, it will always
    * scroll to the next snap point towards the scroll direction while
    * receiving the wheel events.
    *
@@ -955,10 +951,10 @@ public:
    * a grid fashion, increasing from left to right until the end of
    * the X-domain.
    *
-   * @note: Pages start from 0 as the first page, not 1.
+   * @since_tizen 2.4
+   * @note Pages start from 0 as the first page, not 1.
    *
    * @returns The Current page.
-   * @since_tizen 2.4
    */
   unsigned int GetCurrentPage() const;
 
index 1c1fdbb..5eb1d4c 100644 (file)
@@ -42,12 +42,6 @@ class Scrollable;
  *
  * Scrollables such as ScrollView and ItemView can be derived from this class.
  *
- * Signals
- * | %Signal Name      | Method                       |
- * |-------------------|------------------------------|
- * | scroll-started    | @ref ScrollStartedSignal()   |
- * | scroll-completed  | @ref ScrollUpdatedSignal()   |
- * | scroll-updated    | @ref ScrollCompletedSignal() |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API Scrollable : public Control
@@ -61,10 +55,10 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000,             ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000,             ///< Reserve property indices @since_tizen 2.4
 
     ANIMATABLE_PROPERTY_START_INDEX = ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX,
-    ANIMATABLE_PROPERTY_END_INDEX =   ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX + 1000              ///< Reserve animatable property indices
+    ANIMATABLE_PROPERTY_END_INDEX =   ANIMATABLE_PROPERTY_REGISTRATION_START_INDEX + 1000              ///< Reserve animatable property indices @since_tizen 2.4
   };
 
   /**
@@ -76,27 +70,27 @@ public:
     enum
     {
       // Event side properties
-      OVERSHOOT_EFFECT_COLOR = PROPERTY_START_INDEX, ///< Property, name "overshoot-effect-color",    @see SetOvershootEffectColor(),    type Vector4
-      OVERSHOOT_ANIMATION_SPEED,                     ///< Property, name "overshoot-animation-speed", @see SetOvershootAnimationSpeed(), type float
+      OVERSHOOT_EFFECT_COLOR = PROPERTY_START_INDEX, ///< Property, name "overshoot-effect-color",    @see SetOvershootEffectColor(),    type Vector4 @since_tizen 2.4
+      OVERSHOOT_ANIMATION_SPEED,                     ///< Property, name "overshoot-animation-speed", @see SetOvershootAnimationSpeed(), type float @since_tizen 2.4
 
       // Animatable properties
-      SCROLL_RELATIVE_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "scroll-relative-position", type Vector2
-      SCROLL_POSITION_MIN,                                        ///< Property, name "scroll-position-min",      type Vector2
-      SCROLL_POSITION_MIN_X,                                      ///< Property, name "scroll-position-min-x",    type float
-      SCROLL_POSITION_MIN_Y,                                      ///< Property, name "scroll-position-min-y",    type float
-      SCROLL_POSITION_MAX,                                        ///< Property, name "scroll-position-max",      type Vector2
-      SCROLL_POSITION_MAX_X,                                      ///< Property, name "scroll-position-max-x",    type float
-      SCROLL_POSITION_MAX_Y,                                      ///< Property, name "scroll-position-max-y",    type float
-      CAN_SCROLL_VERTICAL,                                        ///< Property, name "can-scroll-vertical",      type bool
-      CAN_SCROLL_HORIZONTAL                                       ///< Property, name "can-scroll-horizontal",    type bool
+      SCROLL_RELATIVE_POSITION = ANIMATABLE_PROPERTY_START_INDEX, ///< Property, name "scroll-relative-position", type Vector2 @since_tizen 2.4
+      SCROLL_POSITION_MIN,                                        ///< Property, name "scroll-position-min",      type Vector2 @since_tizen 2.4
+      SCROLL_POSITION_MIN_X,                                      ///< Property, name "scroll-position-min-x",    type float @since_tizen 2.4
+      SCROLL_POSITION_MIN_Y,                                      ///< Property, name "scroll-position-min-y",    type float @since_tizen 2.4
+      SCROLL_POSITION_MAX,                                        ///< Property, name "scroll-position-max",      type Vector2 @since_tizen 2.4
+      SCROLL_POSITION_MAX_X,                                      ///< Property, name "scroll-position-max-x",    type float @since_tizen 2.4
+      SCROLL_POSITION_MAX_Y,                                      ///< Property, name "scroll-position-max-y",    type float @since_tizen 2.4
+      CAN_SCROLL_VERTICAL,                                        ///< Property, name "can-scroll-vertical",      type bool @since_tizen 2.4
+      CAN_SCROLL_HORIZONTAL                                       ///< Property, name "can-scroll-horizontal",    type bool @since_tizen 2.4
     };
   };
 
   // Typedefs
 
-  typedef Signal< void ( const Vector2& ) > ScrollStartedSignalType;   ///< ScrollStarted signal type
-  typedef Signal< void ( const Vector2& ) > ScrollCompletedSignalType; ///< ScrollCompleted signal type
-  typedef Signal< void ( const Vector2& ) > ScrollUpdatedSignalType;   ///< Scroll updated signal type
+  typedef Signal< void ( const Vector2& ) > ScrollStartedSignalType;   ///< ScrollStarted signal type @since_tizen 2.4
+  typedef Signal< void ( const Vector2& ) > ScrollCompletedSignalType; ///< ScrollCompleted signal type @since_tizen 2.4
+  typedef Signal< void ( const Vector2& ) > ScrollUpdatedSignalType;   ///< Scroll updated signal type @since_tizen 2.4
 
 public:
 
@@ -135,7 +129,7 @@ public:
   ~Scrollable();
 
   /**
-   * @brief Downcast an Object handle to Scrollable.
+   * @brief Downcast a handle to Scrollable handle.
    *
    * If handle points to a Scrollable the downcast produces valid
    * handle. If not the returned handle is left uninitialized.
@@ -179,6 +173,7 @@ public:
 
   /**
    * @brief Set the speed of overshoot animation in pixels per second.
+   *
    * When the speed is not greater than 0, the overshoot is set instantly with no animation.
    * @since_tizen 2.4
    * @param[in] pixelsPerSecond The speed of the overshoot animation.
index 30bae18..0829117 100644 (file)
@@ -55,13 +55,6 @@ class TableView;
  *
  * These properties are registered dynamically to the child and is non-animatable.
  *
- * | %Property Name            | Type        |
- * |---------------------------|-------------|
- * | cell-index                | Vector2     |
- * | row-span                  | float       |
- * | column-span               | float       |
- * | cell-horizontal-alignment | string      |
- * | cell-vertical-alignment   | string      |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API TableView : public Control
@@ -75,7 +68,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices @since_tizen 2.4
   };
 
   /**
@@ -108,11 +101,11 @@ public:
   {
     enum
     {
-      ROWS = PROPERTY_START_INDEX, ///< name "rows",           type unsigned int
-      COLUMNS,                     ///< name "columns",        type unsigned int
-      CELL_PADDING,                ///< name "cell-padding",   type Vector2
-      LAYOUT_ROWS,                 ///< name "layout-rows",    type Map
-      LAYOUT_COLUMNS,              ///< name "layout-columns", type Map
+      ROWS = PROPERTY_START_INDEX, ///< type unsigned int @since_tizen 2.4
+      COLUMNS,                     ///< type unsigned int @since_tizen 2.4
+      CELL_PADDING,                ///< type Vector2 @since_tizen 2.4
+      LAYOUT_ROWS,                 ///< type Map @since_tizen 2.4
+      LAYOUT_COLUMNS,              ///< type Map @since_tizen 2.4
     };
   };
 
@@ -122,10 +115,10 @@ public:
    */
   enum LayoutPolicy
   {
-    FIXED,      ///< Fixed with the given value.
-    RELATIVE,   ///< Calculated as percentage of the remainder after subtracting Padding and Fixed height/width
-    FILL,       ///< Default policy, get the remainder of the 100% (after subtracting Fixed, Fit and Relative height/ width) divided evenly between 'fill' rows/columns
-    FIT         ///< Fit around its children.
+    FIXED,      ///< Fixed with the given value. @since_tizen 2.4
+    RELATIVE,   ///< Calculated as percentage of the remainder after subtracting Padding and Fixed height/width @since_tizen 2.4
+    FILL,       ///< Default policy, get the remainder of the 100% (after subtracting Fixed, Fit and Relative height/ width) divided evenly between 'fill' rows/columns @since_tizen 2.4
+    FIT         ///< Fit around its children. @since_tizen 2.4
   };
 
   /**
@@ -188,7 +181,9 @@ public:
   static TableView New( unsigned int initialRows, unsigned int initialColumns );
 
   /**
-   * @brief Downcast an Object handle to TableView. If handle points to a TableView the
+   * @brief Downcast a handle to TableView handle.
+   *
+   * If handle points to a TableView the
    * downcast produces valid handle. If not the returned handle is left uninitialized.
    * @since_tizen 2.4
    * @param[in] handle Handle to an object
@@ -209,20 +204,20 @@ public:
 
   /**
    * @brief Returns a child from the given layout position
-   * Note! if there is no child in this position this method returns an uninitialized
-   * Actor handle
    * @since_tizen 2.4
    * @param[in] position in the table
    * @return child that was in the cell or an uninitialized handle
+   * @note if there is no child in this position this method returns an uninitialized
+   * Actor handle
    */
   Actor GetChildAt( CellPosition position );
 
   /**
    * @brief Removes a child from the given layout position
-   * Note! if there is no child in this position this method does nothing
    * @since_tizen 2.4
    * @param[in] position for the child to remove
    * @return child that was removed or an uninitialized handle
+   * @note if there is no child in this position this method does nothing
    */
   Actor RemoveChildAt( CellPosition position );
 
@@ -282,24 +277,28 @@ public:
   void DeleteColumn( unsigned int columnIndex, std::vector<Actor>& removed );
 
   /**
-   * @brief Resize the TableView. Note! if the new size is smaller than old,
-   * superfluous actors get removed. If you want to relayout removed children,
-   * use the variant that returns the removed Actors and reinsert them into the table
-   * If an actor spans to a removed row or column it gets removed from the table
+   * @brief Resize the TableView.
+   *
    * @since_tizen 2.4
    * @param[in] rows for the table
    * @param[in] columns for the table
+   * @note if the new size is smaller than old,
+   * superfluous actors get removed. If you want to relayout removed children,
+   * use the variant that returns the removed Actors and reinsert them into the table
+   * If an actor spans to a removed row or column it gets removed from the table
    */
   void Resize( unsigned int rows, unsigned int columns );
 
   /**
-   * @brief Resize the TableView. Note! if the new size is smaller than old,
-   * superfluous actors get removed.
-   * If an actor spans to a removed row or column it gets removed from the table
+   * @brief Resize the TableView.
+   *
    * @since_tizen 2.4
    * @param[in] rows for the table
    * @param[in] columns for the table
    * @param[out] removed actor handles
+   * @note if the new size is smaller than old,
+   * superfluous actors get removed.
+   * If an actor spans to a removed row or column it gets removed from the table
    */
   void Resize( unsigned int rows, unsigned int columns, std::vector<Actor>& removed );
 
@@ -363,10 +362,10 @@ public:
 
   /**
    * @brief Gets a row's fixed height.
-   * Note! The returned value is valid if it has been set before.
    * @since_tizen 2.4
    * @return height in world coordinate units.
    * @pre The row rowIndex must exist.
+   * @note The returned value is valid if it has been set before.
    */
   float GetFixedHeight( unsigned int rowIndex ) const;
 
@@ -383,10 +382,10 @@ public:
 
   /**
    * @brief Gets a row's relative height.
-   * Note! The returned value is valid if it has been set before.
    * @since_tizen 2.4
    * @return height in percentage units, between 0.0f and 1.0f.
    * @pre The row rowIndex must exist.
+   * @note The returned value is valid if it has been set before.
    */
   float GetRelativeHeight( unsigned int rowIndex ) const;
 
@@ -402,10 +401,10 @@ public:
 
   /**
    * @brief Gets a column's fixed width.
-   * Note! The returned value is valid if it has been set before.
    * @since_tizen 2.4
    * @return width in world coordinate units.
    * @pre The column columnIndex must exist.
+   * @note The returned value is valid if it has been set before.
    */
   float GetFixedWidth( unsigned int columnIndex ) const;
 
@@ -422,10 +421,10 @@ public:
 
   /**
    * @brief Gets a column's relative width.
-   * Note! The returned value is valid if it has been set before.
    * @since_tizen 2.4
    * @return width in percentage units, between 0.0f and 1.0f.
    * @pre The column columnIndex must exist.
+   * @note The returned value is valid if it has been set before.
    */
   float GetRelativeWidth( unsigned int columnIndex ) const;
 
index a63a106..c7e9c16 100644 (file)
@@ -39,12 +39,6 @@ class TextField;
 /**
  * @brief A control which provides a single-line editable text field.
  *
- *  * Signals
- * | %Signal Name           | Method                                              |
- * |------------------------|-----------------------------------------------------|
- * | text-changed           | @ref TextChangedSignal()                            |
- * | max-length-reached     | @ref MaxLengthReachedSignal()                       |
- *
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API TextField : public Control
@@ -58,7 +52,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices @since_tizen 2.4
   };
 
   /**
@@ -69,40 +63,40 @@ public:
   {
     enum
     {
-      RENDERING_BACKEND = PROPERTY_START_INDEX, ///< name "rendering-backend",                   The type or rendering e.g. bitmap-based,                                  type INT
-      TEXT,                                     ///< name "text",                                The text to display in UTF-8 format,                                      type STRING
-      PLACEHOLDER_TEXT,                         ///< name "placeholder-text",                    The text to display when the TextField is empty and inactive,             type STRING
-      PLACEHOLDER_TEXT_FOCUSED,                 ///< name "placeholder-text-focused",            The text to display when the TextField is empty with key-input focus,     type STRING
-      FONT_FAMILY,                              ///< name "font-family",                         The requested font family,                                                type STRING
-      FONT_STYLE,                               ///< name "font-style",                          The requested font style,                                                 type STRING
-      POINT_SIZE,                               ///< name "point-size",                          The size of font in points,                                               type FLOAT
-      MAX_LENGTH,                               ///< name "max-length"                           The maximum number of characters that can be inserted,                    type INTEGER
-      EXCEED_POLICY,                            ///< name "exceed-policy"                        Specifies how the text is truncated when it does not fit,                 type INTEGER
-      HORIZONTAL_ALIGNMENT,                     ///< name "horizontal-alignment",                The line horizontal alignment,                                            type STRING,  values "BEGIN", "CENTER", "END"
-      VERTICAL_ALIGNMENT,                       ///< name "vertical-alignment",                  The line vertical alignment,                                              type STRING,  values   "TOP",   "CENTER",   "BOTTOM"
-      TEXT_COLOR,                               ///< name "text-color",                          The text color,                                                           type VECTOR4
-      PLACEHOLDER_TEXT_COLOR,                   ///< name "placeholder-text-color",              The placeholder-text color,                                               type VECTOR4
-      SHADOW_OFFSET,                            ///< name "shadow-offset",                       The drop shadow offset 0 indicates no shadow,                             type VECTOR2
-      SHADOW_COLOR,                             ///< name "shadow-color",                        The color of a drop shadow,                                               type VECTOR4
-      PRIMARY_CURSOR_COLOR,                     ///< name "primary-cursor-color",                The color to apply to the primary cursor,                                 type VECTOR4
-      SECONDARY_CURSOR_COLOR,                   ///< name "secondary-cursor-color",              The color to apply to the secondary cursor,                               type VECTOR4
-      ENABLE_CURSOR_BLINK,                      ///< name "enable-cursor-blink",                 Whether the cursor should blink or not,                                   type BOOLEAN
-      CURSOR_BLINK_INTERVAL,                    ///< name "cursor-blink-interval",               The time interval in seconds between cursor on/off states,                type FLOAT
-      CURSOR_BLINK_DURATION,                    ///< name "cursor-blink-duration",               The cursor will stop blinking after this number of seconds (if non-zero), type FLOAT
-      CURSOR_WIDTH,                             ///< name "cursor-width",                        The cursor width,                                                         type INTEGER
-      GRAB_HANDLE_IMAGE,                        ///< name "grab-handle-image",                   The image to display for the grab handle,                                 type STRING
-      GRAB_HANDLE_PRESSED_IMAGE,                ///< name "grab-handle-pressed-image",           The image to display when the grab handle is pressed,                     type STRING
-      SCROLL_THRESHOLD,                         ///< name "scroll-threshold"                     Scrolling will occur if the cursor is this close to the control border,   type FLOAT
-      SCROLL_SPEED,                             ///< name "scroll-speed"                         The scroll speed in pixels per second,                                    type FLOAT
-      SELECTION_HANDLE_IMAGE_LEFT,              ///< name "selection-handle-image-left",         The image to display for the left selection handle,                       type MAP
-      SELECTION_HANDLE_IMAGE_RIGHT,             ///< name "selection-handle-image-right",        The image to display for the right selection handle,                      type MAP
-      SELECTION_HANDLE_PRESSED_IMAGE_LEFT,      ///< name "selection-handle-pressed-image-left"  The image to display when the left selection handle is pressed,           type MAP
-      SELECTION_HANDLE_PRESSED_IMAGE_RIGHT,     ///< name "selection-handle-pressed-image-right" The image to display when the right selection handle is pressed,          type MAP
-      SELECTION_HANDLE_MARKER_IMAGE_LEFT,       ///< name "selection-handle-marker-image-left",  The image to display for the left selection handle marker,                type MAP
-      SELECTION_HANDLE_MARKER_IMAGE_RIGHT,      ///< name "selection-handle-marker-image-right", The image to display for the right selection handle marker,               type MAP
-      SELECTION_HIGHLIGHT_COLOR,                ///< name "selection-highlight-color"            The color of the selection highlight,                                     type VECTOR4
-      DECORATION_BOUNDING_BOX,                  ///< name "decoration-bounding-box"              The decorations (handles etc) will positioned within this area on-screen, type RECTANGLE
-      INPUT_METHOD_SETTINGS                     ///< name "input-method-settings"                The settings to relating to the System's Input Method, Key and Value      type MAP
+      RENDERING_BACKEND = PROPERTY_START_INDEX, ///< The type of rendering,                                                    type INT @since_tizen 2.4 @see RenderingType
+      TEXT,                                     ///< The text to display in UTF-8 format,                                      type STRING @since_tizen 2.4
+      PLACEHOLDER_TEXT,                         ///< The text to display when the TextField is empty and inactive,             type STRING @since_tizen 2.4
+      PLACEHOLDER_TEXT_FOCUSED,                 ///< The text to display when the TextField is empty with key-input focus,     type STRING @since_tizen 2.4
+      FONT_FAMILY,                              ///< The requested font family,                                                type STRING @since_tizen 2.4
+      FONT_STYLE,                               ///< The requested font style,                                                 type STRING @since_tizen 2.4
+      POINT_SIZE,                               ///< The size of font in points,                                               type FLOAT @since_tizen 2.4
+      MAX_LENGTH,                               ///< The maximum number of characters that can be inserted,                    type INTEGER @since_tizen 2.4
+      EXCEED_POLICY,                            ///< Specifies how the text is truncated when it does not fit,                 type INTEGER @since_tizen 2.4
+      HORIZONTAL_ALIGNMENT,                     ///< The line horizontal alignment,                                            type STRING,  values "BEGIN", "CENTER", "END" @since_tizen 2.4
+      VERTICAL_ALIGNMENT,                       ///< The line vertical alignment,                                              type STRING,  values   "TOP",   "CENTER",   "BOTTOM" @since_tizen 2.4
+      TEXT_COLOR,                               ///< The text color,                                                           type VECTOR4 @since_tizen 2.4
+      PLACEHOLDER_TEXT_COLOR,                   ///< The placeholder-text color,                                               type VECTOR4 @since_tizen 2.4
+      SHADOW_OFFSET,                            ///< The drop shadow offset 0 indicates no shadow,                             type VECTOR2 @since_tizen 2.4
+      SHADOW_COLOR,                             ///< The color of a drop shadow,                                               type VECTOR4 @since_tizen 2.4
+      PRIMARY_CURSOR_COLOR,                     ///< The color to apply to the primary cursor,                                 type VECTOR4 @since_tizen 2.4
+      SECONDARY_CURSOR_COLOR,                   ///< The color to apply to the secondary cursor,                               type VECTOR4 @since_tizen 2.4
+      ENABLE_CURSOR_BLINK,                      ///< Whether the cursor should blink or not,                                   type BOOLEAN @since_tizen 2.4
+      CURSOR_BLINK_INTERVAL,                    ///< The time interval in seconds between cursor on/off states,                type FLOAT @since_tizen 2.4
+      CURSOR_BLINK_DURATION,                    ///< The cursor will stop blinking after this number of seconds (if non-zero), type FLOAT @since_tizen 2.4
+      CURSOR_WIDTH,                             ///< The cursor width,                                                         type INTEGER @since_tizen 2.4
+      GRAB_HANDLE_IMAGE,                        ///< The image to display for the grab handle,                                 type STRING @since_tizen 2.4
+      GRAB_HANDLE_PRESSED_IMAGE,                ///< The image to display when the grab handle is pressed,                     type STRING @since_tizen 2.4
+      SCROLL_THRESHOLD,                         ///< Scrolling will occur if the cursor is this close to the control border,   type FLOAT @since_tizen 2.4
+      SCROLL_SPEED,                             ///< The scroll speed in pixels per second,                                    type FLOAT @since_tizen 2.4
+      SELECTION_HANDLE_IMAGE_LEFT,              ///< The image to display for the left selection handle,                       type MAP @since_tizen 2.4
+      SELECTION_HANDLE_IMAGE_RIGHT,             ///< The image to display for the right selection handle,                      type MAP @since_tizen 2.4
+      SELECTION_HANDLE_PRESSED_IMAGE_LEFT,      ///< The image to display when the left selection handle is pressed,           type MAP @since_tizen 2.4
+      SELECTION_HANDLE_PRESSED_IMAGE_RIGHT,     ///< The image to display when the right selection handle is pressed,          type MAP @since_tizen 2.4
+      SELECTION_HANDLE_MARKER_IMAGE_LEFT,       ///< The image to display for the left selection handle marker,                type MAP @since_tizen 2.4
+      SELECTION_HANDLE_MARKER_IMAGE_RIGHT,      ///< The image to display for the right selection handle marker,               type MAP @since_tizen 2.4
+      SELECTION_HIGHLIGHT_COLOR,                ///< The color of the selection highlight,                                     type VECTOR4 @since_tizen 2.4
+      DECORATION_BOUNDING_BOX,                  ///< The decorations (handles etc) will positioned within this area on-screen, type RECTANGLE @since_tizen 2.4
+      INPUT_METHOD_SETTINGS                     ///< The settings to relating to the System's Input Method, Key and Value      type MAP @since_tizen 2.4
     };
   };
 
@@ -114,15 +108,18 @@ public:
    */
   enum ExceedPolicy
   {
-    EXCEED_POLICY_ORIGINAL,        ///< The text will be display at original size, and may exceed the TextField boundary.
-    EXCEED_POLICY_CLIP             ///< The end of text will be clipped to fit within the TextField.
+    EXCEED_POLICY_ORIGINAL,        ///< The text will be display at original size, and may exceed the TextField boundary. @since_tizen 2.4
+    EXCEED_POLICY_CLIP             ///< The end of text will be clipped to fit within the TextField. @since_tizen 2.4
   };
 
   // Type Defs
 
-  /// @brief Max Characters Exceed signal type;
+  /// @brief Text changed signal type
   /// @since_tizen 2.4
   typedef Signal<void ( TextField ) > TextChangedSignalType;
+
+  /// @brief Max characters exceed signal type
+  /// @since_tizen 2.4
   typedef Signal<void ( TextField ) > MaxLengthReachedSignalType;
 
   /**
@@ -164,7 +161,7 @@ public:
   ~TextField();
 
   /**
-   * @brief Downcast a handle to TextField.
+   * @brief Downcast a handle to TextField handle.
    *
    * If the BaseHandle points is a TextField the downcast returns a valid handle.
    * If not the returned handle is left empty.
index accd1ac..0473f7e 100644 (file)
@@ -53,7 +53,7 @@ public:
   enum PropertyRange
   {
     PROPERTY_START_INDEX = Control::CONTROL_PROPERTY_END_INDEX + 1,
-    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices
+    PROPERTY_END_INDEX =   PROPERTY_START_INDEX + 1000              ///< Reserve property indices @since_tizen 2.4
   };
 
   /**
@@ -64,20 +64,20 @@ public:
   {
     enum
     {
-      RENDERING_BACKEND = PROPERTY_START_INDEX, ///< name "rendering-backend",    The type or rendering e.g. bitmap-based,          type INT
-      TEXT,                                     ///< name "text",                 The text to display in UTF-8 format,              type STRING
-      FONT_FAMILY,                              ///< name "font-family",          The requested font family,                        type STRING
-      FONT_STYLE,                               ///< name "font-style",           The requested font style,                         type STRING
-      POINT_SIZE,                               ///< name "point-size",           The size of font in points,                       type FLOAT
-      MULTI_LINE,                               ///< name "multi-line",           The single-line or multi-line layout option,      type BOOLEAN
-      HORIZONTAL_ALIGNMENT,                     ///< name "horizontal-alignment", The line horizontal alignment,                    type STRING,  values "BEGIN", "CENTER", "END"
-      VERTICAL_ALIGNMENT,                       ///< name "vertical-alignment",   The line vertical alignment,                      type STRING,  values   "TOP",   "CENTER",   "BOTTOM"
-      TEXT_COLOR,                               ///< name "text-color",           The text color,                                   type VECTOR4
-      SHADOW_OFFSET,                            ///< name "shadow-offset",        The drop shadow offset 0 indicates no shadow,     type VECTOR2
-      SHADOW_COLOR,                             ///< name "shadow-color",         The color of a drop shadow,                       type VECTOR4
-      UNDERLINE_ENABLED,                        ///< name "underline-enabled",    The underline enabled flag,                       type BOOLEAN
-      UNDERLINE_COLOR,                          ///< name "underline-color",      The color of the underline,                       type VECTOR4
-      UNDERLINE_HEIGHT                          ///< name "underline-height",     Overrides the underline height from font metrics, type FLOAT
+      RENDERING_BACKEND = PROPERTY_START_INDEX, ///< The type of rendering,                                                    type INT @since_tizen 2.4 @see RenderingType
+      TEXT,                                     ///< The text to display in UTF-8 format,              type STRING @since_tizen 2.4
+      FONT_FAMILY,                              ///< The requested font family,                        type STRING @since_tizen 2.4
+      FONT_STYLE,                               ///< The requested font style,                         type STRING @since_tizen 2.4
+      POINT_SIZE,                               ///< The size of font in points,                       type FLOAT @since_tizen 2.4
+      MULTI_LINE,                               ///< The single-line or multi-line layout option,      type BOOLEAN @since_tizen 2.4
+      HORIZONTAL_ALIGNMENT,                     ///< The line horizontal alignment,                    type STRING,  values "BEGIN", "CENTER", "END" @since_tizen 2.4
+      VERTICAL_ALIGNMENT,                       ///< The line vertical alignment,                      type STRING,  values   "TOP",   "CENTER",   "BOTTOM" @since_tizen 2.4
+      TEXT_COLOR,                               ///< The text color,                                   type VECTOR4 @since_tizen 2.4
+      SHADOW_OFFSET,                            ///< The drop shadow offset 0 indicates no shadow,     type VECTOR2 @since_tizen 2.4
+      SHADOW_COLOR,                             ///< The color of a drop shadow,                       type VECTOR4 @since_tizen 2.4
+      UNDERLINE_ENABLED,                        ///< The underline enabled flag,                       type BOOLEAN @since_tizen 2.4
+      UNDERLINE_COLOR,                          ///< The color of the underline,                       type VECTOR4 @since_tizen 2.4
+      UNDERLINE_HEIGHT                          ///< Overrides the underline height from font metrics, type FLOAT @since_tizen 2.4
     };
   };
 
@@ -130,7 +130,7 @@ public:
   ~TextLabel();
 
   /**
-   * @brief Downcast a handle to TextLabel.
+   * @brief Downcast a handle to TextLabel handle.
    *
    * If the BaseHandle points is a TextLabel the downcast returns a valid handle.
    * If not the returned handle is left empty.
index 531c143..89b0c48 100644 (file)
@@ -47,10 +47,10 @@ namespace ControlOrientation
  */
 enum Type
 {
-  Up,   ///< The contents of control are in a vertical layout, from top to bottom
-  Left, ///< The contents of control are in a horizontal layout, from left to right
-  Down, ///< The contents of control are in a vertical layout, from bottom to top
-  Right ///< The contents of control are in a horizontal layout, from right to left
+  Up,   ///< The contents of control are in a vertical layout, from top to bottom @since_tizen 2.4
+  Left, ///< The contents of control are in a horizontal layout, from left to right @since_tizen 2.4
+  Down, ///< The contents of control are in a vertical layout, from bottom to top @since_tizen 2.4
+  Right ///< The contents of control are in a horizontal layout, from right to left @since_tizen 2.4
 };
 
 } // namespace ControlOrientation
@@ -58,6 +58,7 @@ enum Type
 /**
  * @brief Query whether an orientation is vertical.
  *
+ * @since_tizen 2.4
  * @param[in] orientation The orientation.
  * @return True if the orientation is vertical.
  */
index 42a559b..c065a99 100644 (file)
@@ -45,13 +45,6 @@ class KeyboardFocusManager;
  * highlight for the focused actor and emits a signal when the focus
  * is changed.
  *
- * Signals
- * | %Signal Name                     | Method                             |
- * |----------------------------------|------------------------------------|
- * | keyboard-pre-focus-change        | @ref PreFocusChangeSignal()        |
- * | keyboard-focus-changed           | @ref FocusChangedSignal()          |
- * | keyboard-focus-group-changed     | @ref FocusGroupChangedSignal()     |
- * | keyboard-focused-actor-enter-key | @ref FocusedActorEnterKeySignal()  |
  * @since_tizen 2.4
  */
 class DALI_IMPORT_API KeyboardFocusManager : public BaseHandle
index 83dc054..0634c18 100644 (file)
@@ -23,18 +23,33 @@ namespace Dali
 
 namespace Toolkit
 {
+/**
+ * @addtogroup dali_toolkit_controls_text_controls
+ * @{
+ */
 
+/**
+ * @brief Text rendering enumerations
+ * @since_tizen 2.4
+ */
 namespace Text
 {
-// The type of text renderer required
+
+/**
+ * @brief The type of text renderer required.
+ * @since_tizen 2.4
+ */
 enum RenderingType
 {
-  RENDERING_SHARED_ATLAS ///< A bitmap-based solution where renderers can share a texture atlas
+  RENDERING_SHARED_ATLAS ///< A bitmap-based solution where renderers can share a texture atlas @since_tizen 2.4
 };
 
 const unsigned int DEFAULT_RENDERING_BACKEND = RENDERING_SHARED_ATLAS;
 } // namespace Text
 
+/**
+ * @}
+ */
 } // namespace Toolkit
 
 } // namespace Dali
index d53b9b5..c189b63 100644 (file)
@@ -63,7 +63,7 @@ distributing this software or its derivatives.
       "point-size":18,
       "primary-cursor-color":[0.0,0.72,0.9,1.0],
       "secondary-cursor-color":[0.0,0.72,0.9,1.0],
-      "cursor-width":1,
+      "cursor-width":2,
       "selection-highlight-color":[0.75,0.96,1.0,1.0],
       "grab-handle-image" : "{DALI_STYLE_IMAGE_DIR}cursor_handler_drop_center.png",
       "selection-handle-image-left" : {"filename":"{DALI_STYLE_IMAGE_DIR}selection_handle_drop_left.png" },
@@ -115,7 +115,12 @@ distributing this software or its derivatives.
     },
     "textselectiontoolbar":
     {
-      "enable-overshoot":true
+      "enable-overshoot":false,
+      "scroll-view":
+      {
+        "overshoot-animation-speed":120.0,
+        "overshoot-size":[480.0,42.0]
+      }
     },
     "scrollview":
     {
index a958f66..62278ef 100644 (file)
@@ -115,7 +115,12 @@ distributing this software or its derivatives.
     },
     "textselectiontoolbar":
     {
-      "enable-overshoot":true
+      "enable-overshoot":false,
+      "scroll-view":
+      {
+        "overshoot-animation-speed":360.0,
+        "overshoot-size":[720.0,130.0]
+      }
     },
     "scrollview":
     {
index 43922c8..477a0f3 100644 (file)
@@ -1,6 +1,23 @@
 #ifndef __DALI_TOOLKIT_DOC_H__
 #define __DALI_TOOLKIT_DOC_H__
 
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
 /**
  * @defgroup dali DALi
  * @ingroup CAPI_UI_FRAMEWORK
  * @brief DALi is a cross-platform 3D UI Toolkit for embedded systems.
  *
  * @section dali-overview Overview
+ *
  * DALi's 3D user interface engine enables you to create rich and high-performance 
  * UI applications. DALi is based on OpenGL ES 2.0, but provides a clean 
  * cross-platform C++ framework. 
  * This means that you can use high-level DALi APIs instead of accessing 
  * low-level OpenGL APIs directly.
- * <ul>
- * <li>DALi Core: This module provides scene graph-based rendering, animation, and event handling.</li>
- * <li>DALi Adaptor: This module is a platform adaptation layer.</li>
- * <li>DALi Toolkit: This module provides UI components and various effects on top of the DALi Core.</li>
- * </ul>
+ *
+ * DALi consists of the following modules:
+ * <table>
+ * <tr>
+ *    <th>Module</th>
+ *    <th>Description</th>
+ * </tr>
+ * <tr>
+ *    <td>@ref dali_core</td>
+ *    <td>DALi Core provides core functionalities such as scene graph-based rendering, animation, and event handling.</td>
+ * </tr>
+ * <tr>
+ *    <td>@ref dali_adaptor</td>
+ *    <td>DALi Adaptor is a platform adaptation layer.</td>
+ * </tr>
+ * <tr>
+ *    <td>@ref dali_toolkit</td>
+ *    <td>DALi Toolkit provides UI components and various effects on top of the DALi Core.</td>
+ * </tr>
+ * </table>
+ *
+ * The layer diagram for DALi modules is shown below:
+ * @image html dali-modules.png "Figure: DALi modules"
  *
  * @defgroup dali_toolkit DALi Toolkit
- * @ingroup dali
  *
- * @brief This module provides UI components and various effects on top of the DALi Core.
+ * @brief DALi Toolkit provides UI components and various effects on top of the DALi Core.
+ *
+ * @section dali_core_overview Overview
  *
+ * DALi Toolkit consists of the following groups of API:
+ *
+ * <table>
+ * <tr>
+ *    <th>API Group</th>
+ *    <th>Description</th>
+ * </tr>
+ * <tr>
+ *    <td>@ref dali_toolkit_controls</td>
+ *    <td>Controls are interactive components for layouting the user interface.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_alignment</td>
+ *    <td>Alignment is a container which provides an easy way to align other actors inside its boundary.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_buttons</td>
+ *    <td>Button is a small object on UI that you can press.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_gaussian_blur_view</td>
+ *    <td>GaussianBlurView provides a render process that blurs an image.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_image_view</td>
+ *    <td>ImageView is a control displying an image.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_scroll_bar</td>
+ *    <td>ScrollBar control.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_scrollable</td>
+ *    <td>Scrollable container controls.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:2em">@ref dali_toolkit_controls_item_view</td>
+ *    <td>ItemView class is a scrollable container that can contain many items.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:2em">@ref dali_toolkit_controls_scroll_view</td>
+ *    <td>ScrollView class provides scrollable view which contains actors and can be scrolled automatically or manually by panning.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_table_view</td>
+ *    <td>TableView class is a layout container for aligning child actors in a grid like layout.</td>
+ * </tr>
+ * <tr>
+ *    <td style="padding-left:1em">@ref dali_toolkit_controls_text_controls</td>
+ *    <td>Controls for displaying text or text input.</td>
+ * </tr>
+ * <tr>
+ *    <td>@ref dali_toolkit_managers</td>
+ *    <td>Singleton classes for managing application-wide functionalities.</td>
+ * </tr>
+ * </table>
+ *
+ * @ingroup dali
  * @{
  *   @defgroup dali_toolkit_controls Controls
  *   @brief Controls are interactive components for layouting the user interface. 
diff --git a/doc/images/dali-modules.png b/doc/images/dali-modules.png
new file mode 100755 (executable)
index 0000000..d85303c
Binary files /dev/null and b/doc/images/dali-modules.png differ