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=cfac37f676421921790938a42ef725a245149154;hp=fee1690e6295bcf6c59c375b5fd1fdc3598f6a3a;hb=dd0935960c1acaf63d2b4f560b39236b871135b7;hpb=80683070b9f5e77093540c20464a3150b895b778 diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index fee1690..cfac37f 100755 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -62,7 +62,6 @@ const char * const PLACEHOLDER_FONT_STYLE = "fontStyle"; const char * const PLACEHOLDER_POINT_SIZE = "pointSize"; const char * const PLACEHOLDER_PIXEL_SIZE = "pixelSize"; const char * const PLACEHOLDER_ELLIPSIS = "ellipsis"; -const unsigned int MAX_TEXT_LENGTH = 1024u * 32u; float ConvertToEven( float value ) { @@ -80,7 +79,6 @@ int ConvertPixelToPint( float pixel ) return ( pixel * 72.f ) / static_cast< float >( horizontalDpi ); } - } // namespace namespace Dali @@ -322,7 +320,7 @@ bool Controller::IsSmoothHandlePanEnabled() const void Controller::SetMaximumNumberOfCharacters( Length maxCharacters ) { - mImpl->mMaximumNumberOfCharacters = std::min( maxCharacters, MAX_TEXT_LENGTH ); + mImpl->mMaximumNumberOfCharacters = maxCharacters; } int Controller::GetMaximumNumberOfCharacters() @@ -396,6 +394,18 @@ void Controller::SetHorizontalAlignment( Text::HorizontalAlignment::Type alignme // Set the flag to redo the alignment operation. mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | ALIGN ); + if( mImpl->mEventData ) + { + mImpl->mEventData->mUpdateAlignment = true; + + // Update the cursor if it's in editing mode + if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + { + mImpl->ChangeState( EventData::EDITING ); + mImpl->mEventData->mUpdateCursorPosition = true; + } + } + mImpl->RequestRelayout(); } } @@ -691,13 +701,6 @@ void Controller::SetText( const std::string& text ) utf8 = reinterpret_cast( text.c_str() ); } - // Limit the text size. If the text size is too large, crash or deadlock will occur. - if( textSize > MAX_TEXT_LENGTH ) - { - DALI_LOG_WARNING( "The text size is too large(%d), limit the length to 32,768u\n", textSize ); - textSize = MAX_TEXT_LENGTH; - } - // Convert text into UTF-32 Vector& utf32Characters = mImpl->mModel->mLogicalModel->mText; utf32Characters.Resize( textSize ); @@ -1459,6 +1462,22 @@ float Controller::GetDefaultLineSpacing() const return mImpl->mLayoutEngine.GetDefaultLineSpacing(); } +bool Controller::SetDefaultLineSize( float lineSize ) +{ + if( std::fabs( lineSize - mImpl->mLayoutEngine.GetDefaultLineSize() ) > Math::MACHINE_EPSILON_1000 ) + { + mImpl->mLayoutEngine.SetDefaultLineSize(lineSize); + mImpl->mRecalculateNaturalSize = true; + return true; + } + return false; +} + +float Controller::GetDefaultLineSize() const +{ + return mImpl->mLayoutEngine.GetDefaultLineSize(); +} + void Controller::SetInputColor( const Vector4& color ) { if( NULL != mImpl->mEventData ) @@ -2033,7 +2052,6 @@ Vector3 Controller::GetNaturalSize() GET_SCRIPTS | VALIDATE_FONTS | GET_LINE_BREAKS | - GET_WORD_BREAKS | BIDI_INFO | SHAPE_TEXT | GET_GLYPH_METRICS ); @@ -2105,7 +2123,6 @@ bool Controller::CheckForTextFit( float pointSize, Size& layoutSize ) GET_SCRIPTS | VALIDATE_FONTS | GET_LINE_BREAKS | - GET_WORD_BREAKS | BIDI_INFO | SHAPE_TEXT| GET_GLYPH_METRICS ); @@ -2134,7 +2151,7 @@ bool Controller::CheckForTextFit( float pointSize, Size& layoutSize ) void Controller::FitPointSizeforLayout( Size layoutSize ) { const OperationsMask operations = mImpl->mOperationsPending; - if( NO_OPERATION != ( UPDATE_LAYOUT_SIZE & operations ) ) + if( NO_OPERATION != ( UPDATE_LAYOUT_SIZE & operations ) || mImpl->mTextFitContentSize != layoutSize ) { bool actualellipsis = mImpl->mModel->mElideEnabled; float minPointSize = mImpl->mTextFitMinSize; @@ -2201,7 +2218,6 @@ float Controller::GetHeightForWidth( float width ) GET_SCRIPTS | VALIDATE_FONTS | GET_LINE_BREAKS | - GET_WORD_BREAKS | BIDI_INFO | SHAPE_TEXT | GET_GLYPH_METRICS ); @@ -2423,7 +2439,6 @@ Toolkit::DevelText::TextDirection::Type Controller::GetTextDirection() GET_SCRIPTS | VALIDATE_FONTS | GET_LINE_BREAKS | - GET_WORD_BREAKS | BIDI_INFO | SHAPE_TEXT | GET_GLYPH_METRICS ); @@ -2447,6 +2462,9 @@ Toolkit::DevelText::TextDirection::Type Controller::GetTextDirection() // Clear the update info. This info will be set the next time the text is updated. mImpl->mTextUpdateInfo.Clear(); + // FullRelayoutNeeded should be true because DoRelayout is MAX_FLOAT, MAX_FLOAT. + mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true; + mImpl->mUpdateTextDirection = false; } @@ -3031,17 +3049,22 @@ void Controller::LongPressEvent( Gesture::State state, float x, float y ) } } -void Controller::SelectEvent( float x, float y, bool selectAll ) +void Controller::SelectEvent( float x, float y, SelectionType selectType ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::SelectEvent\n" ); if( NULL != mImpl->mEventData ) { - if( selectAll ) + if( selectType == SelectionType::ALL ) { Event event( Event::SELECT_ALL ); mImpl->mEventData->mEventQueue.push_back( event ); } + else if( selectType == SelectionType::NONE ) + { + Event event( Event::SELECT_NONE ); + mImpl->mEventData->mEventQueue.push_back( event ); + } else { Event event( Event::SELECT ); @@ -3324,14 +3347,14 @@ void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Butt if( mImpl->mEventData->mSelectionEnabled ) { // Creates a SELECT event. - SelectEvent( currentCursorPosition.x, currentCursorPosition.y, false ); + SelectEvent( currentCursorPosition.x, currentCursorPosition.y, SelectionType::INTERACTIVE ); } break; } case Toolkit::TextSelectionPopup::SELECT_ALL: { // Creates a SELECT_ALL event - SelectEvent( 0.f, 0.f, true ); + SelectEvent( 0.f, 0.f, SelectionType::ALL ); break; } case Toolkit::TextSelectionPopup::CLIPBOARD: @@ -3700,6 +3723,13 @@ bool Controller::RemoveText( int cursorOffset, } } + // If the number of current text and the number of characters to be deleted are same, + // it means all texts should be removed and all Preedit variables should be initialized. + if( ( currentText.Count() - numberOfCharacters == 0 ) && ( cursorIndex == 0 ) ) + { + mImpl->ClearPreEditFlag(); + } + // Updates the text style runs by removing characters. Runs with no characters are removed. mImpl->mModel->mLogicalModel->UpdateTextStyleRuns( cursorIndex, -numberOfCharacters ); @@ -3714,6 +3744,11 @@ bool Controller::RemoveText( int cursorOffset, mImpl->mEventData->mScrollAfterDelete = true; + if( EventData::INACTIVE == mImpl->mEventData->mState ) + { + mImpl->ChangeState( EventData::EDITING ); + } + DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::RemoveText %p removed %d\n", this, numberOfCharacters ); removed = true; } @@ -3741,6 +3776,16 @@ bool Controller::RemoveSelectedText() return textRemoved; } +std::string Controller::GetSelectedText() +{ + std::string text; + if( EventData::SELECTING == mImpl->mEventData->mState ) + { + mImpl->RetrieveSelection( text, false ); + } + return text; +} + // private : Relayout. bool Controller::DoRelayout( const Size& size, @@ -3806,38 +3851,16 @@ bool Controller::DoRelayout( const Size& size, return true; } - const Vector& lineBreakInfo = mImpl->mModel->mLogicalModel->mLineBreakInfo; - const Vector& wordBreakInfo = mImpl->mModel->mLogicalModel->mWordBreakInfo; - const Vector& characterDirection = mImpl->mModel->mLogicalModel->mCharacterDirections; - const Vector& glyphs = mImpl->mModel->mVisualModel->mGlyphs; - const Vector& glyphsToCharactersMap = mImpl->mModel->mVisualModel->mGlyphsToCharacters; - const Vector& charactersPerGlyph = mImpl->mModel->mVisualModel->mCharactersPerGlyph; - const Character* const textBuffer = mImpl->mModel->mLogicalModel->mText.Begin(); - const float outlineWidth = static_cast( mImpl->mModel->GetOutlineWidth() ); - // Set the layout parameters. Layout::Parameters layoutParameters( size, - textBuffer, - lineBreakInfo.Begin(), - wordBreakInfo.Begin(), - ( 0u != characterDirection.Count() ) ? characterDirection.Begin() : NULL, - glyphs.Begin(), - glyphsToCharactersMap.Begin(), - charactersPerGlyph.Begin(), - charactersToGlyphBuffer, - glyphsPerCharacterBuffer, - totalNumberOfGlyphs, - mImpl->mModel->mHorizontalAlignment, - mImpl->mModel->mLineWrapMode, - outlineWidth, - mImpl->mModel->mIgnoreSpacesAfterText, - mImpl->mModel->mMatchSystemLanguageDirection ); + mImpl->mModel); // Resize the vector of positions to have the same size than the vector of glyphs. Vector& glyphPositions = mImpl->mModel->mVisualModel->mGlyphPositions; glyphPositions.Resize( totalNumberOfGlyphs ); // Whether the last character is a new paragraph character. + const Character* const textBuffer = mImpl->mModel->mLogicalModel->mText.Begin(); mImpl->mTextUpdateInfo.mIsLastCharacterNewParagraph = TextAbstraction::IsNewParagraph( *( textBuffer + ( mImpl->mModel->mLogicalModel->mText.Count() - 1u ) ) ); layoutParameters.isLastNewParagraph = mImpl->mTextUpdateInfo.mIsLastCharacterNewParagraph; @@ -3873,8 +3896,6 @@ bool Controller::DoRelayout( const Size& size, bool isAutoScrollEnabled = mImpl->mIsAutoScrollEnabled; Size newLayoutSize; viewUpdated = mImpl->mLayoutEngine.LayoutText( layoutParameters, - glyphPositions, - mImpl->mModel->mVisualModel->mLines, newLayoutSize, elideTextEnabled, isAutoScrollEnabled ); @@ -3891,46 +3912,10 @@ bool Controller::DoRelayout( const Size& size, mImpl->mIsTextDirectionRTL = false; } - // Reorder the lines - if( NO_OPERATION != ( REORDER & operations ) ) + if ( ( NO_OPERATION != ( UPDATE_DIRECTION & operations ) ) && !mImpl->mModel->mVisualModel->mLines.Empty() ) { - Vector& bidirectionalInfo = mImpl->mModel->mLogicalModel->mBidirectionalParagraphInfo; - Vector& bidirectionalLineInfo = mImpl->mModel->mLogicalModel->mBidirectionalLineInfo; - - // Check first if there are paragraphs with bidirectional info. - if( 0u != bidirectionalInfo.Count() ) - { - // Get the lines - const Length numberOfLines = mImpl->mModel->mVisualModel->mLines.Count(); - - // Reorder the lines. - bidirectionalLineInfo.Reserve( numberOfLines ); // Reserve because is not known yet how many lines have right to left characters. - ReorderLines( bidirectionalInfo, - startIndex, - requestedNumberOfCharacters, - mImpl->mModel->mVisualModel->mLines, - bidirectionalLineInfo ); - - // Set the bidirectional info per line into the layout parameters. - layoutParameters.lineBidirectionalInfoRunsBuffer = bidirectionalLineInfo.Begin(); - layoutParameters.numberOfBidirectionalInfoRuns = bidirectionalLineInfo.Count(); - - // Re-layout the text. Reorder those lines with right to left characters. - mImpl->mLayoutEngine.ReLayoutRightToLeftLines( layoutParameters, - startIndex, - requestedNumberOfCharacters, - glyphPositions ); - - if ( ( NO_OPERATION != ( UPDATE_DIRECTION & operations ) ) && ( numberOfLines > 0 ) ) - { - const LineRun* const firstline = mImpl->mModel->mVisualModel->mLines.Begin(); - if ( firstline ) - { - mImpl->mIsTextDirectionRTL = firstline->direction; - } - } - } - } // REORDER + mImpl->mIsTextDirectionRTL = mImpl->mModel->mVisualModel->mLines[0u].direction; + } // Sets the layout size. if( NO_OPERATION != ( UPDATE_LAYOUT_SIZE & operations ) ) @@ -3945,11 +3930,23 @@ bool Controller::DoRelayout( const Size& size, // The laid-out lines. Vector& lines = mImpl->mModel->mVisualModel->mLines; + CharacterIndex alignStartIndex = startIndex; + Length alignRequestedNumberOfCharacters = requestedNumberOfCharacters; + + // the whole text needs to be full aligned. + // If you do not do a full aligned, only the last line of the multiline input is aligned. + if( mImpl->mEventData && mImpl->mEventData->mUpdateAlignment ) + { + alignStartIndex = 0u; + alignRequestedNumberOfCharacters = mImpl->mModel->mLogicalModel->mText.Count(); + mImpl->mEventData->mUpdateAlignment = false; + } + // Need to align with the control's size as the text may contain lines // starting either with left to right text or right to left. mImpl->mLayoutEngine.Align( size, - startIndex, - requestedNumberOfCharacters, + alignStartIndex, + alignRequestedNumberOfCharacters, mImpl->mModel->mHorizontalAlignment, lines, mImpl->mModel->mAlignmentOffset, @@ -4327,6 +4324,11 @@ bool Controller::ShouldClearFocusOnEscape() const return mImpl->mShouldClearFocusOnEscape; } +Actor Controller::CreateBackgroundActor() +{ + return mImpl->CreateBackgroundActor(); +} + // private : Private contructors & copy operator. Controller::Controller()