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.cpp;h=64003704f151fd6d5bde29ad2eb81e158c91e5fa;hp=af0698694314e0cb967fbc16f03de046027ef14c;hb=b601d4dd5163d5c27ba6b9b17a376143d2da985c;hpb=27c3ff64b7236bb404bd931259674094390d63a1 diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index af06986..6400370 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -117,7 +117,7 @@ void Controller::SetText( const std::string& text ) } // Reset keyboard as text changed - mImpl->PreEditReset(); + mImpl->ResetImfManager(); } void Controller::GetText( std::string& text ) const @@ -862,7 +862,7 @@ bool Controller::DoRelayout( const Size& size, layoutSize = mImpl->mVisualModel->GetActualSize(); } - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::DoRelayout no glyphs, view updated %s\n", ( viewUpdated ? "true" : "false" ) ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::DoRelayout, view updated %s\n", ( viewUpdated ? "true" : "false" ) ); return viewUpdated; } @@ -946,8 +946,13 @@ void Controller::KeyboardFocusGainEvent() if( mImpl->mEventData ) { - Event event( Event::KEYBOARD_FOCUS_GAIN_EVENT ); - mImpl->mEventData->mEventQueue.push_back( event ); + mImpl->ChangeState( EventData::EDITING ); + + if( mImpl->IsShowingPlaceholderText() ) + { + // Show alternative placeholder-text when editing + ShowPlaceholderText(); + } mImpl->RequestRelayout(); } @@ -959,8 +964,13 @@ void Controller::KeyboardFocusLostEvent() if( mImpl->mEventData ) { - Event event( Event::KEYBOARD_FOCUS_LOST_EVENT ); - mImpl->mEventData->mEventQueue.push_back( event ); + mImpl->ChangeState( EventData::INACTIVE ); + + if( mImpl->IsShowingPlaceholderText() ) + { + // Revert to regular placeholder-text when not editing + ShowPlaceholderText(); + } mImpl->RequestRelayout(); } @@ -993,6 +1003,11 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) } else if( Dali::DALI_KEY_BACKSPACE == keyCode ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p DALI_KEY_BACKSPACE\n", this ); + + // IMF manager is no longer handling key-events + mImpl->ClearPreEditFlag(); + // Remove the character before the current cursor position bool removed = RemoveText( -1, 1 ); @@ -1011,6 +1026,11 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) } else { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p keyString %s\n", this, keyString.c_str() ); + + // IMF manager is no longer handling key-events + mImpl->ClearPreEditFlag(); + InsertText( keyString, COMMIT ); } @@ -1028,61 +1048,73 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ bool maxLengthReached( false ); DALI_ASSERT_DEBUG( NULL != mImpl->mEventData && "Unexpected InsertText" ) - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::InsertText %p %s (%s) mPreEditFlag %d cursor %d\n", - this, text.c_str(), (COMMIT == type ? "COMMIT" : "PRE_EDIT"), mImpl->mEventData->mPreEditFlag, mImpl->mEventData->mPrimaryCursorPosition ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::InsertText %p %s (%s) mPrimaryCursorPosition %d mPreEditFlag %d mPreEditStartPosition %d mPreEditLength %d\n", + this, text.c_str(), (COMMIT == type ? "COMMIT" : "PRE_EDIT"), + mImpl->mEventData->mPrimaryCursorPosition, mImpl->mEventData->mPreEditFlag, mImpl->mEventData->mPreEditStartPosition, mImpl->mEventData->mPreEditLength ); + + Vector utf32Characters; + Length characterCount( 0u ); if( ! text.empty() ) { + // The placeholder text is no longer needed if( mImpl->IsShowingPlaceholderText() ) { ResetText(); } + + // Convert text into UTF-32 + utf32Characters.Resize( text.size() ); + + // This is a bit horrible but std::string returns a (signed) char* + const uint8_t* utf8 = reinterpret_cast( text.c_str() ); + + // Transform a text array encoded in utf8 into an array encoded in utf32. + // It returns the actual number of characters. + characterCount = Utf8ToUtf32( utf8, text.size(), utf32Characters.Begin() ); + utf32Characters.Resize( characterCount ); + + DALI_ASSERT_DEBUG( text.size() >= utf32Characters.Count() && "Invalid UTF32 conversion length" ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "UTF8 size %d, UTF32 size %d\n", text.size(), utf32Characters.Count() ); } - if( mImpl->mEventData ) + if( 0u != utf32Characters.Count() ) { - if( COMMIT == type ) - { - mImpl->mEventData->mPreEditFlag = false; - } - else // PRE_EDIT + // Handle the IMF (predicitive text) state changes + if( mImpl->mEventData ) { if( mImpl->mEventData->mPreEditFlag && 0 != mImpl->mEventData->mPreEditLength ) { // Remove previous pre-edit text + CharacterIndex offset = mImpl->mEventData->mPrimaryCursorPosition - mImpl->mEventData->mPreEditStartPosition; + removedPreEdit = RemoveText( -static_cast(offset), mImpl->mEventData->mPreEditLength ); + mImpl->mEventData->mPrimaryCursorPosition = mImpl->mEventData->mPreEditStartPosition; - removedPreEdit = RemoveText( -1, mImpl->mEventData->mPreEditLength ); + mImpl->mEventData->mPreEditLength = 0; } - else - { - // Record the start of the pre-edit text - mImpl->mEventData->mPreEditStartPosition = mImpl->mEventData->mPrimaryCursorPosition; - mImpl->mEventData->mPreEditLength = text.size(); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "mPreEditStartPosition %d mPreEditLength %d\n", mImpl->mEventData->mPreEditStartPosition, mImpl->mEventData->mPreEditLength ); + if( COMMIT == type ) + { + // IMF manager is no longer handling key-events + mImpl->ClearPreEditFlag(); } + else // PRE_EDIT + { + if( ! mImpl->mEventData->mPreEditFlag ) + { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Entered PreEdit state" ); - mImpl->mEventData->mPreEditFlag = true; - } - } - - if( ! text.empty() ) - { - // Convert text into UTF-32 - Vector utf32Characters; - utf32Characters.Resize( text.size() ); - - // This is a bit horrible but std::string returns a (signed) char* - const uint8_t* utf8 = reinterpret_cast( text.c_str() ); + // Record the start of the pre-edit text + mImpl->mEventData->mPreEditStartPosition = mImpl->mEventData->mPrimaryCursorPosition; + } - // Transform a text array encoded in utf8 into an array encoded in utf32. - // It returns the actual number of characters. - Length characterCount = Utf8ToUtf32( utf8, text.size(), utf32Characters.Begin() ); - utf32Characters.Resize( characterCount ); + mImpl->mEventData->mPreEditLength = utf32Characters.Count(); + mImpl->mEventData->mPreEditFlag = true; - DALI_ASSERT_DEBUG( text.size() >= utf32Characters.Count() && "Invalid UTF32 conversion length" ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "UTF8 size %d, UTF32 size %d\n", text.size(), utf32Characters.Count() ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "mPreEditStartPosition %d mPreEditLength %d\n", mImpl->mEventData->mPreEditStartPosition, mImpl->mEventData->mPreEditLength ); + } + } const Length numberOfCharactersInModel = mImpl->mLogicalModel->GetNumberOfCharacters(); @@ -1109,7 +1141,8 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Inserted %d characters, new size %d new cursor %d\n", maxSizeOfNewText, mImpl->mLogicalModel->mText.Count(), mImpl->mEventData->mPrimaryCursorPosition ); } - if( removedPreEdit || !text.empty() ) + if( removedPreEdit || + 0 != utf32Characters.Count() ) { // Queue an inserted event mImpl->QueueModifyEvent( ModifyEvent::TEXT_INSERTED ); @@ -1121,7 +1154,7 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ mImpl->mControlInterface.MaxLengthReached(); - mImpl->PreEditReset(); + mImpl->ResetImfManager(); } } @@ -1135,14 +1168,8 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y ) { bool tapDuringEditMode( EventData::EDITING == mImpl->mEventData->mState ); - mImpl->ChangeState( EventData::EDITING ); - - if( mImpl->IsShowingPlaceholderText() ) - { - // Alternative placeholder-text is used when editing - ShowPlaceholderText(); - } - else if( EventData::EDITING == mImpl->mEventData->mState ) + if( ! mImpl->IsShowingPlaceholderText() && + EventData::EDITING == mImpl->mEventData->mState ) { // Grab handle is not shown until a tap is received whilst EDITING if( tapDuringEditMode ) @@ -1151,6 +1178,8 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y ) } mImpl->mEventData->mDecorator->SetPopupActive( false ); } + + mImpl->ChangeState( EventData::EDITING ); } else if( mImpl->mEventData->mSelectionEnabled && ( 2u == tapCount ) ) @@ -1172,7 +1201,7 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y ) } // Reset keyboard as tap event has occurred. - mImpl->PreEditReset(); + mImpl->ResetImfManager(); } void Controller::PanEvent( Gesture::State state, const Vector2& displacement )