Text selection refactoring
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / text-controller-impl.h
old mode 100644 (file)
new mode 100755 (executable)
index a5de151..bb03be4
@@ -21,6 +21,7 @@
 // EXTERNAL INCLUDES
 #include <dali/devel-api/adaptor-framework/clipboard.h>
 #include <dali/devel-api/text-abstraction/font-client.h>
+#include <dali/public-api/rendering/shader.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/text/input-style.h>
@@ -39,10 +40,16 @@ namespace Toolkit
 namespace Text
 {
 
+const float DEFAULT_TEXTFIT_MIN = 10.f;
+const float DEFAULT_TEXTFIT_MAX = 100.f;
+const float DEFAULT_TEXTFIT_STEP = 1.f;
+
 //Forward declarations
 struct CursorInfo;
 struct FontDefaults;
 
+class SelectableControlInterface;
+
 struct Event
 {
   // Used to queue input events until DoRelayout()
@@ -56,7 +63,8 @@ struct Event
     LEFT_SELECTION_HANDLE_EVENT,
     RIGHT_SELECTION_HANDLE_EVENT,
     SELECT,
-    SELECT_ALL
+    SELECT_ALL,
+    SELECT_NONE,
   };
 
   union Param
@@ -97,7 +105,7 @@ struct EventData
     TEXT_PANNING
   };
 
-  EventData( DecoratorPtr decorator );
+  EventData( DecoratorPtr decorator, InputMethodContext& inputMethodContext );
 
   ~EventData();
 
@@ -107,7 +115,7 @@ struct EventData
   }
 
   DecoratorPtr       mDecorator;               ///< Pointer to the decorator.
-  ImfManager         mImfManager;              ///< The Input Method Framework Manager.
+  InputMethodContext mInputMethodContext;      ///< The Input Method Framework Manager.
   FontDefaults*      mPlaceholderFont;         ///< The placeholder default font.
   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.
@@ -162,6 +170,8 @@ struct EventData
   bool mIsPlaceholderPixelSize          : 1;   ///< True if the placeholder font size is set as pixel size.
   bool mIsPlaceholderElideEnabled       : 1;   ///< True if the placeholder text's elide is enabled.
   bool mPlaceholderEllipsisFlag         : 1;   ///< True if the text controller sets the placeholder ellipsis.
+  bool mShiftSelectionFlag              : 1;   ///< True if the text selection using Shift key is enabled.
+  bool mUpdateAlignment                 : 1;   ///< True if the whole text needs to be full aligned..
 };
 
 struct ModifyEvent
@@ -181,6 +191,7 @@ struct FontDefaults
   FontDefaults()
   : mFontDescription(),
     mDefaultPointSize( 0.f ),
+    mFitPointSize( 0.f ),
     mFontId( 0u ),
     familyDefined( false ),
     weightDefined( false ),
@@ -206,6 +217,7 @@ struct FontDefaults
 
   TextAbstraction::FontDescription mFontDescription;  ///< The default font's description.
   float                            mDefaultPointSize; ///< The default font's point size.
+  float                            mFitPointSize; ///< The fit font's point size.
   FontId                           mFontId;           ///< The font's id of the default font.
   bool familyDefined:1; ///< Whether the default font's family name is defined.
   bool weightDefined:1; ///< Whether the default font's weight is defined.
@@ -298,9 +310,11 @@ struct OutlineDefaults
 struct Controller::Impl
 {
   Impl( ControlInterface* controlInterface,
-        EditableControlInterface* editableControlInterface )
+        EditableControlInterface* editableControlInterface,
+        SelectableControlInterface* selectableControlInterface )
   : mControlInterface( controlInterface ),
     mEditableControlInterface( editableControlInterface ),
+    mSelectableControlInterface( selectableControlInterface ),
     mModel(),
     mFontDefaults( NULL ),
     mUnderlineDefaults( NULL ),
@@ -322,12 +336,18 @@ struct Controller::Impl
     mMarkupProcessorEnabled( false ),
     mClipboardHideEnabled( true ),
     mIsAutoScrollEnabled( false ),
-    mAutoScrollDirectionRTL( false ),
+    mUpdateTextDirection( true ),
+    mIsTextDirectionRTL( false ),
     mUnderlineSetByString( false ),
     mShadowSetByString( false ),
     mOutlineSetByString( false ),
     mFontStyleSetByString( false ),
-    mShouldClearFocusOnEscape( true )
+    mShouldClearFocusOnEscape( true ),
+    mLayoutDirection( LayoutDirection::LEFT_TO_RIGHT ),
+    mTextFitMinSize( DEFAULT_TEXTFIT_MIN ),
+    mTextFitMaxSize( DEFAULT_TEXTFIT_MAX ),
+    mTextFitStepSize( DEFAULT_TEXTFIT_STEP ),
+    mTextFitEnabled( false )
   {
     mModel = Model::New();
 
@@ -453,14 +473,14 @@ struct Controller::Impl
     }
   }
 
-  void ResetImfManager()
+  void ResetInputMethodContext()
   {
     if( mEventData )
     {
       // Reset incase we are in a pre-edit state.
-      if( mEventData->mImfManager )
+      if( mEventData->mInputMethodContext )
       {
-        mEventData->mImfManager.Reset(); // Will trigger a message ( commit, get surrounding )
+        mEventData->mInputMethodContext.Reset(); // Will trigger a message ( commit, get surrounding )
       }
 
       ClearPreEditFlag();
@@ -468,14 +488,14 @@ struct Controller::Impl
   }
 
   /**
-   * @brief Helper to notify IMF manager with surrounding text & cursor changes.
+   * @brief Helper to notify InputMethodContext with surrounding text & cursor changes.
    */
-  void NotifyImfManager();
+  void NotifyInputMethodContext();
 
   /**
-   * @brief Helper to notify IMF manager with multi line status.
+   * @brief Helper to notify InputMethodContext with multi line status.
    */
-  void NotifyImfMultiLineStatus();
+  void NotifyInputMethodContextMultiLineStatus();
 
   /**
    * @brief Retrieve the current cursor position.
@@ -604,6 +624,18 @@ struct Controller::Impl
 
   void OnSelectAllEvent();
 
+  void OnSelectNoneEvent();
+
+  /**
+   * @copydoc Text::SelectableControlInterface::SetTextSelectionRange()
+   */
+  void SetTextSelectionRange(const uint32_t *pStart, const uint32_t *pEndf);
+
+  /**
+   * @copydoc Text::SelectableControlInterface::GetTextSelectionRange()
+   */
+  Uint32Pair GetTextSelectionRange() const;
+
   /**
    * @brief Retrieves the selected text. It removes the text if the @p deleteAfterRetrieval parameter is @e true.
    *
@@ -710,6 +742,25 @@ struct Controller::Impl
    */
   void ScrollTextToMatchCursor( const CursorInfo& cursorInfo );
 
+  /**
+   * @brief Create an actor that renders the text background color
+   *
+   * @return the created actor or an empty handle if no background color needs to be rendered.
+   */
+  Actor CreateBackgroundActor();
+
+public:
+
+  /**
+   * @brief Gets implementation from the controller handle.
+   * @param controller The text controller
+   * @return The implementation of the Controller
+   */
+  static Impl& GetImplementation( Text::Controller& controller )
+  {
+    return *controller.mImpl;
+  }
+
 private:
   // Declared private and left undefined to avoid copies.
   Impl( const Impl& );
@@ -720,6 +771,7 @@ public:
 
   ControlInterface* mControlInterface;     ///< Reference to the text controller.
   EditableControlInterface* mEditableControlInterface; ///< Reference to the editable text controller.
+  SelectableControlInterface* mSelectableControlInterface; ///< Reference to the selectable text controller.
   ModelPtr mModel;                         ///< Pointer to the text's model.
   FontDefaults* mFontDefaults;             ///< Avoid allocating this when the user does not specify a font.
   UnderlineDefaults* mUnderlineDefaults;   ///< Avoid allocating this when the user does not specify underline parameters.
@@ -738,18 +790,28 @@ public:
   OperationsMask mOperationsPending;       ///< Operations pending to be done to layout the text.
   Length mMaximumNumberOfCharacters;       ///< Maximum number of characters that can be inserted.
   HiddenText* mHiddenInput;                ///< Avoid allocating this when the user does not specify hidden input mode.
+  Vector2 mTextFitContentSize;             ///< Size of Text fit content
 
   bool mRecalculateNaturalSize:1;          ///< Whether the natural size needs to be recalculated.
   bool mMarkupProcessorEnabled:1;          ///< Whether the mark-up procesor is enabled.
   bool mClipboardHideEnabled:1;            ///< Whether the ClipboardHide function work or not
   bool mIsAutoScrollEnabled:1;             ///< Whether auto text scrolling is enabled.
-  CharacterDirection mAutoScrollDirectionRTL:1;  ///< Direction of auto scrolling, true if rtl
+  bool mUpdateTextDirection:1;             ///< Whether the text direction needs to be updated.
+  CharacterDirection mIsTextDirectionRTL:1;  ///< Whether the text direction is right to left or not
 
   bool mUnderlineSetByString:1;            ///< Set when underline is set by string (legacy) instead of map
   bool mShadowSetByString:1;               ///< Set when shadow is set by string (legacy) instead of map
   bool mOutlineSetByString:1;              ///< Set when outline is set by string (legacy) instead of map
   bool mFontStyleSetByString:1;            ///< Set when font style is set by string (legacy) instead of map
   bool mShouldClearFocusOnEscape:1;        ///< Whether text control should clear key input focus
+  LayoutDirection::Type mLayoutDirection;  ///< Current system language direction
+
+  Shader mShaderBackground;                ///< The shader for text background.
+
+  float mTextFitMinSize;                   ///< Minimum Font Size for text fit. Default 10
+  float mTextFitMaxSize;                   ///< Maximum Font Size for text fit. Default 100
+  float mTextFitStepSize;                  ///< Step Size for font intervalse. Default 1
+  bool  mTextFitEnabled : 1;               ///< Whether the text's fit is enabled.
 };
 
 } // namespace Text