X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Ftext-controls%2Ftext-editor-impl.cpp;h=af428838283c723291d9f55df4ee03b31f4e47af;hb=23b11d5e9e206a703616aeef9bea3f75647a54db;hp=8f7916c1e77399c4e720ef5ea406d3261d5a2e77;hpb=4a2c09ae826a352ce60c50f9986167ae3d3e6693;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git 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 8f7916c..af42883 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 @@ -121,6 +124,7 @@ DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "outline", DALI_PROPERTY_REGISTRATION( Toolkit, TextEditor, "inputOutline", STRING, 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() @@ -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,11 +926,16 @@ 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 ); @@ -969,6 +982,24 @@ 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. + Property::Map backGroundMap; + backGroundMap[Toolkit::Visual::Property::TYPE] = Visual::COLOR; + backGroundMap[ColorVisual::Property::MIX_COLOR] = Color::TRANSPARENT; + + mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND, backGroundMap ); + + // 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 ) @@ -988,13 +1019,7 @@ void TextEditor::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange: case StyleChange::DEFAULT_FONT_SIZE_CHANGE: { - DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor::OnStyleChange StyleChange::DEFAULT_FONT_SIZE_CHANGE (%f)\n", mController->GetDefaultPointSize() ); - - if ( (mController->GetDefaultPointSize() <= 0.0f) ) // If DefaultPointSize not set by Property system it will be 0.0f - { - // Property system did not set the PointSize so should update it. - // todo instruct text-controller to update model - } + GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); break; } case StyleChange::THEME_CHANGE: @@ -1037,21 +1062,40 @@ 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 ) ) { if( mRenderer ) { - renderableActor = mRenderer->Render( mController->GetView(), DepthIndex::TEXT ); + renderableActor = mRenderer->Render( mController->GetView(), + mAlignmentOffset, + DepthIndex::TEXT ); } if( renderableActor != mRenderableActor ) @@ -1065,41 +1109,21 @@ void TextEditor::RenderText( Text::Controller::UpdateTextType updateTextType ) { const Vector2& scrollOffset = mController->GetScrollPosition(); - mRenderableActor.SetPosition( scrollOffset.x, scrollOffset.y ); + mRenderableActor.SetPosition( scrollOffset.x + mAlignmentOffset, 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 ); } } @@ -1211,21 +1235,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(); @@ -1242,6 +1251,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 ) @@ -1275,34 +1353,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(); @@ -1328,7 +1378,7 @@ void TextEditor::OnStageConnection( int depth ) // Call the Control::OnStageConnection() to set the depth of the background. Control::OnStageConnection( depth ); - // Sets the depth to the renderers inside the text's decorator. + // Sets the depth to the visuals inside the text's decorator. mDecorator->SetTextDepth( depth ); // The depth of the text renderer is set in the RenderText() called from OnRelayout(). @@ -1339,8 +1389,19 @@ 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 ), + mAlignmentOffset( 0.f ), mRenderingBackend( DEFAULT_RENDERING_BACKEND ), mHasBeenStaged( false ) { @@ -1348,7 +1409,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