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-field-impl.cpp;h=eeb7fa5a0be2ad2e240560ec3a82a2182c5d6e0e;hp=b2a0b50ffa0b0b0f3365528a533d42e3b55b1a79;hb=785904f5477a648bc0005dcbb39bd3a85077e32d;hpb=8cb7d1587a132f32f869eb1f8f8712d390cecc50 diff --git a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp index b2a0b50..eeb7fa5 100644 --- a/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp +++ b/dali-toolkit/internal/controls/text-controls/text-field-impl.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include using namespace Dali::Toolkit::Text; @@ -107,15 +108,18 @@ DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "secondary-cursor-color", DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "enable-cursor-blink", BOOLEAN, ENABLE_CURSOR_BLINK ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "cursor-blink-interval", FLOAT, CURSOR_BLINK_INTERVAL ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "cursor-blink-duration", FLOAT, CURSOR_BLINK_DURATION ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "cursor-width", INTEGER, CURSOR_WIDTH ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "grab-handle-image", STRING, GRAB_HANDLE_IMAGE ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "grab-handle-pressed-image", VECTOR4, GRAB_HANDLE_PRESSED_IMAGE ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "grab-handle-pressed-image", STRING, GRAB_HANDLE_PRESSED_IMAGE ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "scroll-threshold", FLOAT, SCROLL_THRESHOLD ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "scroll-speed", FLOAT, SCROLL_SPEED ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-image-left", STRING, SELECTION_HANDLE_IMAGE_LEFT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-image-right", STRING, SELECTION_HANDLE_IMAGE_RIGHT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-pressed-image-left", STRING, SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-pressed-image-right", STRING, SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) -DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-highlight-color", STRING, SELECTION_HIGHLIGHT_COLOR ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-image-left", MAP, SELECTION_HANDLE_IMAGE_LEFT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-image-right", MAP, SELECTION_HANDLE_IMAGE_RIGHT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-pressed-image-left", MAP, SELECTION_HANDLE_PRESSED_IMAGE_LEFT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-pressed-image-right", MAP, SELECTION_HANDLE_PRESSED_IMAGE_RIGHT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-marker-image-left", MAP, SELECTION_HANDLE_MARKER_IMAGE_LEFT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-handle-marker-image-right", MAP, SELECTION_HANDLE_MARKER_IMAGE_RIGHT ) +DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "selection-highlight-color", VECTOR4, SELECTION_HIGHLIGHT_COLOR ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "decoration-bounding-box", RECTANGLE, DECORATION_BOUNDING_BOX ) DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "input-method-settings", MAP, INPUT_METHOD_SETTINGS ) @@ -145,6 +149,9 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr { Toolkit::TextField textField = Toolkit::TextField::DownCast( Dali::BaseHandle( object ) ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField SetProperty\n"); + + if( textField ) { TextField& impl( GetImpl( textField ) ); @@ -206,7 +213,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mController->GetDefaultFontFamily() != fontFamily ) { - impl.mController->SetDefaultFontFamily( fontFamily ); + impl.mController->SetDefaultFontFamily( fontFamily, true ); // "true" as SetProperty means user defined font so don't change when system font changes. } } break; @@ -230,7 +237,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mController ) { const float pointSize = value.Get< float >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p FONT_STYLE %f\n", impl.mController.Get(), pointSize ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p POINT_SIZE %f\n", impl.mController.Get(), pointSize ); if( !Equals( impl.mController->GetDefaultPointSize(), pointSize ) ) { @@ -239,6 +246,17 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } break; } + case Toolkit::TextField::Property::MAX_LENGTH: + { + if( impl.mController ) + { + const int max = value.Get< int >(); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p MAX_LENGTH %d\n", impl.mController.Get(), max ); + + impl.mController->SetMaximumNumberOfCharacters( max ); + } + break; + } case Toolkit::TextField::Property::EXCEED_POLICY: { // TODO @@ -249,7 +267,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mController ) { const std::string alignStr = value.Get< std::string >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p HORIZONTAL_ALIGNMENT %f\n", impl.mController.Get(), alignStr.c_str() ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %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(), @@ -267,7 +285,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mController ) { const std::string alignStr = value.Get< std::string >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p VERTICAL_ALIGNMENT %f\n", impl.mController.Get(), alignStr.c_str() ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p VERTICAL_ALIGNMENT %s\n", impl.mController.Get(), alignStr.c_str() ); LayoutEngine::VerticalAlignment alignment( LayoutEngine::VERTICAL_ALIGN_BOTTOM ); if( Scripting::GetEnumeration< LayoutEngine::VerticalAlignment >( alignStr.c_str(), @@ -345,9 +363,9 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mDecorator ) { const Vector4 color = value.Get< Vector4 >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PRIMARY_CURSOR_COLOR %f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PRIMARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); - impl.mDecorator->SetColor( PRIMARY_CURSOR, color ); + impl.mDecorator->SetCursorColor( PRIMARY_CURSOR, color ); impl.RequestTextRelayout(); } break; @@ -357,9 +375,9 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mDecorator ) { const Vector4 color = value.Get< Vector4 >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p SECONDARY_CURSOR_COLOR %f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p SECONDARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); - impl.mDecorator->SetColor( SECONDARY_CURSOR, color ); + impl.mDecorator->SetCursorColor( SECONDARY_CURSOR, color ); impl.RequestTextRelayout(); } break; @@ -392,12 +410,24 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr if( impl.mDecorator ) { const float duration = value.Get< float >(); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_BLINK_INTERVAL %f\n", impl.mController.Get(), duration ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_BLINK_DURATION %f\n", impl.mController.Get(), duration ); impl.mDecorator->SetCursorBlinkDuration( duration ); } break; } + case Toolkit::TextField::Property::CURSOR_WIDTH: + { + if( impl.mDecorator ) + { + const int width = value.Get< int >(); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_WIDTH %d\n", impl.mController.Get(), width ); + + impl.mDecorator->SetCursorWidth( width ); + impl.mController->GetLayoutEngine().SetCursorWidth( width ); + } + break; + } case Toolkit::TextField::Property::GRAB_HANDLE_IMAGE: { const ResourceImage image = ResourceImage::New( value.Get< std::string >() ); @@ -446,8 +476,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_LEFT: { - const ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p SELECTION_HANDLE_IMAGE_LEFT %f\n", impl.mController.Get(), image.GetUrl().c_str() ); + const Image image = Scripting::NewImage( value ); if( impl.mDecorator ) { @@ -458,8 +487,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT: { - const ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p SELECTION_HANDLE_IMAGE_RIGHT %f\n", impl.mController.Get(), image.GetUrl().c_str() ); + const Image image = Scripting::NewImage( value ); if( impl.mDecorator ) { @@ -470,8 +498,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT: { - const ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p SELECTION_HANDLE_PRESSED_IMAGE_LEFT %f\n", impl.mController.Get(), image.GetUrl().c_str() ); + const Image image = Scripting::NewImage( value ); if( impl.mDecorator ) { @@ -482,8 +509,7 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } case Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT: { - const ResourceImage image = ResourceImage::New( value.Get< std::string >() ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p SELECTION_HANDLE_PRESSED_IMAGE_RIGHT %f\n", impl.mController.Get(), image.GetUrl().c_str() ); + const Image image = Scripting::NewImage( value ); if( impl.mDecorator ) { @@ -492,10 +518,30 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } break; } + case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT: + { + const Image image = Scripting::NewImage( value ); + if( impl.mDecorator ) + { + impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, image ); + impl.RequestTextRelayout(); + } + break; + } + case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT: + { + const Image image = Scripting::NewImage( value ); + if( impl.mDecorator ) + { + impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, image ); + impl.RequestTextRelayout(); + } + break; + } case Toolkit::TextField::Property::SELECTION_HIGHLIGHT_COLOR: { const Vector4 color = value.Get< Vector4 >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p SELECTION_HIGHLIGHT_COLOR %f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p SELECTION_HIGHLIGHT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a ); if( impl.mDecorator ) { @@ -516,17 +562,6 @@ void TextField::SetProperty( BaseObject* object, Property::Index index, const Pr } break; } - case Toolkit::TextField::Property::MAX_LENGTH: - { - if( impl.mController ) - { - const int max = value.Get< int >(); - DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p MAX_LENGTH %d\n", impl.mController.Get(), max ); - - impl.mController->SetMaximumNumberOfCharacters( max ); - } - break; - } case Toolkit::TextField::Property::INPUT_METHOD_SETTINGS: { const Property::Map map = value.Get(); @@ -609,6 +644,14 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } break; } + case Toolkit::TextField::Property::MAX_LENGTH: + { + if( impl.mController ) + { + value = impl.mController->GetMaximumNumberOfCharacters(); + } + break; + } case Toolkit::TextField::Property::EXCEED_POLICY: { value = impl.mExceedPolicy; @@ -711,6 +754,14 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } break; } + case Toolkit::TextField::Property::CURSOR_WIDTH: + { + if( impl.mDecorator ) + { + value = impl.mDecorator->GetCursorWidth(); + } + break; + } case Toolkit::TextField::Property::GRAB_HANDLE_IMAGE: { if( impl.mDecorator ) @@ -753,50 +804,32 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } case Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_LEFT: { - if( impl.mDecorator ) - { - ResourceImage image = ResourceImage::DownCast( impl.mDecorator->GetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED ) ); - if( image ) - { - value = image.GetUrl(); - } - } + impl.GetHandleImagePropertyValue( value, LEFT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED ); break; } case Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_RIGHT: { - if( impl.mDecorator ) - { - ResourceImage image = ResourceImage::DownCast( impl.mDecorator->GetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED ) ); - if( image ) - { - value = image.GetUrl(); - } - } + impl.GetHandleImagePropertyValue( value, RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED ) ; break; } case Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_LEFT: { - if( impl.mDecorator ) - { - ResourceImage image = ResourceImage::DownCast( impl.mDecorator->GetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED ) ); - if( image ) - { - value = image.GetUrl(); - } - } + impl.GetHandleImagePropertyValue( value, LEFT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED ); break; } case Toolkit::TextField::Property::SELECTION_HANDLE_PRESSED_IMAGE_RIGHT: { - if( impl.mDecorator ) - { - ResourceImage image = ResourceImage::DownCast( impl.mDecorator->GetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED ) ); - if( image ) - { - value = image.GetUrl(); - } - } + impl.GetHandleImagePropertyValue( value, RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED ); + break; + } + case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_LEFT: + { + impl.GetHandleImagePropertyValue( value, LEFT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED ); + break; + } + case Toolkit::TextField::Property::SELECTION_HANDLE_MARKER_IMAGE_RIGHT: + { + impl.GetHandleImagePropertyValue( value, RIGHT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED ); break; } case Toolkit::TextField::Property::SELECTION_HIGHLIGHT_COLOR: @@ -815,14 +848,6 @@ Property::Value TextField::GetProperty( BaseObject* object, Property::Index inde } break; } - case Toolkit::TextField::Property::MAX_LENGTH: - { - if( impl.mController ) - { - value = impl.mController->GetMaximumNumberOfCharacters(); - } - break; - } case Toolkit::TextField::Property::INPUT_METHOD_SETTINGS: { break; @@ -901,7 +926,36 @@ void TextField::OnInitialize() void TextField::OnStyleChange( Toolkit::StyleManager styleManager, StyleChange::Type change ) { - GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField::OnStyleChange\n"); + + switch ( change ) + { + case StyleChange::DEFAULT_FONT_CHANGE: + { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField::OnStyleChange DEFAULT_FONT_CHANGE\n"); + std::string newFont = styleManager.GetDefaultFontFamily(); + // Property system did not set the font so should update it. + mController->UpdateAfterFontChange( newFont ); + break; + } + + case StyleChange::DEFAULT_FONT_SIZE_CHANGE: + { + DALI_LOG_INFO( gLogFilter, Debug::General, "TextField::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 + } + break; + } + case StyleChange::THEME_CHANGE: + { + GetImpl( styleManager ).ApplyThemeStyle( Toolkit::Control( GetOwner() ) ); + break; + } + } } Vector3 TextField::GetNaturalSize() @@ -916,6 +970,8 @@ float TextField::GetHeightForWidth( float width ) void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField OnRelayout\n"); + if( mController->Relayout( size ) || !mRenderer ) { @@ -931,17 +987,18 @@ void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container ) mRenderer = Backend::Get().NewRenderer( mRenderingBackend ); } - RenderText(); EnableClipping( (Dali::Toolkit::TextField::EXCEED_POLICY_CLIP == mExceedPolicy), size ); + RenderText(); } } void TextField::RenderText() { + Actor self = Self(); Actor renderableActor; if( mRenderer ) { - renderableActor = mRenderer->Render( mController->GetView(), mDepth ); + renderableActor = mRenderer->Render( mController->GetView(), self.GetHierarchyDepth() ); } if( renderableActor != mRenderableActor ) @@ -956,14 +1013,10 @@ void TextField::RenderText() mRenderableActor.SetPosition( offset.x, offset.y ); - // Make sure the actor is parented correctly with/without clipping + Actor clipRootActor; if( mClipper ) { - mClipper->GetRootActor().Add( mRenderableActor ); - } - else - { - Self().Add( mRenderableActor ); + clipRootActor = mClipper->GetRootActor(); } for( std::vector::const_iterator it = mClippingDecorationActors.begin(), @@ -973,16 +1026,26 @@ void TextField::RenderText() { Actor actor = *it; - if( mClipper ) + if( clipRootActor ) { - mClipper->GetRootActor().Add( actor ); + clipRootActor.Add( actor ); } else { - Self().Add( actor ); + self.Add( actor ); } } mClippingDecorationActors.clear(); + + // Make sure the actor is parented correctly with/without clipping + if( clipRootActor ) + { + clipRootActor.Add( mRenderableActor ); + } + else + { + self.Add( mRenderableActor ); + } } } @@ -1137,6 +1200,21 @@ ImfManager::ImfCallbackData TextField::OnImfEvent( Dali::ImfManager& imfManager, return mController->OnImfEvent( imfManager, imfEvent ); } +void TextField::GetHandleImagePropertyValue( Property::Value& value, Text::HandleType handleType, Text::HandleImageType handleImageType ) +{ + if( mDecorator ) + { + ResourceImage image = ResourceImage::DownCast( mDecorator->GetHandleImage( handleType, handleImageType ) ); + + if ( image ) + { + Property::Map map; + Scripting::CreatePropertyMap( image, map ); + value = map; + } + } +} + void TextField::EnableClipping( bool clipping, const Vector2& size ) { if( clipping ) @@ -1187,7 +1265,13 @@ void TextField::KeyboardStatusChanged(bool keyboardShown) void TextField::OnStageConnection( int depth ) { - mDepth = 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. + mDecorator->SetTextDepth( depth ); + + // The depth of the text renderer is set in the RenderText() called from OnRelayout(). } bool TextField::OnTouched( Actor actor, const TouchEvent& event ) @@ -1199,7 +1283,6 @@ TextField::TextField() : Control( ControlBehaviour( REQUIRES_STYLE_CHANGE_SIGNALS ) ), mRenderingBackend( DEFAULT_RENDERING_BACKEND ), mExceedPolicy( Dali::Toolkit::TextField::EXCEED_POLICY_CLIP ), - mDepth( 0 ), mHasBeenStaged( false ) { }