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.cpp;h=e77f00d067b77a2d607f945ade851017e690f008;hp=f64c266441853e69a296e7b86044bd225aa0368c;hb=7d540590dfce9f3c3773ca25486b3089b002c553;hpb=9598e692217c5fb541d862a3957b3efd5fd5171d diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index f64c266..e77f00d 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -300,17 +300,17 @@ void Controller::Impl::CalculateTextUpdateIndices( Length& numberOfCharacters ) } else { - CharacterIndex lastIndex = 0u; + Length numberOfCharactersToUpdate = 0u; if( mTextUpdateInfo.mFullRelayoutNeeded ) { - lastIndex = mTextUpdateInfo.mPreviousNumberOfCharacters; + numberOfCharactersToUpdate = mTextUpdateInfo.mPreviousNumberOfCharacters; } else { - lastIndex = ( mTextUpdateInfo.mNumberOfCharactersToRemove > 0u ) ? mTextUpdateInfo.mNumberOfCharactersToRemove : 1u; + numberOfCharactersToUpdate = ( mTextUpdateInfo.mNumberOfCharactersToRemove > 0u ) ? mTextUpdateInfo.mNumberOfCharactersToRemove : 1u; } mLogicalModel->FindParagraphs( mTextUpdateInfo.mCharacterIndex, - lastIndex, + numberOfCharactersToUpdate, paragraphsToBeUpdated ); } @@ -338,42 +338,43 @@ void Controller::Impl::CalculateTextUpdateIndices( Length& numberOfCharacters ) numberOfCharacters = lastParagraph.characterRun.characterIndex + lastParagraph.characterRun.numberOfCharacters - mTextUpdateInfo.mParagraphCharacterIndex; } } + mTextUpdateInfo.mRequestedNumberOfCharacters = numberOfCharacters + mTextUpdateInfo.mNumberOfCharactersToAdd - mTextUpdateInfo.mNumberOfCharactersToRemove; mTextUpdateInfo.mStartGlyphIndex = *( mVisualModel->mCharactersToGlyph.Begin() + mTextUpdateInfo.mParagraphCharacterIndex ); } void Controller::Impl::ClearFullModelData( OperationsMask operations ) { - if( GET_LINE_BREAKS & operations ) + if( NO_OPERATION != ( GET_LINE_BREAKS & operations ) ) { mLogicalModel->mLineBreakInfo.Clear(); mLogicalModel->mParagraphInfo.Clear(); } - if( GET_WORD_BREAKS & operations ) + if( NO_OPERATION != ( GET_WORD_BREAKS & operations ) ) { mLogicalModel->mLineBreakInfo.Clear(); } - if( GET_SCRIPTS & operations ) + if( NO_OPERATION != ( GET_SCRIPTS & operations ) ) { mLogicalModel->mScriptRuns.Clear(); } - if( VALIDATE_FONTS & operations ) + if( NO_OPERATION != ( VALIDATE_FONTS & operations ) ) { mLogicalModel->mFontRuns.Clear(); } if( 0u != mLogicalModel->mBidirectionalParagraphInfo.Count() ) { - if( BIDI_INFO & operations ) + if( NO_OPERATION != ( BIDI_INFO & operations ) ) { mLogicalModel->mBidirectionalParagraphInfo.Clear(); mLogicalModel->mCharacterDirections.Clear(); } - if( REORDER & operations ) + if( NO_OPERATION != ( REORDER & operations ) ) { // Free the allocated memory used to store the conversion table in the bidirectional line info run. for( Vector::Iterator it = mLogicalModel->mBidirectionalLineInfo.Begin(), @@ -387,13 +388,10 @@ void Controller::Impl::ClearFullModelData( OperationsMask operations ) bidiLineInfo.visualToLogicalMap = NULL; } mLogicalModel->mBidirectionalLineInfo.Clear(); - - mLogicalModel->mLogicalToVisualMap.Clear(); - mLogicalModel->mVisualToLogicalMap.Clear(); } } - if( SHAPE_TEXT & operations ) + if( NO_OPERATION != ( SHAPE_TEXT & operations ) ) { mVisualModel->mGlyphs.Clear(); mVisualModel->mGlyphsToCharacters.Clear(); @@ -403,17 +401,22 @@ void Controller::Impl::ClearFullModelData( OperationsMask operations ) mVisualModel->mGlyphPositions.Clear(); } - if( LAYOUT & operations ) + if( NO_OPERATION != ( LAYOUT & operations ) ) { mVisualModel->mLines.Clear(); } + + if( NO_OPERATION != ( COLOR & operations ) ) + { + mVisualModel->mColorIndices.Clear(); + } } void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, CharacterIndex endIndex, OperationsMask operations ) { const CharacterIndex endIndexPlusOne = endIndex + 1u; - if( GET_LINE_BREAKS & operations ) + if( NO_OPERATION != ( GET_LINE_BREAKS & operations ) ) { // Clear the line break info. LineBreakInfo* lineBreakInfoBuffer = mLogicalModel->mLineBreakInfo.Begin(); @@ -427,7 +430,7 @@ void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, Chara mLogicalModel->mParagraphInfo ); } - if( GET_WORD_BREAKS & operations ) + if( NO_OPERATION != ( GET_WORD_BREAKS & operations ) ) { // Clear the word break info. WordBreakInfo* wordBreakInfoBuffer = mLogicalModel->mWordBreakInfo.Begin(); @@ -436,7 +439,7 @@ void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, Chara wordBreakInfoBuffer + endIndexPlusOne ); } - if( GET_SCRIPTS & operations ) + if( NO_OPERATION != ( GET_SCRIPTS & operations ) ) { // Clear the scripts. ClearCharacterRuns( startIndex, @@ -444,7 +447,7 @@ void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, Chara mLogicalModel->mScriptRuns ); } - if( VALIDATE_FONTS & operations ) + if( NO_OPERATION != ( VALIDATE_FONTS & operations ) ) { // Clear the fonts. ClearCharacterRuns( startIndex, @@ -454,7 +457,7 @@ void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, Chara if( 0u != mLogicalModel->mBidirectionalParagraphInfo.Count() ) { - if( BIDI_INFO & operations ) + if( NO_OPERATION != ( BIDI_INFO & operations ) ) { // Clear the bidirectional paragraph info. ClearCharacterRuns( startIndex, @@ -468,7 +471,7 @@ void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, Chara characterDirectionsBuffer + endIndexPlusOne ); } - if( REORDER & operations ) + if( NO_OPERATION != ( REORDER & operations ) ) { uint32_t startRemoveIndex = mLogicalModel->mBidirectionalLineInfo.Count(); uint32_t endRemoveIndex = startRemoveIndex; @@ -494,15 +497,6 @@ void Controller::Impl::ClearCharacterModelData( CharacterIndex startIndex, Chara mLogicalModel->mBidirectionalLineInfo.Erase( bidirectionalLineInfoBuffer + startRemoveIndex, bidirectionalLineInfoBuffer + endRemoveIndex ); - - // Clear the logical to visual and the visual to logical conversion tables. - CharacterIndex* logicalToVisualMapBuffer = mLogicalModel->mLogicalToVisualMap.Begin(); - mLogicalModel->mLogicalToVisualMap.Erase( logicalToVisualMapBuffer + startIndex, - logicalToVisualMapBuffer + endIndexPlusOne ); - - CharacterIndex* visualToLogicalMapBuffer = mLogicalModel->mVisualToLogicalMap.Begin(); - mLogicalModel->mVisualToLogicalMap.Erase( visualToLogicalMapBuffer + startIndex, - visualToLogicalMapBuffer + endIndexPlusOne ); } } } @@ -512,97 +506,100 @@ void Controller::Impl::ClearGlyphModelData( CharacterIndex startIndex, Character const CharacterIndex endIndexPlusOne = endIndex + 1u; const Length numberOfCharactersRemoved = endIndexPlusOne - startIndex; - const bool clearShape = SHAPE_TEXT & operations; - const bool clearLayout = LAYOUT & operations; - - if( clearShape || clearLayout ) - { - // Convert the character index to glyph index before deleting the character to glyph and the glyphs per character buffers. - GlyphIndex* charactersToGlyphBuffer = mVisualModel->mCharactersToGlyph.Begin(); - Length* glyphsPerCharacterBuffer = mVisualModel->mGlyphsPerCharacter.Begin(); + // Convert the character index to glyph index before deleting the character to glyph and the glyphs per character buffers. + GlyphIndex* charactersToGlyphBuffer = mVisualModel->mCharactersToGlyph.Begin(); + Length* glyphsPerCharacterBuffer = mVisualModel->mGlyphsPerCharacter.Begin(); - const GlyphIndex endGlyphIndex = *( charactersToGlyphBuffer + endIndex ); - const GlyphIndex endGlyphIndexPlusOne = endGlyphIndex + *( glyphsPerCharacterBuffer + endIndex ); - const Length numberOfGlyphsRemoved = endGlyphIndexPlusOne - mTextUpdateInfo.mStartGlyphIndex; + const GlyphIndex endGlyphIndexPlusOne = *( charactersToGlyphBuffer + endIndex ) + *( glyphsPerCharacterBuffer + endIndex ); + const Length numberOfGlyphsRemoved = endGlyphIndexPlusOne - mTextUpdateInfo.mStartGlyphIndex; - if( clearShape ) + if( NO_OPERATION != ( SHAPE_TEXT & operations ) ) + { + // Update the character to glyph indices. + for( Vector::Iterator it = charactersToGlyphBuffer + endIndexPlusOne, + endIt = charactersToGlyphBuffer + mVisualModel->mCharactersToGlyph.Count(); + it != endIt; + ++it ) { - // Update the character to glyph indices. - for( Vector::Iterator it = charactersToGlyphBuffer + endIndexPlusOne, - endIt = charactersToGlyphBuffer + mVisualModel->mCharactersToGlyph.Count(); - it != endIt; - ++it ) - { - CharacterIndex& index = *it; - index -= numberOfGlyphsRemoved; - } + CharacterIndex& index = *it; + index -= numberOfGlyphsRemoved; + } - // Clear the character to glyph conversion table. - mVisualModel->mCharactersToGlyph.Erase( charactersToGlyphBuffer + startIndex, - charactersToGlyphBuffer + endIndexPlusOne ); + // Clear the character to glyph conversion table. + mVisualModel->mCharactersToGlyph.Erase( charactersToGlyphBuffer + startIndex, + charactersToGlyphBuffer + endIndexPlusOne ); - // Clear the glyphs per character table. - mVisualModel->mGlyphsPerCharacter.Erase( glyphsPerCharacterBuffer + startIndex, - glyphsPerCharacterBuffer + endIndexPlusOne ); + // Clear the glyphs per character table. + mVisualModel->mGlyphsPerCharacter.Erase( glyphsPerCharacterBuffer + startIndex, + glyphsPerCharacterBuffer + endIndexPlusOne ); - // Clear the glyphs buffer. - GlyphInfo* glyphsBuffer = mVisualModel->mGlyphs.Begin(); - mVisualModel->mGlyphs.Erase( glyphsBuffer + mTextUpdateInfo.mStartGlyphIndex, - glyphsBuffer + endGlyphIndexPlusOne ); + // Clear the glyphs buffer. + GlyphInfo* glyphsBuffer = mVisualModel->mGlyphs.Begin(); + mVisualModel->mGlyphs.Erase( glyphsBuffer + mTextUpdateInfo.mStartGlyphIndex, + glyphsBuffer + endGlyphIndexPlusOne ); - CharacterIndex* glyphsToCharactersBuffer = mVisualModel->mGlyphsToCharacters.Begin(); + CharacterIndex* glyphsToCharactersBuffer = mVisualModel->mGlyphsToCharacters.Begin(); - // Update the glyph to character indices. - for( Vector::Iterator it = glyphsToCharactersBuffer + endGlyphIndexPlusOne, - endIt = glyphsToCharactersBuffer + mVisualModel->mGlyphsToCharacters.Count(); - it != endIt; - ++it ) - { - CharacterIndex& index = *it; - index -= numberOfCharactersRemoved; - } + // Update the glyph to character indices. + for( Vector::Iterator it = glyphsToCharactersBuffer + endGlyphIndexPlusOne, + endIt = glyphsToCharactersBuffer + mVisualModel->mGlyphsToCharacters.Count(); + it != endIt; + ++it ) + { + CharacterIndex& index = *it; + index -= numberOfCharactersRemoved; + } - // Clear the glyphs to characters buffer. - mVisualModel->mGlyphsToCharacters.Erase( glyphsToCharactersBuffer + mTextUpdateInfo.mStartGlyphIndex, - glyphsToCharactersBuffer + endGlyphIndexPlusOne ); + // Clear the glyphs to characters buffer. + mVisualModel->mGlyphsToCharacters.Erase( glyphsToCharactersBuffer + mTextUpdateInfo.mStartGlyphIndex, + glyphsToCharactersBuffer + endGlyphIndexPlusOne ); - // Clear the characters per glyph buffer. - Length* charactersPerGlyphBuffer = mVisualModel->mCharactersPerGlyph.Begin(); - mVisualModel->mCharactersPerGlyph.Erase( charactersPerGlyphBuffer + mTextUpdateInfo.mStartGlyphIndex, - charactersPerGlyphBuffer + endGlyphIndexPlusOne ); + // Clear the characters per glyph buffer. + Length* charactersPerGlyphBuffer = mVisualModel->mCharactersPerGlyph.Begin(); + mVisualModel->mCharactersPerGlyph.Erase( charactersPerGlyphBuffer + mTextUpdateInfo.mStartGlyphIndex, + charactersPerGlyphBuffer + endGlyphIndexPlusOne ); - // Clear the positions buffer. - Vector2* positionsBuffer = mVisualModel->mGlyphPositions.Begin(); - mVisualModel->mGlyphPositions.Erase( positionsBuffer + mTextUpdateInfo.mStartGlyphIndex, - positionsBuffer + endGlyphIndexPlusOne ); - } + // Clear the positions buffer. + Vector2* positionsBuffer = mVisualModel->mGlyphPositions.Begin(); + mVisualModel->mGlyphPositions.Erase( positionsBuffer + mTextUpdateInfo.mStartGlyphIndex, + positionsBuffer + endGlyphIndexPlusOne ); + } - if( clearLayout ) - { - // Clear the lines. - uint32_t startRemoveIndex = mVisualModel->mLines.Count(); - uint32_t endRemoveIndex = startRemoveIndex; - ClearCharacterRuns( startIndex, - endIndex, - mVisualModel->mLines, - startRemoveIndex, - endRemoveIndex ); + if( NO_OPERATION != ( LAYOUT & operations ) ) + { + // Clear the lines. + uint32_t startRemoveIndex = mVisualModel->mLines.Count(); + uint32_t endRemoveIndex = startRemoveIndex; + ClearCharacterRuns( startIndex, + endIndex, + mVisualModel->mLines, + startRemoveIndex, + endRemoveIndex ); + + // Will update the glyph runs. + startRemoveIndex = mVisualModel->mLines.Count(); + endRemoveIndex = startRemoveIndex; + ClearGlyphRuns( mTextUpdateInfo.mStartGlyphIndex, + endGlyphIndexPlusOne - 1u, + mVisualModel->mLines, + startRemoveIndex, + endRemoveIndex ); - // Will update the glyph runs. - uint32_t startRemoveGlyphIndex = mVisualModel->mLines.Count(); - uint32_t endRemoveGlyphIndex = startRemoveIndex; - ClearGlyphRuns( mTextUpdateInfo.mStartGlyphIndex, - endGlyphIndex, - mVisualModel->mLines, - startRemoveGlyphIndex, - endRemoveGlyphIndex ); + // Set the line index from where to insert the new laid-out lines. + mTextUpdateInfo.mStartLineIndex = startRemoveIndex; - // Set the line index from where to insert the new laid-out lines. - mTextUpdateInfo.mStartLineIndex = startRemoveIndex; + LineRun* linesBuffer = mVisualModel->mLines.Begin(); + mVisualModel->mLines.Erase( linesBuffer + startRemoveIndex, + linesBuffer + endRemoveIndex ); + } - LineRun* linesBuffer = mVisualModel->mLines.Begin(); - mVisualModel->mLines.Erase( linesBuffer + startRemoveIndex, - linesBuffer + endRemoveIndex ); + if( NO_OPERATION != ( COLOR & operations ) ) + { + if( 0u != mVisualModel->mColorIndices.Count() ) + { + ColorIndex* colorIndexBuffer = mVisualModel->mColorIndices.Begin(); + mVisualModel->mColorIndices.Erase( colorIndexBuffer + mTextUpdateInfo.mStartGlyphIndex, + colorIndexBuffer + endGlyphIndexPlusOne ); } } } @@ -628,12 +625,9 @@ void Controller::Impl::ClearModelData( CharacterIndex startIndex, CharacterIndex mTextUpdateInfo.mEstimatedNumberOfLines = std::max( mVisualModel->mLines.Count(), mLogicalModel->mParagraphInfo.Count() ); mVisualModel->ClearCaches(); - - // TODO finish the mark-up. - mVisualModel->mColorRuns.Clear(); } -void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) +bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) { DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::UpdateModel\n" ); @@ -643,7 +637,7 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) if( NO_OPERATION == operations ) { // Nothing to do if no operations are pending and required. - return; + return false; } Vector& utf32Characters = mLogicalModel->mText; @@ -661,15 +655,18 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) if( mTextUpdateInfo.mClearAll || ( 0u != paragraphCharacters ) ) { - ClearModelData( startIndex, startIndex + ( ( paragraphCharacters > 0u ) ? paragraphCharacters - 1u : 0u ), operationsRequired ); + ClearModelData( startIndex, startIndex + ( ( paragraphCharacters > 0u ) ? paragraphCharacters - 1u : 0u ), operations ); } mTextUpdateInfo.mClearAll = false; + // Whether the model is updated. + bool updated = false; + Vector& lineBreakInfo = mLogicalModel->mLineBreakInfo; const Length requestedNumberOfCharacters = mTextUpdateInfo.mRequestedNumberOfCharacters; - if( GET_LINE_BREAKS & operations ) + if( NO_OPERATION != ( GET_LINE_BREAKS & operations ) ) { // Retrieves the line break info. The line break info is used to split the text in 'paragraphs' to // calculate the bidirectional info for each 'paragraph'. @@ -685,10 +682,11 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // Create the paragraph info. mLogicalModel->CreateParagraphInfo( startIndex, requestedNumberOfCharacters ); + updated = true; } Vector& wordBreakInfo = mLogicalModel->mWordBreakInfo; - if( GET_WORD_BREAKS & operations ) + if( NO_OPERATION != ( GET_WORD_BREAKS & operations ) ) { // Retrieves the word break info. The word break info is used to layout the text (where to wrap the text in lines). wordBreakInfo.Resize( numberOfCharacters, TextAbstraction::WORD_NO_BREAK ); @@ -697,10 +695,11 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) startIndex, requestedNumberOfCharacters, wordBreakInfo ); + updated = true; } - const bool getScripts = GET_SCRIPTS & operations; - const bool validateFonts = VALIDATE_FONTS & operations; + const bool getScripts = NO_OPERATION != ( GET_SCRIPTS & operations ); + const bool validateFonts = NO_OPERATION != ( VALIDATE_FONTS & operations ); Vector& scripts = mLogicalModel->mScriptRuns; Vector& validFonts = mLogicalModel->mFontRuns; @@ -738,12 +737,13 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) requestedNumberOfCharacters, validFonts ); } + updated = true; } Vector mirroredUtf32Characters; bool textMirrored = false; const Length numberOfParagraphs = mLogicalModel->mParagraphInfo.Count(); - if( BIDI_INFO & operations ) + if( NO_OPERATION != ( BIDI_INFO & operations ) ) { Vector& bidirectionalInfo = mLogicalModel->mBidirectionalParagraphInfo; bidirectionalInfo.Reserve( numberOfParagraphs ); @@ -781,6 +781,7 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // There is no right to left characters. Clear the directions vector. mLogicalModel->mCharacterDirections.Clear(); } + updated = true; } Vector& glyphs = mVisualModel->mGlyphs; @@ -790,7 +791,7 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) newParagraphGlyphs.Reserve( numberOfParagraphs ); const Length currentNumberOfGlyphs = glyphs.Count(); - if( SHAPE_TEXT & operations ) + if( NO_OPERATION != ( SHAPE_TEXT & operations ) ) { const Vector& textToShape = textMirrored ? mirroredUtf32Characters : utf32Characters; // Shapes the text. @@ -809,11 +810,12 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // Create the 'number of glyphs' per character and the glyph to character conversion tables. mVisualModel->CreateGlyphsPerCharacterTable( startIndex, mTextUpdateInfo.mStartGlyphIndex, requestedNumberOfCharacters ); mVisualModel->CreateCharacterToGlyphTable( startIndex, mTextUpdateInfo.mStartGlyphIndex, requestedNumberOfCharacters ); + updated = true; } const Length numberOfGlyphs = glyphs.Count() - currentNumberOfGlyphs; - if( GET_GLYPH_METRICS & operations ) + if( NO_OPERATION != ( GET_GLYPH_METRICS & operations ) ) { GlyphInfo* glyphsBuffer = glyphs.Begin(); mMetrics->GetGlyphMetrics( glyphsBuffer + mTextUpdateInfo.mStartGlyphIndex, numberOfGlyphs ); @@ -828,6 +830,22 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) glyph.width = 0.f; glyph.advance = 0.f; } + updated = true; + } + + if( NO_OPERATION != ( COLOR & operations ) ) + { + // Set the color runs in glyphs. + SetColorSegmentationInfo( mLogicalModel->mColorRuns, + mVisualModel->mCharactersToGlyph, + mVisualModel->mGlyphsPerCharacter, + startIndex, + mTextUpdateInfo.mStartGlyphIndex, + requestedNumberOfCharacters, + mVisualModel->mColors, + mVisualModel->mColorIndices ); + + updated = true; } if( ( NULL != mEventData ) && @@ -856,22 +874,6 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // Set the previous number of characters for the next time the text is updated. mTextUpdateInfo.mPreviousNumberOfCharacters = numberOfCharacters; -} - -bool Controller::Impl::UpdateModelStyle( OperationsMask operationsRequired ) -{ - bool updated = false; - - if( COLOR & operationsRequired ) - { - // Set the color runs in glyphs. - SetColorSegmentationInfo( mLogicalModel->mColorRuns, - mVisualModel->mCharactersToGlyph, - mVisualModel->mGlyphsPerCharacter, - mVisualModel->mColorRuns ); - - updated = true; - } return updated; } @@ -880,35 +882,52 @@ void Controller::Impl::RetrieveDefaultInputStyle( InputStyle& inputStyle ) { // Sets the default text's color. inputStyle.textColor = mTextColor; + inputStyle.isDefaultColor = true; + + inputStyle.familyName.clear(); + inputStyle.weight = TextAbstraction::FontWeight::NORMAL; + inputStyle.width = TextAbstraction::FontWidth::NORMAL; + inputStyle.slant = TextAbstraction::FontSlant::NORMAL; + inputStyle.size = 0.f; + + inputStyle.familyDefined = false; + inputStyle.weightDefined = false; + inputStyle.widthDefined = false; + inputStyle.slantDefined = false; + inputStyle.sizeDefined = false; // Sets the default font's family name, weight, width, slant and size. if( mFontDefaults ) { - inputStyle.familyName = mFontDefaults->mFontDescription.family; - inputStyle.weight = mFontDefaults->mFontDescription.weight; - inputStyle.width = mFontDefaults->mFontDescription.width; - inputStyle.slant = mFontDefaults->mFontDescription.slant; - inputStyle.size = mFontDefaults->mDefaultPointSize; + if( mFontDefaults->familyDefined ) + { + inputStyle.familyName = mFontDefaults->mFontDescription.family; + inputStyle.familyDefined = true; + } - inputStyle.familyDefined = mFontDefaults->familyDefined; - inputStyle.weightDefined = mFontDefaults->weightDefined; - inputStyle.widthDefined = mFontDefaults->widthDefined; - inputStyle.slantDefined = mFontDefaults->slantDefined; - inputStyle.sizeDefined = mFontDefaults->sizeDefined; - } - else - { - inputStyle.familyName.clear(); - inputStyle.weight = TextAbstraction::FontWeight::NORMAL; - inputStyle.width = TextAbstraction::FontWidth::NORMAL; - inputStyle.slant = TextAbstraction::FontSlant::NORMAL; - inputStyle.size = 0.f; + if( mFontDefaults->weightDefined ) + { + inputStyle.weight = mFontDefaults->mFontDescription.weight; + inputStyle.weightDefined = true; + } + + if( mFontDefaults->widthDefined ) + { + inputStyle.width = mFontDefaults->mFontDescription.width; + inputStyle.widthDefined = true; + } - inputStyle.familyDefined = false; - inputStyle.weightDefined = false; - inputStyle.widthDefined = false; - inputStyle.slantDefined = false; - inputStyle.sizeDefined = false; + if( mFontDefaults->slantDefined ) + { + inputStyle.slant = mFontDefaults->mFontDescription.slant; + inputStyle.slantDefined = true; + } + + if( mFontDefaults->sizeDefined ) + { + inputStyle.size = mFontDefaults->mDefaultPointSize; + inputStyle.sizeDefined = true; + } } } @@ -1371,12 +1390,17 @@ void Controller::Impl::ShowClipboard() void Controller::Impl::HideClipboard() { - if( mClipboard ) + if( mClipboard && mClipboardHideEnabled ) { mClipboard.HideClipboard(); } } +void Controller::Impl::SetClipboardHideEnable(bool enable) +{ + mClipboardHideEnabled = enable; +} + bool Controller::Impl::CopyStringToClipboard( std::string& source ) { //Send string to clipboard @@ -1914,10 +1938,6 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, const Vector& positions = mVisualModel->mGlyphPositions; const Vector2* const positionsBuffer = positions.Begin(); - // Get the visual to logical conversion tables. - const CharacterIndex* const visualToLogicalBuffer = ( 0u != mLogicalModel->mVisualToLogicalMap.Count() ) ? mLogicalModel->mVisualToLogicalMap.Begin() : NULL; - const CharacterIndex* const visualToLogicalCursorBuffer = mLogicalModel->mVisualToLogicalCursorMap.Begin(); - // Get the character to glyph conversion table. const GlyphIndex* const charactersToGlyphBuffer = mVisualModel->mCharactersToGlyph.Begin(); @@ -1927,9 +1947,6 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, // Get the glyph's info buffer. const GlyphInfo* const glyphInfoBuffer = mVisualModel->mGlyphs.Begin(); - // If the vector is void, there is no right to left characters. - const bool hasRightToLeftCharacters = NULL != visualToLogicalBuffer; - const CharacterIndex startCharacter = line.characterRun.characterIndex; const CharacterIndex endCharacter = line.characterRun.characterIndex + line.characterRun.numberOfCharacters; DALI_ASSERT_DEBUG( endCharacter <= mLogicalModel->mText.Count() && "Invalid line info" ); @@ -1943,7 +1960,7 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, for( ; !matched && ( visualIndex < endCharacter ); ++visualIndex ) { // The character in logical order. - const CharacterIndex characterLogicalOrderIndex = hasRightToLeftCharacters ? *( visualToLogicalBuffer + visualIndex ) : visualIndex; + const CharacterIndex characterLogicalOrderIndex = mLogicalModel->GetLogicalCharacterIndex( visualIndex ); // Get the script of the character. const Script script = mLogicalModel->GetScript( characterLogicalOrderIndex ); @@ -1957,7 +1974,7 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, { // Get the first character/glyph of the group of glyphs. const CharacterIndex firstVisualCharacterIndex = 1u + visualIndex - numberOfCharacters; - const CharacterIndex firstLogicalCharacterIndex = hasRightToLeftCharacters ? *( visualToLogicalBuffer + firstVisualCharacterIndex ) : firstVisualCharacterIndex; + const CharacterIndex firstLogicalCharacterIndex = mLogicalModel->GetLogicalCharacterIndex( firstVisualCharacterIndex ); const GlyphIndex firstLogicalGlyphIndex = *( charactersToGlyphBuffer + firstLogicalCharacterIndex ); // Get the metrics for the group of glyphs. @@ -2000,7 +2017,6 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, } - // Return the logical position of the cursor in characters. if( !matched ) @@ -2008,7 +2024,7 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, visualIndex = endCharacter; } - logicalIndex = hasRightToLeftCharacters ? *( visualToLogicalCursorBuffer + visualIndex ) : visualIndex; + logicalIndex = mLogicalModel->GetLogicalCursorIndex( visualIndex ); DALI_LOG_INFO( gLogFilter, Debug::Verbose, "%p closest visualIndex %d logicalIndex %d\n", this, visualIndex, logicalIndex ); DALI_ASSERT_DEBUG( ( logicalIndex <= mLogicalModel->mText.Count() && logicalIndex >= 0 ) && "GetClosestCursorIndex - Out of bounds index" );