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=30c6e04bccbeeffa7bf5faa4aff5107dfd835593;hp=bcff10f2760bd111104f08eb52280fcc6948ae09;hb=2de247c304a6f70fa87f465eb1b5417efd6e5f6b;hpb=dfd3018cbcc4e2a9c61b3cd165a0bd9b538b9d0c diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index bcff10f..30c6e04 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,12 +19,15 @@ #include // EXTERNAL INCLUDES -#include -#include -#include +#include +#include #include +#include +#include +#include // INTERNAL INCLUDES +#include #include #include #include @@ -35,7 +38,6 @@ namespace { - #if defined(DEBUG_ENABLED) Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_CONTROLS"); #endif @@ -44,53 +46,52 @@ constexpr float MAX_FLOAT = std::numeric_limits::max(); const std::string EMPTY_STRING(""); -int ConvertPixelToPint( float pixel ) +int ConvertPixelToPint(float pixel) { - unsigned int horizontalDpi = 0u; - unsigned int verticalDpi = 0u; - Dali::TextAbstraction::FontClient fontClient = Dali::TextAbstraction::FontClient::Get(); - fontClient.GetDpi( horizontalDpi, verticalDpi ); + unsigned int horizontalDpi = 0u; + unsigned int verticalDpi = 0u; + Dali::TextAbstraction::FontClient fontClient = Dali::TextAbstraction::FontClient::Get(); + fontClient.GetDpi(horizontalDpi, verticalDpi); - return ( pixel * 72.f ) / static_cast< float >( horizontalDpi ); + return (pixel * 72.f) / static_cast(horizontalDpi); } } // namespace namespace Dali { - namespace Toolkit { - namespace Text { - // public : Constructor. ControllerPtr Controller::New() { - return ControllerPtr( new Controller() ); + return ControllerPtr(new Controller()); } -ControllerPtr Controller::New( ControlInterface* controlInterface ) +ControllerPtr Controller::New(ControlInterface* controlInterface) { - return ControllerPtr( new Controller( controlInterface ) ); + return ControllerPtr(new Controller(controlInterface)); } -ControllerPtr Controller::New( ControlInterface* controlInterface, - EditableControlInterface* editableControlInterface, - SelectableControlInterface* selectableControlInterface ) +ControllerPtr Controller::New(ControlInterface* controlInterface, + EditableControlInterface* editableControlInterface, + SelectableControlInterface* selectableControlInterface, + AnchorControlInterface* anchorControlInterface) { - return ControllerPtr( new Controller( controlInterface, - editableControlInterface, - selectableControlInterface ) ); + return ControllerPtr(new Controller(controlInterface, + editableControlInterface, + selectableControlInterface, + anchorControlInterface)); } // public : Configure the text controller. -void Controller::EnableTextInput( DecoratorPtr decorator, InputMethodContext& inputMethodContext ) +void Controller::EnableTextInput(DecoratorPtr decorator, InputMethodContext& inputMethodContext) { - if( !decorator ) + if(!decorator) { delete mImpl->mEventData; mImpl->mEventData = NULL; @@ -99,16 +100,16 @@ void Controller::EnableTextInput( DecoratorPtr decorator, InputMethodContext& in return; } - if( NULL == mImpl->mEventData ) + if(NULL == mImpl->mEventData) { - mImpl->mEventData = new EventData( decorator, inputMethodContext ); + mImpl->mEventData = new EventData(decorator, inputMethodContext); } } -void Controller::SetGlyphType( TextAbstraction::GlyphType glyphType ) +void Controller::SetGlyphType(TextAbstraction::GlyphType glyphType) { // Metrics for bitmap & vector based glyphs are different - mImpl->mMetrics->SetGlyphType( glyphType ); + mImpl->mMetrics->SetGlyphType(glyphType); // Clear the font-specific data ClearFontData(); @@ -116,16 +117,18 @@ void Controller::SetGlyphType( TextAbstraction::GlyphType glyphType ) mImpl->RequestRelayout(); } -void Controller::SetMarkupProcessorEnabled( bool enable ) +void Controller::SetMarkupProcessorEnabled(bool enable) { - if( enable != mImpl->mMarkupProcessorEnabled ) + if(enable != mImpl->mMarkupProcessorEnabled) { //If Text was already set, call the SetText again for enabling or disabling markup mImpl->mMarkupProcessorEnabled = enable; std::string text; - GetText( text ); - SetText( text ); + GetText(text); + SetText(text); } + + mImpl->mModel->mVisualModel->SetMarkupProcessorEnabled(enable); } bool Controller::IsMarkupProcessorEnabled() const @@ -133,31 +136,35 @@ bool Controller::IsMarkupProcessorEnabled() const return mImpl->mMarkupProcessorEnabled; } -void Controller::SetAutoScrollEnabled( bool enable ) +bool Controller::HasAnchors() const +{ + return (mImpl->mMarkupProcessorEnabled && mImpl->mModel->mLogicalModel->mAnchors.Count() && mImpl->IsShowingRealText()); +} + +void Controller::SetAutoScrollEnabled(bool enable) { - DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled[%s] SingleBox[%s]-> [%p]\n", (enable)?"true":"false", ( mImpl->mLayoutEngine.GetLayout() == Layout::Engine::SINGLE_LINE_BOX)?"true":"false", this ); + DALI_LOG_INFO(gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled[%s] SingleBox[%s]-> [%p]\n", (enable) ? "true" : "false", (mImpl->mLayoutEngine.GetLayout() == Layout::Engine::SINGLE_LINE_BOX) ? "true" : "false", this); - if( mImpl->mLayoutEngine.GetLayout() == Layout::Engine::SINGLE_LINE_BOX ) + if(mImpl->mLayoutEngine.GetLayout() == Layout::Engine::SINGLE_LINE_BOX) { - if( enable ) + if(enable) { - DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled for SINGLE_LINE_BOX\n" ); - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | - LAYOUT | - ALIGN | - UPDATE_LAYOUT_SIZE | - UPDATE_DIRECTION | - REORDER ); - + DALI_LOG_INFO(gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled for SINGLE_LINE_BOX\n"); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | + LAYOUT | + ALIGN | + UPDATE_LAYOUT_SIZE | + UPDATE_DIRECTION | + REORDER); } else { - DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled Disabling autoscroll\n"); - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | - LAYOUT | - ALIGN | - UPDATE_LAYOUT_SIZE | - REORDER ); + DALI_LOG_INFO(gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled Disabling autoscroll\n"); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | + LAYOUT | + ALIGN | + UPDATE_LAYOUT_SIZE | + REORDER); } mImpl->mIsAutoScrollEnabled = enable; @@ -165,14 +172,14 @@ void Controller::SetAutoScrollEnabled( bool enable ) } else { - DALI_LOG_WARNING( "Attempted AutoScrolling on a non SINGLE_LINE_BOX, request ignored\n" ); + DALI_LOG_WARNING("Attempted AutoScrolling on a non SINGLE_LINE_BOX, request ignored\n"); mImpl->mIsAutoScrollEnabled = false; } } bool Controller::IsAutoScrollEnabled() const { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::IsAutoScrollEnabled[%s]\n", mImpl->mIsAutoScrollEnabled?"true":"false" ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Controller::IsAutoScrollEnabled[%s]\n", mImpl->mIsAutoScrollEnabled ? "true" : "false"); return mImpl->mIsAutoScrollEnabled; } @@ -186,27 +193,27 @@ float Controller::GetAutoScrollLineAlignment() const { float offset = 0.f; - if( mImpl->mModel->mVisualModel && - ( 0u != mImpl->mModel->mVisualModel->mLines.Count() ) ) + if(mImpl->mModel->mVisualModel && + (0u != mImpl->mModel->mVisualModel->mLines.Count())) { - offset = ( *mImpl->mModel->mVisualModel->mLines.Begin() ).alignmentOffset; + offset = (*mImpl->mModel->mVisualModel->mLines.Begin()).alignmentOffset; } return offset; } -void Controller::SetHorizontalScrollEnabled( bool enable ) +void Controller::SetHorizontalScrollEnabled(bool enable) { - if( ( NULL != mImpl->mEventData ) && - mImpl->mEventData->mDecorator ) + if((NULL != mImpl->mEventData) && + mImpl->mEventData->mDecorator) { - mImpl->mEventData->mDecorator->SetHorizontalScrollEnabled( enable ); + mImpl->mEventData->mDecorator->SetHorizontalScrollEnabled(enable); } } bool Controller::IsHorizontalScrollEnabled() const { - if( ( NULL != mImpl->mEventData ) && - mImpl->mEventData->mDecorator ) + if((NULL != mImpl->mEventData) && + mImpl->mEventData->mDecorator) { return mImpl->mEventData->mDecorator->IsHorizontalScrollEnabled(); } @@ -214,22 +221,22 @@ bool Controller::IsHorizontalScrollEnabled() const return false; } -void Controller::SetVerticalScrollEnabled( bool enable ) +void Controller::SetVerticalScrollEnabled(bool enable) { - if( ( NULL != mImpl->mEventData ) && - mImpl->mEventData->mDecorator ) + if((NULL != mImpl->mEventData) && + mImpl->mEventData->mDecorator) { - if( mImpl->mEventData->mDecorator ) + if(mImpl->mEventData->mDecorator) { - mImpl->mEventData->mDecorator->SetVerticalScrollEnabled( enable ); + mImpl->mEventData->mDecorator->SetVerticalScrollEnabled(enable); } } } bool Controller::IsVerticalScrollEnabled() const { - if( ( NULL != mImpl->mEventData ) && - mImpl->mEventData->mDecorator ) + if((NULL != mImpl->mEventData) && + mImpl->mEventData->mDecorator) { return mImpl->mEventData->mDecorator->IsVerticalScrollEnabled(); } @@ -237,19 +244,19 @@ bool Controller::IsVerticalScrollEnabled() const return false; } -void Controller::SetSmoothHandlePanEnabled( bool enable ) +void Controller::SetSmoothHandlePanEnabled(bool enable) { - if( ( NULL != mImpl->mEventData ) && - mImpl->mEventData->mDecorator ) + if((NULL != mImpl->mEventData) && + mImpl->mEventData->mDecorator) { - mImpl->mEventData->mDecorator->SetSmoothHandlePanEnabled( enable ); + mImpl->mEventData->mDecorator->SetSmoothHandlePanEnabled(enable); } } bool Controller::IsSmoothHandlePanEnabled() const { - if( ( NULL != mImpl->mEventData ) && - mImpl->mEventData->mDecorator ) + if((NULL != mImpl->mEventData) && + mImpl->mEventData->mDecorator) { return mImpl->mEventData->mDecorator->IsSmoothHandlePanEnabled(); } @@ -257,7 +264,7 @@ bool Controller::IsSmoothHandlePanEnabled() const return false; } -void Controller::SetMaximumNumberOfCharacters( Length maxCharacters ) +void Controller::SetMaximumNumberOfCharacters(Length maxCharacters) { mImpl->mMaximumNumberOfCharacters = maxCharacters; } @@ -267,16 +274,16 @@ int Controller::GetMaximumNumberOfCharacters() return mImpl->mMaximumNumberOfCharacters; } -void Controller::SetEnableCursorBlink( bool enable ) +void Controller::SetEnableCursorBlink(bool enable) { - DALI_ASSERT_DEBUG( NULL != mImpl->mEventData && "TextInput disabled" ); + DALI_ASSERT_DEBUG(NULL != mImpl->mEventData && "TextInput disabled"); - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mCursorBlinkEnabled = enable; - if( !enable && - mImpl->mEventData->mDecorator ) + if(!enable && + mImpl->mEventData->mDecorator) { mImpl->mEventData->mDecorator->StopCursorBlink(); } @@ -285,7 +292,7 @@ void Controller::SetEnableCursorBlink( bool enable ) bool Controller::GetEnableCursorBlink() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mCursorBlinkEnabled; } @@ -293,23 +300,23 @@ bool Controller::GetEnableCursorBlink() const return false; } -void Controller::SetMultiLineEnabled( bool enable ) +void Controller::SetMultiLineEnabled(bool enable) { const Layout::Engine::Type layout = enable ? Layout::Engine::MULTI_LINE_BOX : Layout::Engine::SINGLE_LINE_BOX; - if( layout != mImpl->mLayoutEngine.GetLayout() ) + if(layout != mImpl->mLayoutEngine.GetLayout()) { // Set the layout type. - mImpl->mLayoutEngine.SetLayout( layout ); + mImpl->mLayoutEngine.SetLayout(layout); // Set the flags to redo the layout operations - const OperationsMask layoutOperations = static_cast( LAYOUT | - UPDATE_LAYOUT_SIZE | - ALIGN | - REORDER ); + const OperationsMask layoutOperations = static_cast(LAYOUT | + UPDATE_LAYOUT_SIZE | + ALIGN | + REORDER); mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true; - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | layoutOperations ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | layoutOperations); // Need to recalculate natural size mImpl->mRecalculateNaturalSize = true; @@ -323,24 +330,24 @@ bool Controller::IsMultiLineEnabled() const return Layout::Engine::MULTI_LINE_BOX == mImpl->mLayoutEngine.GetLayout(); } -void Controller::SetHorizontalAlignment( Text::HorizontalAlignment::Type alignment ) +void Controller::SetHorizontalAlignment(Text::HorizontalAlignment::Type alignment) { - if( alignment != mImpl->mModel->mHorizontalAlignment ) + if(alignment != mImpl->mModel->mHorizontalAlignment) { // Set the alignment. mImpl->mModel->mHorizontalAlignment = alignment; // Set the flag to redo the alignment operation. - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | ALIGN ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | ALIGN); - if( mImpl->mEventData ) + if(mImpl->mEventData) { mImpl->mEventData->mUpdateAlignment = true; // Update the cursor if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->ChangeState( EventData::EDITING ); + mImpl->ChangeState(EventData::EDITING); mImpl->mEventData->mUpdateCursorPosition = true; } } @@ -354,14 +361,14 @@ Text::HorizontalAlignment::Type Controller::GetHorizontalAlignment() const return mImpl->mModel->mHorizontalAlignment; } -void Controller::SetVerticalAlignment( VerticalAlignment::Type alignment ) +void Controller::SetVerticalAlignment(VerticalAlignment::Type alignment) { - if( alignment != mImpl->mModel->mVerticalAlignment ) + if(alignment != mImpl->mModel->mVerticalAlignment) { // Set the alignment. mImpl->mModel->mVerticalAlignment = alignment; - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | ALIGN ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | ALIGN); mImpl->RequestRelayout(); } @@ -377,49 +384,72 @@ bool Controller::IsIgnoreSpacesAfterText() const return mImpl->mModel->mIgnoreSpacesAfterText; } -void Controller::SetIgnoreSpacesAfterText( bool ignore ) +void Controller::SetIgnoreSpacesAfterText(bool ignore) { mImpl->mModel->mIgnoreSpacesAfterText = ignore; } -bool Controller::IsMatchSystemLanguageDirection() const +void Controller::ChangedLayoutDirection() +{ + mImpl->mIsLayoutDirectionChanged = true; +} + +void Controller::SetMatchLayoutDirection(DevelText::MatchLayoutDirection type) { - return mImpl->mModel->mMatchSystemLanguageDirection; + mImpl->mModel->mMatchLayoutDirection = type; } -void Controller::SetMatchSystemLanguageDirection( bool match ) +DevelText::MatchLayoutDirection Controller::GetMatchLayoutDirection() const { - mImpl->mModel->mMatchSystemLanguageDirection = match; + return mImpl->mModel->mMatchLayoutDirection; } -void Controller::SetLayoutDirection( Dali::LayoutDirection::Type layoutDirection ) +void Controller::SetLayoutDirection(Dali::LayoutDirection::Type layoutDirection) { mImpl->mLayoutDirection = layoutDirection; } +Dali::LayoutDirection::Type Controller::GetLayoutDirection(Dali::Actor& actor) const +{ + if(mImpl->mModel->mMatchLayoutDirection == DevelText::MatchLayoutDirection::LOCALE || + (mImpl->mModel->mMatchLayoutDirection == DevelText::MatchLayoutDirection::INHERIT && !mImpl->mIsLayoutDirectionChanged)) + { + return static_cast(DevelWindow::Get(actor).GetRootLayer().GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get()); + } + else + { + return static_cast(actor.GetProperty(Dali::Actor::Property::LAYOUT_DIRECTION).Get()); + } +} + bool Controller::IsShowingRealText() const { return mImpl->IsShowingRealText(); } - -void Controller::SetLineWrapMode( Text::LineWrap::Mode lineWrapMode ) +void Controller::SetLineWrapMode(Text::LineWrap::Mode lineWrapMode) { - if( lineWrapMode != mImpl->mModel->mLineWrapMode ) + if(lineWrapMode != mImpl->mModel->mLineWrapMode) { + // Update Text layout for applying wrap mode + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | + ALIGN | + LAYOUT | + UPDATE_LAYOUT_SIZE | + REORDER); + + if((mImpl->mModel->mLineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION) || (lineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::HYPHENATION) || + (mImpl->mModel->mLineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::MIXED) || (lineWrapMode == (Text::LineWrap::Mode)DevelText::LineWrap::MIXED)) // hyphen is treated as line break + { + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | GET_LINE_BREAKS); + } + // Set the text wrap mode. mImpl->mModel->mLineWrapMode = lineWrapMode; - - // Update Text layout for applying wrap mode - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | - ALIGN | - LAYOUT | - UPDATE_LAYOUT_SIZE | - REORDER ); - mImpl->mTextUpdateInfo.mCharacterIndex = 0u; + mImpl->mTextUpdateInfo.mCharacterIndex = 0u; mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; - mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); // Request relayout mImpl->RequestRelayout(); @@ -431,9 +461,10 @@ Text::LineWrap::Mode Controller::GetLineWrapMode() const return mImpl->mModel->mLineWrapMode; } -void Controller::SetTextElideEnabled( bool enabled ) +void Controller::SetTextElideEnabled(bool enabled) { mImpl->mModel->mElideEnabled = enabled; + mImpl->mModel->mVisualModel->SetTextElideEnabled(enabled); } bool Controller::IsTextElideEnabled() const @@ -451,9 +482,9 @@ bool Controller::IsTextFitEnabled() const return mImpl->mTextFitEnabled; } -void Controller::SetTextFitMinSize( float minSize, FontSizeType type ) +void Controller::SetTextFitMinSize(float minSize, FontSizeType type) { - switch( type ) + switch(type) { case POINT_SIZE: { @@ -462,7 +493,7 @@ void Controller::SetTextFitMinSize( float minSize, FontSizeType type ) } case PIXEL_SIZE: { - mImpl->mTextFitMinSize = ConvertPixelToPint( minSize ); + mImpl->mTextFitMinSize = ConvertPixelToPint(minSize); break; } } @@ -473,9 +504,9 @@ float Controller::GetTextFitMinSize() const return mImpl->mTextFitMinSize; } -void Controller::SetTextFitMaxSize( float maxSize, FontSizeType type ) +void Controller::SetTextFitMaxSize(float maxSize, FontSizeType type) { - switch( type ) + switch(type) { case POINT_SIZE: { @@ -484,7 +515,7 @@ void Controller::SetTextFitMaxSize( float maxSize, FontSizeType type ) } case PIXEL_SIZE: { - mImpl->mTextFitMaxSize = ConvertPixelToPint( maxSize ); + mImpl->mTextFitMaxSize = ConvertPixelToPint(maxSize); break; } } @@ -495,9 +526,9 @@ float Controller::GetTextFitMaxSize() const return mImpl->mTextFitMaxSize; } -void Controller::SetTextFitStepSize( float step, FontSizeType type ) +void Controller::SetTextFitStepSize(float step, FontSizeType type) { - switch( type ) + switch(type) { case POINT_SIZE: { @@ -506,7 +537,7 @@ void Controller::SetTextFitStepSize( float step, FontSizeType type ) } case PIXEL_SIZE: { - mImpl->mTextFitStepSize = ConvertPixelToPint( step ); + mImpl->mTextFitStepSize = ConvertPixelToPint(step); break; } } @@ -527,7 +558,7 @@ Vector2 Controller::GetTextFitContentSize() const return mImpl->mTextFitContentSize; } -void Controller::SetPlaceholderTextElideEnabled( bool enabled ) +void Controller::SetPlaceholderTextElideEnabled(bool enabled) { PlaceholderHandler::SetPlaceholderTextElideEnabled(*this, enabled); } @@ -537,7 +568,7 @@ bool Controller::IsPlaceholderTextElideEnabled() const return PlaceholderHandler::IsPlaceholderTextElideEnabled(*this); } -void Controller::SetSelectionEnabled( bool enabled ) +void Controller::SetSelectionEnabled(bool enabled) { mImpl->mEventData->mSelectionEnabled = enabled; } @@ -547,7 +578,7 @@ bool Controller::IsSelectionEnabled() const return mImpl->mEventData->mSelectionEnabled; } -void Controller::SetShiftSelectionEnabled( bool enabled ) +void Controller::SetShiftSelectionEnabled(bool enabled) { mImpl->mEventData->mShiftSelectionFlag = enabled; } @@ -557,7 +588,7 @@ bool Controller::IsShiftSelectionEnabled() const return mImpl->mEventData->mShiftSelectionFlag; } -void Controller::SetGrabHandleEnabled( bool enabled ) +void Controller::SetGrabHandleEnabled(bool enabled) { mImpl->mEventData->mGrabHandleEnabled = enabled; } @@ -579,41 +610,41 @@ bool Controller::IsGrabHandlePopupEnabled() const // public : Update -void Controller::SetText( const std::string& text ) +void Controller::SetText(const std::string& text) { TextUpdater::SetText(*this, text); } -void Controller::GetText( std::string& text ) const +void Controller::GetText(std::string& text) const { - if( !mImpl->IsShowingPlaceholderText() ) + if(!mImpl->IsShowingPlaceholderText()) { // Retrieves the text string. - mImpl->GetText( 0u, text ); + mImpl->GetText(0u, text); } else { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::GetText %p empty (but showing placeholder)\n", this ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Controller::GetText %p empty (but showing placeholder)\n", this); } } -void Controller::SetPlaceholderText( PlaceholderType type, const std::string& text ) +void Controller::SetPlaceholderText(PlaceholderType type, const std::string& text) { PlaceholderHandler::SetPlaceholderText(*this, type, text); } -void Controller::GetPlaceholderText( PlaceholderType type, std::string& text ) const +void Controller::GetPlaceholderText(PlaceholderType type, std::string& text) const { - PlaceholderHandler::GetPlaceholderText(*this, type, text ); + PlaceholderHandler::GetPlaceholderText(*this, type, text); } -void Controller::UpdateAfterFontChange( const std::string& newDefaultFont ) +void Controller::UpdateAfterFontChange(const std::string& newDefaultFont) { - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::UpdateAfterFontChange\n"); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Controller::UpdateAfterFontChange\n"); - if( !mImpl->mFontDefaults->familyDefined ) // If user defined font then should not update when system font changes + if(!mImpl->mFontDefaults->familyDefined) // If user defined font then should not update when system font changes { - DALI_LOG_INFO( gLogFilter, Debug::Concise, "Controller::UpdateAfterFontChange newDefaultFont(%s)\n", newDefaultFont.c_str() ); + DALI_LOG_INFO(gLogFilter, Debug::Concise, "Controller::UpdateAfterFontChange newDefaultFont(%s)\n", newDefaultFont.c_str()); mImpl->mFontDefaults->mFontDescription.family = newDefaultFont; ClearFontData(); @@ -622,50 +653,50 @@ void Controller::UpdateAfterFontChange( const std::string& newDefaultFont ) } } -void Controller::RetrieveSelection( std::string& selectedText ) const +void Controller::RetrieveSelection(std::string& selectedText) const { - mImpl->RetrieveSelection( selectedText, false ); + mImpl->RetrieveSelection(selectedText, false); } -void Controller::SetSelection( int start, int end ) +void Controller::SetSelection(int start, int end) { - mImpl->SetSelection( start, end ); + mImpl->SetSelection(start, end); } -std::pair< int, int > Controller::GetSelectionIndexes() const +std::pair Controller::GetSelectionIndexes() const { return mImpl->GetSelectionIndexes(); } -void Controller::CopyStringToClipboard( const std::string& source ) +void Controller::CopyStringToClipboard(const std::string& source) { - mImpl->CopyStringToClipboard( source ); + mImpl->CopyStringToClipboard(source); } -void Controller::SendSelectionToClipboard( bool deleteAfterSending ) +void Controller::SendSelectionToClipboard(bool deleteAfterSending) { - mImpl->SendSelectionToClipboard( deleteAfterSending ); + mImpl->SendSelectionToClipboard(deleteAfterSending); } // public : Default style & Input style -void Controller::SetDefaultFontFamily( const std::string& defaultFontFamily ) +void Controller::SetDefaultFontFamily(const std::string& defaultFontFamily) { - if( NULL == mImpl->mFontDefaults ) + if(NULL == mImpl->mFontDefaults) { mImpl->mFontDefaults = new FontDefaults(); } mImpl->mFontDefaults->mFontDescription.family = defaultFontFamily; - DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetDefaultFontFamily %s\n", defaultFontFamily.c_str()); + DALI_LOG_INFO(gLogFilter, Debug::General, "Controller::SetDefaultFontFamily %s\n", defaultFontFamily.c_str()); mImpl->mFontDefaults->familyDefined = !defaultFontFamily.empty(); - if( mImpl->mEventData ) + if(mImpl->mEventData) { // Update the cursor position if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->mEventData->mDecoratorUpdated = true; + mImpl->mEventData->mDecoratorUpdated = true; mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font family is updated. } } @@ -678,7 +709,7 @@ void Controller::SetDefaultFontFamily( const std::string& defaultFontFamily ) const std::string& Controller::GetDefaultFontFamily() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->mFontDescription.family; } @@ -686,7 +717,7 @@ const std::string& Controller::GetDefaultFontFamily() const return EMPTY_STRING; } -void Controller::SetPlaceholderFontFamily( const std::string& placeholderTextFontFamily ) +void Controller::SetPlaceholderFontFamily(const std::string& placeholderTextFontFamily) { PlaceholderHandler::SetPlaceholderFontFamily(*this, placeholderTextFontFamily); } @@ -696,22 +727,22 @@ const std::string& Controller::GetPlaceholderFontFamily() const return PlaceholderHandler::GetPlaceholderFontFamily(*this); } -void Controller::SetDefaultFontWeight( FontWeight weight ) +void Controller::SetDefaultFontWeight(FontWeight weight) { - if( NULL == mImpl->mFontDefaults ) + if(NULL == mImpl->mFontDefaults) { mImpl->mFontDefaults = new FontDefaults(); } mImpl->mFontDefaults->mFontDescription.weight = weight; - mImpl->mFontDefaults->weightDefined = true; + mImpl->mFontDefaults->weightDefined = true; - if( mImpl->mEventData ) + if(mImpl->mEventData) { // Update the cursor position if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->mEventData->mDecoratorUpdated = true; + mImpl->mEventData->mDecoratorUpdated = true; mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font weight is updated. } } @@ -724,7 +755,7 @@ void Controller::SetDefaultFontWeight( FontWeight weight ) bool Controller::IsDefaultFontWeightDefined() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->weightDefined; } @@ -734,7 +765,7 @@ bool Controller::IsDefaultFontWeightDefined() const FontWeight Controller::GetDefaultFontWeight() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->mFontDescription.weight; } @@ -742,14 +773,15 @@ FontWeight Controller::GetDefaultFontWeight() const return TextAbstraction::FontWeight::NORMAL; } -void Controller::SetPlaceholderTextFontWeight( FontWeight weight ) +void Controller::SetPlaceholderTextFontWeight(FontWeight weight) { PlaceholderHandler::SetPlaceholderTextFontWeight(*this, weight); } bool Controller::IsPlaceholderTextFontWeightDefined() const { - return PlaceholderHandler::IsPlaceholderTextFontWeightDefined(*this);; + return PlaceholderHandler::IsPlaceholderTextFontWeightDefined(*this); + ; } FontWeight Controller::GetPlaceholderTextFontWeight() const @@ -757,22 +789,22 @@ FontWeight Controller::GetPlaceholderTextFontWeight() const return PlaceholderHandler::GetPlaceholderTextFontWeight(*this); } -void Controller::SetDefaultFontWidth( FontWidth width ) +void Controller::SetDefaultFontWidth(FontWidth width) { - if( NULL == mImpl->mFontDefaults ) + if(NULL == mImpl->mFontDefaults) { mImpl->mFontDefaults = new FontDefaults(); } mImpl->mFontDefaults->mFontDescription.width = width; - mImpl->mFontDefaults->widthDefined = true; + mImpl->mFontDefaults->widthDefined = true; - if( mImpl->mEventData ) + if(mImpl->mEventData) { // Update the cursor position if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->mEventData->mDecoratorUpdated = true; + mImpl->mEventData->mDecoratorUpdated = true; mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font width is updated. } } @@ -785,7 +817,7 @@ void Controller::SetDefaultFontWidth( FontWidth width ) bool Controller::IsDefaultFontWidthDefined() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->widthDefined; } @@ -795,7 +827,7 @@ bool Controller::IsDefaultFontWidthDefined() const FontWidth Controller::GetDefaultFontWidth() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->mFontDescription.width; } @@ -803,7 +835,7 @@ FontWidth Controller::GetDefaultFontWidth() const return TextAbstraction::FontWidth::NORMAL; } -void Controller::SetPlaceholderTextFontWidth( FontWidth width ) +void Controller::SetPlaceholderTextFontWidth(FontWidth width) { PlaceholderHandler::SetPlaceholderTextFontWidth(*this, width); } @@ -818,22 +850,22 @@ FontWidth Controller::GetPlaceholderTextFontWidth() const return PlaceholderHandler::GetPlaceholderTextFontWidth(*this); } -void Controller::SetDefaultFontSlant( FontSlant slant ) +void Controller::SetDefaultFontSlant(FontSlant slant) { - if( NULL == mImpl->mFontDefaults ) + if(NULL == mImpl->mFontDefaults) { mImpl->mFontDefaults = new FontDefaults(); } mImpl->mFontDefaults->mFontDescription.slant = slant; - mImpl->mFontDefaults->slantDefined = true; + mImpl->mFontDefaults->slantDefined = true; - if( mImpl->mEventData ) + if(mImpl->mEventData) { // Update the cursor position if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->mEventData->mDecoratorUpdated = true; + mImpl->mEventData->mDecoratorUpdated = true; mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font slant is updated. } } @@ -846,7 +878,7 @@ void Controller::SetDefaultFontSlant( FontSlant slant ) bool Controller::IsDefaultFontSlantDefined() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->slantDefined; } @@ -855,7 +887,7 @@ bool Controller::IsDefaultFontSlantDefined() const FontSlant Controller::GetDefaultFontSlant() const { - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { return mImpl->mFontDefaults->mFontDescription.slant; } @@ -863,7 +895,7 @@ FontSlant Controller::GetDefaultFontSlant() const return TextAbstraction::FontSlant::NORMAL; } -void Controller::SetPlaceholderTextFontSlant( FontSlant slant ) +void Controller::SetPlaceholderTextFontSlant(FontSlant slant) { PlaceholderHandler::SetPlaceholderTextFontSlant(*this, slant); } @@ -878,16 +910,16 @@ FontSlant Controller::GetPlaceholderTextFontSlant() const return PlaceholderHandler::GetPlaceholderTextFontSlant(*this); } -void Controller::SetFontSizeScale( float scale ) +void Controller::SetFontSizeScale(float scale) { mImpl->mFontSizeScale = scale; - if( mImpl->mEventData ) + if(mImpl->mEventData) { // Update the cursor position if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->mEventData->mDecoratorUpdated = true; + mImpl->mEventData->mDecoratorUpdated = true; mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font size is updated. } } @@ -900,7 +932,7 @@ void Controller::SetFontSizeScale( float scale ) float Controller::GetFontSizeScale() const { - if( nullptr != mImpl->mFontDefaults ) + if(nullptr != mImpl->mFontDefaults) { return mImpl->mFontSizeScale; } @@ -908,41 +940,41 @@ float Controller::GetFontSizeScale() const return 1.f; } -void Controller::SetDefaultFontSize( float fontSize, FontSizeType type ) +void Controller::SetDefaultFontSize(float fontSize, FontSizeType type) { - if( NULL == mImpl->mFontDefaults ) + if(NULL == mImpl->mFontDefaults) { mImpl->mFontDefaults = new FontDefaults(); } - switch( type ) + switch(type) { case POINT_SIZE: { mImpl->mFontDefaults->mDefaultPointSize = fontSize; - mImpl->mFontDefaults->sizeDefined = true; + mImpl->mFontDefaults->sizeDefined = true; break; } case PIXEL_SIZE: { // Point size = Pixel size * 72.f / DPI - unsigned int horizontalDpi = 0u; - unsigned int verticalDpi = 0u; - TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.GetDpi( horizontalDpi, verticalDpi ); + unsigned int horizontalDpi = 0u; + unsigned int verticalDpi = 0u; + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.GetDpi(horizontalDpi, verticalDpi); - mImpl->mFontDefaults->mDefaultPointSize = ( fontSize * 72.f ) / static_cast< float >( horizontalDpi ); - mImpl->mFontDefaults->sizeDefined = true; + mImpl->mFontDefaults->mDefaultPointSize = (fontSize * 72.f) / static_cast(horizontalDpi); + mImpl->mFontDefaults->sizeDefined = true; break; } } - if( mImpl->mEventData ) + if(mImpl->mEventData) { // Update the cursor position if it's in editing mode - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { - mImpl->mEventData->mDecoratorUpdated = true; + mImpl->mEventData->mDecoratorUpdated = true; mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font size is updated. } } @@ -953,12 +985,12 @@ void Controller::SetDefaultFontSize( float fontSize, FontSizeType type ) mImpl->RequestRelayout(); } -float Controller::GetDefaultFontSize( FontSizeType type ) const +float Controller::GetDefaultFontSize(FontSizeType type) const { float value = 0.0f; - if( NULL != mImpl->mFontDefaults ) + if(NULL != mImpl->mFontDefaults) { - switch( type ) + switch(type) { case POINT_SIZE: { @@ -968,12 +1000,12 @@ float Controller::GetDefaultFontSize( FontSizeType type ) const case PIXEL_SIZE: { // Pixel size = Point size * DPI / 72.f - unsigned int horizontalDpi = 0u; - unsigned int verticalDpi = 0u; - TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - fontClient.GetDpi( horizontalDpi, verticalDpi ); + unsigned int horizontalDpi = 0u; + unsigned int verticalDpi = 0u; + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.GetDpi(horizontalDpi, verticalDpi); - value = mImpl->mFontDefaults->mDefaultPointSize * static_cast< float >( horizontalDpi ) / 72.f; + value = mImpl->mFontDefaults->mDefaultPointSize * static_cast(horizontalDpi) / 72.f; break; } } @@ -983,27 +1015,27 @@ float Controller::GetDefaultFontSize( FontSizeType type ) const return value; } -void Controller::SetPlaceholderTextFontSize( float fontSize, FontSizeType type ) +void Controller::SetPlaceholderTextFontSize(float fontSize, FontSizeType type) { PlaceholderHandler::SetPlaceholderTextFontSize(*this, fontSize, type); } -float Controller::GetPlaceholderTextFontSize( FontSizeType type ) const +float Controller::GetPlaceholderTextFontSize(FontSizeType type) const { return PlaceholderHandler::GetPlaceholderTextFontSize(*this, type); } -void Controller::SetDefaultColor( const Vector4& color ) +void Controller::SetDefaultColor(const Vector4& color) { mImpl->mTextColor = color; - if( !mImpl->IsShowingPlaceholderText() ) + if(!mImpl->IsShowingPlaceholderText()) { - mImpl->mModel->mVisualModel->SetTextColor( color ); + mImpl->mModel->mVisualModel->SetTextColor(color); mImpl->mModel->mLogicalModel->mColorRuns.Clear(); - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | COLOR ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | COLOR); mImpl->RequestRelayout(); } @@ -1014,7 +1046,7 @@ const Vector4& Controller::GetDefaultColor() const return mImpl->mTextColor; } -void Controller::SetPlaceholderTextColor( const Vector4& textColor ) +void Controller::SetPlaceholderTextColor(const Vector4& textColor) { PlaceholderHandler::SetPlaceholderTextColor(*this, textColor); } @@ -1024,9 +1056,9 @@ const Vector4& Controller::GetPlaceholderTextColor() const return PlaceholderHandler::GetPlaceholderTextColor(*this); } -void Controller::SetShadowOffset( const Vector2& shadowOffset ) +void Controller::SetShadowOffset(const Vector2& shadowOffset) { - mImpl->mModel->mVisualModel->SetShadowOffset( shadowOffset ); + mImpl->mModel->mVisualModel->SetShadowOffset(shadowOffset); mImpl->RequestRelayout(); } @@ -1036,9 +1068,9 @@ const Vector2& Controller::GetShadowOffset() const return mImpl->mModel->mVisualModel->GetShadowOffset(); } -void Controller::SetShadowColor( const Vector4& shadowColor ) +void Controller::SetShadowColor(const Vector4& shadowColor) { - mImpl->mModel->mVisualModel->SetShadowColor( shadowColor ); + mImpl->mModel->mVisualModel->SetShadowColor(shadowColor); mImpl->RequestRelayout(); } @@ -1048,11 +1080,11 @@ const Vector4& Controller::GetShadowColor() const return mImpl->mModel->mVisualModel->GetShadowColor(); } -void Controller::SetShadowBlurRadius( const float& shadowBlurRadius ) +void Controller::SetShadowBlurRadius(const float& shadowBlurRadius) { - if ( fabsf( GetShadowBlurRadius() - shadowBlurRadius ) > Math::MACHINE_EPSILON_1 ) + if(fabsf(GetShadowBlurRadius() - shadowBlurRadius) > Math::MACHINE_EPSILON_1) { - mImpl->mModel->mVisualModel->SetShadowBlurRadius( shadowBlurRadius ); + mImpl->mModel->mVisualModel->SetShadowBlurRadius(shadowBlurRadius); mImpl->RequestRelayout(); } @@ -1063,9 +1095,9 @@ const float& Controller::GetShadowBlurRadius() const return mImpl->mModel->mVisualModel->GetShadowBlurRadius(); } -void Controller::SetUnderlineColor( const Vector4& color ) +void Controller::SetUnderlineColor(const Vector4& color) { - mImpl->mModel->mVisualModel->SetUnderlineColor( color ); + mImpl->mModel->mVisualModel->SetUnderlineColor(color); mImpl->RequestRelayout(); } @@ -1075,9 +1107,9 @@ const Vector4& Controller::GetUnderlineColor() const return mImpl->mModel->mVisualModel->GetUnderlineColor(); } -void Controller::SetUnderlineEnabled( bool enabled ) +void Controller::SetUnderlineEnabled(bool enabled) { - mImpl->mModel->mVisualModel->SetUnderlineEnabled( enabled ); + mImpl->mModel->mVisualModel->SetUnderlineEnabled(enabled); mImpl->RequestRelayout(); } @@ -1087,9 +1119,9 @@ bool Controller::IsUnderlineEnabled() const return mImpl->mModel->mVisualModel->IsUnderlineEnabled(); } -void Controller::SetUnderlineHeight( float height ) +void Controller::SetUnderlineHeight(float height) { - mImpl->mModel->mVisualModel->SetUnderlineHeight( height ); + mImpl->mModel->mVisualModel->SetUnderlineHeight(height); mImpl->RequestRelayout(); } @@ -1099,9 +1131,9 @@ float Controller::GetUnderlineHeight() const return mImpl->mModel->mVisualModel->GetUnderlineHeight(); } -void Controller::SetOutlineColor( const Vector4& color ) +void Controller::SetOutlineColor(const Vector4& color) { - mImpl->mModel->mVisualModel->SetOutlineColor( color ); + mImpl->mModel->mVisualModel->SetOutlineColor(color); mImpl->RequestRelayout(); } @@ -1111,9 +1143,9 @@ const Vector4& Controller::GetOutlineColor() const return mImpl->mModel->mVisualModel->GetOutlineColor(); } -void Controller::SetOutlineWidth( uint16_t width ) +void Controller::SetOutlineWidth(uint16_t width) { - mImpl->mModel->mVisualModel->SetOutlineWidth( width ); + mImpl->mModel->mVisualModel->SetOutlineWidth(width); mImpl->RequestRelayout(); } @@ -1123,9 +1155,9 @@ uint16_t Controller::GetOutlineWidth() const return mImpl->mModel->mVisualModel->GetOutlineWidth(); } -void Controller::SetBackgroundColor( const Vector4& color ) +void Controller::SetBackgroundColor(const Vector4& color) { - mImpl->mModel->mVisualModel->SetBackgroundColor( color ); + mImpl->mModel->mVisualModel->SetBackgroundColor(color); mImpl->RequestRelayout(); } @@ -1135,9 +1167,9 @@ const Vector4& Controller::GetBackgroundColor() const return mImpl->mModel->mVisualModel->GetBackgroundColor(); } -void Controller::SetBackgroundEnabled( bool enabled ) +void Controller::SetBackgroundEnabled(bool enabled) { - mImpl->mModel->mVisualModel->SetBackgroundEnabled( enabled ); + mImpl->mModel->mVisualModel->SetBackgroundEnabled(enabled); mImpl->RequestRelayout(); } @@ -1147,9 +1179,9 @@ bool Controller::IsBackgroundEnabled() const return mImpl->mModel->mVisualModel->IsBackgroundEnabled(); } -void Controller::SetDefaultEmbossProperties( const std::string& embossProperties ) +void Controller::SetDefaultEmbossProperties(const std::string& embossProperties) { - if( NULL == mImpl->mEmbossDefaults ) + if(NULL == mImpl->mEmbossDefaults) { mImpl->mEmbossDefaults = new EmbossDefaults(); } @@ -1159,7 +1191,7 @@ void Controller::SetDefaultEmbossProperties( const std::string& embossProperties const std::string& Controller::GetDefaultEmbossProperties() const { - if( NULL != mImpl->mEmbossDefaults ) + if(NULL != mImpl->mEmbossDefaults) { return mImpl->mEmbossDefaults->properties; } @@ -1167,9 +1199,9 @@ const std::string& Controller::GetDefaultEmbossProperties() const return EMPTY_STRING; } -void Controller::SetDefaultOutlineProperties( const std::string& outlineProperties ) +void Controller::SetDefaultOutlineProperties(const std::string& outlineProperties) { - if( NULL == mImpl->mOutlineDefaults ) + if(NULL == mImpl->mOutlineDefaults) { mImpl->mOutlineDefaults = new OutlineDefaults(); } @@ -1179,7 +1211,7 @@ void Controller::SetDefaultOutlineProperties( const std::string& outlineProperti const std::string& Controller::GetDefaultOutlineProperties() const { - if( NULL != mImpl->mOutlineDefaults ) + if(NULL != mImpl->mOutlineDefaults) { return mImpl->mOutlineDefaults->properties; } @@ -1187,12 +1219,31 @@ const std::string& Controller::GetDefaultOutlineProperties() const return EMPTY_STRING; } -bool Controller::SetDefaultLineSpacing( float lineSpacing ) +void Controller::RelayoutForNewLineSize() { - if( std::fabs( lineSpacing - mImpl->mLayoutEngine.GetDefaultLineSpacing() ) > Math::MACHINE_EPSILON_1000 ) + // relayout all characters + mImpl->mTextUpdateInfo.mCharacterIndex = 0; + mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | LAYOUT); + + //remove selection + if((mImpl->mEventData != nullptr) && (mImpl->mEventData->mState == EventData::SELECTING)) + { + mImpl->ChangeState(EventData::EDITING); + } + + mImpl->RequestRelayout(); +} + +bool Controller::SetDefaultLineSpacing(float lineSpacing) +{ + if(std::fabs(lineSpacing - mImpl->mLayoutEngine.GetDefaultLineSpacing()) > Math::MACHINE_EPSILON_1000) { mImpl->mLayoutEngine.SetDefaultLineSpacing(lineSpacing); mImpl->mRecalculateNaturalSize = true; + + RelayoutForNewLineSize(); return true; } return false; @@ -1203,12 +1254,14 @@ float Controller::GetDefaultLineSpacing() const return mImpl->mLayoutEngine.GetDefaultLineSpacing(); } -bool Controller::SetDefaultLineSize( float lineSize ) +bool Controller::SetDefaultLineSize(float lineSize) { - if( std::fabs( lineSize - mImpl->mLayoutEngine.GetDefaultLineSize() ) > Math::MACHINE_EPSILON_1000 ) + if(std::fabs(lineSize - mImpl->mLayoutEngine.GetDefaultLineSize()) > Math::MACHINE_EPSILON_1000) { mImpl->mLayoutEngine.SetDefaultLineSize(lineSize); mImpl->mRecalculateNaturalSize = true; + + RelayoutForNewLineSize(); return true; } return false; @@ -1219,54 +1272,62 @@ float Controller::GetDefaultLineSize() const return mImpl->mLayoutEngine.GetDefaultLineSize(); } -void Controller::SetInputColor( const Vector4& color ) +void Controller::SetInputColor(const Vector4& color) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { - mImpl->mEventData->mInputStyle.textColor = color; + mImpl->mEventData->mInputStyle.textColor = color; mImpl->mEventData->mInputStyle.isDefaultColor = false; - if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState ) + if(EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState) { - const bool handlesCrossed = mImpl->mEventData->mLeftSelectionPosition > mImpl->mEventData->mRightSelectionPosition; + if(EventData::SELECTING == mImpl->mEventData->mState) + { + const bool handlesCrossed = mImpl->mEventData->mLeftSelectionPosition > mImpl->mEventData->mRightSelectionPosition; - // Get start and end position of selection - const CharacterIndex startOfSelectedText = handlesCrossed ? mImpl->mEventData->mRightSelectionPosition : mImpl->mEventData->mLeftSelectionPosition; - const Length lengthOfSelectedText = ( handlesCrossed ? mImpl->mEventData->mLeftSelectionPosition : mImpl->mEventData->mRightSelectionPosition ) - startOfSelectedText; + // Get start and end position of selection + const CharacterIndex startOfSelectedText = handlesCrossed ? mImpl->mEventData->mRightSelectionPosition : mImpl->mEventData->mLeftSelectionPosition; + const Length lengthOfSelectedText = (handlesCrossed ? mImpl->mEventData->mLeftSelectionPosition : mImpl->mEventData->mRightSelectionPosition) - startOfSelectedText; - // Add the color run. - const VectorBase::SizeType numberOfRuns = mImpl->mModel->mLogicalModel->mColorRuns.Count(); - mImpl->mModel->mLogicalModel->mColorRuns.Resize( numberOfRuns + 1u ); + // Add the color run. + const VectorBase::SizeType numberOfRuns = mImpl->mModel->mLogicalModel->mColorRuns.Count(); + mImpl->mModel->mLogicalModel->mColorRuns.Resize(numberOfRuns + 1u); - ColorRun& colorRun = *( mImpl->mModel->mLogicalModel->mColorRuns.Begin() + numberOfRuns ); - colorRun.color = color; - colorRun.characterRun.characterIndex = startOfSelectedText; - colorRun.characterRun.numberOfCharacters = lengthOfSelectedText; + ColorRun& colorRun = *(mImpl->mModel->mLogicalModel->mColorRuns.Begin() + numberOfRuns); + colorRun.color = color; + colorRun.characterRun.characterIndex = startOfSelectedText; + colorRun.characterRun.numberOfCharacters = lengthOfSelectedText; + + mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText; + mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText; + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText; + } + else + { + mImpl->mTextUpdateInfo.mCharacterIndex = 0; + mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); + } // Request to relayout. - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | COLOR ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | COLOR); mImpl->RequestRelayout(); - - mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText; - mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText; - mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText; } } } const Vector4& Controller::GetInputColor() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mInputStyle.textColor; } // Return the default text's color if there is no EventData. return mImpl->mTextColor; - } -void Controller::SetInputFontFamily( const std::string& fontFamily ) +void Controller::SetInputFontFamily(const std::string& fontFamily) { InputFontHandler::SetInputFontFamily(*this, fontFamily); } @@ -1276,7 +1337,7 @@ const std::string& Controller::GetInputFontFamily() const return InputFontHandler::GetInputFontFamily(*this); } -void Controller::SetInputFontWeight( FontWeight weight ) +void Controller::SetInputFontWeight(FontWeight weight) { InputFontHandler::SetInputFontWeight(*this, weight); } @@ -1291,7 +1352,7 @@ FontWeight Controller::GetInputFontWeight() const return InputFontHandler::GetInputFontWeight(*this); } -void Controller::SetInputFontWidth( FontWidth width ) +void Controller::SetInputFontWidth(FontWidth width) { InputFontHandler::SetInputFontWidth(*this, width); } @@ -1306,7 +1367,7 @@ FontWidth Controller::GetInputFontWidth() const return InputFontHandler::GetInputFontWidth(*this); } -void Controller::SetInputFontSlant( FontSlant slant ) +void Controller::SetInputFontSlant(FontSlant slant) { InputFontHandler::SetInputFontSlant(*this, slant); } @@ -1321,7 +1382,7 @@ FontSlant Controller::GetInputFontSlant() const return InputFontHandler::GetInputFontSlant(*this); } -void Controller::SetInputFontPointSize( float size ) +void Controller::SetInputFontPointSize(float size) { InputFontHandler::SetInputFontPointSize(*this, size); } @@ -1331,18 +1392,18 @@ float Controller::GetInputFontPointSize() const return InputFontHandler::GetInputFontPointSize(*this); } -void Controller::SetInputLineSpacing( float lineSpacing ) +void Controller::SetInputLineSpacing(float lineSpacing) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { - mImpl->mEventData->mInputStyle.lineSpacing = lineSpacing; + mImpl->mEventData->mInputStyle.lineSpacing = lineSpacing; mImpl->mEventData->mInputStyle.isLineSpacingDefined = true; } } float Controller::GetInputLineSpacing() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mInputStyle.lineSpacing; } @@ -1350,9 +1411,9 @@ float Controller::GetInputLineSpacing() const return 0.f; } -void Controller::SetInputShadowProperties( const std::string& shadowProperties ) +void Controller::SetInputShadowProperties(const std::string& shadowProperties) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mInputStyle.shadowProperties = shadowProperties; } @@ -1360,7 +1421,7 @@ void Controller::SetInputShadowProperties( const std::string& shadowProperties ) const std::string& Controller::GetInputShadowProperties() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mInputStyle.shadowProperties; } @@ -1368,9 +1429,9 @@ const std::string& Controller::GetInputShadowProperties() const return EMPTY_STRING; } -void Controller::SetInputUnderlineProperties( const std::string& underlineProperties ) +void Controller::SetInputUnderlineProperties(const std::string& underlineProperties) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mInputStyle.underlineProperties = underlineProperties; } @@ -1378,7 +1439,7 @@ void Controller::SetInputUnderlineProperties( const std::string& underlineProper const std::string& Controller::GetInputUnderlineProperties() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mInputStyle.underlineProperties; } @@ -1386,9 +1447,9 @@ const std::string& Controller::GetInputUnderlineProperties() const return EMPTY_STRING; } -void Controller::SetInputEmbossProperties( const std::string& embossProperties ) +void Controller::SetInputEmbossProperties(const std::string& embossProperties) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mInputStyle.embossProperties = embossProperties; } @@ -1396,7 +1457,7 @@ void Controller::SetInputEmbossProperties( const std::string& embossProperties ) const std::string& Controller::GetInputEmbossProperties() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mInputStyle.embossProperties; } @@ -1404,9 +1465,9 @@ const std::string& Controller::GetInputEmbossProperties() const return GetDefaultEmbossProperties(); } -void Controller::SetInputOutlineProperties( const std::string& outlineProperties ) +void Controller::SetInputOutlineProperties(const std::string& outlineProperties) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mInputStyle.outlineProperties = outlineProperties; } @@ -1414,7 +1475,7 @@ void Controller::SetInputOutlineProperties( const std::string& outlineProperties const std::string& Controller::GetInputOutlineProperties() const { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mInputStyle.outlineProperties; } @@ -1422,9 +1483,9 @@ const std::string& Controller::GetInputOutlineProperties() const return GetDefaultOutlineProperties(); } -void Controller::SetInputModePassword( bool passwordInput ) +void Controller::SetInputModePassword(bool passwordInput) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mPasswordInput = passwordInput; } @@ -1432,16 +1493,16 @@ void Controller::SetInputModePassword( bool passwordInput ) bool Controller::IsInputModePassword() { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { return mImpl->mEventData->mPasswordInput; } return false; } -void Controller::SetNoTextDoubleTapAction( NoTextTap::Action action ) +void Controller::SetNoTextDoubleTapAction(NoTextTap::Action action) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mDoubleTapAction = action; } @@ -1451,7 +1512,7 @@ Controller::NoTextTap::Action Controller::GetNoTextDoubleTapAction() const { NoTextTap::Action action = NoTextTap::NO_ACTION; - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { action = mImpl->mEventData->mDoubleTapAction; } @@ -1459,9 +1520,9 @@ Controller::NoTextTap::Action Controller::GetNoTextDoubleTapAction() const return action; } -void Controller::SetNoTextLongPressAction( NoTextTap::Action action ) +void Controller::SetNoTextLongPressAction(NoTextTap::Action action) { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mLongPressAction = action; } @@ -1471,7 +1532,7 @@ Controller::NoTextTap::Action Controller::GetNoTextLongPressAction() const { NoTextTap::Action action = NoTextTap::NO_ACTION; - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { action = mImpl->mEventData->mLongPressAction; } @@ -1484,7 +1545,7 @@ bool Controller::IsUnderlineSetByString() return mImpl->mUnderlineSetByString; } -void Controller::UnderlineSetByString( bool setByString ) +void Controller::UnderlineSetByString(bool setByString) { mImpl->mUnderlineSetByString = setByString; } @@ -1494,7 +1555,7 @@ bool Controller::IsShadowSetByString() return mImpl->mShadowSetByString; } -void Controller::ShadowSetByString( bool setByString ) +void Controller::ShadowSetByString(bool setByString) { mImpl->mShadowSetByString = setByString; } @@ -1504,7 +1565,7 @@ bool Controller::IsOutlineSetByString() return mImpl->mOutlineSetByString; } -void Controller::OutlineSetByString( bool setByString ) +void Controller::OutlineSetByString(bool setByString) { mImpl->mOutlineSetByString = setByString; } @@ -1514,7 +1575,7 @@ bool Controller::IsFontStyleSetByString() return mImpl->mFontStyleSetByString; } -void Controller::FontStyleSetByString( bool setByString ) +void Controller::FontStyleSetByString(bool setByString) { mImpl->mFontStyleSetByString = setByString; } @@ -1536,24 +1597,24 @@ Vector3 Controller::GetNaturalSize() return Relayouter::GetNaturalSize(*this); } -bool Controller::CheckForTextFit( float pointSize, Size& layoutSize ) +bool Controller::CheckForTextFit(float pointSize, Size& layoutSize) { return Relayouter::CheckForTextFit(*this, pointSize, layoutSize); } -void Controller::FitPointSizeforLayout( Size layoutSize ) +void Controller::FitPointSizeforLayout(Size layoutSize) { Relayouter::FitPointSizeforLayout(*this, layoutSize); } -float Controller::GetHeightForWidth( float width ) +float Controller::GetHeightForWidth(float width) { return Relayouter::GetHeightForWidth(*this, width); } -int Controller::GetLineCount( float width ) +int Controller::GetLineCount(float width) { - GetHeightForWidth( width ); + GetHeightForWidth(width); int numberofLines = mImpl->mModel->GetNumberOfLines(); return numberofLines; } @@ -1567,49 +1628,66 @@ float Controller::GetScrollAmountByUserInput() { float scrollAmount = 0.0f; - if (NULL != mImpl->mEventData && mImpl->mEventData->mCheckScrollAmount) + if(NULL != mImpl->mEventData && mImpl->mEventData->mCheckScrollAmount) { - scrollAmount = mImpl->mModel->mScrollPosition.y - mImpl->mModel->mScrollPositionLast.y; + scrollAmount = mImpl->mModel->mScrollPosition.y - mImpl->mModel->mScrollPositionLast.y; mImpl->mEventData->mCheckScrollAmount = false; } return scrollAmount; } -bool Controller::GetTextScrollInfo( float& scrollPosition, float& controlHeight, float& layoutHeight ) +bool Controller::GetTextScrollInfo(float& scrollPosition, float& controlHeight, float& layoutHeight) { const Vector2& layout = mImpl->mModel->mVisualModel->GetLayoutSize(); - bool isScrolled; + bool isScrolled; - controlHeight = mImpl->mModel->mVisualModel->mControlSize.height; - layoutHeight = layout.height; + controlHeight = mImpl->mModel->mVisualModel->mControlSize.height; + layoutHeight = layout.height; scrollPosition = mImpl->mModel->mScrollPosition.y; - isScrolled = !Equals( mImpl->mModel->mScrollPosition.y, mImpl->mModel->mScrollPositionLast.y, Math::MACHINE_EPSILON_1 ); + isScrolled = !Equals(mImpl->mModel->mScrollPosition.y, mImpl->mModel->mScrollPositionLast.y, Math::MACHINE_EPSILON_1); return isScrolled; } void Controller::SetHiddenInputOption(const Property::Map& options) { - if( NULL == mImpl->mHiddenInput ) + if(NULL == mImpl->mHiddenInput) { - mImpl->mHiddenInput = new HiddenText( this ); + mImpl->mHiddenInput = new HiddenText(this); } mImpl->mHiddenInput->SetProperties(options); } void Controller::GetHiddenInputOption(Property::Map& options) { - if( NULL != mImpl->mHiddenInput ) + if(NULL != mImpl->mHiddenInput) { mImpl->mHiddenInput->GetProperties(options); } } -void Controller::SetPlaceholderProperty( const Property::Map& map ) +void Controller::SetInputFilterOption(const Property::Map& options) +{ + if(!mImpl->mInputFilter) + { + mImpl->mInputFilter = std::unique_ptr(new InputFilter()); + } + mImpl->mInputFilter->SetProperties(options); +} + +void Controller::GetInputFilterOption(Property::Map& options) +{ + if(NULL != mImpl->mInputFilter) + { + mImpl->mInputFilter->GetProperties(options); + } +} + +void Controller::SetPlaceholderProperty(const Property::Map& map) { PlaceholderHandler::SetPlaceholderProperty(*this, map); } -void Controller::GetPlaceholderProperty( Property::Map& map ) +void Controller::GetPlaceholderProperty(Property::Map& map) { PlaceholderHandler::GetPlaceholderProperty(*this, map); } @@ -1619,32 +1697,32 @@ Toolkit::DevelText::TextDirection::Type Controller::GetTextDirection() // Make sure the model is up-to-date before layouting ProcessModifyEvents(); - if ( mImpl->mUpdateTextDirection ) + if(mImpl->mUpdateTextDirection) { // Operations that can be done only once until the text changes. - const OperationsMask onlyOnceOperations = static_cast( CONVERT_TO_UTF32 | - GET_SCRIPTS | - VALIDATE_FONTS | - GET_LINE_BREAKS | - BIDI_INFO | - SHAPE_TEXT | - GET_GLYPH_METRICS ); + const OperationsMask onlyOnceOperations = static_cast(CONVERT_TO_UTF32 | + GET_SCRIPTS | + VALIDATE_FONTS | + GET_LINE_BREAKS | + BIDI_INFO | + SHAPE_TEXT | + GET_GLYPH_METRICS); // Set the update info to relayout the whole text. - mImpl->mTextUpdateInfo.mParagraphCharacterIndex = 0u; + mImpl->mTextUpdateInfo.mParagraphCharacterIndex = 0u; mImpl->mTextUpdateInfo.mRequestedNumberOfCharacters = mImpl->mModel->mLogicalModel->mText.Count(); // Make sure the model is up-to-date before layouting - mImpl->UpdateModel( onlyOnceOperations ); + mImpl->UpdateModel(onlyOnceOperations); Vector3 naturalSize; - DoRelayout( Size( MAX_FLOAT, MAX_FLOAT ), - static_cast( onlyOnceOperations | - LAYOUT | REORDER | UPDATE_DIRECTION ), - naturalSize.GetVectorXY() ); + DoRelayout(Size(MAX_FLOAT, MAX_FLOAT), + static_cast(onlyOnceOperations | + LAYOUT | REORDER | UPDATE_DIRECTION), + naturalSize.GetVectorXY()); // Do not do again the only once operations. - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending & ~onlyOnceOperations ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending & ~onlyOnceOperations); // Clear the update info. This info will be set the next time the text is updated. mImpl->mTextUpdateInfo.Clear(); @@ -1663,14 +1741,25 @@ Toolkit::DevelText::VerticalLineAlignment::Type Controller::GetVerticalLineAlign return mImpl->mModel->GetVerticalLineAlignment(); } -void Controller::SetVerticalLineAlignment( Toolkit::DevelText::VerticalLineAlignment::Type alignment ) +void Controller::SetVerticalLineAlignment(Toolkit::DevelText::VerticalLineAlignment::Type alignment) { mImpl->mModel->mVerticalLineAlignment = alignment; } +Toolkit::DevelText::EllipsisPosition::Type Controller::GetEllipsisPosition() const +{ + return mImpl->mModel->GetEllipsisPosition(); +} + +void Controller::SetEllipsisPosition(Toolkit::DevelText::EllipsisPosition::Type ellipsisPosition) +{ + mImpl->mModel->mEllipsisPosition = ellipsisPosition; + mImpl->mModel->mVisualModel->SetEllipsisPosition(ellipsisPosition); +} + // public : Relayout. -Controller::UpdateTextType Controller::Relayout( const Size& size, Dali::LayoutDirection::Type layoutDirection ) +Controller::UpdateTextType Controller::Relayout(const Size& size, Dali::LayoutDirection::Type layoutDirection) { return Relayouter::Relayout(*this, size, layoutDirection); } @@ -1684,28 +1773,28 @@ void Controller::RequestRelayout() bool Controller::IsInputStyleChangedSignalsQueueEmpty() { - return ( NULL == mImpl->mEventData ) || ( 0u == mImpl->mEventData->mInputStyleChangedQueue.Count() ); + return (NULL == mImpl->mEventData) || (0u == mImpl->mEventData->mInputStyleChangedQueue.Count()); } void Controller::ProcessInputStyleChangedSignals() { - if( NULL == mImpl->mEventData ) + if(NULL == mImpl->mEventData) { // Nothing to do. return; } - for( Vector::ConstIterator it = mImpl->mEventData->mInputStyleChangedQueue.Begin(), - endIt = mImpl->mEventData->mInputStyleChangedQueue.End(); - it != endIt; - ++it ) + for(Vector::ConstIterator it = mImpl->mEventData->mInputStyleChangedQueue.Begin(), + endIt = mImpl->mEventData->mInputStyleChangedQueue.End(); + it != endIt; + ++it) { const InputStyle::Mask mask = *it; - if( NULL != mImpl->mEditableControlInterface ) + if(NULL != mImpl->mEditableControlInterface) { // Emit the input style changed signal. - mImpl->mEditableControlInterface->InputStyleChanged( mask ); + mImpl->mEditableControlInterface->InputStyleChanged(mask); } } @@ -1724,37 +1813,47 @@ void Controller::KeyboardFocusLostEvent() EventHandler::KeyboardFocusLostEvent(*this); } -bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent ) +bool Controller::KeyEvent(const Dali::KeyEvent& keyEvent) { return EventHandler::KeyEvent(*this, keyEvent); } -void Controller::TapEvent( unsigned int tapCount, float x, float y ) +void Controller::AnchorEvent(float x, float y) +{ + EventHandler::AnchorEvent(*this, x, y); +} + +void Controller::TapEvent(unsigned int tapCount, float x, float y) { EventHandler::TapEvent(*this, tapCount, x, y); } -void Controller::PanEvent( GestureState state, const Vector2& displacement ) +void Controller::PanEvent(GestureState state, const Vector2& displacement) { EventHandler::PanEvent(*this, state, displacement); } -void Controller::LongPressEvent( GestureState state, float x, float y ) +void Controller::LongPressEvent(GestureState state, float x, float y) { EventHandler::LongPressEvent(*this, state, x, y); } -void Controller::SelectEvent( float x, float y, SelectionType selectType ) +void Controller::SelectEvent(float x, float y, SelectionType selectType) { EventHandler::SelectEvent(*this, x, y, selectType); } -void Controller::SetTextSelectionRange(const uint32_t *start, const uint32_t *end) +void Controller::SelectEvent(const uint32_t start, const uint32_t end, SelectionType selectType) { - if( mImpl->mEventData ) + EventHandler::SelectEvent(*this, start, end, selectType); +} + +void Controller::SetTextSelectionRange(const uint32_t* start, const uint32_t* end) +{ + if(mImpl->mEventData) { - mImpl->mEventData->mCheckScrollAmount = true; - mImpl->mEventData->mIsLeftHandleSelected = true; + mImpl->mEventData->mCheckScrollAmount = true; + mImpl->mEventData->mIsLeftHandleSelected = true; mImpl->mEventData->mIsRightHandleSelected = true; mImpl->SetTextSelectionRange(start, end); mImpl->RequestRelayout(); @@ -1772,15 +1871,15 @@ CharacterIndex Controller::GetPrimaryCursorPosition() const return mImpl->GetPrimaryCursorPosition(); } -bool Controller::SetPrimaryCursorPosition( CharacterIndex index ) +bool Controller::SetPrimaryCursorPosition(CharacterIndex index, bool focused) { - if( mImpl->mEventData ) + if(mImpl->mEventData) { - mImpl->mEventData->mCheckScrollAmount = true; - mImpl->mEventData->mIsLeftHandleSelected = true; + mImpl->mEventData->mCheckScrollAmount = true; + mImpl->mEventData->mIsLeftHandleSelected = true; mImpl->mEventData->mIsRightHandleSelected = true; - mImpl->mEventData->mCheckScrollAmount = true; - if( mImpl->SetPrimaryCursorPosition(index) ) + mImpl->mEventData->mCheckScrollAmount = true; + if(mImpl->SetPrimaryCursorPosition(index, focused) && focused) { KeyboardFocusGainEvent(); return true; @@ -1791,25 +1890,83 @@ bool Controller::SetPrimaryCursorPosition( CharacterIndex index ) void Controller::SelectWholeText() { - SelectEvent( 0.f, 0.f, SelectionType::ALL ); + SelectEvent(0.f, 0.f, SelectionType::ALL); } void Controller::SelectNone() { - SelectEvent( 0.f, 0.f, SelectionType::NONE ); + SelectEvent(0.f, 0.f, SelectionType::NONE); +} + +void Controller::SelectText(const uint32_t start, const uint32_t end) +{ + SelectEvent(start, end, SelectionType::RANGE); } string Controller::GetSelectedText() const { string text; - if( EventData::SELECTING == mImpl->mEventData->mState ) + if(EventData::SELECTING == mImpl->mEventData->mState) + { + mImpl->RetrieveSelection(text, false); + } + return text; +} + +string Controller::CopyText() +{ + string text; + mImpl->RetrieveSelection(text, false); + mImpl->SendSelectionToClipboard(false); // Text not modified + + mImpl->mEventData->mUpdateCursorPosition = true; + + mImpl->RequestRelayout(); // Cursor, Handles, Selection Highlight, Popup + + return text; +} + +string Controller::CutText() +{ + string text; + mImpl->RetrieveSelection(text, false); + + if(!IsEditable()) + { + return ""; + } + + mImpl->SendSelectionToClipboard(true); // Synchronous call to modify text + mImpl->mOperationsPending = ALL_OPERATIONS; + + if((0u != mImpl->mModel->mLogicalModel->mText.Count()) || + !mImpl->IsPlaceholderAvailable()) + { + mImpl->QueueModifyEvent(ModifyEvent::TEXT_DELETED); + } + else { - mImpl->RetrieveSelection( text, false ); + ShowPlaceholderText(); + } + + mImpl->mEventData->mUpdateCursorPosition = true; + mImpl->mEventData->mScrollAfterDelete = true; + + mImpl->RequestRelayout(); + + if(nullptr != mImpl->mEditableControlInterface) + { + mImpl->mEditableControlInterface->TextChanged(true); } return text; } -InputMethodContext::CallbackData Controller::OnInputMethodContextEvent( InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent ) +void Controller::PasteText() +{ + mImpl->RequestGetTextFromClipboard(); // Request clipboard service to retrieve an item +} + +InputMethodContext::CallbackData Controller::OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent) { return EventHandler::OnInputMethodContextEvent(*this, inputMethodContext, inputMethodContextEvent); } @@ -1821,16 +1978,16 @@ void Controller::PasteClipboardItemEvent() // protected : Inherit from Text::Decorator::ControllerInterface. -void Controller::GetTargetSize( Vector2& targetSize ) +void Controller::GetTargetSize(Vector2& targetSize) { targetSize = mImpl->mModel->mVisualModel->mControlSize; } -void Controller::AddDecoration( Actor& actor, bool needsClipping ) +void Controller::AddDecoration(Actor& actor, bool needsClipping) { - if( NULL != mImpl->mEditableControlInterface ) + if(NULL != mImpl->mEditableControlInterface) { - mImpl->mEditableControlInterface->AddDecoration( actor, needsClipping ); + mImpl->mEditableControlInterface->AddDecoration(actor, needsClipping); } } @@ -1839,48 +1996,48 @@ bool Controller::IsEditable() const return mImpl->IsEditable(); } -void Controller::SetEditable( bool editable ) +void Controller::SetEditable(bool editable) { - mImpl->SetEditable( editable ); + mImpl->SetEditable(editable); if(mImpl->mEventData && mImpl->mEventData->mDecorator) { - mImpl->mEventData->mDecorator->SetEditable( editable ); + mImpl->mEventData->mDecorator->SetEditable(editable); } } -void Controller::ScrollBy( Vector2 scroll ) +void Controller::ScrollBy(Vector2 scroll) { - if( mImpl->mEventData && (fabs(scroll.x) > Math::MACHINE_EPSILON_0 || fabs(scroll.y) > Math::MACHINE_EPSILON_0)) + if(mImpl->mEventData && (fabs(scroll.x) > Math::MACHINE_EPSILON_0 || fabs(scroll.y) > Math::MACHINE_EPSILON_0)) { - const Vector2& layoutSize = mImpl->mModel->mVisualModel->GetLayoutSize(); - const Vector2 currentScroll = mImpl->mModel->mScrollPosition; + const Vector2& layoutSize = mImpl->mModel->mVisualModel->GetLayoutSize(); + const Vector2 currentScroll = mImpl->mModel->mScrollPosition; - scroll.x = -scroll.x; - scroll.y = -scroll.y; + scroll.x = -scroll.x; + scroll.y = -scroll.y; - if( fabs(scroll.x) > Math::MACHINE_EPSILON_0 ) - { - mImpl->mModel->mScrollPosition.x += scroll.x; - mImpl->ClampHorizontalScroll( layoutSize ); - } + if(fabs(scroll.x) > Math::MACHINE_EPSILON_0) + { + mImpl->mModel->mScrollPosition.x += scroll.x; + mImpl->ClampHorizontalScroll(layoutSize); + } - if( fabs(scroll.y) > Math::MACHINE_EPSILON_0 ) - { - mImpl->mModel->mScrollPosition.y += scroll.y; - mImpl->ClampVerticalScroll( layoutSize ); - } + if(fabs(scroll.y) > Math::MACHINE_EPSILON_0) + { + mImpl->mModel->mScrollPosition.y += scroll.y; + mImpl->ClampVerticalScroll(layoutSize); + } - if (mImpl->mModel->mScrollPosition != currentScroll) - { - mImpl->mEventData->mDecorator->UpdatePositions( mImpl->mModel->mScrollPosition - currentScroll ); - mImpl->RequestRelayout(); - } + if(mImpl->mModel->mScrollPosition != currentScroll) + { + mImpl->mEventData->mDecorator->UpdatePositions(mImpl->mModel->mScrollPosition - currentScroll); + mImpl->RequestRelayout(); + } } } float Controller::GetHorizontalScrollPosition() { - if( mImpl->mEventData ) + if(mImpl->mEventData) { //scroll values are negative internally so we convert them to positive numbers return -mImpl->mModel->mScrollPosition.x; @@ -1890,7 +2047,7 @@ float Controller::GetHorizontalScrollPosition() float Controller::GetVerticalScrollPosition() { - if( mImpl->mEventData ) + if(mImpl->mEventData) { //scroll values are negative internally so we convert them to positive numbers return -mImpl->mModel->mScrollPosition.y; @@ -1898,14 +2055,14 @@ float Controller::GetVerticalScrollPosition() return 0; } -void Controller::DecorationEvent( HandleType handleType, HandleState state, float x, float y ) +void Controller::DecorationEvent(HandleType handleType, HandleState state, float x, float y) { EventHandler::DecorationEvent(*this, handleType, state, x, y); } // protected : Inherit from TextSelectionPopup::TextPopupButtonCallbackInterface. -void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Buttons button ) +void Controller::TextPopupButtonTouched(Dali::Toolkit::TextSelectionPopup::Buttons button) { EventHandler::TextPopupButtonTouched(*this, button); } @@ -1921,19 +2078,19 @@ void Controller::DisplayTimeExpired() // private : Update. -void Controller::InsertText( const std::string& text, Controller::InsertType type ) +void Controller::InsertText(const std::string& text, Controller::InsertType type) { TextUpdater::InsertText(*this, text, type); } -void Controller::PasteText( const std::string& stringToPaste ) +void Controller::PasteText(const std::string& stringToPaste) { TextUpdater::PasteText(*this, stringToPaste); } -bool Controller::RemoveText( int cursorOffset, - int numberOfCharacters, - UpdateInputStyleType type ) +bool Controller::RemoveText(int cursorOffset, + int numberOfCharacters, + UpdateInputStyleType type) { return TextUpdater::RemoveText(*this, cursorOffset, numberOfCharacters, type); } @@ -1943,16 +2100,29 @@ bool Controller::RemoveSelectedText() return TextUpdater::RemoveSelectedText(*this); } +void Controller::InsertTextAnchor(int numberOfCharacters, + CharacterIndex previousCursorIndex) +{ + TextUpdater::InsertTextAnchor(*this, numberOfCharacters, previousCursorIndex); +} + +void Controller::RemoveTextAnchor(int cursorOffset, + int numberOfCharacters, + CharacterIndex previousCursorIndex) +{ + TextUpdater::RemoveTextAnchor(*this, cursorOffset, numberOfCharacters, previousCursorIndex); +} + // private : Relayout. -bool Controller::DoRelayout( const Size& size, - OperationsMask operationsRequired, - Size& layoutSize ) +bool Controller::DoRelayout(const Size& size, + OperationsMask operationsRequired, + Size& layoutSize) { return Relayouter::DoRelayout(*this, size, operationsRequired, layoutSize); } -void Controller::CalculateVerticalOffset( const Size& controlSize ) +void Controller::CalculateVerticalOffset(const Size& controlSize) { Relayouter::CalculateVerticalOffset(*this, controlSize); } @@ -1979,7 +2149,7 @@ void Controller::TextDeletedEvent() EventHandler::TextDeletedEvent(*this); } -bool Controller::DeleteEvent( int keyCode ) +bool Controller::DeleteEvent(int keyCode) { return EventHandler::DeleteEvent(*this, keyCode); } @@ -1998,29 +2168,29 @@ void Controller::ShowPlaceholderText() void Controller::ClearFontData() { - if( mImpl->mFontDefaults ) + if(mImpl->mFontDefaults) { mImpl->mFontDefaults->mFontId = 0u; // Remove old font ID } // Set flags to update the model. - mImpl->mTextUpdateInfo.mCharacterIndex = 0u; + mImpl->mTextUpdateInfo.mCharacterIndex = 0u; mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters; - mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); + mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count(); - mImpl->mTextUpdateInfo.mClearAll = true; + mImpl->mTextUpdateInfo.mClearAll = true; mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true; - mImpl->mRecalculateNaturalSize = true; + mImpl->mRecalculateNaturalSize = true; - mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending | - VALIDATE_FONTS | - SHAPE_TEXT | - BIDI_INFO | - GET_GLYPH_METRICS | - LAYOUT | - UPDATE_LAYOUT_SIZE | - REORDER | - ALIGN ); + mImpl->mOperationsPending = static_cast(mImpl->mOperationsPending | + VALIDATE_FONTS | + SHAPE_TEXT | + BIDI_INFO | + GET_GLYPH_METRICS | + LAYOUT | + UPDATE_LAYOUT_SIZE | + REORDER | + ALIGN); } void Controller::ClearStyleData() @@ -2029,15 +2199,15 @@ void Controller::ClearStyleData() mImpl->mModel->mLogicalModel->ClearFontDescriptionRuns(); } -void Controller::ResetCursorPosition( CharacterIndex cursorIndex ) +void Controller::ResetCursorPosition(CharacterIndex cursorIndex) { // Reset the cursor position - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { mImpl->mEventData->mPrimaryCursorPosition = cursorIndex; // Update the cursor if it's in editing mode. - if( EventData::IsEditingState( mImpl->mEventData->mState ) ) + if(EventData::IsEditingState(mImpl->mEventData->mState)) { mImpl->mEventData->mUpdateCursorPosition = true; } @@ -2046,7 +2216,7 @@ void Controller::ResetCursorPosition( CharacterIndex cursorIndex ) CharacterIndex Controller::GetCursorPosition() { - if( !mImpl->mEventData ) + if(!mImpl->mEventData) return 0; return mImpl->mEventData->mPrimaryCursorPosition; @@ -2054,19 +2224,24 @@ CharacterIndex Controller::GetCursorPosition() void Controller::ResetScrollPosition() { - if( NULL != mImpl->mEventData ) + if(NULL != mImpl->mEventData) { // Reset the scroll position. - mImpl->mModel->mScrollPosition = Vector2::ZERO; + mImpl->mModel->mScrollPosition = Vector2::ZERO; mImpl->mEventData->mScrollAfterUpdatePosition = true; } } -void Controller::SetControlInterface( ControlInterface* controlInterface ) +void Controller::SetControlInterface(ControlInterface* controlInterface) { mImpl->mControlInterface = controlInterface; } +void Controller::SetAnchorControlInterface(AnchorControlInterface* anchorControlInterface) +{ + mImpl->mAnchorControlInterface = anchorControlInterface; +} + bool Controller::ShouldClearFocusOnEscape() const { return mImpl->mShouldClearFocusOnEscape; @@ -2080,19 +2255,20 @@ Actor Controller::CreateBackgroundActor() // private : Private contructors & copy operator. Controller::Controller() -: Controller(nullptr, nullptr, nullptr) +: Controller(nullptr, nullptr, nullptr, nullptr) { } -Controller::Controller( ControlInterface* controlInterface ) -:Controller( controlInterface, nullptr, nullptr) +Controller::Controller(ControlInterface* controlInterface) +: Controller(controlInterface, nullptr, nullptr, nullptr) { } -Controller::Controller( ControlInterface* controlInterface, - EditableControlInterface* editableControlInterface, - SelectableControlInterface* selectableControlInterface ) -: mImpl(new Controller::Impl(controlInterface, editableControlInterface, selectableControlInterface)) +Controller::Controller(ControlInterface* controlInterface, + EditableControlInterface* editableControlInterface, + SelectableControlInterface* selectableControlInterface, + AnchorControlInterface* anchorControlInterface) +: mImpl(new Controller::Impl(controlInterface, editableControlInterface, selectableControlInterface, anchorControlInterface)) { }