X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-impl.h;h=2936d4d378589d8d0cde9740dbd158df57d61e62;hp=ab2764caf32a7ddf196e72b2a886497b0fdd8e36;hb=fcbd0fc67ae67b5f068f09483a765d4afa7bd52b;hpb=c3f7ea6cb0c0b75c2276193aff88b5c7a679a2d5 diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index ab2764c..2936d4d 100644 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -19,13 +19,14 @@ */ // EXTERNAL INCLUDES +#include #include -#include // INTERNAL INCLUDES #include #include #include +#include #include namespace Dali @@ -45,9 +46,12 @@ struct Event CURSOR_KEY_EVENT, TAP_EVENT, PAN_EVENT, + LONG_PRESS_EVENT, GRAB_HANDLE_EVENT, LEFT_SELECTION_HANDLE_EVENT, - RIGHT_SELECTION_HANDLE_EVENT + RIGHT_SELECTION_HANDLE_EVENT, + SELECT, + SELECT_ALL }; union Param @@ -98,9 +102,14 @@ struct EventData enum State { INACTIVE, + INTERRUPTED, SELECTING, + SELECTION_CHANGED, EDITING, - EDITING_WITH_POPUP + EDITING_WITH_POPUP, + EDITING_WITH_GRAB_HANDLE, + GRAB_HANDLE_PANNING, + SELECTION_HANDLE_PANNING }; EventData( DecoratorPtr decorator ); @@ -133,19 +142,21 @@ struct EventData CharacterIndex mPreEditStartPosition; ///< Used to remove the pre-edit text if necessary. Length mPreEditLength; ///< Used to remove the pre-edit text if necessary. - bool mIsShowingPlaceholderText : 1; ///< True if the place-holder text is being displayed. - bool mPreEditFlag : 1; ///< True if the model contains text in pre-edit state. - 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. + bool mIsShowingPlaceholderText : 1; ///< True if the place-holder text is being displayed. + bool mPreEditFlag : 1; ///< True if the model contains text in pre-edit state. + 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 mScrollAfterUpdatePosition : 1; ///< Whether to scroll after the cursor position is updated. + bool mScrollAfterDelete : 1; ///< Whether to scroll after delete characters. + bool mAllTextSelected : 1; ///< True if the selection handles are selecting all the text }; struct ModifyEvent @@ -163,9 +174,14 @@ struct ModifyEvent struct FontDefaults { FontDefaults() - : mDefaultPointSize(0.0f), + : mFontDescription(), + mFontStyle(), + mDefaultPointSize(0.0f), mFontId(0u) { + // Initially use the default platform font + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.GetDefaultPlatformFontDescription( mFontDescription ); } FontId GetFontId( TextAbstraction::FontClient& fontClient ) @@ -173,14 +189,14 @@ struct FontDefaults if( !mFontId ) { Dali::TextAbstraction::PointSize26Dot6 pointSize = mDefaultPointSize*64; - mFontId = fontClient.GetFontId( mDefaultFontFamily, mDefaultFontStyle, pointSize ); + mFontId = fontClient.GetFontId( mFontDescription, pointSize ); } return mFontId; } - std::string mDefaultFontFamily; - std::string mDefaultFontStyle; + TextAbstraction::FontDescription mFontDescription; + std::string mFontStyle; float mDefaultPointSize; FontId mFontId; }; @@ -194,23 +210,30 @@ struct Controller::Impl mFontDefaults( NULL ), mEventData( NULL ), mFontClient(), + mClipboard(), mView(), + mMetrics(), mLayoutEngine(), mModifyEvents(), - mControlSize(), mTextColor( Color::BLACK ), mAlignmentOffset(), mOperationsPending( NO_OPERATION ), mMaximumNumberOfCharacters( 50 ), - mRecalculateNaturalSize( true ) + mRecalculateNaturalSize( true ), + mUserDefinedFontFamily( false ) { mLogicalModel = LogicalModel::New(); mVisualModel = VisualModel::New(); mFontClient = TextAbstraction::FontClient::Get(); + mClipboard = Clipboard::Get(); mView.SetVisualModel( mVisualModel ); + // Use this to access FontClient i.e. to get down-scaled Emoji metrics. + mMetrics = Metrics::New( mFontClient ); + mLayoutEngine.SetMetrics( mMetrics ); + // Set the text properties to default mVisualModel->SetUnderlineEnabled( false ); mVisualModel->SetUnderlineHeight( 0.0f ); @@ -218,6 +241,7 @@ struct Controller::Impl ~Impl() { + delete mFontDefaults; delete mEventData; } @@ -266,6 +290,12 @@ struct Controller::Impl return ( mEventData && mEventData->mIsShowingPlaceholderText ); } + bool IsShowingRealText() const + { + return ( !IsShowingPlaceholderText() && + 0u != mLogicalModel->mText.Count() ); + } + /** * @brief Called when placeholder-text is hidden */ @@ -292,14 +322,23 @@ struct Controller::Impl void ResetImfManager() { - // Reset incase we are in a pre-edit state. - ImfManager imfManager = ImfManager::Get(); - if ( imfManager ) + if( mEventData ) { - imfManager.Reset(); // Will trigger a commit message + // Reset incase we are in a pre-edit state. + ImfManager imfManager = ImfManager::Get(); + if ( imfManager ) + { + imfManager.Reset(); // Will trigger a commit message + } + + ClearPreEditFlag(); } + } - ClearPreEditFlag(); + bool IsClipboardEmpty() + { + bool result( mClipboard && mClipboard.NumberOfItems() ); + return !result; // // If NumberOfItems greater than 0, return false } void UpdateModel( OperationsMask operationsRequired ); @@ -312,20 +351,47 @@ struct Controller::Impl */ void GetDefaultFonts( Dali::Vector& fonts, Length numberOfCharacters ); + /** + * @brief Retrieve the line height of the default font. + */ + float GetDefaultFontLineHeight(); + void OnCursorKeyEvent( const Event& event ); void OnTapEvent( const Event& event ); void OnPanEvent( const Event& event ); + void OnLongPressEvent( const Event& event ); + void OnHandleEvent( const Event& event ); + void OnSelectEvent( const Event& event ); + + void OnSelectAllEvent(); + + void RetrieveSelection( std::string& selectedText, bool deleteAfterRetreival ); + + void ShowClipboard(); + + void HideClipboard(); + + bool CopyStringToClipboard( std::string& source ); + + void SendSelectionToClipboard( bool deleteAfterSending ); + + void GetTextFromClipboard( unsigned int itemIndex, std::string& retreivedString ); + + void RepositionSelectionHandles( CharacterIndex selectionStart, CharacterIndex selectionEnd ); void RepositionSelectionHandles( float visualX, float visualY ); - void ChangeState( EventData::State newState ); + void SetPopupButtons(); + void ChangeState( EventData::State newState ); LineIndex GetClosestLine( float y ) const; + void FindSelectionIndices( float visualX, float visualY, CharacterIndex& startIndex, CharacterIndex& endIndex ); + /** * @brief Retrieves the cursor's logical position for a given touch point x,y * @@ -392,11 +458,23 @@ struct Controller::Impl void ClampVerticalScroll( const Vector2& actualSize ); /** + * @brief Scrolls the text to make a position visible. + * + * @pre mEventData must not be NULL. (there is a text-input or selection capabilities). + * + * @param[in] position A position in decorator coords. + * + * This method is called after inserting text, moving the cursor with the grab handle or the keypad, + * or moving the selection handles. + */ + void ScrollToMakePositionVisible( const Vector2& position ); + + /** * @brief Scrolls the text to make the cursor visible. * - * This method is called after inserting, deleting or moving the cursor with the keypad. + * This method is called after deleting text. */ - void ScrollToMakeCursorVisible(); + void ScrollTextToMatchCursor(); ControlInterface& mControlInterface; ///< Reference to the text controller. LogicalModelPtr mLogicalModel; ///< Pointer to the logical model. @@ -404,15 +482,18 @@ struct Controller::Impl FontDefaults* mFontDefaults; ///< Avoid allocating this when the user does not specify a font. EventData* mEventData; ///< Avoid allocating everything for text input until EnableTextInput(). TextAbstraction::FontClient mFontClient; ///< Handle to the font client. + Clipboard mClipboard; ///< Handle to the system clipboard View mView; ///< The view interface to the rendering back-end. + MetricsPtr mMetrics; ///< A wrapper around FontClient used to get metrics & potentially down-scaled Emoji metrics. LayoutEngine mLayoutEngine; ///< The layout engine. std::vector mModifyEvents; ///< Temporary stores the text set until the next relayout. - Size mControlSize; ///< The size of the control. Vector4 mTextColor; ///< The regular text color 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. + bool mUserDefinedFontFamily:1; ///< Whether the Font family was set by the user instead of being left as sytem default. }; } // namespace Text