2 * Copyright (c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali-toolkit/internal/text/text-controller.h>
25 #include <dali/integration-api/debug.h>
28 #include <dali-toolkit/internal/text/text-controller-event-handler.h>
29 #include <dali-toolkit/internal/text/text-controller-impl.h>
30 #include <dali-toolkit/internal/text/text-controller-input-font-handler.h>
31 #include <dali-toolkit/internal/text/text-controller-placeholder-handler.h>
32 #include <dali-toolkit/internal/text/text-controller-relayouter.h>
33 #include <dali-toolkit/internal/text/text-controller-text-updater.h>
34 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
39 #if defined(DEBUG_ENABLED)
40 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_TEXT_CONTROLS");
43 constexpr float MAX_FLOAT = std::numeric_limits<float>::max();
45 const std::string EMPTY_STRING("");
47 int ConvertPixelToPint( float pixel )
49 unsigned int horizontalDpi = 0u;
50 unsigned int verticalDpi = 0u;
51 Dali::TextAbstraction::FontClient fontClient = Dali::TextAbstraction::FontClient::Get();
52 fontClient.GetDpi( horizontalDpi, verticalDpi );
54 return ( pixel * 72.f ) / static_cast< float >( horizontalDpi );
68 // public : Constructor.
70 ControllerPtr Controller::New()
72 return ControllerPtr( new Controller() );
75 ControllerPtr Controller::New( ControlInterface* controlInterface )
77 return ControllerPtr( new Controller( controlInterface ) );
80 ControllerPtr Controller::New( ControlInterface* controlInterface,
81 EditableControlInterface* editableControlInterface,
82 SelectableControlInterface* selectableControlInterface )
84 return ControllerPtr( new Controller( controlInterface,
85 editableControlInterface,
86 selectableControlInterface ) );
89 // public : Configure the text controller.
91 void Controller::EnableTextInput( DecoratorPtr decorator, InputMethodContext& inputMethodContext )
95 delete mImpl->mEventData;
96 mImpl->mEventData = NULL;
98 // Nothing else to do.
102 if( NULL == mImpl->mEventData )
104 mImpl->mEventData = new EventData( decorator, inputMethodContext );
108 void Controller::SetGlyphType( TextAbstraction::GlyphType glyphType )
110 // Metrics for bitmap & vector based glyphs are different
111 mImpl->mMetrics->SetGlyphType( glyphType );
113 // Clear the font-specific data
116 mImpl->RequestRelayout();
119 void Controller::SetMarkupProcessorEnabled( bool enable )
121 if( enable != mImpl->mMarkupProcessorEnabled )
123 //If Text was already set, call the SetText again for enabling or disabling markup
124 mImpl->mMarkupProcessorEnabled = enable;
131 bool Controller::IsMarkupProcessorEnabled() const
133 return mImpl->mMarkupProcessorEnabled;
136 void Controller::SetAutoScrollEnabled( bool enable )
138 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 );
140 if( mImpl->mLayoutEngine.GetLayout() == Layout::Engine::SINGLE_LINE_BOX )
144 DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled for SINGLE_LINE_BOX\n" );
145 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
155 DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetAutoScrollEnabled Disabling autoscroll\n");
156 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
163 mImpl->mIsAutoScrollEnabled = enable;
164 mImpl->RequestRelayout();
168 DALI_LOG_WARNING( "Attempted AutoScrolling on a non SINGLE_LINE_BOX, request ignored\n" );
169 mImpl->mIsAutoScrollEnabled = false;
173 bool Controller::IsAutoScrollEnabled() const
175 DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::IsAutoScrollEnabled[%s]\n", mImpl->mIsAutoScrollEnabled?"true":"false" );
177 return mImpl->mIsAutoScrollEnabled;
180 CharacterDirection Controller::GetAutoScrollDirection() const
182 return mImpl->mIsTextDirectionRTL;
185 float Controller::GetAutoScrollLineAlignment() const
189 if( mImpl->mModel->mVisualModel &&
190 ( 0u != mImpl->mModel->mVisualModel->mLines.Count() ) )
192 offset = ( *mImpl->mModel->mVisualModel->mLines.Begin() ).alignmentOffset;
198 void Controller::SetHorizontalScrollEnabled( bool enable )
200 if( ( NULL != mImpl->mEventData ) &&
201 mImpl->mEventData->mDecorator )
203 mImpl->mEventData->mDecorator->SetHorizontalScrollEnabled( enable );
206 bool Controller::IsHorizontalScrollEnabled() const
208 if( ( NULL != mImpl->mEventData ) &&
209 mImpl->mEventData->mDecorator )
211 return mImpl->mEventData->mDecorator->IsHorizontalScrollEnabled();
217 void Controller::SetVerticalScrollEnabled( bool enable )
219 if( ( NULL != mImpl->mEventData ) &&
220 mImpl->mEventData->mDecorator )
222 if( mImpl->mEventData->mDecorator )
224 mImpl->mEventData->mDecorator->SetVerticalScrollEnabled( enable );
229 bool Controller::IsVerticalScrollEnabled() const
231 if( ( NULL != mImpl->mEventData ) &&
232 mImpl->mEventData->mDecorator )
234 return mImpl->mEventData->mDecorator->IsVerticalScrollEnabled();
240 void Controller::SetSmoothHandlePanEnabled( bool enable )
242 if( ( NULL != mImpl->mEventData ) &&
243 mImpl->mEventData->mDecorator )
245 mImpl->mEventData->mDecorator->SetSmoothHandlePanEnabled( enable );
249 bool Controller::IsSmoothHandlePanEnabled() const
251 if( ( NULL != mImpl->mEventData ) &&
252 mImpl->mEventData->mDecorator )
254 return mImpl->mEventData->mDecorator->IsSmoothHandlePanEnabled();
260 void Controller::SetMaximumNumberOfCharacters( Length maxCharacters )
262 mImpl->mMaximumNumberOfCharacters = maxCharacters;
265 int Controller::GetMaximumNumberOfCharacters()
267 return mImpl->mMaximumNumberOfCharacters;
270 void Controller::SetEnableCursorBlink( bool enable )
272 DALI_ASSERT_DEBUG( NULL != mImpl->mEventData && "TextInput disabled" );
274 if( NULL != mImpl->mEventData )
276 mImpl->mEventData->mCursorBlinkEnabled = enable;
279 mImpl->mEventData->mDecorator )
281 mImpl->mEventData->mDecorator->StopCursorBlink();
286 bool Controller::GetEnableCursorBlink() const
288 if( NULL != mImpl->mEventData )
290 return mImpl->mEventData->mCursorBlinkEnabled;
296 void Controller::SetMultiLineEnabled( bool enable )
298 const Layout::Engine::Type layout = enable ? Layout::Engine::MULTI_LINE_BOX : Layout::Engine::SINGLE_LINE_BOX;
300 if( layout != mImpl->mLayoutEngine.GetLayout() )
302 // Set the layout type.
303 mImpl->mLayoutEngine.SetLayout( layout );
305 // Set the flags to redo the layout operations
306 const OperationsMask layoutOperations = static_cast<OperationsMask>( LAYOUT |
311 mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true;
312 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending | layoutOperations );
314 // Need to recalculate natural size
315 mImpl->mRecalculateNaturalSize = true;
317 mImpl->RequestRelayout();
321 bool Controller::IsMultiLineEnabled() const
323 return Layout::Engine::MULTI_LINE_BOX == mImpl->mLayoutEngine.GetLayout();
326 void Controller::SetHorizontalAlignment( Text::HorizontalAlignment::Type alignment )
328 if( alignment != mImpl->mModel->mHorizontalAlignment )
330 // Set the alignment.
331 mImpl->mModel->mHorizontalAlignment = alignment;
333 // Set the flag to redo the alignment operation.
334 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending | ALIGN );
336 if( mImpl->mEventData )
338 mImpl->mEventData->mUpdateAlignment = true;
340 // Update the cursor if it's in editing mode
341 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
343 mImpl->ChangeState( EventData::EDITING );
344 mImpl->mEventData->mUpdateCursorPosition = true;
348 mImpl->RequestRelayout();
352 Text::HorizontalAlignment::Type Controller::GetHorizontalAlignment() const
354 return mImpl->mModel->mHorizontalAlignment;
357 void Controller::SetVerticalAlignment( VerticalAlignment::Type alignment )
359 if( alignment != mImpl->mModel->mVerticalAlignment )
361 // Set the alignment.
362 mImpl->mModel->mVerticalAlignment = alignment;
364 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending | ALIGN );
366 mImpl->RequestRelayout();
370 VerticalAlignment::Type Controller::GetVerticalAlignment() const
372 return mImpl->mModel->mVerticalAlignment;
375 bool Controller::IsIgnoreSpacesAfterText() const
377 return mImpl->mModel->mIgnoreSpacesAfterText;
380 void Controller::SetIgnoreSpacesAfterText( bool ignore )
382 mImpl->mModel->mIgnoreSpacesAfterText = ignore;
385 bool Controller::IsMatchSystemLanguageDirection() const
387 return mImpl->mModel->mMatchSystemLanguageDirection;
390 void Controller::SetMatchSystemLanguageDirection( bool match )
392 mImpl->mModel->mMatchSystemLanguageDirection = match;
395 void Controller::SetLayoutDirection( Dali::LayoutDirection::Type layoutDirection )
397 mImpl->mLayoutDirection = layoutDirection;
400 bool Controller::IsShowingRealText() const
402 return mImpl->IsShowingRealText();
406 void Controller::SetLineWrapMode( Text::LineWrap::Mode lineWrapMode )
408 if( lineWrapMode != mImpl->mModel->mLineWrapMode )
410 // Set the text wrap mode.
411 mImpl->mModel->mLineWrapMode = lineWrapMode;
414 // Update Text layout for applying wrap mode
415 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
420 mImpl->mTextUpdateInfo.mCharacterIndex = 0u;
421 mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
422 mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count();
425 mImpl->RequestRelayout();
429 Text::LineWrap::Mode Controller::GetLineWrapMode() const
431 return mImpl->mModel->mLineWrapMode;
434 void Controller::SetTextElideEnabled( bool enabled )
436 mImpl->mModel->mElideEnabled = enabled;
439 bool Controller::IsTextElideEnabled() const
441 return mImpl->mModel->mElideEnabled;
444 void Controller::SetTextFitEnabled(bool enabled)
446 mImpl->mTextFitEnabled = enabled;
449 bool Controller::IsTextFitEnabled() const
451 return mImpl->mTextFitEnabled;
454 void Controller::SetTextFitMinSize( float minSize, FontSizeType type )
460 mImpl->mTextFitMinSize = minSize;
465 mImpl->mTextFitMinSize = ConvertPixelToPint( minSize );
471 float Controller::GetTextFitMinSize() const
473 return mImpl->mTextFitMinSize;
476 void Controller::SetTextFitMaxSize( float maxSize, FontSizeType type )
482 mImpl->mTextFitMaxSize = maxSize;
487 mImpl->mTextFitMaxSize = ConvertPixelToPint( maxSize );
493 float Controller::GetTextFitMaxSize() const
495 return mImpl->mTextFitMaxSize;
498 void Controller::SetTextFitStepSize( float step, FontSizeType type )
504 mImpl->mTextFitStepSize = step;
509 mImpl->mTextFitStepSize = ConvertPixelToPint( step );
515 float Controller::GetTextFitStepSize() const
517 return mImpl->mTextFitStepSize;
520 void Controller::SetTextFitContentSize(Vector2 size)
522 mImpl->mTextFitContentSize = size;
525 Vector2 Controller::GetTextFitContentSize() const
527 return mImpl->mTextFitContentSize;
530 void Controller::SetPlaceholderTextElideEnabled( bool enabled )
532 PlaceholderHandler::SetPlaceholderTextElideEnabled(*this, enabled);
535 bool Controller::IsPlaceholderTextElideEnabled() const
537 return PlaceholderHandler::IsPlaceholderTextElideEnabled(*this);
540 void Controller::SetSelectionEnabled( bool enabled )
542 mImpl->mEventData->mSelectionEnabled = enabled;
545 bool Controller::IsSelectionEnabled() const
547 return mImpl->mEventData->mSelectionEnabled;
550 void Controller::SetShiftSelectionEnabled( bool enabled )
552 mImpl->mEventData->mShiftSelectionFlag = enabled;
555 bool Controller::IsShiftSelectionEnabled() const
557 return mImpl->mEventData->mShiftSelectionFlag;
560 void Controller::SetGrabHandleEnabled( bool enabled )
562 mImpl->mEventData->mGrabHandleEnabled = enabled;
565 bool Controller::IsGrabHandleEnabled() const
567 return mImpl->mEventData->mGrabHandleEnabled;
570 void Controller::SetGrabHandlePopupEnabled(bool enabled)
572 mImpl->mEventData->mGrabHandlePopupEnabled = enabled;
575 bool Controller::IsGrabHandlePopupEnabled() const
577 return mImpl->mEventData->mGrabHandlePopupEnabled;
582 void Controller::SetText( const std::string& text )
584 TextUpdater::SetText(*this, text);
587 void Controller::GetText( std::string& text ) const
589 if( !mImpl->IsShowingPlaceholderText() )
591 // Retrieves the text string.
592 mImpl->GetText( 0u, text );
596 DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::GetText %p empty (but showing placeholder)\n", this );
600 void Controller::SetPlaceholderText( PlaceholderType type, const std::string& text )
602 PlaceholderHandler::SetPlaceholderText(*this, type, text);
605 void Controller::GetPlaceholderText( PlaceholderType type, std::string& text ) const
607 PlaceholderHandler::GetPlaceholderText(*this, type, text );
610 void Controller::UpdateAfterFontChange( const std::string& newDefaultFont )
612 DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::UpdateAfterFontChange\n");
614 if( !mImpl->mFontDefaults->familyDefined ) // If user defined font then should not update when system font changes
616 DALI_LOG_INFO( gLogFilter, Debug::Concise, "Controller::UpdateAfterFontChange newDefaultFont(%s)\n", newDefaultFont.c_str() );
617 mImpl->mFontDefaults->mFontDescription.family = newDefaultFont;
621 mImpl->RequestRelayout();
625 void Controller::RetrieveSelection( std::string& selectedText ) const
627 mImpl->RetrieveSelection( selectedText, false );
630 void Controller::SetSelection( int start, int end )
632 mImpl->SetSelection( start, end );
635 std::pair< int, int > Controller::GetSelectionIndexes() const
637 return mImpl->GetSelectionIndexes();
640 void Controller::CopyStringToClipboard( const std::string& source )
642 mImpl->CopyStringToClipboard( source );
645 void Controller::SendSelectionToClipboard( bool deleteAfterSending )
647 mImpl->SendSelectionToClipboard( deleteAfterSending );
650 // public : Default style & Input style
652 void Controller::SetDefaultFontFamily( const std::string& defaultFontFamily )
654 if( NULL == mImpl->mFontDefaults )
656 mImpl->mFontDefaults = new FontDefaults();
659 mImpl->mFontDefaults->mFontDescription.family = defaultFontFamily;
660 DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetDefaultFontFamily %s\n", defaultFontFamily.c_str());
661 mImpl->mFontDefaults->familyDefined = !defaultFontFamily.empty();
663 if( mImpl->mEventData )
665 // Update the cursor position if it's in editing mode
666 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
668 mImpl->mEventData->mDecoratorUpdated = true;
669 mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font family is updated.
673 // Clear the font-specific data
676 mImpl->RequestRelayout();
679 const std::string& Controller::GetDefaultFontFamily() const
681 if( NULL != mImpl->mFontDefaults )
683 return mImpl->mFontDefaults->mFontDescription.family;
689 void Controller::SetPlaceholderFontFamily( const std::string& placeholderTextFontFamily )
691 PlaceholderHandler::SetPlaceholderFontFamily(*this, placeholderTextFontFamily);
694 const std::string& Controller::GetPlaceholderFontFamily() const
696 return PlaceholderHandler::GetPlaceholderFontFamily(*this);
699 void Controller::SetDefaultFontWeight( FontWeight weight )
701 if( NULL == mImpl->mFontDefaults )
703 mImpl->mFontDefaults = new FontDefaults();
706 mImpl->mFontDefaults->mFontDescription.weight = weight;
707 mImpl->mFontDefaults->weightDefined = true;
709 if( mImpl->mEventData )
711 // Update the cursor position if it's in editing mode
712 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
714 mImpl->mEventData->mDecoratorUpdated = true;
715 mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font weight is updated.
719 // Clear the font-specific data
722 mImpl->RequestRelayout();
725 bool Controller::IsDefaultFontWeightDefined() const
727 if( NULL != mImpl->mFontDefaults )
729 return mImpl->mFontDefaults->weightDefined;
735 FontWeight Controller::GetDefaultFontWeight() const
737 if( NULL != mImpl->mFontDefaults )
739 return mImpl->mFontDefaults->mFontDescription.weight;
742 return TextAbstraction::FontWeight::NORMAL;
745 void Controller::SetPlaceholderTextFontWeight( FontWeight weight )
747 PlaceholderHandler::SetPlaceholderTextFontWeight(*this, weight);
750 bool Controller::IsPlaceholderTextFontWeightDefined() const
752 return PlaceholderHandler::IsPlaceholderTextFontWeightDefined(*this);;
755 FontWeight Controller::GetPlaceholderTextFontWeight() const
757 return PlaceholderHandler::GetPlaceholderTextFontWeight(*this);
760 void Controller::SetDefaultFontWidth( FontWidth width )
762 if( NULL == mImpl->mFontDefaults )
764 mImpl->mFontDefaults = new FontDefaults();
767 mImpl->mFontDefaults->mFontDescription.width = width;
768 mImpl->mFontDefaults->widthDefined = true;
770 if( mImpl->mEventData )
772 // Update the cursor position if it's in editing mode
773 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
775 mImpl->mEventData->mDecoratorUpdated = true;
776 mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font width is updated.
780 // Clear the font-specific data
783 mImpl->RequestRelayout();
786 bool Controller::IsDefaultFontWidthDefined() const
788 if( NULL != mImpl->mFontDefaults )
790 return mImpl->mFontDefaults->widthDefined;
796 FontWidth Controller::GetDefaultFontWidth() const
798 if( NULL != mImpl->mFontDefaults )
800 return mImpl->mFontDefaults->mFontDescription.width;
803 return TextAbstraction::FontWidth::NORMAL;
806 void Controller::SetPlaceholderTextFontWidth( FontWidth width )
808 PlaceholderHandler::SetPlaceholderTextFontWidth(*this, width);
811 bool Controller::IsPlaceholderTextFontWidthDefined() const
813 return PlaceholderHandler::IsPlaceholderTextFontWidthDefined(*this);
816 FontWidth Controller::GetPlaceholderTextFontWidth() const
818 return PlaceholderHandler::GetPlaceholderTextFontWidth(*this);
821 void Controller::SetDefaultFontSlant( FontSlant slant )
823 if( NULL == mImpl->mFontDefaults )
825 mImpl->mFontDefaults = new FontDefaults();
828 mImpl->mFontDefaults->mFontDescription.slant = slant;
829 mImpl->mFontDefaults->slantDefined = true;
831 if( mImpl->mEventData )
833 // Update the cursor position if it's in editing mode
834 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
836 mImpl->mEventData->mDecoratorUpdated = true;
837 mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font slant is updated.
841 // Clear the font-specific data
844 mImpl->RequestRelayout();
847 bool Controller::IsDefaultFontSlantDefined() const
849 if( NULL != mImpl->mFontDefaults )
851 return mImpl->mFontDefaults->slantDefined;
856 FontSlant Controller::GetDefaultFontSlant() const
858 if( NULL != mImpl->mFontDefaults )
860 return mImpl->mFontDefaults->mFontDescription.slant;
863 return TextAbstraction::FontSlant::NORMAL;
866 void Controller::SetPlaceholderTextFontSlant( FontSlant slant )
868 PlaceholderHandler::SetPlaceholderTextFontSlant(*this, slant);
871 bool Controller::IsPlaceholderTextFontSlantDefined() const
873 return PlaceholderHandler::IsPlaceholderTextFontSlantDefined(*this);
876 FontSlant Controller::GetPlaceholderTextFontSlant() const
878 return PlaceholderHandler::GetPlaceholderTextFontSlant(*this);
881 void Controller::SetFontSizeScale( float scale )
883 mImpl->mFontSizeScale = scale;
885 if( mImpl->mEventData )
887 // Update the cursor position if it's in editing mode
888 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
890 mImpl->mEventData->mDecoratorUpdated = true;
891 mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font size is updated.
895 // Clear the font-specific data
898 mImpl->RequestRelayout();
901 float Controller::GetFontSizeScale() const
903 if( nullptr != mImpl->mFontDefaults )
905 return mImpl->mFontSizeScale;
911 void Controller::SetDefaultFontSize( float fontSize, FontSizeType type )
913 if( NULL == mImpl->mFontDefaults )
915 mImpl->mFontDefaults = new FontDefaults();
922 mImpl->mFontDefaults->mDefaultPointSize = fontSize;
923 mImpl->mFontDefaults->sizeDefined = true;
928 // Point size = Pixel size * 72.f / DPI
929 unsigned int horizontalDpi = 0u;
930 unsigned int verticalDpi = 0u;
931 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
932 fontClient.GetDpi( horizontalDpi, verticalDpi );
934 mImpl->mFontDefaults->mDefaultPointSize = ( fontSize * 72.f ) / static_cast< float >( horizontalDpi );
935 mImpl->mFontDefaults->sizeDefined = true;
940 if( mImpl->mEventData )
942 // Update the cursor position if it's in editing mode
943 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
945 mImpl->mEventData->mDecoratorUpdated = true;
946 mImpl->mEventData->mUpdateCursorPosition = true; // Cursor position should be updated when the font size is updated.
950 // Clear the font-specific data
953 mImpl->RequestRelayout();
956 float Controller::GetDefaultFontSize( FontSizeType type ) const
959 if( NULL != mImpl->mFontDefaults )
965 value = mImpl->mFontDefaults->mDefaultPointSize;
970 // Pixel size = Point size * DPI / 72.f
971 unsigned int horizontalDpi = 0u;
972 unsigned int verticalDpi = 0u;
973 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
974 fontClient.GetDpi( horizontalDpi, verticalDpi );
976 value = mImpl->mFontDefaults->mDefaultPointSize * static_cast< float >( horizontalDpi ) / 72.f;
986 void Controller::SetPlaceholderTextFontSize( float fontSize, FontSizeType type )
988 PlaceholderHandler::SetPlaceholderTextFontSize(*this, fontSize, type);
991 float Controller::GetPlaceholderTextFontSize( FontSizeType type ) const
993 return PlaceholderHandler::GetPlaceholderTextFontSize(*this, type);
996 void Controller::SetDefaultColor( const Vector4& color )
998 mImpl->mTextColor = color;
1000 if( !mImpl->IsShowingPlaceholderText() )
1002 mImpl->mModel->mVisualModel->SetTextColor( color );
1004 mImpl->mModel->mLogicalModel->mColorRuns.Clear();
1006 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending | COLOR );
1008 mImpl->RequestRelayout();
1012 const Vector4& Controller::GetDefaultColor() const
1014 return mImpl->mTextColor;
1017 void Controller::SetPlaceholderTextColor( const Vector4& textColor )
1019 PlaceholderHandler::SetPlaceholderTextColor(*this, textColor);
1022 const Vector4& Controller::GetPlaceholderTextColor() const
1024 return PlaceholderHandler::GetPlaceholderTextColor(*this);
1027 void Controller::SetShadowOffset( const Vector2& shadowOffset )
1029 mImpl->mModel->mVisualModel->SetShadowOffset( shadowOffset );
1031 mImpl->RequestRelayout();
1034 const Vector2& Controller::GetShadowOffset() const
1036 return mImpl->mModel->mVisualModel->GetShadowOffset();
1039 void Controller::SetShadowColor( const Vector4& shadowColor )
1041 mImpl->mModel->mVisualModel->SetShadowColor( shadowColor );
1043 mImpl->RequestRelayout();
1046 const Vector4& Controller::GetShadowColor() const
1048 return mImpl->mModel->mVisualModel->GetShadowColor();
1051 void Controller::SetShadowBlurRadius( const float& shadowBlurRadius )
1053 if ( fabsf( GetShadowBlurRadius() - shadowBlurRadius ) > Math::MACHINE_EPSILON_1 )
1055 mImpl->mModel->mVisualModel->SetShadowBlurRadius( shadowBlurRadius );
1057 mImpl->RequestRelayout();
1061 const float& Controller::GetShadowBlurRadius() const
1063 return mImpl->mModel->mVisualModel->GetShadowBlurRadius();
1066 void Controller::SetUnderlineColor( const Vector4& color )
1068 mImpl->mModel->mVisualModel->SetUnderlineColor( color );
1070 mImpl->RequestRelayout();
1073 const Vector4& Controller::GetUnderlineColor() const
1075 return mImpl->mModel->mVisualModel->GetUnderlineColor();
1078 void Controller::SetUnderlineEnabled( bool enabled )
1080 mImpl->mModel->mVisualModel->SetUnderlineEnabled( enabled );
1082 mImpl->RequestRelayout();
1085 bool Controller::IsUnderlineEnabled() const
1087 return mImpl->mModel->mVisualModel->IsUnderlineEnabled();
1090 void Controller::SetUnderlineHeight( float height )
1092 mImpl->mModel->mVisualModel->SetUnderlineHeight( height );
1094 mImpl->RequestRelayout();
1097 float Controller::GetUnderlineHeight() const
1099 return mImpl->mModel->mVisualModel->GetUnderlineHeight();
1102 void Controller::SetOutlineColor( const Vector4& color )
1104 mImpl->mModel->mVisualModel->SetOutlineColor( color );
1106 mImpl->RequestRelayout();
1109 const Vector4& Controller::GetOutlineColor() const
1111 return mImpl->mModel->mVisualModel->GetOutlineColor();
1114 void Controller::SetOutlineWidth( uint16_t width )
1116 mImpl->mModel->mVisualModel->SetOutlineWidth( width );
1118 mImpl->RequestRelayout();
1121 uint16_t Controller::GetOutlineWidth() const
1123 return mImpl->mModel->mVisualModel->GetOutlineWidth();
1126 void Controller::SetBackgroundColor( const Vector4& color )
1128 mImpl->mModel->mVisualModel->SetBackgroundColor( color );
1130 mImpl->RequestRelayout();
1133 const Vector4& Controller::GetBackgroundColor() const
1135 return mImpl->mModel->mVisualModel->GetBackgroundColor();
1138 void Controller::SetBackgroundEnabled( bool enabled )
1140 mImpl->mModel->mVisualModel->SetBackgroundEnabled( enabled );
1142 mImpl->RequestRelayout();
1145 bool Controller::IsBackgroundEnabled() const
1147 return mImpl->mModel->mVisualModel->IsBackgroundEnabled();
1150 void Controller::SetDefaultEmbossProperties( const std::string& embossProperties )
1152 if( NULL == mImpl->mEmbossDefaults )
1154 mImpl->mEmbossDefaults = new EmbossDefaults();
1157 mImpl->mEmbossDefaults->properties = embossProperties;
1160 const std::string& Controller::GetDefaultEmbossProperties() const
1162 if( NULL != mImpl->mEmbossDefaults )
1164 return mImpl->mEmbossDefaults->properties;
1167 return EMPTY_STRING;
1170 void Controller::SetDefaultOutlineProperties( const std::string& outlineProperties )
1172 if( NULL == mImpl->mOutlineDefaults )
1174 mImpl->mOutlineDefaults = new OutlineDefaults();
1177 mImpl->mOutlineDefaults->properties = outlineProperties;
1180 const std::string& Controller::GetDefaultOutlineProperties() const
1182 if( NULL != mImpl->mOutlineDefaults )
1184 return mImpl->mOutlineDefaults->properties;
1187 return EMPTY_STRING;
1190 bool Controller::SetDefaultLineSpacing( float lineSpacing )
1192 if( std::fabs( lineSpacing - mImpl->mLayoutEngine.GetDefaultLineSpacing() ) > Math::MACHINE_EPSILON_1000 )
1194 mImpl->mLayoutEngine.SetDefaultLineSpacing(lineSpacing);
1195 mImpl->mRecalculateNaturalSize = true;
1201 float Controller::GetDefaultLineSpacing() const
1203 return mImpl->mLayoutEngine.GetDefaultLineSpacing();
1206 bool Controller::SetDefaultLineSize( float lineSize )
1208 if( std::fabs( lineSize - mImpl->mLayoutEngine.GetDefaultLineSize() ) > Math::MACHINE_EPSILON_1000 )
1210 mImpl->mLayoutEngine.SetDefaultLineSize(lineSize);
1211 mImpl->mRecalculateNaturalSize = true;
1217 float Controller::GetDefaultLineSize() const
1219 return mImpl->mLayoutEngine.GetDefaultLineSize();
1222 void Controller::SetInputColor( const Vector4& color )
1224 if( NULL != mImpl->mEventData )
1226 mImpl->mEventData->mInputStyle.textColor = color;
1227 mImpl->mEventData->mInputStyle.isDefaultColor = false;
1229 if( EventData::SELECTING == mImpl->mEventData->mState || EventData::EDITING == mImpl->mEventData->mState || EventData::INACTIVE == mImpl->mEventData->mState )
1231 const bool handlesCrossed = mImpl->mEventData->mLeftSelectionPosition > mImpl->mEventData->mRightSelectionPosition;
1233 // Get start and end position of selection
1234 const CharacterIndex startOfSelectedText = handlesCrossed ? mImpl->mEventData->mRightSelectionPosition : mImpl->mEventData->mLeftSelectionPosition;
1235 const Length lengthOfSelectedText = ( handlesCrossed ? mImpl->mEventData->mLeftSelectionPosition : mImpl->mEventData->mRightSelectionPosition ) - startOfSelectedText;
1237 // Add the color run.
1238 const VectorBase::SizeType numberOfRuns = mImpl->mModel->mLogicalModel->mColorRuns.Count();
1239 mImpl->mModel->mLogicalModel->mColorRuns.Resize( numberOfRuns + 1u );
1241 ColorRun& colorRun = *( mImpl->mModel->mLogicalModel->mColorRuns.Begin() + numberOfRuns );
1242 colorRun.color = color;
1243 colorRun.characterRun.characterIndex = startOfSelectedText;
1244 colorRun.characterRun.numberOfCharacters = lengthOfSelectedText;
1246 // Request to relayout.
1247 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending | COLOR );
1248 mImpl->RequestRelayout();
1250 mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
1251 mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
1252 mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
1257 const Vector4& Controller::GetInputColor() const
1259 if( NULL != mImpl->mEventData )
1261 return mImpl->mEventData->mInputStyle.textColor;
1264 // Return the default text's color if there is no EventData.
1265 return mImpl->mTextColor;
1269 void Controller::SetInputFontFamily( const std::string& fontFamily )
1271 InputFontHandler::SetInputFontFamily(*this, fontFamily);
1274 const std::string& Controller::GetInputFontFamily() const
1276 return InputFontHandler::GetInputFontFamily(*this);
1279 void Controller::SetInputFontWeight( FontWeight weight )
1281 InputFontHandler::SetInputFontWeight(*this, weight);
1284 bool Controller::IsInputFontWeightDefined() const
1286 return InputFontHandler::IsInputFontWeightDefined(*this);
1289 FontWeight Controller::GetInputFontWeight() const
1291 return InputFontHandler::GetInputFontWeight(*this);
1294 void Controller::SetInputFontWidth( FontWidth width )
1296 InputFontHandler::SetInputFontWidth(*this, width);
1299 bool Controller::IsInputFontWidthDefined() const
1301 return InputFontHandler::IsInputFontWidthDefined(*this);
1304 FontWidth Controller::GetInputFontWidth() const
1306 return InputFontHandler::GetInputFontWidth(*this);
1309 void Controller::SetInputFontSlant( FontSlant slant )
1311 InputFontHandler::SetInputFontSlant(*this, slant);
1314 bool Controller::IsInputFontSlantDefined() const
1316 return InputFontHandler::IsInputFontSlantDefined(*this);
1319 FontSlant Controller::GetInputFontSlant() const
1321 return InputFontHandler::GetInputFontSlant(*this);
1324 void Controller::SetInputFontPointSize( float size )
1326 InputFontHandler::SetInputFontPointSize(*this, size);
1329 float Controller::GetInputFontPointSize() const
1331 return InputFontHandler::GetInputFontPointSize(*this);
1334 void Controller::SetInputLineSpacing( float lineSpacing )
1336 if( NULL != mImpl->mEventData )
1338 mImpl->mEventData->mInputStyle.lineSpacing = lineSpacing;
1339 mImpl->mEventData->mInputStyle.isLineSpacingDefined = true;
1343 float Controller::GetInputLineSpacing() const
1345 if( NULL != mImpl->mEventData )
1347 return mImpl->mEventData->mInputStyle.lineSpacing;
1353 void Controller::SetInputShadowProperties( const std::string& shadowProperties )
1355 if( NULL != mImpl->mEventData )
1357 mImpl->mEventData->mInputStyle.shadowProperties = shadowProperties;
1361 const std::string& Controller::GetInputShadowProperties() const
1363 if( NULL != mImpl->mEventData )
1365 return mImpl->mEventData->mInputStyle.shadowProperties;
1368 return EMPTY_STRING;
1371 void Controller::SetInputUnderlineProperties( const std::string& underlineProperties )
1373 if( NULL != mImpl->mEventData )
1375 mImpl->mEventData->mInputStyle.underlineProperties = underlineProperties;
1379 const std::string& Controller::GetInputUnderlineProperties() const
1381 if( NULL != mImpl->mEventData )
1383 return mImpl->mEventData->mInputStyle.underlineProperties;
1386 return EMPTY_STRING;
1389 void Controller::SetInputEmbossProperties( const std::string& embossProperties )
1391 if( NULL != mImpl->mEventData )
1393 mImpl->mEventData->mInputStyle.embossProperties = embossProperties;
1397 const std::string& Controller::GetInputEmbossProperties() const
1399 if( NULL != mImpl->mEventData )
1401 return mImpl->mEventData->mInputStyle.embossProperties;
1404 return GetDefaultEmbossProperties();
1407 void Controller::SetInputOutlineProperties( const std::string& outlineProperties )
1409 if( NULL != mImpl->mEventData )
1411 mImpl->mEventData->mInputStyle.outlineProperties = outlineProperties;
1415 const std::string& Controller::GetInputOutlineProperties() const
1417 if( NULL != mImpl->mEventData )
1419 return mImpl->mEventData->mInputStyle.outlineProperties;
1422 return GetDefaultOutlineProperties();
1425 void Controller::SetInputModePassword( bool passwordInput )
1427 if( NULL != mImpl->mEventData )
1429 mImpl->mEventData->mPasswordInput = passwordInput;
1433 bool Controller::IsInputModePassword()
1435 if( NULL != mImpl->mEventData )
1437 return mImpl->mEventData->mPasswordInput;
1442 void Controller::SetNoTextDoubleTapAction( NoTextTap::Action action )
1444 if( NULL != mImpl->mEventData )
1446 mImpl->mEventData->mDoubleTapAction = action;
1450 Controller::NoTextTap::Action Controller::GetNoTextDoubleTapAction() const
1452 NoTextTap::Action action = NoTextTap::NO_ACTION;
1454 if( NULL != mImpl->mEventData )
1456 action = mImpl->mEventData->mDoubleTapAction;
1462 void Controller::SetNoTextLongPressAction( NoTextTap::Action action )
1464 if( NULL != mImpl->mEventData )
1466 mImpl->mEventData->mLongPressAction = action;
1470 Controller::NoTextTap::Action Controller::GetNoTextLongPressAction() const
1472 NoTextTap::Action action = NoTextTap::NO_ACTION;
1474 if( NULL != mImpl->mEventData )
1476 action = mImpl->mEventData->mLongPressAction;
1482 bool Controller::IsUnderlineSetByString()
1484 return mImpl->mUnderlineSetByString;
1487 void Controller::UnderlineSetByString( bool setByString )
1489 mImpl->mUnderlineSetByString = setByString;
1492 bool Controller::IsShadowSetByString()
1494 return mImpl->mShadowSetByString;
1497 void Controller::ShadowSetByString( bool setByString )
1499 mImpl->mShadowSetByString = setByString;
1502 bool Controller::IsOutlineSetByString()
1504 return mImpl->mOutlineSetByString;
1507 void Controller::OutlineSetByString( bool setByString )
1509 mImpl->mOutlineSetByString = setByString;
1512 bool Controller::IsFontStyleSetByString()
1514 return mImpl->mFontStyleSetByString;
1517 void Controller::FontStyleSetByString( bool setByString )
1519 mImpl->mFontStyleSetByString = setByString;
1522 // public : Queries & retrieves.
1524 Layout::Engine& Controller::GetLayoutEngine()
1526 return mImpl->mLayoutEngine;
1529 View& Controller::GetView()
1531 return mImpl->mView;
1534 Vector3 Controller::GetNaturalSize()
1536 return Relayouter::GetNaturalSize(*this);
1539 bool Controller::CheckForTextFit( float pointSize, Size& layoutSize )
1541 return Relayouter::CheckForTextFit(*this, pointSize, layoutSize);
1544 void Controller::FitPointSizeforLayout( Size layoutSize )
1546 Relayouter::FitPointSizeforLayout(*this, layoutSize);
1549 float Controller::GetHeightForWidth( float width )
1551 return Relayouter::GetHeightForWidth(*this, width);
1554 int Controller::GetLineCount( float width )
1556 GetHeightForWidth( width );
1557 int numberofLines = mImpl->mModel->GetNumberOfLines();
1558 return numberofLines;
1561 const ModelInterface* const Controller::GetTextModel() const
1563 return mImpl->mModel.Get();
1566 float Controller::GetScrollAmountByUserInput()
1568 float scrollAmount = 0.0f;
1570 if (NULL != mImpl->mEventData && mImpl->mEventData->mCheckScrollAmount)
1572 scrollAmount = mImpl->mModel->mScrollPosition.y - mImpl->mModel->mScrollPositionLast.y;
1573 mImpl->mEventData->mCheckScrollAmount = false;
1575 return scrollAmount;
1578 bool Controller::GetTextScrollInfo( float& scrollPosition, float& controlHeight, float& layoutHeight )
1580 const Vector2& layout = mImpl->mModel->mVisualModel->GetLayoutSize();
1583 controlHeight = mImpl->mModel->mVisualModel->mControlSize.height;
1584 layoutHeight = layout.height;
1585 scrollPosition = mImpl->mModel->mScrollPosition.y;
1586 isScrolled = !Equals( mImpl->mModel->mScrollPosition.y, mImpl->mModel->mScrollPositionLast.y, Math::MACHINE_EPSILON_1 );
1590 void Controller::SetHiddenInputOption(const Property::Map& options)
1592 if( NULL == mImpl->mHiddenInput )
1594 mImpl->mHiddenInput = new HiddenText( this );
1596 mImpl->mHiddenInput->SetProperties(options);
1599 void Controller::GetHiddenInputOption(Property::Map& options)
1601 if( NULL != mImpl->mHiddenInput )
1603 mImpl->mHiddenInput->GetProperties(options);
1607 void Controller::SetPlaceholderProperty( const Property::Map& map )
1609 PlaceholderHandler::SetPlaceholderProperty(*this, map);
1612 void Controller::GetPlaceholderProperty( Property::Map& map )
1614 PlaceholderHandler::GetPlaceholderProperty(*this, map);
1617 Toolkit::DevelText::TextDirection::Type Controller::GetTextDirection()
1619 // Make sure the model is up-to-date before layouting
1620 ProcessModifyEvents();
1622 if ( mImpl->mUpdateTextDirection )
1624 // Operations that can be done only once until the text changes.
1625 const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( CONVERT_TO_UTF32 |
1631 GET_GLYPH_METRICS );
1633 // Set the update info to relayout the whole text.
1634 mImpl->mTextUpdateInfo.mParagraphCharacterIndex = 0u;
1635 mImpl->mTextUpdateInfo.mRequestedNumberOfCharacters = mImpl->mModel->mLogicalModel->mText.Count();
1637 // Make sure the model is up-to-date before layouting
1638 mImpl->UpdateModel( onlyOnceOperations );
1640 Vector3 naturalSize;
1641 DoRelayout( Size( MAX_FLOAT, MAX_FLOAT ),
1642 static_cast<OperationsMask>( onlyOnceOperations |
1643 LAYOUT | REORDER | UPDATE_DIRECTION ),
1644 naturalSize.GetVectorXY() );
1646 // Do not do again the only once operations.
1647 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending & ~onlyOnceOperations );
1649 // Clear the update info. This info will be set the next time the text is updated.
1650 mImpl->mTextUpdateInfo.Clear();
1652 // FullRelayoutNeeded should be true because DoRelayout is MAX_FLOAT, MAX_FLOAT.
1653 mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true;
1655 mImpl->mUpdateTextDirection = false;
1658 return mImpl->mIsTextDirectionRTL ? Toolkit::DevelText::TextDirection::RIGHT_TO_LEFT : Toolkit::DevelText::TextDirection::LEFT_TO_RIGHT;
1661 Toolkit::DevelText::VerticalLineAlignment::Type Controller::GetVerticalLineAlignment() const
1663 return mImpl->mModel->GetVerticalLineAlignment();
1666 void Controller::SetVerticalLineAlignment( Toolkit::DevelText::VerticalLineAlignment::Type alignment )
1668 mImpl->mModel->mVerticalLineAlignment = alignment;
1671 // public : Relayout.
1673 Controller::UpdateTextType Controller::Relayout( const Size& size, Dali::LayoutDirection::Type layoutDirection )
1675 return Relayouter::Relayout(*this, size, layoutDirection);
1678 void Controller::RequestRelayout()
1680 mImpl->RequestRelayout();
1683 // public : Input style change signals.
1685 bool Controller::IsInputStyleChangedSignalsQueueEmpty()
1687 return ( NULL == mImpl->mEventData ) || ( 0u == mImpl->mEventData->mInputStyleChangedQueue.Count() );
1690 void Controller::ProcessInputStyleChangedSignals()
1692 if( NULL == mImpl->mEventData )
1698 for( Vector<InputStyle::Mask>::ConstIterator it = mImpl->mEventData->mInputStyleChangedQueue.Begin(),
1699 endIt = mImpl->mEventData->mInputStyleChangedQueue.End();
1703 const InputStyle::Mask mask = *it;
1705 if( NULL != mImpl->mEditableControlInterface )
1707 // Emit the input style changed signal.
1708 mImpl->mEditableControlInterface->InputStyleChanged( mask );
1712 mImpl->mEventData->mInputStyleChangedQueue.Clear();
1715 // public : Text-input Event Queuing.
1717 void Controller::KeyboardFocusGainEvent()
1719 EventHandler::KeyboardFocusGainEvent(*this);
1722 void Controller::KeyboardFocusLostEvent()
1724 EventHandler::KeyboardFocusLostEvent(*this);
1727 bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent )
1729 return EventHandler::KeyEvent(*this, keyEvent);
1732 void Controller::TapEvent( unsigned int tapCount, float x, float y )
1734 EventHandler::TapEvent(*this, tapCount, x, y);
1737 void Controller::PanEvent( GestureState state, const Vector2& displacement )
1739 EventHandler::PanEvent(*this, state, displacement);
1742 void Controller::LongPressEvent( GestureState state, float x, float y )
1744 EventHandler::LongPressEvent(*this, state, x, y);
1747 void Controller::SelectEvent( float x, float y, SelectionType selectType )
1749 EventHandler::SelectEvent(*this, x, y, selectType);
1752 void Controller::SetTextSelectionRange(const uint32_t *start, const uint32_t *end)
1754 if( mImpl->mEventData )
1756 mImpl->mEventData->mCheckScrollAmount = true;
1757 mImpl->mEventData->mIsLeftHandleSelected = true;
1758 mImpl->mEventData->mIsRightHandleSelected = true;
1759 mImpl->SetTextSelectionRange(start, end);
1760 mImpl->RequestRelayout();
1761 KeyboardFocusGainEvent();
1765 Uint32Pair Controller::GetTextSelectionRange() const
1767 return mImpl->GetTextSelectionRange();
1770 CharacterIndex Controller::GetPrimaryCursorPosition() const
1772 return mImpl->GetPrimaryCursorPosition();
1775 bool Controller::SetPrimaryCursorPosition( CharacterIndex index )
1777 if( mImpl->mEventData )
1779 mImpl->mEventData->mCheckScrollAmount = true;
1780 mImpl->mEventData->mIsLeftHandleSelected = true;
1781 mImpl->mEventData->mIsRightHandleSelected = true;
1782 mImpl->mEventData->mCheckScrollAmount = true;
1783 if( mImpl->SetPrimaryCursorPosition(index) )
1785 KeyboardFocusGainEvent();
1792 void Controller::SelectWholeText()
1794 SelectEvent( 0.f, 0.f, SelectionType::ALL );
1797 void Controller::SelectNone()
1799 SelectEvent( 0.f, 0.f, SelectionType::NONE );
1802 string Controller::GetSelectedText() const
1805 if( EventData::SELECTING == mImpl->mEventData->mState )
1807 mImpl->RetrieveSelection( text, false );
1812 InputMethodContext::CallbackData Controller::OnInputMethodContextEvent( InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent )
1814 return EventHandler::OnInputMethodContextEvent(*this, inputMethodContext, inputMethodContextEvent);
1817 void Controller::PasteClipboardItemEvent()
1819 EventHandler::PasteClipboardItemEvent(*this);
1822 // protected : Inherit from Text::Decorator::ControllerInterface.
1824 void Controller::GetTargetSize( Vector2& targetSize )
1826 targetSize = mImpl->mModel->mVisualModel->mControlSize;
1829 void Controller::AddDecoration( Actor& actor, bool needsClipping )
1831 if( NULL != mImpl->mEditableControlInterface )
1833 mImpl->mEditableControlInterface->AddDecoration( actor, needsClipping );
1837 bool Controller::IsEditable() const
1839 return mImpl->IsEditable();
1842 void Controller::SetEditable( bool editable )
1844 mImpl->SetEditable( editable );
1845 if(mImpl->mEventData && mImpl->mEventData->mDecorator)
1847 mImpl->mEventData->mDecorator->SetEditable( editable );
1851 void Controller::ScrollBy( Vector2 scroll )
1853 if( mImpl->mEventData && (fabs(scroll.x) > Math::MACHINE_EPSILON_0 || fabs(scroll.y) > Math::MACHINE_EPSILON_0))
1855 const Vector2& layoutSize = mImpl->mModel->mVisualModel->GetLayoutSize();
1856 const Vector2 currentScroll = mImpl->mModel->mScrollPosition;
1858 scroll.x = -scroll.x;
1859 scroll.y = -scroll.y;
1861 if( fabs(scroll.x) > Math::MACHINE_EPSILON_0 )
1863 mImpl->mModel->mScrollPosition.x += scroll.x;
1864 mImpl->ClampHorizontalScroll( layoutSize );
1867 if( fabs(scroll.y) > Math::MACHINE_EPSILON_0 )
1869 mImpl->mModel->mScrollPosition.y += scroll.y;
1870 mImpl->ClampVerticalScroll( layoutSize );
1873 if (mImpl->mModel->mScrollPosition != currentScroll)
1875 mImpl->mEventData->mDecorator->UpdatePositions( mImpl->mModel->mScrollPosition - currentScroll );
1876 mImpl->RequestRelayout();
1881 float Controller::GetHorizontalScrollPosition()
1883 if( mImpl->mEventData )
1885 //scroll values are negative internally so we convert them to positive numbers
1886 return -mImpl->mModel->mScrollPosition.x;
1891 float Controller::GetVerticalScrollPosition()
1893 if( mImpl->mEventData )
1895 //scroll values are negative internally so we convert them to positive numbers
1896 return -mImpl->mModel->mScrollPosition.y;
1901 void Controller::DecorationEvent( HandleType handleType, HandleState state, float x, float y )
1903 EventHandler::DecorationEvent(*this, handleType, state, x, y);
1906 // protected : Inherit from TextSelectionPopup::TextPopupButtonCallbackInterface.
1908 void Controller::TextPopupButtonTouched( Dali::Toolkit::TextSelectionPopup::Buttons button )
1910 EventHandler::TextPopupButtonTouched(*this, button);
1913 void Controller::DisplayTimeExpired()
1915 mImpl->mEventData->mUpdateCursorPosition = true;
1916 // Apply modifications to the model
1917 mImpl->mOperationsPending = ALL_OPERATIONS;
1919 mImpl->RequestRelayout();
1922 // private : Update.
1924 void Controller::InsertText( const std::string& text, Controller::InsertType type )
1926 TextUpdater::InsertText(*this, text, type);
1929 void Controller::PasteText( const std::string& stringToPaste )
1931 TextUpdater::PasteText(*this, stringToPaste);
1934 bool Controller::RemoveText( int cursorOffset,
1935 int numberOfCharacters,
1936 UpdateInputStyleType type )
1938 return TextUpdater::RemoveText(*this, cursorOffset, numberOfCharacters, type);
1941 bool Controller::RemoveSelectedText()
1943 return TextUpdater::RemoveSelectedText(*this);
1946 // private : Relayout.
1948 bool Controller::DoRelayout( const Size& size,
1949 OperationsMask operationsRequired,
1952 return Relayouter::DoRelayout(*this, size, operationsRequired, layoutSize);
1955 void Controller::CalculateVerticalOffset( const Size& controlSize )
1957 Relayouter::CalculateVerticalOffset(*this, controlSize);
1960 // private : Events.
1962 void Controller::ProcessModifyEvents()
1964 EventHandler::ProcessModifyEvents(*this);
1967 void Controller::TextReplacedEvent()
1969 EventHandler::TextReplacedEvent(*this);
1972 void Controller::TextInsertedEvent()
1974 EventHandler::TextInsertedEvent(*this);
1977 void Controller::TextDeletedEvent()
1979 EventHandler::TextDeletedEvent(*this);
1982 bool Controller::DeleteEvent( int keyCode )
1984 return EventHandler::DeleteEvent(*this, keyCode);
1987 // private : Helpers.
1989 void Controller::ResetText()
1991 TextUpdater::ResetText(*this);
1994 void Controller::ShowPlaceholderText()
1996 PlaceholderHandler::ShowPlaceholderText(*this);
1999 void Controller::ClearFontData()
2001 if( mImpl->mFontDefaults )
2003 mImpl->mFontDefaults->mFontId = 0u; // Remove old font ID
2006 // Set flags to update the model.
2007 mImpl->mTextUpdateInfo.mCharacterIndex = 0u;
2008 mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
2009 mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mModel->mLogicalModel->mText.Count();
2011 mImpl->mTextUpdateInfo.mClearAll = true;
2012 mImpl->mTextUpdateInfo.mFullRelayoutNeeded = true;
2013 mImpl->mRecalculateNaturalSize = true;
2015 mImpl->mOperationsPending = static_cast<OperationsMask>( mImpl->mOperationsPending |
2021 UPDATE_LAYOUT_SIZE |
2026 void Controller::ClearStyleData()
2028 mImpl->mModel->mLogicalModel->mColorRuns.Clear();
2029 mImpl->mModel->mLogicalModel->ClearFontDescriptionRuns();
2032 void Controller::ResetCursorPosition( CharacterIndex cursorIndex )
2034 // Reset the cursor position
2035 if( NULL != mImpl->mEventData )
2037 mImpl->mEventData->mPrimaryCursorPosition = cursorIndex;
2039 // Update the cursor if it's in editing mode.
2040 if( EventData::IsEditingState( mImpl->mEventData->mState ) )
2042 mImpl->mEventData->mUpdateCursorPosition = true;
2047 CharacterIndex Controller::GetCursorPosition()
2049 if( !mImpl->mEventData )
2052 return mImpl->mEventData->mPrimaryCursorPosition;
2055 void Controller::ResetScrollPosition()
2057 if( NULL != mImpl->mEventData )
2059 // Reset the scroll position.
2060 mImpl->mModel->mScrollPosition = Vector2::ZERO;
2061 mImpl->mEventData->mScrollAfterUpdatePosition = true;
2065 void Controller::SetControlInterface( ControlInterface* controlInterface )
2067 mImpl->mControlInterface = controlInterface;
2070 bool Controller::ShouldClearFocusOnEscape() const
2072 return mImpl->mShouldClearFocusOnEscape;
2075 Actor Controller::CreateBackgroundActor()
2077 return mImpl->CreateBackgroundActor();
2080 // private : Private contructors & copy operator.
2082 Controller::Controller()
2083 : Controller(nullptr, nullptr, nullptr)
2087 Controller::Controller( ControlInterface* controlInterface )
2088 :Controller( controlInterface, nullptr, nullptr)
2092 Controller::Controller( ControlInterface* controlInterface,
2093 EditableControlInterface* editableControlInterface,
2094 SelectableControlInterface* selectableControlInterface )
2095 : mImpl(new Controller::Impl(controlInterface, editableControlInterface, selectableControlInterface))
2099 // The copy constructor and operator are left unimplemented.
2101 // protected : Destructor.
2103 Controller::~Controller()
2110 } // namespace Toolkit