From: Victor Cebollada Date: Fri, 17 Jun 2016 15:37:24 +0000 (+0100) Subject: Fix for the surrounding info send to the IMF manager. X-Git-Tag: dali_1.1.40~5 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=2af20bd47b6f3ed138d87d4ddb0d458ae8b8f3e3 Fix for the surrounding info send to the IMF manager. * It sends the cursor position when the or the selection handles are updated. * It stops sending the surrounding text as the IMF manager does nothing with it. Change-Id: I439faa41df5aa060b7822a3cc15eccefb0a10e6e Signed-off-by: Victor Cebollada --- diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index e248c25..aad550c 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -161,6 +161,13 @@ bool Controller::Impl::ProcessInputEvents() } } + if( mEventData->mUpdateCursorPosition || + mEventData->mUpdateLeftSelectionPosition || + mEventData->mUpdateRightSelectionPosition ) + { + NotifyImfManager(); + } + // The cursor must also be repositioned after inserts into the model if( mEventData->mUpdateCursorPosition ) { @@ -276,6 +283,80 @@ bool Controller::Impl::ProcessInputEvents() return decoratorUpdated; } +void Controller::Impl::NotifyImfManager() +{ + if( mEventData && mEventData->mImfManager ) + { + CharacterIndex cursorPosition = GetLogicalCursorPosition(); + + const Length numberOfWhiteSpaces = GetNumberOfWhiteSpaces( 0u ); + + // Update the cursor position by removing the initial white spaces. + if( cursorPosition < numberOfWhiteSpaces ) + { + cursorPosition = 0u; + } + else + { + cursorPosition -= numberOfWhiteSpaces; + } + + mEventData->mImfManager.SetCursorPosition( cursorPosition ); + mEventData->mImfManager.NotifyCursorPosition(); + } +} + +CharacterIndex Controller::Impl::GetLogicalCursorPosition() const +{ + CharacterIndex cursorPosition = 0u; + + if( mEventData ) + { + if( ( EventData::SELECTING == mEventData->mState ) || + ( EventData::SELECTION_HANDLE_PANNING == mEventData->mState ) ) + { + cursorPosition = std::min( mEventData->mRightSelectionPosition, mEventData->mLeftSelectionPosition ); + } + else + { + cursorPosition = mEventData->mPrimaryCursorPosition; + } + } + + return cursorPosition; +} + +Length Controller::Impl::GetNumberOfWhiteSpaces( CharacterIndex index ) const +{ + Length numberOfWhiteSpaces = 0u; + + // Get the buffer to the text. + Character* utf32CharacterBuffer = mLogicalModel->mText.Begin(); + + const Length totalNumberOfCharacters = mLogicalModel->mText.Count(); + for( ; index < totalNumberOfCharacters; ++index, ++numberOfWhiteSpaces ) + { + if( !TextAbstraction::IsWhiteSpace( *( utf32CharacterBuffer + index ) ) ) + { + break; + } + } + + return numberOfWhiteSpaces; +} + +void Controller::Impl::GetText( CharacterIndex index, std::string& text ) const +{ + // Get the total number of characters. + Length numberOfCharacters = mLogicalModel->mText.Count(); + + // Retrieve the text. + if( 0u != numberOfCharacters ) + { + Utf32ToUtf8( mLogicalModel->mText.Begin() + index, numberOfCharacters - index, text ); + } +} + void Controller::Impl::CalculateTextUpdateIndices( Length& numberOfCharacters ) { mTextUpdateInfo.mParagraphCharacterIndex = 0u; diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index cefc5aa..003aec5 100644 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -429,6 +429,37 @@ struct Controller::Impl } } + /** + * @brief Helper to notify IMF manager with surrounding text & cursor changes. + */ + void NotifyImfManager(); + + /** + * @brief Retrieve the current cursor position. + * + * @return The cursor position. + */ + CharacterIndex GetLogicalCursorPosition() const; + + /** + * @brief Retrieves the number of consecutive white spaces starting from the given @p index. + * + * @param[in] index The character index from where to count the number of consecutive white spaces. + * + * @return The number of consecutive white spaces. + */ + Length GetNumberOfWhiteSpaces( CharacterIndex index ) const; + + /** + * @brief Retrieve any text previously set starting from the given @p index. + * + * @param[in] index The character index from where to retrieve the text. + * @param[out] text A string of UTF-8 characters. + * + * @see Dali::Toolkit::Text::Controller::GetText() + */ + void GetText( CharacterIndex index, std::string& text ) const; + bool IsClipboardEmpty() { bool result( mClipboard && mClipboard.NumberOfItems() ); diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 2891953..96a2dc3 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -292,9 +292,6 @@ void Controller::SetText( const std::string& text ) mImpl->mEventData->mEventQueue.clear(); } - // Notify IMF as text changed - NotifyImfManager(); - // Do this last since it provides callbacks into application code mImpl->mControlInterface.TextChanged(); } @@ -303,12 +300,8 @@ void Controller::GetText( std::string& text ) const { if( !mImpl->IsShowingPlaceholderText() ) { - Vector& utf32Characters = mImpl->mLogicalModel->mText; - - if( 0u != utf32Characters.Count() ) - { - Utf32ToUtf8( &utf32Characters[0], utf32Characters.Count(), text ); - } + // Retrieves the text string. + mImpl->GetText( 0u, text ); } else { @@ -316,16 +309,6 @@ void Controller::GetText( std::string& text ) const } } -unsigned int Controller::GetLogicalCursorPosition() const -{ - if( NULL != mImpl->mEventData ) - { - return mImpl->mEventData->mPrimaryCursorPosition; - } - - return 0u; -} - void Controller::SetPlaceholderText( PlaceholderType type, const std::string& text ) { if( NULL != mImpl->mEventData ) @@ -2018,9 +2001,13 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) textChanged = true; } - if( ( mImpl->mEventData->mState != EventData::INTERRUPTED ) && - ( mImpl->mEventData->mState != EventData::INACTIVE ) ) + if ( ( mImpl->mEventData->mState != EventData::INTERRUPTED ) && + ( mImpl->mEventData->mState != EventData::INACTIVE ) && + ( Dali::DALI_KEY_SHIFT_LEFT != keyCode ) ) { + // Should not change the state if the key is the shift send by the imf manager. + // Otherwise, when the state is SELECTING the text controller can't send the right + // surrounding info to the imf. mImpl->ChangeState( EventData::EDITING ); } @@ -2564,12 +2551,6 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt mImpl->SendSelectionToClipboard( true ); // Synchronous call to modify text mImpl->mOperationsPending = ALL_OPERATIONS; - // This is to reset the virtual keyboard to Upper-case - if( 0u == mImpl->mLogicalModel->mText.Count() ) - { - NotifyImfManager(); - } - if( ( 0u != mImpl->mLogicalModel->mText.Count() ) || !mImpl->IsPlaceholderAvailable() ) { @@ -2632,35 +2613,36 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, const ImfManager::ImfEventData& imfEvent ) { - bool update = false; + // Whether the text needs to be relaid-out. bool requestRelayout = false; - std::string text; - unsigned int cursorPosition = 0u; + // Whether to retrieve the text and cursor position to be sent to the IMF manager. + bool retrieveText = false; + bool retrieveCursor = false; switch( imfEvent.eventName ) { case ImfManager::COMMIT: { InsertText( imfEvent.predictiveString, Text::Controller::COMMIT ); - update = true; requestRelayout = true; + retrieveCursor = true; break; } case ImfManager::PREEDIT: { InsertText( imfEvent.predictiveString, Text::Controller::PRE_EDIT ); - update = true; requestRelayout = true; + retrieveCursor = true; break; } case ImfManager::DELETESURROUNDING: { - update = RemoveText( imfEvent.cursorOffset, - imfEvent.numberOfChars, - DONT_UPDATE_INPUT_STYLE ); + const bool textDeleted = RemoveText( imfEvent.cursorOffset, + imfEvent.numberOfChars, + DONT_UPDATE_INPUT_STYLE ); - if( update ) + if( textDeleted ) { if( ( 0u != mImpl->mLogicalModel->mText.Count() ) || !mImpl->IsPlaceholderAvailable() ) @@ -2673,17 +2655,16 @@ ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, cons } mImpl->mEventData->mUpdateCursorPosition = true; mImpl->mEventData->mScrollAfterDelete = true; + + requestRelayout = true; + retrieveCursor = true; } - requestRelayout = true; break; } case ImfManager::GETSURROUNDING: { - GetText( text ); - cursorPosition = GetLogicalCursorPosition(); - - imfManager.SetSurroundingText( text ); - imfManager.SetCursorPosition( cursorPosition ); + retrieveText = true; + retrieveCursor = true; break; } case ImfManager::VOID: @@ -2693,12 +2674,6 @@ ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, cons } } // end switch - if( ImfManager::GETSURROUNDING != imfEvent.eventName ) - { - GetText( text ); - cursorPosition = GetLogicalCursorPosition(); - } - if( requestRelayout ) { mImpl->mOperationsPending = ALL_OPERATIONS; @@ -2708,7 +2683,32 @@ ImfManager::ImfCallbackData Controller::OnImfEvent( ImfManager& imfManager, cons mImpl->mControlInterface.TextChanged(); } - ImfManager::ImfCallbackData callbackData( update, cursorPosition, text, false ); + std::string text; + CharacterIndex cursorPosition = 0u; + Length numberOfWhiteSpaces = 0u; + + if( retrieveCursor ) + { + numberOfWhiteSpaces = mImpl->GetNumberOfWhiteSpaces( 0u ); + + cursorPosition = mImpl->GetLogicalCursorPosition(); + + if( cursorPosition < numberOfWhiteSpaces ) + { + cursorPosition = 0u; + } + else + { + cursorPosition -= numberOfWhiteSpaces; + } + } + + if( retrieveText ) + { + mImpl->GetText( numberOfWhiteSpaces, text ); + } + + ImfManager::ImfCallbackData callbackData( ( retrieveText || retrieveCursor ), cursorPosition, text, false ); return callbackData; } @@ -2746,11 +2746,6 @@ bool Controller::BackspaceKeyEvent() if( removed ) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p DALI_KEY_BACKSPACE RemovedText\n", this ); - // Notifiy the IMF manager after text changed - // Automatic Upper-case and restarting prediction on an existing word require this. - NotifyImfManager(); - if( ( 0u != mImpl->mLogicalModel->mText.Count() ) || !mImpl->IsPlaceholderAvailable() ) { @@ -2767,23 +2762,6 @@ bool Controller::BackspaceKeyEvent() return removed; } -void Controller::NotifyImfManager() -{ - if( NULL != mImpl->mEventData ) - { - if( mImpl->mEventData->mImfManager ) - { - // Notifying IMF of a cursor change triggers a surrounding text request so updating it now. - std::string text; - GetText( text ); - mImpl->mEventData->mImfManager.SetSurroundingText( text ); - - mImpl->mEventData->mImfManager.SetCursorPosition( GetLogicalCursorPosition() ); - mImpl->mEventData->mImfManager.NotifyCursorPosition(); - } - } -} - void Controller::ShowPlaceholderText() { if( mImpl->IsPlaceholderAvailable() ) diff --git a/dali-toolkit/internal/text/text-controller.h b/dali-toolkit/internal/text/text-controller.h index 7badd1e..e559fad 100644 --- a/dali-toolkit/internal/text/text-controller.h +++ b/dali-toolkit/internal/text/text-controller.h @@ -191,7 +191,7 @@ public: /** * @brief Retrieve any text previously set. * - * @return A string of UTF-8 characters. + * @param[out] text A string of UTF-8 characters. */ void GetText( std::string& text ) const; @@ -212,13 +212,6 @@ public: UpdateInputStyleType type ); /** - * @brief Retrieve the current cursor position. - * - * @return The cursor position. - */ - unsigned int GetLogicalCursorPosition() const; - - /** * @brief Replaces any placeholder text previously set. * * @param[in] type Different placeholder-text can be shown when the control is active/inactive. @@ -963,11 +956,6 @@ private: bool BackspaceKeyEvent(); /** - * @brief Helper to notify IMF manager with surrounding text & cursor changes. - */ - void NotifyImfManager(); - - /** * @brief Helper to clear font-specific data. */ void ShowPlaceholderText();