Merge "Applyed text padding to TextLabel, Field, Editor" into devel/master
authorJinho, Lee <jeano.lee@samsung.com>
Thu, 13 Jul 2017 04:16:14 +0000 (04:16 +0000)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Thu, 13 Jul 2017 04:16:14 +0000 (04:16 +0000)
1  2 
automated-tests/src/dali-toolkit/utc-Dali-TextField.cpp
dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp
dali-toolkit/internal/controls/text-controls/text-field-impl.cpp

@@@ -98,8 -98,6 +98,8 @@@ const char* const PROPERTY_NAME_INPUT_O
  
  const char* const PROPERTY_NAME_HIDDEN_INPUT_SETTINGS                = "hiddenInputSettings";
  const char* const PROPERTY_NAME_PIXEL_SIZE                           = "pixelSize";
 +const char* const PROPERTY_NAME_ENABLE_SELECTION                     = "enableSelection";
 +const char* const PROPERTY_NAME_PLACEHOLDER                          = "placeholder";
  
  const int DEFAULT_RENDERING_BACKEND = Dali::Toolkit::Text::DEFAULT_RENDERING_BACKEND;
  
@@@ -307,9 -305,8 +307,9 @@@ Integration::KeyEvent GenerateKey( cons
                                     int keyModifier,
                                     unsigned long timeStamp,
                                     const Integration::KeyEvent::State& keyState,
 -                                   const std::string& deviceName,
 -                                   const DevelKeyEvent::DeviceClass::Type& deviceClass )
 +                                   const std::string& deviceName = DEFAULT_DEVICE_NAME,
 +                                   const DevelDevice::Class::Type& deviceClass = DevelDevice::Class::NONE,
 +                                   const DevelDevice::Subclass::Type& deviceSubclass = DevelDevice::Subclass::NONE )
  {
    return Integration::KeyEvent( keyName,
                                  keyString,
                                  timeStamp,
                                  keyState,
                                  deviceName,
 -                                deviceClass );
 +                                deviceClass,
 +                                deviceSubclass );
  }
  
  bool DaliTestCheckMaps( const Property::Map& fontStyleMapGet, const Property::Map& fontStyleMapSet )
@@@ -511,8 -507,6 +511,8 @@@ int UtcDaliTextFieldGetPropertyP(void
    DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_INPUT_OUTLINE ) == TextField::Property::INPUT_OUTLINE );
    DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_HIDDEN_INPUT_SETTINGS ) == DevelTextField::Property::HIDDEN_INPUT_SETTINGS );
    DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PIXEL_SIZE ) == DevelTextField::Property::PIXEL_SIZE );
 +  DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_ENABLE_SELECTION ) == DevelTextField::Property::ENABLE_SELECTION );
 +  DALI_TEST_CHECK( field.GetPropertyIndex( PROPERTY_NAME_PLACEHOLDER ) == DevelTextField::Property::PLACEHOLDER );
  
    END_TEST;
  }
@@@ -851,74 -845,6 +851,74 @@@ int UtcDaliTextFieldSetPropertyP(void
    field.SetProperty( DevelTextField::Property::PIXEL_SIZE, 20.f );
    DALI_TEST_EQUALS( field.GetProperty<float>( DevelTextField::Property::PIXEL_SIZE ), 20.f, Math::MACHINE_EPSILON_1000, TEST_LOCATION );
  
 +  // Check the enable selection property
 +  field.SetProperty( DevelTextField::Property::ENABLE_SELECTION, false );
 +  DALI_TEST_EQUALS( field.GetProperty<bool>( DevelTextField::Property::ENABLE_SELECTION ), false, TEST_LOCATION );
 +
 +  // Check the placeholder property with pixel size
 +  Property::Map placeholderPixelSizeMapSet;
 +  Property::Map placeholderPixelSizeMapGet;
 +  Property::Map placeholderFontstyleMap;
 +  placeholderPixelSizeMapSet["placeholderText"] = "Setting Placeholder Text";
 +  placeholderPixelSizeMapSet["placeholderColor"] = Color::BLUE;
 +  placeholderPixelSizeMapSet["placeholderFontFamily"] = "Arial";
 +  placeholderPixelSizeMapSet["placeholderPixelSize"] = 15.0f;
 +
 +  placeholderFontstyleMap.Insert( "weight", "bold" );
 +  placeholderPixelSizeMapSet["placeholderFontStyle"] = placeholderFontstyleMap;
 +  field.SetProperty( DevelTextField::Property::PLACEHOLDER, placeholderPixelSizeMapSet );
 +
 +  placeholderPixelSizeMapGet = field.GetProperty<Property::Map>( DevelTextField::Property::PLACEHOLDER );
 +  DALI_TEST_EQUALS( placeholderPixelSizeMapGet.Count(), placeholderPixelSizeMapSet.Count(), TEST_LOCATION );
 +  DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderPixelSizeMapGet, placeholderPixelSizeMapSet ), true, TEST_LOCATION );
 +
 +  // Check the placeholder property with point size
 +  Property::Map placeholderMapSet;
 +  Property::Map placeholderMapGet;
 +  placeholderMapSet["placeholderText"] = "Setting Placeholder Text";
 +  placeholderMapSet["placeholderColor"] = Color::RED;
 +  placeholderMapSet["placeholderFontFamily"] = "Arial";
 +  placeholderMapSet["placeholderPointSize"] = 12.0f;
 +
 +  // Check the placeholder font style property
 +  placeholderFontstyleMap.Clear();
 +
 +  placeholderFontstyleMap.Insert( "weight", "bold" );
 +  placeholderFontstyleMap.Insert( "width", "condensed" );
 +  placeholderFontstyleMap.Insert( "slant", "italic" );
 +  placeholderMapSet["placeholderFontStyle"] = placeholderFontstyleMap;
 +  field.SetProperty( DevelTextField::Property::PLACEHOLDER, placeholderMapSet );
 +
 +  placeholderMapGet = field.GetProperty<Property::Map>( DevelTextField::Property::PLACEHOLDER );
 +  DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION );
 +  DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION );
 +
 +  // Reset font style.
 +  placeholderFontstyleMap.Clear();
 +  placeholderFontstyleMap.Insert( "weight", "normal" );
 +  placeholderFontstyleMap.Insert( "slant", "oblique" );
 +  placeholderMapSet["placeholderFontStyle"] = placeholderFontstyleMap;
 +  field.SetProperty( DevelTextField::Property::PLACEHOLDER, placeholderMapSet );
 +
 +  placeholderMapGet = field.GetProperty<Property::Map>( DevelTextField::Property::PLACEHOLDER );
 +  DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION );
 +  DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION );
 +
 +  placeholderFontstyleMap.Clear();
 +  placeholderFontstyleMap.Insert( "slant", "roman" );
 +  placeholderMapSet["placeholderFontStyle"] = placeholderFontstyleMap;
 +  field.SetProperty( DevelTextField::Property::PLACEHOLDER, placeholderMapSet );
 +
 +  placeholderMapGet = field.GetProperty<Property::Map>( DevelTextField::Property::PLACEHOLDER );
 +
 +  placeholderFontstyleMap.Clear();
 +  placeholderMapSet["placeholderFontStyle"] = placeholderFontstyleMap;
 +
 +  field.SetProperty( DevelTextField::Property::PLACEHOLDER, placeholderMapSet );
 +  placeholderMapGet = field.GetProperty<Property::Map>( DevelTextField::Property::PLACEHOLDER );
 +  DALI_TEST_EQUALS( placeholderMapGet.Count(), placeholderMapSet.Count(), TEST_LOCATION );
 +  DALI_TEST_EQUALS( DaliTestCheckMaps( placeholderMapGet, placeholderMapSet ), true, TEST_LOCATION );
 +
    END_TEST;
  }
  
@@@ -978,7 -904,7 +978,7 @@@ int utcDaliTextFieldTextChangedP(void
    field.SetKeyInputFocus();
  
    gTextChangedCallBackCalled = false;
 -  application.ProcessEvent( GenerateKey( "D", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "D", "D", KEY_D_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    DALI_TEST_CHECK( gTextChangedCallBackCalled );
  
    END_TEST;
@@@ -1031,8 -957,8 +1031,8 @@@ int utcDaliTextFieldMaxCharactersReache
  
    gMaxCharactersCallBackCalled = false;
  
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    DALI_TEST_CHECK( gMaxCharactersCallBackCalled );
    DALI_TEST_CHECK( maxLengthReachedSignal );
@@@ -1063,8 -989,8 +1063,8 @@@ int utcDaliTextFieldMaxCharactersReache
  
    gMaxCharactersCallBackCalled = false;
  
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    DALI_TEST_CHECK( !gMaxCharactersCallBackCalled );
    DALI_TEST_CHECK( !maxLengthReachedSignal );
@@@ -1381,7 -1307,7 +1381,7 @@@ int utcDaliTextFieldInputStyleChanged02
    gInputStyleMask = TextField::InputStyle::NONE;
    inputStyleChangedSignal = false;
  
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    gInputStyleMask = TextField::InputStyle::NONE;
    inputStyleChangedSignal = false;
  
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    gInputStyleMask = TextField::InputStyle::NONE;
    inputStyleChangedSignal = false;
  
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
@@@ -1529,7 -1455,7 +1529,7 @@@ int utcDaliTextFieldEvent01(void
    application.Render();
  
    // Add a key event but as the text field has not the focus it should do nothing.
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    application.Render();
  
    // Now the text field has the focus, so it can handle the key events.
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    application.Render();
  
    // The second text field has the focus. It should handle the key events.
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
@@@ -1637,8 -1563,8 +1637,8 @@@ int utcDaliTextFieldEvent02(void
    DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION );
  
    // Now the text field has the focus, so it can handle the key events.
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    // Move the cursor and check the position changes.
    Vector3 position1 = cursor.GetCurrentPosition();
  
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_LEFT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
  
    DALI_TEST_CHECK( position2.x < position1.x );
  
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_CURSOR_RIGHT, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    DALI_TEST_CHECK( position5.x > position4.x );
  
    // Remove all the text.
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    field.SetProperty( TextField::Property::TEXT, "" );
  
    // Render and notify
    // Should not be a renderer.
    DALI_TEST_EQUALS( stencil.GetChildCount(), 0u, TEST_LOCATION );
  
+   // Chanege exceed policy (EXCEED_POLICY_ORIGINAL doesn't use stencil )
+   field.SetProperty( TextField::Property::TEXT, "This is a long text for the size of the text-field." );
+   field.SetProperty( TextField::Property::EXCEED_POLICY, Dali::Toolkit::TextField::EXCEED_POLICY_ORIGINAL );
+   application.SendNotification();
+   application.Render();
+   // There are renderer and decorator layer
+   DALI_TEST_EQUALS( field.GetChildCount(), 2u, TEST_LOCATION );
    END_TEST;
  }
  
@@@ -2120,14 -2056,14 +2130,14 @@@ int utcDaliTextFieldEvent09(void
    Property::Map map;
    map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_NONE;
    field.SetProperty( DevelTextField::Property::HIDDEN_INPUT_SETTINGS, map );
 -  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    application.SendNotification();
    application.Render();
  
    map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::HIDE_ALL;
    map[ HiddenInput::Property::SUBSTITUTE_CHARACTER ] = 0x23;
    field.SetProperty( DevelTextField::Property::HIDDEN_INPUT_SETTINGS, map );
 -  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    application.SendNotification();
    application.Render();
  
    field.SetProperty( DevelTextField::Property::HIDDEN_INPUT_SETTINGS, map );
    for( unsigned int index = 0u; index < 5u; ++index )
    {
 -    application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +    application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
      application.SendNotification();
      application.Render();
    }
    field.SetProperty( DevelTextField::Property::HIDDEN_INPUT_SETTINGS, map );
    for( unsigned int index = 0u; index < 5u; ++index )
    {
 -    application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +    application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
      application.SendNotification();
      application.Render();
    }
    map[ HiddenInput::Property::MODE ] = HiddenInput::Mode::SHOW_LAST_CHARACTER;
    map[ HiddenInput::Property::SHOW_DURATION ] = 0;
    field.SetProperty( DevelTextField::Property::HIDDEN_INPUT_SETTINGS, map );
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_BACKSPACE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    application.SendNotification();
    application.Render();
 -  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    application.SendNotification();
    application.Render();
  
    map[ HiddenInput::Property::SHOW_DURATION ] = 100;
    field.SetProperty( DevelTextField::Property::HIDDEN_INPUT_SETTINGS, map );
 -  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "d", "d", 0, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    application.SendNotification();
    application.Render();
  
@@@ -2275,7 -2211,7 +2285,7 @@@ int utcDaliTextFieldStyleWhilstSelected
    DALI_TEST_EQUALS( DaliTestCheckMaps( fontStyleMapGet, fontStyleMapSet ), true, TEST_LOCATION );
  
    // Press Escape to increase coverage
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
    application.SendNotification();
    application.Render();
  
@@@ -2309,8 -2245,8 +2319,8 @@@ int utcDaliTextFieldEscKeyLoseFocus(voi
    application.Render();
  
    // Add a key event but as the text field has not the focus it should do nothing.
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    application.Render();
  
    // Now the text field has the focus, so it can handle the key events.
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "d", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "d", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "d", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "d", "d", KEY_D_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    DALI_TEST_EQUALS( field.GetProperty<std::string>( TextField::Property::TEXT ), std::string("ad"), TEST_LOCATION );
  
    // Generate a Esc key event. The text field should lose the focus.
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "", "", DALI_KEY_ESCAPE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    DALI_TEST_EQUALS( false, field.HasKeyInputFocus(), TEST_LOCATION );
  
    // No more text should be introduced
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "a", "a", KEY_A_CODE, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
@@@ -2415,24 -2351,24 +2425,24 @@@ int utcDaliTextFieldSomeSpecialKeys(voi
    application.Render();
  
    // Generate a Esc key event. The text field should lose the focus.
 -  application.ProcessEvent( GenerateKey( "XF86PowerOff", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "XF86PowerOff", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "XF86PowerOff", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "XF86PowerOff", "XF86PowerOff", DALI_KEY_POWER, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    application.Render();
  
    // Generate a Esc key event. The text field should lose the focus.
 -  application.ProcessEvent( GenerateKey( "XF86Menu", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "XF86Menu", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "XF86Menu", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "XF86Menu", "XF86Menu", DALI_KEY_MENU, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
    application.Render();
  
    // Generate a Esc key event. The text field should lose the focus.
 -  application.ProcessEvent( GenerateKey( "XF86Home", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 -  application.ProcessEvent( GenerateKey( "XF86Home", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelKeyEvent::DeviceClass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "XF86Home", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::Down, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
 +  application.ProcessEvent( GenerateKey( "XF86Home", "XF86Home", DALI_KEY_HOME, 0, 0, Integration::KeyEvent::Up, DEFAULT_DEVICE_NAME, DevelDevice::Class::NONE, DevelDevice::Subclass::NONE ) );
  
    // Render and notify
    application.SendNotification();
@@@ -139,8 -139,6 +139,8 @@@ DALI_DEVEL_PROPERTY_REGISTRATION( Toolk
  DALI_DEVEL_PROPERTY_REGISTRATION_READ_ONLY( Toolkit, TextEditor, "lineCount",            INTEGER,   LINE_COUNT                           )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "placeholderText",                STRING,    PLACEHOLDER_TEXT                     )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "placeholderTextColor",           VECTOR4,   PLACEHOLDER_TEXT_COLOR               )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "enableSelection",                BOOLEAN,   ENABLE_SELECTION                     )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "placeholder",                    MAP,       PLACEHOLDER                          )
  
  DALI_SIGNAL_REGISTRATION( Toolkit, TextEditor, "textChanged",        SIGNAL_TEXT_CHANGED )
  DALI_SIGNAL_REGISTRATION( Toolkit, TextEditor, "inputStyleChanged",  SIGNAL_INPUT_STYLE_CHANGED )
@@@ -693,25 -691,6 +693,25 @@@ void TextEditor::SetProperty( BaseObjec
          }
          break;
        }
 +      case Toolkit::DevelTextEditor::Property::ENABLE_SELECTION:
 +      {
 +        if( impl.mController )
 +        {
 +          const bool enableSelection = value.Get< bool >();
 +          DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_SELECTION %d\n", impl.mController.Get(), enableSelection );
 +          impl.mController->SetSelectionEnabled( enableSelection );
 +        }
 +        break;
 +      }
 +      case Toolkit::DevelTextEditor::Property::PLACEHOLDER:
 +      {
 +        const Property::Map* map = value.GetMap();
 +        if( map )
 +        {
 +          impl.mController->SetPlaceholderProperty( *map );
 +        }
 +        break;
 +      }
      } // switch
    } // texteditor
  }
@@@ -1073,21 -1052,6 +1073,21 @@@ Property::Value TextEditor::GetProperty
          }
          break;
        }
 +      case Toolkit::DevelTextEditor::Property::ENABLE_SELECTION:
 +      {
 +        if( impl.mController )
 +        {
 +          value = impl.mController->IsSelectionEnabled();
 +        }
 +        break;
 +      }
 +      case Toolkit::DevelTextEditor::Property::PLACEHOLDER:
 +      {
 +        Property::Map map;
 +        impl.mController->GetPlaceholderProperty( map );
 +        value = map;
 +        break;
 +      }
      } //switch
    }
  
@@@ -1193,8 -1157,8 +1193,8 @@@ void TextEditor::OnInitialize(
  
    // Creates an extra control to be used as stencil buffer.
    mStencil = Control::New();
-   mStencil.SetAnchorPoint( AnchorPoint::CENTER );
-   mStencil.SetParentOrigin( ParentOrigin::CENTER );
+   mStencil.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+   mStencil.SetParentOrigin( ParentOrigin::TOP_LEFT );
  
    // Creates a background visual. Even if the color is transparent it updates the stencil.
    mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND,
@@@ -1248,14 -1212,32 +1248,32 @@@ Vector3 TextEditor::GetNaturalSize(
  
  float TextEditor::GetHeightForWidth( float width )
  {
-   return mController->GetHeightForWidth( width );
+   Padding padding;
+   Self().GetPadding( padding );
+   return mController->GetHeightForWidth( width ) + padding.top + padding.bottom;
  }
  
  void TextEditor::OnRelayout( const Vector2& size, RelayoutContainer& container )
  {
    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor OnRelayout\n");
  
-   const Text::Controller::UpdateTextType updateTextType = mController->Relayout( size );
+   Actor self = Self();
+   Padding padding;
+   self.GetPadding( padding );
+   Vector2 contentSize( size.x - ( padding.left + padding.right ), size.y - ( padding.top + padding.bottom ) );
+   if( mStencil )
+   {
+     mStencil.SetPosition( padding.left , padding.top  );
+   }
+   if( mActiveLayer )
+   {
+     mActiveLayer.SetPosition( padding.left , padding.top  );
+   }
+   const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize );
  
    if( ( Text::Controller::NONE_UPDATED != updateTextType ) ||
        !mRenderer )
      }
  
      RenderText( updateTextType );
    }
  
    // The text-editor emits signals when the input style changes. These changes of style are
@@@ -1397,7 -1380,9 +1416,9 @@@ void TextEditor::OnTap( const TapGestur
    mImfManager.Activate();
  
    // Deliver the tap before the focus event to controller; this allows us to detect when focus is gained due to tap-gestures
-   mController->TapEvent( gesture.numberOfTaps, gesture.localPoint.x, gesture.localPoint.y );
+   Padding padding;
+   Self().GetPadding( padding );
+   mController->TapEvent( gesture.numberOfTaps, gesture.localPoint.x - padding.left, gesture.localPoint.y - padding.top );
  
    SetKeyInputFocus();
  }
@@@ -1411,7 -1396,9 +1432,9 @@@ void TextEditor::OnLongPress( const Lon
  {
    mImfManager.Activate();
  
-   mController->LongPressEvent( gesture.state, gesture.localPoint.x, gesture.localPoint.y );
+   Padding padding;
+   Self().GetPadding( padding );
+   mController->LongPressEvent( gesture.state, gesture.localPoint.x - padding.left, gesture.localPoint.y - padding.top );
  
    SetKeyInputFocus();
  }
@@@ -1514,7 -1501,10 +1537,10 @@@ void TextEditor::AddDecoration( Actor& 
      }
      else
      {
+       actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
+       actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
        Self().Add( actor );
+       mActiveLayer = actor;
      }
    }
  }
@@@ -140,8 -140,6 +140,8 @@@ DALI_PROPERTY_REGISTRATION( Toolkit, Te
  DALI_PROPERTY_REGISTRATION( Toolkit, TextField, "inputOutline",                         MAP,       INPUT_OUTLINE                        )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "hiddenInputSettings",            MAP,       HIDDEN_INPUT_SETTINGS                )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "pixelSize",                      FLOAT,     PIXEL_SIZE                           )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "enableSelection",                BOOLEAN,   ENABLE_SELECTION                     )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "placeholder",                    MAP,       PLACEHOLDER                          )
  
  DALI_SIGNAL_REGISTRATION( Toolkit, TextField, "textChanged",        SIGNAL_TEXT_CHANGED )
  DALI_SIGNAL_REGISTRATION( Toolkit, TextField, "maxLengthReached",   SIGNAL_MAX_LENGTH_REACHED )
@@@ -753,25 -751,6 +753,25 @@@ void TextField::SetProperty( BaseObject
          }
          break;
        }
 +      case Toolkit::DevelTextField::Property::ENABLE_SELECTION:
 +      {
 +        if( impl.mController )
 +        {
 +          const bool enableSelection = value.Get< bool >();
 +           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_SELECTION %d\n", impl.mController.Get(), enableSelection );
 +          impl.mController->SetSelectionEnabled( enableSelection );
 +        }
 +        break;
 +      }
 +      case Toolkit::DevelTextField::Property::PLACEHOLDER:
 +      {
 +        const Property::Map* map = value.GetMap();
 +        if( map )
 +        {
 +          impl.mController->SetPlaceholderProperty( *map );
 +        }
 +        break;
 +      }
      } // switch
    } // textfield
  }
@@@ -1150,21 -1129,6 +1150,21 @@@ Property::Value TextField::GetProperty
          }
          break;
        }
 +      case Toolkit::DevelTextField::Property::ENABLE_SELECTION:
 +      {
 +        if( impl.mController )
 +        {
 +          value = impl.mController->IsSelectionEnabled();
 +        }
 +        break;
 +      }
 +      case Toolkit::DevelTextField::Property::PLACEHOLDER:
 +      {
 +        Property::Map map;
 +        impl.mController->GetPlaceholderProperty( map );
 +        value = map;
 +        break;
 +      }
      } //switch
    }
  
@@@ -1316,14 -1280,31 +1316,31 @@@ Vector3 TextField::GetNaturalSize(
  
  float TextField::GetHeightForWidth( float width )
  {
-   return mController->GetHeightForWidth( width );
+   Padding padding;
+   Self().GetPadding( padding );
+   return mController->GetHeightForWidth( width ) + padding.top + padding.bottom;
  }
  
  void TextField::OnRelayout( const Vector2& size, RelayoutContainer& container )
  {
    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField OnRelayout\n");
  
-   const Text::Controller::UpdateTextType updateTextType = mController->Relayout( size );
+   Actor self = Self();
+   Padding padding;
+   self.GetPadding( padding );
+   Vector2 contentSize( size.x - ( padding.left + padding.right ), size.y - ( padding.top + padding.bottom ) );
+   if( mStencil )
+   {
+     mStencil.SetPosition( padding.left , padding.top  );
+   }
+   if( mActiveLayer )
+   {
+     mActiveLayer.SetPosition( padding.left , padding.top  );
+   }
+   const Text::Controller::UpdateTextType updateTextType = mController->Relayout( contentSize );
  
    if( ( Text::Controller::NONE_UPDATED != updateTextType ) ||
        !mRenderer )
      }
  
      RenderText( updateTextType );
    }
  
    // The text-field emits signals when the input style changes. These changes of style are
@@@ -1388,7 -1370,17 +1406,17 @@@ void TextField::RenderText( Text::Contr
    {
      const Vector2& scrollOffset = mController->GetTextModel()->GetScrollPosition();
  
-     mRenderableActor.SetPosition( scrollOffset.x + mAlignmentOffset, scrollOffset.y );
+     if( mStencil )
+     {
+        mRenderableActor.SetPosition( scrollOffset.x + mAlignmentOffset, scrollOffset.y );
+     }
+     else
+     {
+        Padding padding;
+        Self().GetPadding( padding );
+        mRenderableActor.SetPosition( scrollOffset.x + mAlignmentOffset + padding.left, scrollOffset.y + padding.top );
+     }
  
      // Make sure the actors are parented correctly with/without clipping
      Actor self = mStencil ? mStencil : Self();
@@@ -1467,7 -1459,9 +1495,9 @@@ void TextField::OnTap( const TapGesture
    mImfManager.Activate();
  
    // Deliver the tap before the focus event to controller; this allows us to detect when focus is gained due to tap-gestures
-   mController->TapEvent( gesture.numberOfTaps, gesture.localPoint.x, gesture.localPoint.y );
+   Padding padding;
+   Self().GetPadding( padding );
+   mController->TapEvent( gesture.numberOfTaps, gesture.localPoint.x - padding.left, gesture.localPoint.y - padding.top );
  
    SetKeyInputFocus();
  }
@@@ -1481,7 -1475,9 +1511,9 @@@ void TextField::OnLongPress( const Long
  {
    mImfManager.Activate();
  
-   mController->LongPressEvent( gesture.state, gesture.localPoint.x, gesture.localPoint.y );
+   Padding padding;
+   Self().GetPadding( padding );
+   mController->LongPressEvent( gesture.state, gesture.localPoint.x - padding.left, gesture.localPoint.y - padding.top );
  
    SetKeyInputFocus();
  }
@@@ -1581,7 -1577,10 +1613,10 @@@ void TextField::AddDecoration( Actor& a
      }
      else
      {
+       actor.SetParentOrigin( ParentOrigin::TOP_LEFT );
+       actor.SetAnchorPoint( AnchorPoint::TOP_LEFT );
        Self().Add( actor );
+       mActiveLayer = actor;
      }
    }
  }
@@@ -1625,8 -1624,8 +1660,8 @@@ void TextField::EnableClipping(
    {
      // Creates an extra control to be used as stencil buffer.
      mStencil = Control::New();
-     mStencil.SetAnchorPoint( AnchorPoint::CENTER );
-     mStencil.SetParentOrigin( ParentOrigin::CENTER );
+     mStencil.SetAnchorPoint( AnchorPoint::TOP_LEFT );
+     mStencil.SetParentOrigin( ParentOrigin::TOP_LEFT );
  
      // Creates a background visual. Even if the color is transparent it updates the stencil.
      mStencil.SetProperty( Toolkit::Control::Property::BACKGROUND,