X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-impl.cpp;h=ec74f6734f5bd21e872a996eb571b515a471a9aa;hb=2b4be89fbaad622c93c957ad425a485ba0cc8bd4;hp=f39effea67f56b4af5c766523d8e4aab4e0bb136;hpb=09f35f81061ca470e79ac674024b9e587ff44e7f;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index f39effe..ec74f67 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -20,6 +20,7 @@ // EXTERNAL INCLUDES #include +#include // INTERNAL INCLUDES #include @@ -35,6 +36,10 @@ namespace { +#if defined(DEBUG_ENABLED) + Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_CONTROLS"); +#endif + /** * @brief Some characters can be shaped in more than one glyph. * This struct is used to retrieve metrics from these group of glyphs. @@ -138,14 +143,14 @@ EventData::~EventData() bool Controller::Impl::ProcessInputEvents() { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::ProcessInputEvents\n" ); if( NULL == mEventData ) { // Nothing to do if there is no text input. + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::ProcessInputEvents no event data\n" ); return false; } - mEventData->mDecoratorUpdated = false; - if( mEventData->mDecorator ) { for( std::vector::iterator iter = mEventData->mEventQueue.begin(); @@ -154,16 +159,6 @@ bool Controller::Impl::ProcessInputEvents() { switch( iter->type ) { - case Event::KEYBOARD_FOCUS_GAIN_EVENT: - { - OnKeyboardFocus( true ); - break; - } - case Event::KEYBOARD_FOCUS_LOST_EVENT: - { - OnKeyboardFocus( false ); - break; - } case Event::CURSOR_KEY_EVENT: { OnCursorKeyEvent( *iter ); @@ -235,84 +230,11 @@ bool Controller::Impl::ProcessInputEvents() mEventData->mEventQueue.clear(); - return mEventData->mDecoratorUpdated; -} - -void Controller::Impl::ReplaceTextWithPlaceholder() -{ - DALI_ASSERT_DEBUG( mEventData && "No placeholder text available" ); - if( !mEventData ) - { - return; - } - - // Disable handles when showing place-holder text - mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, false ); - mEventData->mDecorator->SetHandleActive( LEFT_SELECTION_HANDLE, false ); - mEventData->mDecorator->SetHandleActive( RIGHT_SELECTION_HANDLE, false ); - - const char* text( NULL ); - size_t size( 0 ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::ProcessInputEvents\n" ); - if( EventData::INACTIVE != mEventData->mState && - 0u != mEventData->mPlaceholderTextActive.c_str() ) - { - text = mEventData->mPlaceholderTextActive.c_str(); - size = mEventData->mPlaceholderTextActive.size(); - } - - else - { - text = mEventData->mPlaceholderTextInactive.c_str(); - size = mEventData->mPlaceholderTextInactive.size(); - } - - // Reset buffers. - mLogicalModel->mText.Clear(); - mLogicalModel->mScriptRuns.Clear(); - mLogicalModel->mFontRuns.Clear(); - mLogicalModel->mLineBreakInfo.Clear(); - mLogicalModel->mWordBreakInfo.Clear(); - mLogicalModel->mBidirectionalParagraphInfo.Clear(); - mLogicalModel->mCharacterDirections.Clear(); - mLogicalModel->mBidirectionalLineInfo.Clear(); - mLogicalModel->mLogicalToVisualMap.Clear(); - mLogicalModel->mVisualToLogicalMap.Clear(); - mVisualModel->mGlyphs.Clear(); - mVisualModel->mGlyphsToCharacters.Clear(); - mVisualModel->mCharactersToGlyph.Clear(); - mVisualModel->mCharactersPerGlyph.Clear(); - mVisualModel->mGlyphsPerCharacter.Clear(); - mVisualModel->mGlyphPositions.Clear(); - mVisualModel->mLines.Clear(); - mVisualModel->ClearCaches(); - mVisualModel->SetTextColor( mEventData->mPlaceholderTextColor ); - - // Convert text into UTF-32 - Vector& utf32Characters = mLogicalModel->mText; - utf32Characters.Resize( size ); - - // This is a bit horrible but std::string returns a (signed) char* - const uint8_t* utf8 = reinterpret_cast( text ); - - // Transform a text array encoded in utf8 into an array encoded in utf32. - // It returns the actual number of characters. - Length characterCount = Utf8ToUtf32( utf8, size, utf32Characters.Begin() ); - utf32Characters.Resize( characterCount ); - - // Reset the cursor position - mEventData->mPrimaryCursorPosition = 0; - - // The natural size needs to be re-calculated. - mRecalculateNaturalSize = true; - - // Apply modifications to the model - mOperationsPending = ALL_OPERATIONS; - UpdateModel( ALL_OPERATIONS ); - mOperationsPending = static_cast( LAYOUT | - ALIGN | - UPDATE_ACTUAL_SIZE | - REORDER ); + bool decoratorUpdated = mEventData->mDecoratorUpdated; + mEventData->mDecoratorUpdated = false; + return decoratorUpdated; } void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) @@ -322,7 +244,7 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) Vector& utf32Characters = mLogicalModel->mText; - const Length numberOfCharacters = mLogicalModel->GetNumberOfCharacters(); + const Length numberOfCharacters = utf32Characters.Count(); Vector& lineBreakInfo = mLogicalModel->mLineBreakInfo; if( GET_LINE_BREAKS & operations ) @@ -475,24 +397,6 @@ void Controller::Impl::GetDefaultFonts( Vector& fonts, Length numberOfC } } -void Controller::Impl::OnKeyboardFocus( bool hasFocus ) -{ - if( NULL == mEventData ) - { - // Nothing to do if there is no text input. - return; - } - - if( !hasFocus ) - { - ChangeState( EventData::INACTIVE ); - } - else - { - ChangeState( EventData::EDITING ); - } -} - void Controller::Impl::OnCursorKeyEvent( const Event& event ) { if( NULL == mEventData ) @@ -532,44 +436,33 @@ void Controller::Impl::OnCursorKeyEvent( const Event& event ) void Controller::Impl::OnTapEvent( const Event& event ) { - if( NULL == mEventData ) + if( NULL != mEventData ) { - // Nothing to do if there is no text input. - return; - } + const unsigned int tapCount = event.p1.mUint; - const unsigned int tapCount = event.p1.mUint; - - if( 1u == tapCount ) - { - // Grab handle is not shown until a tap is received whilst EDITING - if( EventData::EDITING == mEventData->mState && - !IsShowingPlaceholderText() ) + if( 1u == tapCount ) { - if( mEventData->mGrabHandleEnabled ) + if( ! IsShowingPlaceholderText() ) { - mEventData->mDecorator->SetHandleActive( GRAB_HANDLE, true ); - } - mEventData->mDecorator->SetPopupActive( false ); - } - - ChangeState( EventData::EDITING ); - - const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; - const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; - - mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, - yPosition ); + const float xPosition = event.p2.mFloat - mEventData->mScrollPosition.x - mAlignmentOffset.x; + const float yPosition = event.p3.mFloat - mEventData->mScrollPosition.y - mAlignmentOffset.y; - mEventData->mUpdateCursorPosition = true; - mEventData->mScrollAfterUpdateCursorPosition = true; - } - else if( mEventData->mSelectionEnabled && - ( 2u == tapCount ) ) - { - ChangeState( EventData::SELECTING ); + mEventData->mPrimaryCursorPosition = GetClosestCursorIndex( xPosition, + yPosition ); + } + else + { + mEventData->mPrimaryCursorPosition = 0u; + } - RepositionSelectionHandles( event.p2.mFloat, event.p3.mFloat ); + mEventData->mUpdateCursorPosition = true; + mEventData->mScrollAfterUpdateCursorPosition = true; + } + else if( mEventData->mSelectionEnabled && + ( 2u == tapCount ) ) + { + RepositionSelectionHandles( event.p2.mFloat, event.p3.mFloat ); + } } } @@ -740,23 +633,8 @@ void Controller::Impl::ChangeState( EventData::State newState ) if( mEventData->mState != newState ) { - // Show different placeholder when switching between active & inactive - bool updatePlaceholder( false ); - if( IsShowingPlaceholderText() && - ( EventData::INACTIVE == newState || - EventData::INACTIVE == mEventData->mState ) ) - { - updatePlaceholder = true; - } - mEventData->mState = newState; - if( updatePlaceholder ) - { - ReplaceTextWithPlaceholder(); - mEventData->mDecoratorUpdated = true; - } - if( EventData::INACTIVE == mEventData->mState ) { mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_NONE ); @@ -1155,45 +1033,107 @@ CharacterIndex Controller::Impl::CalculateNewCursorIndex( CharacterIndex index ) void Controller::Impl::UpdateCursorPosition() { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->Controller::UpdateCursorPosition %p\n", this ); if( NULL == mEventData ) { // Nothing to do if there is no text input. + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::UpdateCursorPosition no event data\n" ); return; } - CursorInfo cursorInfo; - GetCursorPosition( mEventData->mPrimaryCursorPosition, - cursorInfo ); + if( IsShowingPlaceholderText() ) + { + // Do not want to use the place-holder text to set the cursor position. - const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; - const Vector2 cursorPosition = cursorInfo.primaryPosition + offset; + // Use the line's height of the font's family set to set the cursor's size. + // If there is no font's family set, use the default font. + // Use the current alignment to place the cursor at the beginning, center or end of the box. - // Sets the cursor position. - mEventData->mDecorator->SetPosition( PRIMARY_CURSOR, - cursorPosition.x, - cursorPosition.y, - cursorInfo.primaryCursorHeight, - cursorInfo.lineHeight ); + float lineHeight = 0.f; - // Sets the grab handle position. - mEventData->mDecorator->SetPosition( GRAB_HANDLE, - cursorPosition.x, - cursorPosition.y, - cursorInfo.lineHeight ); + FontId defaultFontId = 0u; + if( NULL == mFontDefaults ) + { + defaultFontId = mFontClient.GetFontId( EMPTY_STRING, + EMPTY_STRING ); + } + else + { + defaultFontId = mFontDefaults->GetFontId( mFontClient ); + } - if( cursorInfo.isSecondaryCursor ) - { - mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_BOTH ); - mEventData->mDecorator->SetPosition( SECONDARY_CURSOR, - cursorInfo.secondaryPosition.x + offset.x, - cursorInfo.secondaryPosition.y + offset.y, - cursorInfo.secondaryCursorHeight, - cursorInfo.lineHeight ); + Text::FontMetrics fontMetrics; + mFontClient.GetFontMetrics( defaultFontId, fontMetrics ); + + lineHeight = fontMetrics.ascender - fontMetrics.descender; + + + Vector2 cursorPosition; + + switch( mLayoutEngine.GetHorizontalAlignment() ) + { + case LayoutEngine::HORIZONTAL_ALIGN_BEGIN: + { + cursorPosition.x = 1.f; + break; + } + case LayoutEngine::HORIZONTAL_ALIGN_CENTER: + { + cursorPosition.x = floor( 0.5f * mControlSize.width ); + break; + } + case LayoutEngine::HORIZONTAL_ALIGN_END: + { + cursorPosition.x = mControlSize.width; + break; + } + } + + mEventData->mDecorator->SetPosition( PRIMARY_CURSOR, + cursorPosition.x, + cursorPosition.y, + lineHeight, + lineHeight ); } else { - mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY ); + CursorInfo cursorInfo; + GetCursorPosition( mEventData->mPrimaryCursorPosition, + cursorInfo ); + + const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; + const Vector2 cursorPosition = cursorInfo.primaryPosition + offset; + + // Sets the cursor position. + mEventData->mDecorator->SetPosition( PRIMARY_CURSOR, + cursorPosition.x, + cursorPosition.y, + cursorInfo.primaryCursorHeight, + cursorInfo.lineHeight ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Primary cursor position: %f,%f\n", cursorPosition.x, cursorPosition.y ); + + // Sets the grab handle position. + mEventData->mDecorator->SetPosition( GRAB_HANDLE, + cursorPosition.x, + cursorPosition.y, + cursorInfo.lineHeight ); + + if( cursorInfo.isSecondaryCursor ) + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_BOTH ); + mEventData->mDecorator->SetPosition( SECONDARY_CURSOR, + cursorInfo.secondaryPosition.x + offset.x, + cursorInfo.secondaryPosition.y + offset.y, + cursorInfo.secondaryCursorHeight, + cursorInfo.lineHeight ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Secondary cursor position: %f,%f\n", cursorInfo.secondaryPosition.x + offset.x, cursorInfo.secondaryPosition.y + offset.y ); + } + else + { + mEventData->mDecorator->SetActiveCursor( ACTIVE_CURSOR_PRIMARY ); + } } + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--Controller::UpdateCursorPosition\n" ); } void Controller::Impl::UpdateSelectionHandle( HandleType handleType )