X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller.cpp;h=adf4e75f11ceef1068266a344cbe9b6916dca9d6;hb=27466c9803e1305dd94eccdb848f7ba66bf8af00;hp=99bed8308cf4a6ea549c370faa25aaba05e2cef3;hpb=b65b76178d928c38e88181fcb52c5fa2fd590036;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 99bed83..adf4e75 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 @@ -128,12 +128,7 @@ void Controller::GetText( std::string& text ) const if( 0u != utf32Characters.Count() ) { - uint32_t numberOfBytes = GetNumberOfUtf8Bytes( &utf32Characters[0], utf32Characters.Count() ); - - text.resize( numberOfBytes ); - - // This is a bit horrible but std::string returns a (signed) char* - Utf32ToUtf8( &utf32Characters[0], utf32Characters.Count(), reinterpret_cast(&text[0]) ); + Utf32ToUtf8( &utf32Characters[0], utf32Characters.Count(), text ); } } else @@ -165,7 +160,12 @@ void Controller::SetPlaceholderText( PlaceholderType type, const std::string& te mImpl->mEventData->mPlaceholderTextActive = text; } - ShowPlaceholderText(); + // Update placeholder if there is no text + if( mImpl->IsShowingPlaceholderText() || + 0u == mImpl->mLogicalModel->mText.Count() ) + { + ShowPlaceholderText(); + } } } @@ -457,6 +457,7 @@ const Vector2& Controller::GetAlignmentOffset() const Vector3 Controller::GetNaturalSize() { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::GetNaturalSize\n" ); Vector3 naturalSize; // Make sure the model is up-to-date before layouting @@ -497,10 +498,14 @@ Vector3 Controller::GetNaturalSize() mImpl->mVisualModel->SetNaturalSize( naturalSize.GetVectorXY() ); mImpl->mRecalculateNaturalSize = false; + + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::GetNaturalSize calculated %f,%f,%f\n", naturalSize.x, naturalSize.y, naturalSize.z ); } else { naturalSize = mImpl->mVisualModel->GetNaturalSize(); + + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::GetNaturalSize cached %f,%f,%f\n", naturalSize.x, naturalSize.y, naturalSize.z ); } return naturalSize; @@ -508,6 +513,7 @@ Vector3 Controller::GetNaturalSize() float Controller::GetHeightForWidth( float width ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::GetHeightForWidth %p width %f\n", this, width ); // Make sure the model is up-to-date before layouting ProcessModifyEvents(); @@ -541,10 +547,12 @@ float Controller::GetHeightForWidth( float width ) // Do the size related operations again. mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | sizeOperations ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::GetHeightForWidth calculated %f\n", layoutSize.height ); } else { layoutSize = mImpl->mVisualModel->GetActualSize(); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::GetHeightForWidth cached %f\n", layoutSize.height ); } return layoutSize.height; @@ -552,7 +560,7 @@ float Controller::GetHeightForWidth( float width ) bool Controller::Relayout( const Size& size ) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::Relayout %p --> size %f,%f\n", this, size.width, size.height ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::Relayout %p size %f,%f\n", this, size.width, size.height ); if( ( size.width < Math::MACHINE_EPSILON_1000 ) || ( size.height < Math::MACHINE_EPSILON_1000 ) ) { @@ -563,7 +571,7 @@ bool Controller::Relayout( const Size& size ) glyphsRemoved = true; } // Not worth to relayout if width or height is equal to zero. - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::Relayout <-- (skipped)\n" ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::Relayout (skipped)\n" ); return glyphsRemoved; } @@ -602,7 +610,7 @@ bool Controller::Relayout( const Size& size ) updated = mImpl->ProcessInputEvents() || updated; } - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::Relayout <--\n" ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::Relayout\n" ); return updated; } @@ -726,6 +734,7 @@ bool Controller::DoRelayout( const Size& size, OperationsMask operationsRequired, Size& layoutSize ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::DoRelayout %p size %f,%f\n", this, size.width, size.height ); bool viewUpdated( false ); // Calculate the operations to be done. @@ -742,6 +751,7 @@ bool Controller::DoRelayout( const Size& size, if( 0u == numberOfGlyphs ) { // Nothing else to do if there is no glyphs. + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::DoRelayout no glyphs, view updated true\n" ); return true; } @@ -857,6 +867,7 @@ bool Controller::DoRelayout( const Size& size, layoutSize = mImpl->mVisualModel->GetActualSize(); } + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::DoRelayout, view updated %s\n", ( viewUpdated ? "true" : "false" ) ); return viewUpdated; } @@ -940,8 +951,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(); } @@ -953,8 +969,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(); } @@ -987,6 +1008,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 ); @@ -995,6 +1021,7 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) if( 0u == mImpl->mLogicalModel->mText.Count() ) { ShowPlaceholderText(); + mImpl->mEventData->mUpdateCursorPosition = true; } else { @@ -1004,6 +1031,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 ); } @@ -1021,61 +1053,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(); @@ -1102,7 +1146,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 ); @@ -1114,7 +1159,7 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ mImpl->mControlInterface.MaxLengthReached(); - mImpl->PreEditReset(); + mImpl->ResetImfManager(); } } @@ -1128,14 +1173,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 ) @@ -1144,6 +1183,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 ) ) @@ -1165,7 +1206,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 )