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=2f333d4d6830f4bb1abb728841ef94d0403e15f9;hp=4763884b6e39ac87a5d4dcedfdd62fd5faaf0003;hb=6ae9cd5f03bd0a8393eebf3cfb4508cab7fd3ede;hpb=7dcd34602d12e17c0fb64cbc0560925878ed87d7 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 4763884..2f333d4 100644 --- a/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include // INTERNAL INCLUDES @@ -52,10 +53,11 @@ namespace // unnamed namespace { #if defined(DEBUG_ENABLED) - Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_CONTROLS"); +Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_CONTROLS"); #endif - const unsigned int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND; +const unsigned int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND; +const float DEFAULT_SCROLL_SPEED = 1200.f; ///< The default scroll speed for the text editor in pixels/second. } // unnamed namespace namespace @@ -120,6 +122,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() @@ -903,6 +906,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 @@ -917,6 +924,11 @@ Toolkit::TextEditor::TextChangedSignalType& TextEditor::TextChangedSignal() return mTextChangedSignal; } +Toolkit::TextEditor::InputStyleChangedSignalType& TextEditor::InputStyleChangedSignal() +{ + return mInputStyleChangedSignal; +} + void TextEditor::OnInitialize() { Actor self = Self(); @@ -928,10 +940,20 @@ void TextEditor::OnInitialize() mController->GetLayoutEngine().SetLayout( LayoutEngine::MULTI_LINE_BOX ); + // Enables the text input. mController->EnableTextInput( mDecorator ); + // Enables the vertical scrolling after the text input has been enabled. + mController->SetVerticalScrollEnabled( true ); + + // Disables the horizontal scrolling. + mController->SetHorizontalScrollEnabled( false ); + mController->SetMaximumNumberOfCharacters( std::numeric_limits::max() ); + // Enable the smooth handle panning. + mController->SetSmoothHandlePanEnabled( true ); + // Forward input events to controller EnableGestureDetection( static_cast( Gesture::Tap | Gesture::Pan | Gesture::LongPress ) ); GetTapGestureDetector().SetMaximumTapsRequired( 2 ); @@ -948,8 +970,11 @@ void TextEditor::OnInitialize() mDecorator->SetBoundingBox( Rect( 0.0f, 0.0f, stageSize.width, stageSize.height ) ); } - // Flip vertically the 'left' selection handle - mDecorator->FlipHandleVertically( LEFT_SELECTION_HANDLE, true ); + // Whether to flip the selection handles as soon as they cross. + mDecorator->FlipSelectionHandlesOnCrossEnabled( true ); + + // Set the default scroll speed. + mDecorator->SetScrollSpeed( DEFAULT_SCROLL_SPEED ); // Fill-parent area by default self.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); @@ -974,13 +999,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: @@ -1026,6 +1045,25 @@ void TextEditor::OnRelayout( const Vector2& size, RelayoutContainer& container ) 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 ) @@ -1223,6 +1261,60 @@ void TextEditor::TextChanged() mTextChangedSignal.Emit( handle ); } +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::MaxLengthReached() { // Nothing to do as TextEditor doesn't emit a max length reached signal. @@ -1314,7 +1406,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(). @@ -1325,8 +1417,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 ) ), + mIdleCallback( NULL ), mRenderingBackend( DEFAULT_RENDERING_BACKEND ), mHasBeenStaged( false ) { @@ -1335,6 +1437,12 @@ TextEditor::TextEditor() TextEditor::~TextEditor() { mClipper.Reset(); + + 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