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=dcb290188b0307cb7f6ff2c1c62075a703b6f3e5;hp=849eb266b03152e8fb332e9ef883691089938beb;hb=3a0e332bcbb81df7de0a571f8b694b20bdbb12be;hpb=23f6baf53a7f1d165625a358251e31612f3b12fd diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 849eb26..dcb2901 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. @@ -31,6 +31,7 @@ #include #include #include +#include #include namespace @@ -73,6 +74,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 +264,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 +277,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; } @@ -1006,11 +1022,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 ) @@ -1018,31 +1048,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; } } } @@ -1642,9 +1672,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. @@ -1704,11 +1748,11 @@ void Controller::Impl::SendSelectionToClipboard( bool deleteAfterSending ) ChangeState( EventData::EDITING ); } -void Controller::Impl::GetTextFromClipboard( unsigned int itemIndex, std::string& retrievedString ) +void Controller::Impl::RequestGetTextFromClipboard() { if ( mClipboard ) { - retrievedString = mClipboard.GetItem( itemIndex ); + mClipboard.RequestItem(); } } @@ -2246,7 +2290,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHighlightActive( false ); mEventData->mDecorator->SetPopupActive( false ); mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::INTERRUPTED: @@ -2257,7 +2300,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetHighlightActive( false ); mEventData->mDecorator->SetPopupActive( false ); mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::SELECTING: @@ -2293,7 +2335,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetPopupActive( false ); } mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::EDITING_WITH_POPUP: @@ -2320,7 +2361,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) SetPopupButtons(); mEventData->mDecorator->SetPopupActive( true ); } - HideClipboard(); mEventData->mDecoratorUpdated = true; break; } @@ -2343,7 +2383,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) mEventData->mDecorator->SetPopupActive( false ); } mEventData->mDecoratorUpdated = true; - HideClipboard(); break; } case EventData::SELECTION_HANDLE_PANNING: @@ -2401,7 +2440,6 @@ void Controller::Impl::ChangeState( EventData::State newState ) SetPopupButtons(); mEventData->mDecorator->SetPopupActive( true ); } - HideClipboard(); mEventData->mDecoratorUpdated = true; break; } @@ -2645,6 +2683,12 @@ void Controller::Impl::ClampHorizontalScroll( const Vector2& layoutSize ) void Controller::Impl::ClampVerticalScroll( const Vector2& layoutSize ) { + if( LayoutEngine::SINGLE_LINE_BOX == mLayoutEngine.GetLayout() ) + { + // Nothing to do if the text is single line. + return; + } + // Clamp between -space & 0. if( layoutSize.height > mVisualModel->mControlSize.height ) { @@ -2712,7 +2756,10 @@ void Controller::Impl::ScrollTextToMatchCursor( const CursorInfo& cursorInfo ) void Controller::Impl::RequestRelayout() { - mControlInterface.RequestTextRelayout(); + if( NULL != mControlInterface ) + { + mControlInterface->RequestTextRelayout(); + } } } // namespace Text