X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=automated-tests%2Fsrc%2Fdali-toolkit%2Futc-Dali-TextEditor.cpp;h=83744f32e5e66ca1d5a8009c185f193bd4b47816;hp=4bb5f5618b8b454dc58b47aa2918b57353350765;hb=cc7bb8e3f22f9ef519c46444ca0ada0f2c5cf5f9;hpb=8e902a37f200809376dc5746e0bcb9d40dd79049 diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index 4bb5f56..83744f3 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -17,13 +17,14 @@ #include #include -#include +#include + +#include +#include #include #include #include #include -#include ///< @todo to be removed when text-editor is added to the dali-toolkit.h -#include using namespace Dali; using namespace Toolkit; @@ -72,6 +73,17 @@ const char* const PROPERTY_NAME_INPUT_FONT_FAMILY = "inputFon const char* const PROPERTY_NAME_INPUT_FONT_STYLE = "inputFontStyle"; const char* const PROPERTY_NAME_INPUT_POINT_SIZE = "inputPointSize"; +const char* const PROPERTY_NAME_LINE_SPACING = "lineSpacing"; +const char* const PROPERTY_NAME_INPUT_LINE_SPACING = "inputLineSpacing"; +const char* const PROPERTY_NAME_UNDERLINE = "underline"; +const char* const PROPERTY_NAME_INPUT_UNDERLINE = "inputUnderline"; +const char* const PROPERTY_NAME_SHADOW = "shadow"; +const char* const PROPERTY_NAME_INPUT_SHADOW = "inputShadow"; +const char* const PROPERTY_NAME_EMBOSS = "emboss"; +const char* const PROPERTY_NAME_INPUT_EMBOSS = "inputEmboss"; +const char* const PROPERTY_NAME_OUTLINE = "outline"; +const char* const PROPERTY_NAME_INPUT_OUTLINE = "inputOutline"; + const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND; const Dali::Vector4 LIGHT_BLUE( 0.75f, 0.96f, 1.f, 1.f ); // The text highlight color. @@ -83,7 +95,26 @@ const float TO_SECONDS = 1.f / TO_MILLISECONDS; const float SCROLL_THRESHOLD = 10.f; const float SCROLL_SPEED = 300.f; +const unsigned int DEFAULT_FONT_SIZE = 1152u; +const std::string DEFAULT_FONT_DIR( "/resources/fonts" ); + static bool gTextChangedCallBackCalled; +static bool gInputStyleChangedCallbackCalled; +static Dali::Toolkit::TextEditor::InputStyle::Mask gInputStyleMask; + +struct CallbackFunctor +{ + CallbackFunctor(bool* callbackFlag) + : mCallbackFlag( callbackFlag ) + { + } + + void operator()() + { + *mCallbackFlag = true; + } + bool* mCallbackFlag; +}; static void TestTextChangedCallback( TextEditor control ) { @@ -92,6 +123,14 @@ static void TestTextChangedCallback( TextEditor control ) gTextChangedCallBackCalled = true; } +static void TestInputStyleChangedCallback( TextEditor control, TextEditor::InputStyle::Mask mask ) +{ + tet_infoline(" TestInputStyleChangedCallback"); + + gInputStyleChangedCallbackCalled = true; + gInputStyleMask = mask; +} + // Generate a TapGestureEvent to send to Core. Integration::TapGestureEvent GenerateTap( Gesture::State state, @@ -181,7 +220,7 @@ int UtcDaliToolkitTextEditorCopyConstructorP(void) TextEditor copy( textEditor ); DALI_TEST_CHECK( copy ); - DALI_TEST_CHECK( copy.GetProperty( TextLabel::Property::TEXT ) == textEditor.GetProperty( TextLabel::Property::TEXT ) ); + DALI_TEST_CHECK( copy.GetProperty( TextEditor::Property::TEXT ) == textEditor.GetProperty( TextEditor::Property::TEXT ) ); END_TEST; } @@ -246,6 +285,18 @@ int UtcDaliTextEditorGetPropertyP(void) DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_FAMILY ) == TextEditor::Property::INPUT_FONT_FAMILY ); DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_FONT_STYLE ) == TextEditor::Property::INPUT_FONT_STYLE ); DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_POINT_SIZE ) == TextEditor::Property::INPUT_POINT_SIZE ); + + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_LINE_SPACING ) == TextEditor::Property::LINE_SPACING ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_LINE_SPACING ) == TextEditor::Property::INPUT_LINE_SPACING ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_UNDERLINE ) == TextEditor::Property::UNDERLINE ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_UNDERLINE ) == TextEditor::Property::INPUT_UNDERLINE ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_SHADOW ) == TextEditor::Property::SHADOW ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_SHADOW ) == TextEditor::Property::INPUT_SHADOW ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_EMBOSS ) == TextEditor::Property::EMBOSS ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_EMBOSS ) == TextEditor::Property::INPUT_EMBOSS ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_OUTLINE ) == TextEditor::Property::OUTLINE ); + DALI_TEST_CHECK( editor.GetPropertyIndex( PROPERTY_NAME_INPUT_OUTLINE ) == TextEditor::Property::INPUT_OUTLINE ); + END_TEST; } @@ -293,11 +344,19 @@ int UtcDaliTextEditorSetPropertyP(void) // Check font properties. editor.SetProperty( TextEditor::Property::FONT_FAMILY, "Setting font family" ); DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::FONT_FAMILY ), std::string("Setting font family"), TEST_LOCATION ); - editor.SetProperty( TextEditor::Property::FONT_STYLE, "Setting font style" ); - DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::FONT_STYLE ), std::string("Setting font style"), TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::FONT_STYLE ), std::string("{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}"), TEST_LOCATION ); editor.SetProperty( TextEditor::Property::POINT_SIZE, 10.f ); DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::POINT_SIZE ), 10.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + // Reset font style. + editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"slant\":\"roman\"}" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::FONT_STYLE, "" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::FONT_STYLE ), std::string(""), TEST_LOCATION ); + // Check that the Alignment properties can be correctly set editor.SetProperty( TextEditor::Property::HORIZONTAL_ALIGNMENT, "END" ); DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::HORIZONTAL_ALIGNMENT ), "END", TEST_LOCATION ); @@ -358,11 +417,61 @@ int UtcDaliTextEditorSetPropertyP(void) // Check input font properties. editor.SetProperty( TextEditor::Property::INPUT_FONT_FAMILY, "Setting input font family" ); DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_FONT_FAMILY ), "Setting input font family", TEST_LOCATION ); - editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "Setting input font style" ); - DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ), "Setting input font style", TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ), "{\"weight\":\"bold\",\"width\":\"condensed\",\"slant\":\"italic\"}", TEST_LOCATION ); editor.SetProperty( TextEditor::Property::INPUT_POINT_SIZE, 12.f ); DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_POINT_SIZE ), 12.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + // Reset input font style. + editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"weight\":\"normal\",\"slant\":\"oblique\"}" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ), std::string("{\"weight\":\"normal\",\"slant\":\"oblique\"}"), TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"slant\":\"roman\"}" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ), std::string("{\"slant\":\"normal\"}"), TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ), std::string(""), TEST_LOCATION ); + + // Check the line spacing property + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::LINE_SPACING ), 0.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::LINE_SPACING, 10.f ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::LINE_SPACING ), 10.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + // Check the input line spacing property + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_LINE_SPACING ), 0.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + editor.SetProperty( TextEditor::Property::INPUT_LINE_SPACING, 20.f ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_LINE_SPACING ), 20.0f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + + // Check the underline property + editor.SetProperty( TextEditor::Property::UNDERLINE, "Underline properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::UNDERLINE ), std::string("Underline properties"), TEST_LOCATION ); + + // Check the input underline property + editor.SetProperty( TextEditor::Property::INPUT_UNDERLINE, "Underline input properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_UNDERLINE ), std::string("Underline input properties"), TEST_LOCATION ); + + // Check the shadow property + editor.SetProperty( TextEditor::Property::SHADOW, "Shadow properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::SHADOW ), std::string("Shadow properties"), TEST_LOCATION ); + + // Check the input shadow property + editor.SetProperty( TextEditor::Property::INPUT_SHADOW, "Shadow input properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_SHADOW ), std::string("Shadow input properties"), TEST_LOCATION ); + + // Check the emboss property + editor.SetProperty( TextEditor::Property::EMBOSS, "Emboss properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::EMBOSS ), std::string("Emboss properties"), TEST_LOCATION ); + + // Check the input emboss property + editor.SetProperty( TextEditor::Property::INPUT_EMBOSS, "Emboss input properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_EMBOSS ), std::string("Emboss input properties"), TEST_LOCATION ); + + // Check the outline property + editor.SetProperty( TextEditor::Property::OUTLINE, "Outline properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::OUTLINE ), std::string("Outline properties"), TEST_LOCATION ); + + // Check the input outline property + editor.SetProperty( TextEditor::Property::INPUT_OUTLINE, "Outline input properties" ); + DALI_TEST_EQUALS( editor.GetProperty( TextEditor::Property::INPUT_OUTLINE ), std::string("Outline input properties"), TEST_LOCATION ); + END_TEST; } @@ -372,7 +481,7 @@ int utcDaliTextEditorAtlasRenderP(void) ToolkitTestApplication application; tet_infoline(" UtcDaliToolkitTextEditorAtlasRenderP"); StyleManager styleManager = StyleManager::Get(); - styleManager.RequestDefaultTheme(); + styleManager.ApplyDefaultTheme(); TextEditor editor = TextEditor::New(); DALI_TEST_CHECK( editor ); @@ -406,11 +515,16 @@ int utcDaliTextEditorTextChangedP(void) Stage::GetCurrent().Add( editor ); - editor.TextChangedSignal().Connect(&TestTextChangedCallback); + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + editor.TextChangedSignal().Connect( &TestTextChangedCallback ); + bool textChangedSignal = false; + editor.ConnectSignal( testTracker, "textChanged", CallbackFunctor(&textChangedSignal) ); gTextChangedCallBackCalled = false; editor.SetProperty( TextEditor::Property::TEXT, "ABC" ); DALI_TEST_CHECK( gTextChangedCallBackCalled ); + DALI_TEST_CHECK( textChangedSignal ); application.SendNotification(); @@ -423,6 +537,464 @@ int utcDaliTextEditorTextChangedP(void) END_TEST; } +int utcDaliTextEditorInputStyleChanged01(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextEditorInputStyleChanged01"); + + // 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. + // This creates an implementation of the adaptor stub and a queue of idle callbacks. + application.CreateAdaptor(); + + // Load some fonts. + + char* pathNamePtr = get_current_dir_name(); + const std::string pathName( pathNamePtr ); + free( pathNamePtr ); + + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.SetDpi( 93u, 93u ); + + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif.ttf", DEFAULT_FONT_SIZE ); + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif-Bold.ttf", DEFAULT_FONT_SIZE ); + + TextEditor editor = TextEditor::New(); + DALI_TEST_CHECK( editor ); + + + editor.SetSize( 300.f, 50.f ); + editor.SetParentOrigin( ParentOrigin::TOP_LEFT ); + editor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + + editor.SetProperty( TextEditor::Property::ENABLE_MARKUP, true ); + editor.SetProperty( TextEditor::Property::TEXT, "Hello world demo" ); + + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + editor.InputStyleChangedSignal().Connect( &TestInputStyleChangedCallback ); + bool inputStyleChangedSignal = false; + editor.ConnectSignal( testTracker, "inputStyleChanged", CallbackFunctor(&inputStyleChangedSignal) ); + + Stage::GetCurrent().Add( editor ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 18.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 18.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextEditor::InputStyle::FONT_FAMILY | TextEditor::InputStyle::POINT_SIZE ), TEST_LOCATION ); + + const std::string fontFamily = editor.GetProperty( TextEditor::Property::INPUT_FONT_FAMILY ).Get(); + DALI_TEST_EQUALS( fontFamily, "DejaVuSerif", TEST_LOCATION ); + + const float pointSize = editor.GetProperty( TextEditor::Property::INPUT_POINT_SIZE ).Get(); + DALI_TEST_EQUALS( pointSize, 18.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 30.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 30.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 43.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 43.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextEditor::InputStyle::COLOR ), TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::GREEN, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 88.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 88.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextEditor::InputStyle::COLOR | TextEditor::InputStyle::FONT_STYLE ), TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + + const std::string style = editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ).Get(); + DALI_TEST_EQUALS( style, "{\"weight\":\"bold\"}", TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 115.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 115.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 164.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 164.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), static_cast( TextEditor::InputStyle::FONT_STYLE ), TEST_LOCATION ); + + const std::string style = editor.GetProperty( TextEditor::Property::INPUT_FONT_STYLE ).Get(); + DALI_TEST_CHECK( style.empty() ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 191.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 191.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + END_TEST; +} + +int utcDaliTextEditorInputStyleChanged02(void) +{ + ToolkitTestApplication application; + tet_infoline(" utcDaliTextEditorInputStyleChanged02"); + + // 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. + // This creates an implementation of the adaptor stub and a queue of idle callbacks. + application.CreateAdaptor(); + + // Load some fonts. + + char* pathNamePtr = get_current_dir_name(); + const std::string pathName( pathNamePtr ); + free( pathNamePtr ); + + TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); + fontClient.SetDpi( 93u, 93u ); + + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif.ttf", DEFAULT_FONT_SIZE ); + fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSerif-Bold.ttf", DEFAULT_FONT_SIZE ); + + TextEditor editor = TextEditor::New(); + DALI_TEST_CHECK( editor ); + + + editor.SetSize( 300.f, 50.f ); + editor.SetParentOrigin( ParentOrigin::TOP_LEFT ); + editor.SetAnchorPoint( AnchorPoint::TOP_LEFT ); + + editor.SetProperty( TextEditor::Property::ENABLE_MARKUP, true ); + editor.SetProperty( TextEditor::Property::TEXT, "He llo world demo" ); + + // connect to the text changed signal. + ConnectionTracker* testTracker = new ConnectionTracker(); + editor.InputStyleChangedSignal().Connect( &TestInputStyleChangedCallback ); + bool inputStyleChangedSignal = false; + editor.ConnectSignal( testTracker, "inputStyleChanged", CallbackFunctor(&inputStyleChangedSignal) ); + + Stage::GetCurrent().Add( editor ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 53.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 53.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Possible, 2u, 1u, Vector2( 53.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 2u, 1u, Vector2( 53.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextEditor::InputStyle::FONT_FAMILY | + TextEditor::InputStyle::POINT_SIZE | + TextEditor::InputStyle::COLOR ), + TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::GREEN, TEST_LOCATION ); + + const std::string fontFamily = editor.GetProperty( TextEditor::Property::INPUT_FONT_FAMILY ).Get(); + DALI_TEST_EQUALS( fontFamily, "DejaVuSerif", TEST_LOCATION ); + + const float pointSize = editor.GetProperty( TextEditor::Property::INPUT_POINT_SIZE ).Get(); + DALI_TEST_EQUALS( pointSize, 18.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextEditor::InputStyle::COLOR ), + TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLUE, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextEditor::InputStyle::COLOR ), + TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + editor.SetProperty( TextEditor::Property::INPUT_COLOR, Color::YELLOW ); + + editor.SetProperty( TextEditor::Property::INPUT_FONT_STYLE, "{\"weight\":\"thin\",\"width\":\"condensed\",\"slant\":\"italic\"}" ); + editor.SetProperty( TextEditor::Property::INPUT_POINT_SIZE, 20.f ); + editor.SetProperty( TextEditor::Property::INPUT_LINE_SPACING, 5.f ); + + editor.SetProperty( TextEditor::Property::INPUT_UNDERLINE, "underline" ); + editor.SetProperty( TextEditor::Property::INPUT_SHADOW, "shadow" ); + editor.SetProperty( TextEditor::Property::INPUT_EMBOSS, "emboss" ); + editor.SetProperty( TextEditor::Property::INPUT_OUTLINE, "outline" ); + + application.ProcessEvent( GenerateKey( "a", "a", 0, 0, 0, Integration::KeyEvent::Down ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( !gInputStyleChangedCallbackCalled ); + DALI_TEST_CHECK( !inputStyleChangedSignal ); + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 63.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 63.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextEditor::InputStyle::COLOR | + TextEditor::InputStyle::POINT_SIZE | + TextEditor::InputStyle::FONT_STYLE | + TextEditor::InputStyle::LINE_SPACING | + TextEditor::InputStyle::UNDERLINE | + TextEditor::InputStyle::SHADOW | + TextEditor::InputStyle::EMBOSS | + TextEditor::InputStyle::OUTLINE ), + TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::BLACK, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + gInputStyleChangedCallbackCalled = false; + gInputStyleMask = TextEditor::InputStyle::NONE; + inputStyleChangedSignal = false; + + editor.SetProperty( TextEditor::Property::FONT_FAMILY, "DejaVuSerif" ); + editor.SetProperty( TextEditor::Property::FONT_STYLE, "{\"weight\":\"black\",\"width\":\"expanded\",\"slant\":\"oblique\"}" ); + + // Create a tap event to touch the text editor. + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 30.f, 25.f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 30.f, 25.f ) ) ); + + // Render and notify + application.SendNotification(); + application.Render(); + + // Executes the idle callbacks added by the text control on the change of input style. + application.RunIdles(); + + DALI_TEST_CHECK( gInputStyleChangedCallbackCalled ); + if( gInputStyleChangedCallbackCalled ) + { + DALI_TEST_EQUALS( static_cast( gInputStyleMask ), + static_cast( TextEditor::InputStyle::COLOR | + TextEditor::InputStyle::POINT_SIZE | + TextEditor::InputStyle::FONT_STYLE ), + TEST_LOCATION ); + + const Vector4 color = editor.GetProperty( TextEditor::Property::INPUT_COLOR ).Get(); + DALI_TEST_EQUALS( color, Color::YELLOW, TEST_LOCATION ); + } + DALI_TEST_CHECK( inputStyleChangedSignal ); + + END_TEST; +} + int utcDaliTextEditorEvent01(void) { ToolkitTestApplication application; @@ -534,17 +1106,14 @@ int utcDaliTextEditorEvent02(void) application.SendNotification(); application.Render(); - // Check there are the expected number of children ( active layer, offscreen root actor, and the offscreen image actor - DALI_TEST_EQUALS( editor.GetChildCount(), 3u, TEST_LOCATION ); - - Actor layer = editor.GetChildAt( 0u ); - DALI_TEST_CHECK( layer.IsLayer() ); + // Check there are the expected number of children ( offscreen root actor, and the offscreen image view + DALI_TEST_EQUALS( editor.GetChildCount(), 2u, TEST_LOCATION ); - Actor offscreenRoot = editor.GetChildAt( 1u ); + Actor offscreenRoot = editor.GetChildAt( 0u ); DALI_TEST_CHECK( offscreenRoot.IsLayer() ); DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor. - Actor offscreenImage = editor.GetChildAt( 2u ); + Actor offscreenImage = editor.GetChildAt( 1u ); DALI_TEST_CHECK( offscreenImage ); // Create a tap event to touch the text editor. @@ -555,6 +1124,9 @@ int utcDaliTextEditorEvent02(void) application.SendNotification(); application.Render(); + Actor layer = editor.GetChildAt( 2u ); + DALI_TEST_CHECK( layer.IsLayer() ); + DALI_TEST_EQUALS( layer.GetChildCount(), 1u, TEST_LOCATION ); // The cursor. DALI_TEST_EQUALS( offscreenRoot.GetChildCount(), 1u, TEST_LOCATION ); // The camera actor. @@ -576,8 +1148,13 @@ int utcDaliTextEditorEvent02(void) CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); DALI_TEST_CHECK( camera ); - Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u ); - DALI_TEST_CHECK( renderer ); + // The offscreen root actor has a container with all the actors which contain the text renderers. + Actor container = offscreenRoot.GetChildAt( 1u ); + for( unsigned int index = 0; index < container.GetChildCount(); ++index ) + { + Renderer renderer = container.GetChildAt( index ).GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + } // Move the cursor and check the position changes. Vector3 position1 = cursor.GetCurrentPosition(); @@ -676,6 +1253,17 @@ int utcDaliTextEditorEvent03(void) application.SendNotification(); application.Render(); + // Send some taps and check text controller with clipboard window + Dali::Clipboard clipboard = Clipboard::Get(); + clipboard.ShowClipboard(); + application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); + application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); + clipboard.HideClipboard(); + + // Render and notify + application.SendNotification(); + application.Render(); + // Tap first to get the focus. application.ProcessEvent( GenerateTap( Gesture::Possible, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); application.ProcessEvent( GenerateTap( Gesture::Started, 1u, 1u, Vector2( 3.f, 25.0f ) ) ); @@ -693,14 +1281,19 @@ int utcDaliTextEditorEvent03(void) application.Render(); // The offscreen root actor should have three actors: the camera, a renderer and the highlight actor. - Actor offscreenRoot = editor.GetChildAt( 1u ); + Actor offscreenRoot = editor.GetChildAt( 0u ); DALI_TEST_CHECK( offscreenRoot.IsLayer() ); CameraActor camera = CameraActor::DownCast( offscreenRoot.GetChildAt( 0u ) ); DALI_TEST_CHECK( camera ); - Renderer renderer = offscreenRoot.GetChildAt( 1u ).GetRendererAt( 0u ); - DALI_TEST_CHECK( renderer ); + // The offscreen root actor has a container with all the actors which contain the text renderers. + Actor container = offscreenRoot.GetChildAt( 1u ); + for( unsigned int index = 0; index < container.GetChildCount(); ++index ) + { + Renderer renderer = container.GetChildAt( index ).GetRendererAt( 0u ); + DALI_TEST_CHECK( renderer ); + } Renderer highlight = offscreenRoot.GetChildAt( 2u ).GetRendererAt( 0u ); DALI_TEST_CHECK( highlight );