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=b6efd5901a2b50848ce7a619137d580e6f2878d3;hp=9637245e9daff4e2ee855a145c6f820d47f92bae;hb=6ae9cd5f03bd0a8393eebf3cfb4508cab7fd3ede;hpb=c5660eb8cf963f8fc7b34bebeb9df827af7349ec diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 9637245..b6efd59 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -73,6 +73,7 @@ EventData::EventData( DecoratorPtr decorator ) mPlaceholderTextInactive(), mPlaceholderTextColor( 0.8f, 0.8f, 0.8f, 0.8f ), mEventQueue(), + mInputStyleChangedQueue(), mState( INACTIVE ), mPrimaryCursorPosition( 0u ), mLeftSelectionPosition( 0u ), @@ -262,6 +263,10 @@ bool Controller::Impl::ProcessInputEvents() if( mEventData->mUpdateInputStyle ) { + // Keep a copy of the current input style. + InputStyle currentInputStyle; + currentInputStyle.Copy( mEventData->mInputStyle ); + // Set the default style first. RetrieveDefaultInputStyle( mEventData->mInputStyle ); @@ -271,6 +276,16 @@ bool Controller::Impl::ProcessInputEvents() // Retrieve the style from the style runs stored in the logical model. mLogicalModel->RetrieveStyle( styleIndex, mEventData->mInputStyle ); + // Compare if the input style has changed. + const bool hasInputStyleChanged = !currentInputStyle.Equal( mEventData->mInputStyle ); + + if( hasInputStyleChanged ) + { + const InputStyle::Mask styleChangedMask = currentInputStyle.GetInputStyleChangeMask( mEventData->mInputStyle ); + // Queue the input style changed signal. + mEventData->mInputStyleChangedQueue.PushBack( styleChangedMask ); + } + mEventData->mUpdateInputStyle = false; } @@ -307,6 +322,15 @@ void Controller::Impl::NotifyImfManager() } } +void Controller::Impl::NotifyImfMultiLineStatus() +{ + if ( mEventData ) + { + LayoutEngine::Layout layout = mLayoutEngine.GetLayout(); + mEventData->mImfManager.NotifyTextInputMultiLine( layout == LayoutEngine::MULTI_LINE_BOX ); + } +} + CharacterIndex Controller::Impl::GetLogicalCursorPosition() const { CharacterIndex cursorPosition = 0u; @@ -824,15 +848,22 @@ bool Controller::Impl::UpdateModel( OperationsMask operationsRequired ) // Validate the fonts set through the mark-up string. Vector& fontDescriptionRuns = mLogicalModel->mFontDescriptionRuns; - // Get the default font id. - const FontId defaultFontId = ( NULL == mFontDefaults ) ? 0u : mFontDefaults->GetFontId( mFontClient ); + // Get the default font's description. + TextAbstraction::FontDescription defaultFontDescription; + TextAbstraction::PointSize26Dot6 defaultPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE; + if( NULL != mFontDefaults ) + { + defaultFontDescription = mFontDefaults->mFontDescription; + defaultPointSize = mFontDefaults->mDefaultPointSize * 64u; + } // Validates the fonts. If there is a character with no assigned font it sets a default one. // After this call, fonts are validated. multilanguageSupport.ValidateFonts( utf32Characters, scripts, fontDescriptionRuns, - defaultFontId, + defaultFontDescription, + defaultPointSize, startIndex, requestedNumberOfCharacters, validFonts ); @@ -990,11 +1021,25 @@ void Controller::Impl::RetrieveDefaultInputStyle( InputStyle& inputStyle ) inputStyle.slant = TextAbstraction::FontSlant::NORMAL; inputStyle.size = 0.f; - inputStyle.familyDefined = false; - inputStyle.weightDefined = false; - inputStyle.widthDefined = false; - inputStyle.slantDefined = false; - inputStyle.sizeDefined = false; + inputStyle.lineSpacing = 0.f; + + inputStyle.underlineProperties.clear(); + inputStyle.shadowProperties.clear(); + inputStyle.embossProperties.clear(); + inputStyle.outlineProperties.clear(); + + inputStyle.isFamilyDefined = false; + inputStyle.isWeightDefined = false; + inputStyle.isWidthDefined = false; + inputStyle.isSlantDefined = false; + inputStyle.isSizeDefined = false; + + inputStyle.isLineSpacingDefined = false; + + inputStyle.isUnderlineDefined = false; + inputStyle.isShadowDefined = false; + inputStyle.isEmbossDefined = false; + inputStyle.isOutlineDefined = false; // Sets the default font's family name, weight, width, slant and size. if( mFontDefaults ) @@ -1002,31 +1047,31 @@ void Controller::Impl::RetrieveDefaultInputStyle( InputStyle& inputStyle ) if( mFontDefaults->familyDefined ) { inputStyle.familyName = mFontDefaults->mFontDescription.family; - inputStyle.familyDefined = true; + inputStyle.isFamilyDefined = true; } if( mFontDefaults->weightDefined ) { inputStyle.weight = mFontDefaults->mFontDescription.weight; - inputStyle.weightDefined = true; + inputStyle.isWeightDefined = true; } if( mFontDefaults->widthDefined ) { inputStyle.width = mFontDefaults->mFontDescription.width; - inputStyle.widthDefined = true; + inputStyle.isWidthDefined = true; } if( mFontDefaults->slantDefined ) { inputStyle.slant = mFontDefaults->mFontDescription.slant; - inputStyle.slantDefined = true; + inputStyle.isSlantDefined = true; } if( mFontDefaults->sizeDefined ) { inputStyle.size = mFontDefaults->mDefaultPointSize; - inputStyle.sizeDefined = true; + inputStyle.isSizeDefined = true; } } } @@ -1626,9 +1671,23 @@ void Controller::Impl::RetrieveSelection( std::string& selectedText, bool delete if( deleteAfterRetrieval ) // Only delete text if copied successfully { + // Keep a copy of the current input style. + InputStyle currentInputStyle; + currentInputStyle.Copy( mEventData->mInputStyle ); + // Set as input style the style of the first deleted character. mLogicalModel->RetrieveStyle( startOfSelectedText, mEventData->mInputStyle ); + // Compare if the input style has changed. + const bool hasInputStyleChanged = !currentInputStyle.Equal( mEventData->mInputStyle ); + + if( hasInputStyleChanged ) + { + const InputStyle::Mask styleChangedMask = currentInputStyle.GetInputStyleChangeMask( mEventData->mInputStyle ); + // Queue the input style changed signal. + mEventData->mInputStyleChangedQueue.PushBack( styleChangedMask ); + } + mLogicalModel->UpdateTextStyleRuns( startOfSelectedText, -static_cast( lengthOfSelectedText ) ); // Mark the paragraphs to be updated. @@ -1788,6 +1847,14 @@ void Controller::Impl::RepositionSelectionHandles() const Length numberOfCharactersEnd = *( charactersPerGlyphBuffer + glyphEnd ); bool splitEndGlyph = ( glyphStart != glyphEnd ) && ( numberOfCharactersEnd > 1u ) && HasLigatureMustBreak( mLogicalModel->GetScript( selectionEndMinusOne ) ); + // The number of quads of the selection box. + const unsigned int numberOfQuads = 1u + ( glyphEnd - glyphStart ) + ( ( numberOfLines > 1u ) ? 2u * numberOfLines : 0u ); + mEventData->mDecorator->ResizeHighlightQuads( numberOfQuads ); + + // Count the actual number of quads. + unsigned int actualNumberOfQuads = 0u; + Vector4 quad; + // Traverse the glyphs. for( GlyphIndex index = glyphStart; index <= glyphEnd; ++index ) { @@ -1811,18 +1878,17 @@ void Controller::Impl::RepositionSelectionHandles() // Calculate the number of characters selected. const Length numberOfCharacters = ( glyphStart == glyphEnd ) ? ( selectionEnd - selectionStart ) : ( numberOfCharactersStart - interGlyphIndex ); - const float xPosition = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + glyphAdvance * static_cast( isCurrentRightToLeft ? ( numberOfCharactersStart - interGlyphIndex - numberOfCharacters ) : interGlyphIndex ); - const float xPositionAdvance = xPosition + static_cast( numberOfCharacters ) * glyphAdvance; - const float yPosition = selectionBoxInfo->lineOffset; + quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + glyphAdvance * static_cast( isCurrentRightToLeft ? ( numberOfCharactersStart - interGlyphIndex - numberOfCharacters ) : interGlyphIndex ); + quad.y = selectionBoxInfo->lineOffset; + quad.z = quad.x + static_cast( numberOfCharacters ) * glyphAdvance; + quad.w = selectionBoxInfo->lineOffset + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. - selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, xPosition ); - selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, xPositionAdvance ); + selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, quad.x ); + selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, quad.z ); - mEventData->mDecorator->AddHighlight( xPosition, - yPosition, - xPositionAdvance, - yPosition + selectionBoxInfo->lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, quad ); + ++actualNumberOfQuads; splitStartGlyph = false; continue; @@ -1843,35 +1909,35 @@ void Controller::Impl::RepositionSelectionHandles() const Length numberOfCharacters = numberOfCharactersEnd - interGlyphIndex; - const float xPosition = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + ( isCurrentRightToLeft ? ( glyphAdvance * static_cast( numberOfCharacters ) ) : 0.f ); - const float xPositionAdvance = xPosition + static_cast( interGlyphIndex ) * glyphAdvance; - const float yPosition = selectionBoxInfo->lineOffset; + quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x + ( isCurrentRightToLeft ? ( glyphAdvance * static_cast( numberOfCharacters ) ) : 0.f ); + quad.y = selectionBoxInfo->lineOffset; + quad.z = quad.x + static_cast( interGlyphIndex ) * glyphAdvance; + quad.w = quad.y + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. - selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, xPosition ); - selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, xPositionAdvance ); + selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, quad.x ); + selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, quad.z ); - mEventData->mDecorator->AddHighlight( xPosition, - yPosition, - xPositionAdvance, - yPosition + selectionBoxInfo->lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; splitEndGlyph = false; continue; } - const float xPosition = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x; - const float xPositionAdvance = xPosition + glyph.advance; - const float yPosition = selectionBoxInfo->lineOffset; + quad.x = lineRun->alignmentOffset + position.x - glyph.xBearing + mScrollPosition.x; + quad.y = selectionBoxInfo->lineOffset; + quad.z = quad.x + glyph.advance; + quad.w = quad.y + selectionBoxInfo->lineHeight; // Store the min and max 'x' for each line. - selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, xPosition ); - selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, xPositionAdvance ); + selectionBoxInfo->minX = std::min( selectionBoxInfo->minX, quad.x ); + selectionBoxInfo->maxX = std::max( selectionBoxInfo->maxX, quad.z ); - mEventData->mDecorator->AddHighlight( xPosition, - yPosition, - xPositionAdvance, - yPosition + selectionBoxInfo->lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Whether to retrieve the next line. if( index == lastGlyphOfLine ) @@ -1915,7 +1981,7 @@ void Controller::Impl::RepositionSelectionHandles() const SelectionBoxInfo& info = *it; // Update the size of the highlighted text. - highLightSize.height += selectionBoxInfo->lineHeight; + highLightSize.height += info.lineHeight; minHighlightX = std::min( minHighlightX, info.minX ); maxHighlightX = std::max( maxHighlightX, info.maxX ); } @@ -1933,11 +1999,15 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyBegin ) { + quad.x = 0.f; + quad.y = firstSelectionBoxLineInfo.lineOffset; + quad.z = firstSelectionBoxLineInfo.minX; + quad.w = firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight; + // Boxify at the beginning of the line. - mEventData->mDecorator->AddHighlight( 0.f, - firstSelectionBoxLineInfo.lineOffset, - firstSelectionBoxLineInfo.minX, - firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. minHighlightX = 0.f; @@ -1945,11 +2015,15 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyEnd ) { + quad.x = firstSelectionBoxLineInfo.maxX; + quad.y = firstSelectionBoxLineInfo.lineOffset; + quad.z = mVisualModel->mControlSize.width; + quad.w = firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight; + // Boxify at the end of the line. - mEventData->mDecorator->AddHighlight( firstSelectionBoxLineInfo.maxX, - firstSelectionBoxLineInfo.lineOffset, - mVisualModel->mControlSize.width, - firstSelectionBoxLineInfo.lineOffset + firstSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. maxHighlightX = mVisualModel->mControlSize.width; @@ -1965,15 +2039,23 @@ void Controller::Impl::RepositionSelectionHandles() { const SelectionBoxInfo& info = *it; - mEventData->mDecorator->AddHighlight( 0.f, - info.lineOffset, - info.minX, - info.lineOffset + info.lineHeight ); + quad.x = 0.f; + quad.y = info.lineOffset; + quad.z = info.minX; + quad.w = info.lineOffset + info.lineHeight; + + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; + + quad.x = info.maxX; + quad.y = info.lineOffset; + quad.z = mVisualModel->mControlSize.width; + quad.w = info.lineOffset + info.lineHeight; - mEventData->mDecorator->AddHighlight( info.maxX, - info.lineOffset, - mVisualModel->mControlSize.width, - info.lineOffset + info.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; } // Update the size of the highlighted text. @@ -1990,11 +2072,15 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyBegin ) { + quad.x = 0.f; + quad.y = lastSelectionBoxLineInfo.lineOffset; + quad.z = lastSelectionBoxLineInfo.minX; + quad.w = lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight; + // Boxify at the beginning of the line. - mEventData->mDecorator->AddHighlight( 0.f, - lastSelectionBoxLineInfo.lineOffset, - lastSelectionBoxLineInfo.minX, - lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. minHighlightX = 0.f; @@ -2002,17 +2088,24 @@ void Controller::Impl::RepositionSelectionHandles() if( boxifyEnd ) { + quad.x = lastSelectionBoxLineInfo.maxX; + quad.y = lastSelectionBoxLineInfo.lineOffset; + quad.z = mVisualModel->mControlSize.width; + quad.w = lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight; + // Boxify at the end of the line. - mEventData->mDecorator->AddHighlight( lastSelectionBoxLineInfo.maxX, - lastSelectionBoxLineInfo.lineOffset, - mVisualModel->mControlSize.width, - lastSelectionBoxLineInfo.lineOffset + lastSelectionBoxLineInfo.lineHeight ); + mEventData->mDecorator->AddHighlight( actualNumberOfQuads, + quad ); + ++actualNumberOfQuads; // Update the size of the highlighted text. maxHighlightX = mVisualModel->mControlSize.width; } } + // Set the actual number of quads. + mEventData->mDecorator->ResizeHighlightQuads( actualNumberOfQuads ); + // Sets the highlight's size and position. In decorator's coords. // The highlight's height has been calculated above (before 'boxifying' the highlight). highLightSize.width = maxHighlightX - minHighlightX;