TextField to limit Input to maximum characters and emit signal
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / text-controller-impl.h
index 06e9463..51927a6 100644 (file)
@@ -46,7 +46,9 @@ struct Event
     CURSOR_KEY_EVENT,
     TAP_EVENT,
     PAN_EVENT,
-    GRAB_HANDLE_EVENT
+    GRAB_HANDLE_EVENT,
+    LEFT_SELECTION_HANDLE_EVENT,
+    RIGHT_SELECTION_HANDLE_EVENT
   };
 
   union Param
@@ -61,6 +63,7 @@ struct Event
   {
     p1.mInt = 0;
     p2.mInt = 0;
+    p3.mInt = 0;
   }
 
   Type type;
@@ -105,34 +108,38 @@ struct EventData
 
   ~EventData();
 
-  DecoratorPtr mDecorator;
-  std::string  mPlaceholderText;
+  DecoratorPtr       mDecorator;               ///< Pointer to the decorator
+  std::string        mPlaceholderText;         ///< The plaxe holder text
 
   /**
    * This is used to delay handling events until after the model has been updated.
    * The number of updates to the model is minimized to improve performance.
    */
-  std::vector<Event> mEventQueue; ///< The queue of touch events etc.
+  std::vector<Event> mEventQueue;              ///< The queue of touch events etc.
 
   /**
    * 0,0 means that the top-left corner of the layout matches the top-left corner of the UI control.
    * Typically this will have a negative value with scrolling occurs.
    */
-  Vector2 mScrollPosition; ///< The text is offset by this position when scrolling.
-
-  State mState; ///< Selection mode, edit mode etc.
-
-  CharacterIndex mPrimaryCursorPosition;   ///< Index into logical model for primary cursor
-  CharacterIndex mSecondaryCursorPosition; ///< Index into logical model for secondary cursor
-
-  bool mDecoratorUpdated           : 1; ///< True if the decorator was updated during event processing
-  bool mCursorBlinkEnabled         : 1; ///< True if cursor should blink when active
-  bool mGrabHandleEnabled          : 1; ///< True if grab handle is enabled
-  bool mGrabHandlePopupEnabled     : 1; ///< True if the grab handle popu-up should be shown
-  bool mSelectionEnabled           : 1; ///< True if selection handles, highlight etc. are enabled
-  bool mHorizontalScrollingEnabled : 1; ///< True if horizontal scrolling is enabled
-  bool mVerticalScrollingEnabled   : 1; ///< True if vertical scrolling is enabled
-  bool mUpdateCursorPosition       : 1; ///< True if the visual position of the cursor must be recalculated
+  Vector2            mScrollPosition;          ///< The text is offset by this position when scrolling.
+
+  State              mState;                   ///< Selection mode, edit mode etc.
+
+  CharacterIndex     mPrimaryCursorPosition;   ///< Index into logical model for primary cursor.
+  CharacterIndex     mLeftSelectionPosition;   ///< Index into logical model for left selection handle.
+  CharacterIndex     mRightSelectionPosition;  ///< Index into logical model for right selection handle.
+
+  bool mDecoratorUpdated                : 1;   ///< True if the decorator was updated during event processing.
+  bool mCursorBlinkEnabled              : 1;   ///< True if cursor should blink when active.
+  bool mGrabHandleEnabled               : 1;   ///< True if grab handle is enabled.
+  bool mGrabHandlePopupEnabled          : 1;   ///< True if the grab handle popu-up should be shown.
+  bool mSelectionEnabled                : 1;   ///< True if selection handles, highlight etc. are enabled.
+  bool mHorizontalScrollingEnabled      : 1;   ///< True if horizontal scrolling is enabled.
+  bool mVerticalScrollingEnabled        : 1;   ///< True if vertical scrolling is enabled.
+  bool mUpdateCursorPosition            : 1;   ///< True if the visual position of the cursor must be recalculated.
+  bool mUpdateLeftSelectionPosition     : 1;   ///< True if the visual position of the left selection handle must be recalculated.
+  bool mUpdateRightSelectionPosition    : 1;   ///< True if the visual position of the right selection handle must be recalculated.
+  bool mScrollAfterUpdateCursorPosition : 1;   ///< Whether to scroll after the cursor position is updated.
 };
 
 struct ModifyEvent
@@ -188,6 +195,7 @@ struct Controller::Impl
     mControlSize(),
     mAlignmentOffset(),
     mOperationsPending( NO_OPERATION ),
+    mMaximumNumberOfCharacters( 50 ),
     mRecalculateNaturalSize( true )
   {
     mLogicalModel = LogicalModel::New();
@@ -215,7 +223,6 @@ struct Controller::Impl
    */
   void RequestRelayout();
 
-
   /**
    * @brief Helper to move the cursor, grab handle etc.
    */
@@ -231,7 +238,7 @@ struct Controller::Impl
 
   void OnPanEvent( const Event& event );
 
-  void OnGrabHandleEvent( const Event& event );
+  void OnHandleEvent( const Event& event );
 
   void RepositionSelectionHandles( float visualX, float visualY );
 
@@ -274,8 +281,43 @@ struct Controller::Impl
    */
   CharacterIndex CalculateNewCursorIndex( CharacterIndex index ) const;
 
+  /**
+   * @brief Updates the cursor position.
+   *
+   * Retrieves the x,y position of the cursor logical position and sets it into the decorator.
+   * It sets the position of the secondary cursor if it's a valid one.
+   * Sets which cursors are active.
+   */
   void UpdateCursorPosition();
 
+  /**
+   * @brief Updates the position of the given selection handle.
+   *
+   * @param[in] handleType One of the selection handles.
+   */
+  void UpdateSelectionHandle( HandleType handleType );
+
+  /**
+   * @biref Clamps the horizontal scrolling to get the control always filled with text.
+   *
+   * @param[in] actualSize The size of the laid out text.
+   */
+  void ClampHorizontalScroll( const Vector2& actualSize );
+
+  /**
+   * @biref Clamps the vertical scrolling to get the control always filled with text.
+   *
+   * @param[in] actualSize The size of the laid out text.
+   */
+  void ClampVerticalScroll( const Vector2& actualSize );
+
+  /**
+   * @brief Scrolls the text to make the cursor visible.
+   *
+   * This method is called after inserting, deleting or moving the cursor with the keypad.
+   */
+  void ScrollToMakeCursorVisible();
+
   ControlInterface& mControlInterface;     ///< Reference to the text controller.
   LogicalModelPtr mLogicalModel;           ///< Pointer to the logical model.
   VisualModelPtr  mVisualModel;            ///< Pointer to the visual model.
@@ -288,6 +330,7 @@ struct Controller::Impl
   Size mControlSize;                       ///< The size of the control.
   Vector2 mAlignmentOffset;                ///< Vertical and horizontal offset of the whole text inside the control due to alignment.
   OperationsMask mOperationsPending;       ///< Operations pending to be done to layout the text.
+  Length mMaximumNumberOfCharacters;       ///< Maximum number of characters that can be inserted.
   bool mRecalculateNaturalSize:1;          ///< Whether the natural size needs to be recalculated.
 };