X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-editor-impl.cpp;h=51684a4f80108298df662e9a198812509e70af3e;hp=9bbce3b9ac7cdf3a34587e99a94d0da4139950b0;hb=675f5551ef3c7ca20ec45c36b865a5092883af43;hpb=36dbb1d0b2cd12285c54da4c44359658f2b92281 diff --git a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp index 9bbce3b..51684a4 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -26,11 +26,14 @@ #include #include #include +#include #include // INTERNAL INCLUDES #include +#include #include +#include #include #include #include @@ -64,9 +67,9 @@ namespace const Scripting::StringEnum HORIZONTAL_ALIGNMENT_STRING_TABLE[] = { - { "BEGIN", Toolkit::Text::LayoutEngine::HORIZONTAL_ALIGN_BEGIN }, - { "CENTER", Toolkit::Text::LayoutEngine::HORIZONTAL_ALIGN_CENTER }, - { "END", Toolkit::Text::LayoutEngine::HORIZONTAL_ALIGN_END }, + { "BEGIN", Toolkit::Text::Layout::HORIZONTAL_ALIGN_BEGIN }, + { "CENTER", Toolkit::Text::Layout::HORIZONTAL_ALIGN_CENTER }, + { "END", Toolkit::Text::Layout::HORIZONTAL_ALIGN_END }, }; const unsigned int HORIZONTAL_ALIGNMENT_STRING_TABLE_COUNT = sizeof( HORIZONTAL_ALIGNMENT_STRING_TABLE ) / sizeof( HORIZONTAL_ALIGNMENT_STRING_TABLE[0] ); @@ -83,7 +86,7 @@ DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "renderingBackend", DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "text", STRING, TEXT ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "textColor", VECTOR4, TEXT_COLOR ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "fontFamily", STRING, FONT_FAMILY ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "fontStyle", STRING, FONT_STYLE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "fontStyle", MAP, FONT_STYLE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "pointSize", FLOAT, POINT_SIZE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "horizontalAlignment", STRING, HORIZONTAL_ALIGNMENT ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "scrollThreshold", FLOAT, SCROLL_THRESHOLD ) @@ -107,20 +110,21 @@ DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "decorationBoundingBox", DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "enableMarkup", BOOLEAN, ENABLE_MARKUP ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputColor", VECTOR4, INPUT_COLOR ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputFontFamily", STRING, INPUT_FONT_FAMILY ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputFontStyle", STRING, INPUT_FONT_STYLE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputFontStyle", MAP, INPUT_FONT_STYLE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputPointSize", FLOAT, INPUT_POINT_SIZE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "lineSpacing", FLOAT, LINE_SPACING ) DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputLineSpacing", FLOAT, INPUT_LINE_SPACING ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "underline", STRING, UNDERLINE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputUnderline", STRING, INPUT_UNDERLINE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "shadow", STRING, SHADOW ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputShadow", STRING, INPUT_SHADOW ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "emboss", STRING, EMBOSS ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputEmboss", STRING, INPUT_EMBOSS ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "outline", STRING, OUTLINE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputOutline", STRING, INPUT_OUTLINE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "underline", MAP, UNDERLINE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputUnderline", MAP, INPUT_UNDERLINE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "shadow", MAP, SHADOW ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputShadow", MAP, INPUT_SHADOW ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "emboss", MAP, EMBOSS ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputEmboss", MAP, INPUT_EMBOSS ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "outline", MAP, OUTLINE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputOutline", MAP, INPUT_OUTLINE ) DALI_SIGNAL_REGISTRATION( Toolkit, TextEditor, "textChanged", SIGNAL_TEXT_CHANGED ) +DALI_SIGNAL_REGISTRATION( Toolkit, TextEditor, "inputStyleChanged", SIGNAL_INPUT_STYLE_CHANGED ) DALI_TYPE_REGISTRATION_END() @@ -171,7 +175,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mController ) { - const std::string text = value.Get< std::string >(); + const std::string& text = value.Get< std::string >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p TEXT %s\n", impl.mController.Get(), text.c_str() ); impl.mController->SetText( text ); @@ -182,12 +186,12 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mController ) { - const Vector4 textColor = value.Get< Vector4 >(); + const Vector4& textColor = value.Get< Vector4 >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a ); - if( impl.mController->GetTextColor() != textColor ) + if( impl.mController->GetDefaultColor() != textColor ) { - impl.mController->SetTextColor( textColor ); + impl.mController->SetDefaultColor( textColor ); impl.mController->SetInputColor( textColor ); impl.mRenderer.Reset(); } @@ -198,7 +202,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mController ) { - const std::string fontFamily = value.Get< std::string >(); + const std::string& fontFamily = value.Get< std::string >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() ); impl.mController->SetDefaultFontFamily( fontFamily ); } @@ -227,14 +231,14 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mController ) { - const std::string alignStr = value.Get< std::string >(); + const std::string& alignStr = value.Get< std::string >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p HORIZONTAL_ALIGNMENT %s\n", impl.mController.Get(), alignStr.c_str() ); - LayoutEngine::HorizontalAlignment alignment( LayoutEngine::HORIZONTAL_ALIGN_BEGIN ); - if( Scripting::GetEnumeration< LayoutEngine::HorizontalAlignment >( alignStr.c_str(), - HORIZONTAL_ALIGNMENT_STRING_TABLE, - HORIZONTAL_ALIGNMENT_STRING_TABLE_COUNT, - alignment ) ) + Layout::HorizontalAlignment alignment( Layout::HORIZONTAL_ALIGN_BEGIN ); + if( Scripting::GetEnumeration< Layout::HorizontalAlignment >( alignStr.c_str(), + HORIZONTAL_ALIGNMENT_STRING_TABLE, + HORIZONTAL_ALIGNMENT_STRING_TABLE_COUNT, + alignment ) ) { impl.mController->SetHorizontalAlignment( alignment ); } @@ -267,7 +271,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mDecorator ) { - const Vector4 color = value.Get< Vector4 >(); + const Vector4& color = value.Get< Vector4 >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PRIMARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); impl.mDecorator->SetCursorColor( PRIMARY_CURSOR, color ); @@ -279,7 +283,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mDecorator ) { - const Vector4 color = value.Get< Vector4 >(); + const Vector4& color = value.Get< Vector4 >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p SECONDARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); impl.mDecorator->SetCursorColor( SECONDARY_CURSOR, color ); @@ -439,7 +443,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mDecorator ) { - const Rect box = value.Get< Rect >(); + const Rect& box = value.Get< Rect >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p DECORATION_BOUNDING_BOX %d,%d %dx%d\n", impl.mController.Get(), box.x, box.y, box.width, box.height ); impl.mDecorator->SetBoundingBox( box ); @@ -462,7 +466,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mController ) { - const Vector4 inputColor = value.Get< Vector4 >(); + const Vector4& inputColor = value.Get< Vector4 >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), inputColor.r, inputColor.g, inputColor.b, inputColor.a ); impl.mController->SetInputColor( inputColor ); @@ -473,7 +477,7 @@ void TextEditor::SetProperty( BaseObject* object, Property::Index index, const P { if( impl.mController ) { - const std::string fontFamily = value.Get< std::string >(); + const std::string& fontFamily = value.Get< std::string >(); DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() ); impl.mController->SetInputFontFamily( fontFamily ); } @@ -622,7 +626,7 @@ Property::Value TextEditor::GetProperty( BaseObject* object, Property::Index ind { if ( impl.mController ) { - value = impl.mController->GetTextColor(); + value = impl.mController->GetDefaultColor(); } break; } @@ -651,9 +655,9 @@ Property::Value TextEditor::GetProperty( BaseObject* object, Property::Index ind { if( impl.mController ) { - const char* name = Scripting::GetEnumerationName< Toolkit::Text::LayoutEngine::HorizontalAlignment >( impl.mController->GetLayoutEngine().GetHorizontalAlignment(), - HORIZONTAL_ALIGNMENT_STRING_TABLE, - HORIZONTAL_ALIGNMENT_STRING_TABLE_COUNT ); + const char* name = Scripting::GetEnumerationName< Toolkit::Text::Layout::HorizontalAlignment >( impl.mController->GetHorizontalAlignment(), + HORIZONTAL_ALIGNMENT_STRING_TABLE, + HORIZONTAL_ALIGNMENT_STRING_TABLE_COUNT ); if( name ) { value = std::string( name ); @@ -904,6 +908,10 @@ bool TextEditor::DoConnectSignal( BaseObject* object, ConnectionTrackerInterface { editor.TextChangedSignal().Connect( tracker, functor ); } + else if( 0 == strcmp( signalName.c_str(), SIGNAL_INPUT_STYLE_CHANGED ) ) + { + editor.InputStyleChangedSignal().Connect( tracker, functor ); + } else { // signalName does not match any signal @@ -918,16 +926,21 @@ Toolkit::TextEditor::TextChangedSignalType& TextEditor::TextChangedSignal() return mTextChangedSignal; } +Toolkit::TextEditor::InputStyleChangedSignalType& TextEditor::InputStyleChangedSignal() +{ + return mInputStyleChangedSignal; +} + void TextEditor::OnInitialize() { Actor self = Self(); - mController = Text::Controller::New( *this ); + mController = Text::Controller::New( this, this ); mDecorator = Text::Decorator::New( *mController, *mController ); - mController->GetLayoutEngine().SetLayout( LayoutEngine::MULTI_LINE_BOX ); + mController->GetLayoutEngine().SetLayout( Layout::Engine::MULTI_LINE_BOX ); // Enables the text input. mController->EnableTextInput( mDecorator ); @@ -938,6 +951,7 @@ void TextEditor::OnInitialize() // Disables the horizontal scrolling. mController->SetHorizontalScrollEnabled( false ); + // Sets the maximum number of characters. mController->SetMaximumNumberOfCharacters( std::numeric_limits::max() ); // Enable the smooth handle panning. @@ -969,6 +983,22 @@ void TextEditor::OnInitialize() self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::HEIGHT ); self.OnStageSignal().Connect( this, &TextEditor::OnStageConnect ); + + // Creates an extra control to be used as stencil buffer. + mStencil = Control::New(); + mStencil.SetAnchorPoint( AnchorPoint::CENTER ); + mStencil.SetParentOrigin( ParentOrigin::CENTER ); + + // Creates a background visual. Even if the color is transparent it updates the stencil. + mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND, + Property::Map().Add( Toolkit::Visual::Property::TYPE, DevelVisual::COLOR ). + Add( ColorVisual::Property::MIX_COLOR, Color::TRANSPARENT ) ); + + // Enable the clipping property. + mStencil.SetProperty( Actor::Property::CLIPPING_MODE, ClippingMode::CLIP_CHILDREN ); + mStencil.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); + + self.Add( mStencil ); } void TextEditor::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) @@ -1031,14 +1061,31 @@ void TextEditor::OnRelayout( const Vector2& size, RelayoutContainer& container ) mRenderer = Backend::Get().NewRenderer( mRenderingBackend ); } - EnableClipping( true, size ); RenderText( updateTextType ); } + + // The text-editor emits signals when the input style changes. These changes of style are + // detected during the relayout process (size negotiation), i.e after the cursor has been moved. Signals + // can't be emitted during the size negotiation as the callbacks may update the UI. + // The text-editor adds an idle callback to the adaptor to emit the signals after the size negotiation. + if( !mController->IsInputStyleChangedSignalsQueueEmpty() ) + { + if( Adaptor::IsAvailable() ) + { + Adaptor& adaptor = Adaptor::Get(); + + if( NULL == mIdleCallback ) + { + // @note: The callback manager takes the ownership of the callback object. + mIdleCallback = MakeCallback( this, &TextEditor::OnIdleSignal ); + adaptor.AddIdle( mIdleCallback ); + } + } + } } void TextEditor::RenderText( Text::Controller::UpdateTextType updateTextType ) { - Actor self = Self(); Actor renderableActor; if( Text::Controller::NONE_UPDATED != ( Text::Controller::MODEL_UPDATED & updateTextType ) ) @@ -1057,43 +1104,23 @@ void TextEditor::RenderText( Text::Controller::UpdateTextType updateTextType ) if( mRenderableActor ) { - const Vector2& scrollOffset = mController->GetScrollPosition(); + const Vector2& scrollOffset = mController->GetTextModel()->GetScrollPosition(); mRenderableActor.SetPosition( scrollOffset.x, scrollOffset.y ); - Actor clipRootActor; - if( mClipper ) - { - clipRootActor = mClipper->GetRootActor(); - } + // Make sure the actors are parented correctly with/without clipping + Actor self = mStencil ? mStencil : Self(); for( std::vector::const_iterator it = mClippingDecorationActors.begin(), endIt = mClippingDecorationActors.end(); it != endIt; ++it ) { - Actor actor = *it; - - if( clipRootActor ) - { - clipRootActor.Add( actor ); - } - else - { - self.Add( actor ); - } + self.Add( *it ); } mClippingDecorationActors.clear(); - // Make sure the actor is parented correctly with/without clipping - if( clipRootActor ) - { - clipRootActor.Add( mRenderableActor ); - } - else - { - self.Add( mRenderableActor ); - } + self.Add( mRenderableActor ); } } @@ -1205,21 +1232,6 @@ bool TextEditor::OnKeyEvent( const KeyEvent& event ) return mController->KeyEvent( event ); } -void TextEditor::AddDecoration( Actor& actor, bool needsClipping ) -{ - if( actor ) - { - if( needsClipping ) - { - mClippingDecorationActors.push_back( actor ); - } - else - { - Self().Add( actor ); - } - } -} - void TextEditor::RequestTextRelayout() { RelayoutRequest(); @@ -1236,6 +1248,75 @@ void TextEditor::MaxLengthReached() // Nothing to do as TextEditor doesn't emit a max length reached signal. } +void TextEditor::InputStyleChanged( Text::InputStyle::Mask inputStyleMask ) +{ + Dali::Toolkit::TextEditor handle( GetOwner() ); + + Toolkit::TextEditor::InputStyle::Mask editorInputStyleMask = Toolkit::TextEditor::InputStyle::NONE; + + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_COLOR ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::COLOR ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_FONT_FAMILY ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::FONT_FAMILY ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_POINT_SIZE ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::POINT_SIZE ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_FONT_WEIGHT ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::FONT_STYLE ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_FONT_WIDTH ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::FONT_STYLE ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_FONT_SLANT ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::FONT_STYLE ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_LINE_SPACING ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::LINE_SPACING ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_UNDERLINE ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::UNDERLINE ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_SHADOW ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::SHADOW ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_EMBOSS ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::EMBOSS ); + } + if( InputStyle::NONE != static_cast( inputStyleMask & InputStyle::INPUT_OUTLINE ) ) + { + editorInputStyleMask = static_cast( editorInputStyleMask | Toolkit::TextEditor::InputStyle::OUTLINE ); + } + + mInputStyleChangedSignal.Emit( handle, editorInputStyleMask ); +} + +void TextEditor::AddDecoration( Actor& actor, bool needsClipping ) +{ + if( actor ) + { + if( needsClipping ) + { + mClippingDecorationActors.push_back( actor ); + } + else + { + Self().Add( actor ); + } + } +} + void TextEditor::OnStageConnect( Dali::Actor actor ) { if ( mHasBeenStaged ) @@ -1269,34 +1350,6 @@ void TextEditor::GetHandleImagePropertyValue( Property::Value& value, Text::Han } } -void TextEditor::EnableClipping( bool clipping, const Vector2& size ) -{ - if( clipping ) - { - // Not worth to created clip actor if width or height is equal to zero. - if( size.width > Math::MACHINE_EPSILON_1000 && size.height > Math::MACHINE_EPSILON_1000 ) - { - if( !mClipper ) - { - Actor self = Self(); - - mClipper = Clipper::New( size ); - self.Add( mClipper->GetRootActor() ); - self.Add( mClipper->GetImageView() ); - } - else if ( mClipper ) - { - mClipper->Refresh( size ); - } - } - } - else - { - // Note - this will automatically remove the root actor & the image view - mClipper.Reset(); - } -} - void TextEditor::OnClipboardTextSelected( ClipboardEventNotifier& clipboard ) { mController->PasteClipboardItemEvent(); @@ -1333,8 +1386,18 @@ bool TextEditor::OnTouched( Actor actor, const TouchData& touch ) return true; } +void TextEditor::OnIdleSignal() +{ + // Emits the change of input style signals. + mController->ProcessInputStyleChangedSignals(); + + // Set the pointer to null as the callback manager deletes the callback after execute it. + mIdleCallback = NULL; +} + TextEditor::TextEditor() -: Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ), +: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ), + mIdleCallback( NULL ), mRenderingBackend( DEFAULT_RENDERING_BACKEND ), mHasBeenStaged( false ) { @@ -1342,7 +1405,13 @@ TextEditor::TextEditor() TextEditor::~TextEditor() { - mClipper.Reset(); + UnparentAndReset( mStencil ); + + if( ( NULL != mIdleCallback ) && Adaptor::IsAvailable() ) + { + // Removes the callback from the callback manager in case the text-editor is destroyed before the callback is executed. + Adaptor::Get().RemoveIdle( mIdleCallback ); + } } } // namespace Internal