Merge "Reduce Cyclomatic Complexity of Text classes" into devel/master
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Mon, 21 Sep 2020 08:29:47 +0000 (08:29 +0000)
committerGerrit Code Review <gerrit@review>
Mon, 21 Sep 2020 08:29:47 +0000 (08:29 +0000)
1  2 
dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp
dali-toolkit/internal/controls/text-controls/text-field-impl.cpp

@@@ -22,6 -22,7 +22,7 @@@
  #include <cstring>
  #include <limits>
  #include <dali/public-api/adaptor-framework/key.h>
+ #include <dali/public-api/common/dali-common.h>
  #include <dali/devel-api/adaptor-framework/window-devel.h>
  #include <dali/devel-api/common/stage.h>
  #include <dali/devel-api/actors/actor-devel.h>
@@@ -139,8 -140,6 +140,8 @@@ DALI_DEVEL_PROPERTY_REGISTRATION( Toolk
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "matchSystemLanguageDirection",   BOOLEAN,   MATCH_SYSTEM_LANGUAGE_DIRECTION      )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "renderingBackend",               INTEGER,   RENDERING_BACKEND                    )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "maxLength",                      INTEGER,   MAX_LENGTH                           )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "selectedTextStart",              INTEGER,   SELECTED_TEXT_START                  )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextEditor, "selectedTextEnd",                INTEGER,   SELECTED_TEXT_END                    )
  
  DALI_SIGNAL_REGISTRATION( Toolkit, TextEditor, "textChanged",        SIGNAL_TEXT_CHANGED )
  DALI_SIGNAL_REGISTRATION( Toolkit, TextEditor, "inputStyleChanged",  SIGNAL_INPUT_STYLE_CHANGED )
@@@ -193,6 -192,8 +194,8 @@@ void TextEditor::SetProperty( BaseObjec
    if( textEditor )
    {
      TextEditor& impl( GetImpl( textEditor ) );
+     DALI_ASSERT_DEBUG( impl.mController && "No text contoller" );
+     DALI_ASSERT_DEBUG( impl.mDecorator && "No text decorator" );
  
      switch( index )
      {
        }
        case Toolkit::TextEditor::Property::TEXT:
        {
-         if( impl.mController )
-         {
-           const std::string& text = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p TEXT %s\n", impl.mController.Get(), text.c_str() );
+         const std::string& text = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p TEXT %s\n", impl.mController.Get(), text.c_str() );
  
-           impl.mController->SetText( text );
-         }
+         impl.mController->SetText( text );
          break;
        }
        case Toolkit::TextEditor::Property::TEXT_COLOR:
        {
-         if( impl.mController )
+         const Vector4& textColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
+         if( impl.mController->GetDefaultColor() != textColor )
          {
-           const Vector4& textColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
-           if( impl.mController->GetDefaultColor() != textColor )
-           {
-             impl.mController->SetDefaultColor( textColor );
-             impl.mController->SetInputColor( textColor );
-             impl.mRenderer.Reset();
-           }
+           impl.mController->SetDefaultColor( textColor );
+           impl.mController->SetInputColor( textColor );
+           impl.mRenderer.Reset();
          }
          break;
        }
        case Toolkit::TextEditor::Property::FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           const std::string& fontFamily = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
-           impl.mController->SetDefaultFontFamily( fontFamily );
-         }
+         const std::string& fontFamily = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
+         impl.mController->SetDefaultFontFamily( fontFamily );
          break;
        }
        case Toolkit::TextEditor::Property::FONT_STYLE:
        }
        case Toolkit::TextEditor::Property::POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           const float pointSize = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p POINT_SIZE %f\n", impl.mController.Get(), pointSize );
+         const float pointSize = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p POINT_SIZE %f\n", impl.mController.Get(), pointSize );
  
-           if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
-           {
-             impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE );
-           }
+         if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
+         {
+           impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE );
          }
          break;
        }
        case Toolkit::TextEditor::Property::HORIZONTAL_ALIGNMENT:
        {
-         if( impl.mController )
+         Text::HorizontalAlignment::Type alignment( static_cast< Text::HorizontalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+         if( Text::GetHorizontalAlignmentEnumeration( value, alignment ) )
          {
-           Text::HorizontalAlignment::Type alignment( static_cast< Text::HorizontalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
-           if( Text::GetHorizontalAlignmentEnumeration( value, alignment ) )
-           {
-             DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p HORIZONTAL_ALIGNMENT %d\n", impl.mController.Get(), alignment );
-             impl.mController->SetHorizontalAlignment( alignment );
-           }
+           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p HORIZONTAL_ALIGNMENT %d\n", impl.mController.Get(), alignment );
+           impl.mController->SetHorizontalAlignment( alignment );
          }
          break;
        }
          const float threshold = value.Get< float >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p SCROLL_THRESHOLD %f\n", impl.mController.Get(), threshold );
  
-         if( impl.mDecorator )
-         {
-           impl.mDecorator->SetScrollThreshold( threshold );
-         }
+         impl.mDecorator->SetScrollThreshold( threshold );
          break;
        }
        case Toolkit::TextEditor::Property::SCROLL_SPEED:
          const float speed = value.Get< float >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p SCROLL_SPEED %f\n", impl.mController.Get(), speed );
  
-         if( impl.mDecorator )
-         {
-           impl.mDecorator->SetScrollSpeed( speed );
-         }
+         impl.mDecorator->SetScrollSpeed( speed );
          break;
        }
        case Toolkit::TextEditor::Property::PRIMARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           const Vector4& color = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PRIMARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a );
+         const Vector4& color = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PRIMARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a );
  
-           impl.mDecorator->SetCursorColor( PRIMARY_CURSOR, color );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetCursorColor( PRIMARY_CURSOR, color );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextEditor::Property::SECONDARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           const Vector4& color = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p SECONDARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a );
+         const Vector4& color = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p SECONDARY_CURSOR_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a );
  
-           impl.mDecorator->SetCursorColor( SECONDARY_CURSOR, color );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetCursorColor( SECONDARY_CURSOR, color );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextEditor::Property::ENABLE_CURSOR_BLINK:
        {
-         if( impl.mController )
-         {
-           const bool enable = value.Get< bool >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p ENABLE_CURSOR_BLINK %d\n", impl.mController.Get(), enable );
+         const bool enable = value.Get< bool >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p ENABLE_CURSOR_BLINK %d\n", impl.mController.Get(), enable );
  
-           impl.mController->SetEnableCursorBlink( enable );
-           impl.RequestTextRelayout();
-         }
+         impl.mController->SetEnableCursorBlink( enable );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextEditor::Property::CURSOR_BLINK_INTERVAL:
        {
-         if( impl.mDecorator )
-         {
-           const float interval = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p CURSOR_BLINK_INTERVAL %f\n", impl.mController.Get(), interval );
+         const float interval = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p CURSOR_BLINK_INTERVAL %f\n", impl.mController.Get(), interval );
  
-           impl.mDecorator->SetCursorBlinkInterval( interval );
-         }
+         impl.mDecorator->SetCursorBlinkInterval( interval );
          break;
        }
        case Toolkit::TextEditor::Property::CURSOR_BLINK_DURATION:
        {
-         if( impl.mDecorator )
-         {
-           const float duration = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p CURSOR_BLINK_DURATION %f\n", impl.mController.Get(), duration );
+         const float duration = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p CURSOR_BLINK_DURATION %f\n", impl.mController.Get(), duration );
  
-           impl.mDecorator->SetCursorBlinkDuration( duration );
-         }
+         impl.mDecorator->SetCursorBlinkDuration( duration );
          break;
        }
        case Toolkit::TextEditor::Property::CURSOR_WIDTH:
        {
-         if( impl.mDecorator )
-         {
-           const int width = value.Get< int >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p CURSOR_WIDTH %d\n", impl.mController.Get(), width );
+         const int width = value.Get< int >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p CURSOR_WIDTH %d\n", impl.mController.Get(), width );
  
-           impl.mDecorator->SetCursorWidth( width );
-           impl.mController->GetLayoutEngine().SetCursorWidth( width );
-         }
+         impl.mDecorator->SetCursorWidth( width );
+         impl.mController->GetLayoutEngine().SetCursorWidth( width );
          break;
        }
        case Toolkit::TextEditor::Property::GRAB_HANDLE_IMAGE:
          const std::string imageFileName = value.Get< std::string >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p GRAB_HANDLE_IMAGE %s\n", impl.mController.Get(), imageFileName.c_str() );
  
-         if( impl.mDecorator && imageFileName.size() )
+         if( imageFileName.size() )
          {
            impl.mDecorator->SetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED, imageFileName );
            impl.RequestTextRelayout();
          const std::string imageFileName = value.Get< std::string >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextEditor %p GRAB_HANDLE_PRESSED_IMAGE %s\n", impl.mController.Get(), imageFileName.c_str() );
  
-         if( impl.mDecorator && imageFileName.size() )
+         if( imageFileName.size() )
          {
            impl.mDecorator->SetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_PRESSED, imageFileName );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
          const Vector4 color = value.Get< Vector4 >();
          DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p SELECTION_HIGHLIGHT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), color.r, color.g, color.b, color.a );
  
-         if( impl.mDecorator )
-         {
-           impl.mDecorator->SetHighlightColor( color );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetHighlightColor( color );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextEditor::Property::DECORATION_BOUNDING_BOX:
        {
-         if( impl.mDecorator )
-         {
-           const Rect<int>& box = value.Get< Rect<int> >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p DECORATION_BOUNDING_BOX %d,%d %dx%d\n", impl.mController.Get(), box.x, box.y, box.width, box.height );
+         const Rect<int>& box = value.Get< Rect<int> >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p DECORATION_BOUNDING_BOX %d,%d %dx%d\n", impl.mController.Get(), box.x, box.y, box.width, box.height );
  
-           impl.mDecorator->SetBoundingBox( box );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetBoundingBox( box );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextEditor::Property::ENABLE_MARKUP:
        {
-         if( impl.mController )
-         {
-           const bool enableMarkup = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_MARKUP %d\n", impl.mController.Get(), enableMarkup );
+         const bool enableMarkup = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_MARKUP %d\n", impl.mController.Get(), enableMarkup );
  
-           impl.mController->SetMarkupProcessorEnabled( enableMarkup );
-         }
+         impl.mController->SetMarkupProcessorEnabled( enableMarkup );
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_COLOR:
        {
-         if( impl.mController )
-         {
-           const Vector4& inputColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), inputColor.r, inputColor.g, inputColor.b, inputColor.a );
+         const Vector4& inputColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), inputColor.r, inputColor.g, inputColor.b, inputColor.a );
  
-           impl.mController->SetInputColor( inputColor );
-         }
+         impl.mController->SetInputColor( inputColor );
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           const std::string& fontFamily = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
-           impl.mController->SetInputFontFamily( fontFamily );
-         }
+         const std::string& fontFamily = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
+         impl.mController->SetInputFontFamily( fontFamily );
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_FONT_STYLE:
        }
        case Toolkit::TextEditor::Property::INPUT_POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           const float pointSize = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_POINT_SIZE %f\n", impl.mController.Get(), pointSize );
-           impl.mController->SetInputFontPointSize( pointSize );
-         }
+         const float pointSize = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p INPUT_POINT_SIZE %f\n", impl.mController.Get(), pointSize );
+         impl.mController->SetInputFontPointSize( pointSize );
          break;
        }
        case Toolkit::TextEditor::Property::LINE_SPACING:
        {
-         if( impl.mController )
-         {
-           // The line spacing isn't supported by the TextEditor. Since it's supported
-           // by the TextLabel for now it must be ignored. The property is being shadowed
-           // locally so its value isn't affected.
-           const float lineSpacing = value.Get<float>();
-           impl.mLineSpacing = lineSpacing;
-           // set it to 0.0 due to missing implementation
-           impl.mController->SetDefaultLineSpacing( 0.0f );
-           impl.mRenderer.Reset();
-         }
+         // The line spacing isn't supported by the TextEditor. Since it's supported
+         // by the TextLabel for now it must be ignored. The property is being shadowed
+         // locally so its value isn't affected.
+         const float lineSpacing = value.Get<float>();
+         impl.mLineSpacing = lineSpacing;
+         // set it to 0.0 due to missing implementation
+         impl.mController->SetDefaultLineSpacing( 0.0f );
+         impl.mRenderer.Reset();
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_LINE_SPACING:
        {
-         if( impl.mController )
-         {
-           const float lineSpacing = value.Get<float>();
-           impl.mController->SetInputLineSpacing( lineSpacing );
-           impl.mRenderer.Reset();
-         }
+         const float lineSpacing = value.Get<float>();
+         impl.mController->SetInputLineSpacing( lineSpacing );
+         impl.mRenderer.Reset();
          break;
        }
        case Toolkit::TextEditor::Property::UNDERLINE:
        }
        case Toolkit::TextEditor::Property::PIXEL_SIZE:
        {
-         if( impl.mController )
-         {
-           const float pixelSize = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize );
+         const float pixelSize = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize );
  
-           if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
-           {
-             impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
-           }
+         if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
+         {
+           impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
          }
          break;
        }
        case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT:
        {
-         if( impl.mController )
-         {
-           const std::string& text = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor::OnPropertySet %p PLACEHOLDER_TEXT %s\n", impl.mController.Get(), text.c_str() );
+         const std::string& text = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor::OnPropertySet %p PLACEHOLDER_TEXT %s\n", impl.mController.Get(), text.c_str() );
  
-           impl.mController->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
-         }
+         impl.mController->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
          break;
        }
        case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT_COLOR:
        {
-         if( impl.mController )
+         const Vector4& textColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PLACEHOLDER_TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
+         if( impl.mController->GetPlaceholderTextColor() != textColor )
          {
-           const Vector4& textColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p PLACEHOLDER_TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
-           if( impl.mController->GetPlaceholderTextColor() != textColor )
-           {
-             impl.mController->SetPlaceholderTextColor( textColor );
-             impl.mRenderer.Reset();
-           }
+           impl.mController->SetPlaceholderTextColor( textColor );
+           impl.mRenderer.Reset();
          }
          break;
        }
        case Toolkit::TextEditor::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 );
-         }
+         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::TextEditor::Property::PLACEHOLDER:
        }
        case Toolkit::TextEditor::Property::LINE_WRAP_MODE:
        {
-         if( impl.mController )
+         Text::LineWrap::Mode lineWrapMode( static_cast< Text::LineWrap::Mode >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+         if( GetLineWrapModeEnumeration( value, lineWrapMode ) )
          {
-           Text::LineWrap::Mode lineWrapMode( static_cast< Text::LineWrap::Mode >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
-           if( GetLineWrapModeEnumeration( value, lineWrapMode ) )
-           {
-             DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p LineWrap::MODE %d\n", impl.mController.Get(), lineWrapMode );
-             impl.mController->SetLineWrapMode( lineWrapMode );
-           }
+           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p LineWrap::MODE %d\n", impl.mController.Get(), lineWrapMode );
+           impl.mController->SetLineWrapMode( lineWrapMode );
          }
          break;
        }
        case Toolkit::DevelTextEditor::Property::ENABLE_SHIFT_SELECTION:
        {
-         if( impl.mController )
-         {
-           const bool shiftSelection = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_SHIFT_SELECTION %d\n", impl.mController.Get(), shiftSelection );
+         const bool shiftSelection = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_SHIFT_SELECTION %d\n", impl.mController.Get(), shiftSelection );
  
-           impl.mController->SetShiftSelectionEnabled( shiftSelection );
-         }
+         impl.mController->SetShiftSelectionEnabled( shiftSelection );
          break;
        }
        case Toolkit::DevelTextEditor::Property::ENABLE_GRAB_HANDLE:
        {
-         if( impl.mController )
-         {
-           const bool grabHandleEnabled = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_GRAB_HANDLE %d\n", impl.mController.Get(), grabHandleEnabled );
+         const bool grabHandleEnabled = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p ENABLE_GRAB_HANDLE %d\n", impl.mController.Get(), grabHandleEnabled );
  
-           impl.mController->SetGrabHandleEnabled( grabHandleEnabled );
-         }
+         impl.mController->SetGrabHandleEnabled( grabHandleEnabled );
          break;
        }
        case Toolkit::DevelTextEditor::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
        {
-         if( impl.mController )
-         {
-           impl.mController->SetMatchSystemLanguageDirection(value.Get< bool >());
-         }
+         impl.mController->SetMatchSystemLanguageDirection(value.Get< bool >());
          break;
        }
        case Toolkit::DevelTextEditor::Property::MAX_LENGTH:
        {
-         if( impl.mController )
-         {
-           const int max = value.Get< int >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p MAX_LENGTH %d\n", impl.mController.Get(), max );
+         const int max = value.Get< int >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p MAX_LENGTH %d\n", impl.mController.Get(), max );
  
-           impl.mController->SetMaximumNumberOfCharacters( max );
-         }
+         impl.mController->SetMaximumNumberOfCharacters( max );
          break;
        }
 +      case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_START:
 +      {
 +        if( impl.mController )
 +        {
 +          uint32_t start = static_cast<uint32_t>(value.Get< int >());
 +          DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p SELECTED_TEXT_START %d\n", impl.mController.Get(), start );
 +          impl.SetTextSelectionRange( &start, nullptr );
 +        }
 +        break;
 +      }
 +      case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_END:
 +      {
 +        if( impl.mController )
 +        {
 +          uint32_t end = static_cast<uint32_t>(value.Get< int >());
 +          DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p SELECTED_TEXT_END %d\n", impl.mController.Get(), end );
 +          impl.SetTextSelectionRange( nullptr, &end );
 +        }
 +        break;
 +      }
      } // switch
    } // texteditor
  }
@@@ -819,6 -709,8 +731,8 @@@ Property::Value TextEditor::GetProperty
    if( textEditor )
    {
      TextEditor& impl( GetImpl( textEditor ) );
+     DALI_ASSERT_DEBUG( impl.mController && "No text contoller" );
+     DALI_ASSERT_DEBUG( impl.mDecorator && "No text decorator" );
  
      switch( index )
      {
        }
        case Toolkit::TextEditor::Property::TEXT:
        {
-         if( impl.mController )
-         {
-           std::string text;
-           impl.mController->GetText( text );
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p returning text: %s\n", impl.mController.Get(), text.c_str() );
-           value = text;
-         }
+         std::string text;
+         impl.mController->GetText( text );
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextEditor %p returning text: %s\n", impl.mController.Get(), text.c_str() );
+         value = text;
          break;
        }
        case Toolkit::TextEditor::Property::TEXT_COLOR:
        {
-         if ( impl.mController )
-         {
-           value = impl.mController->GetDefaultColor();
-         }
+         value = impl.mController->GetDefaultColor();
          break;
        }
        case Toolkit::TextEditor::Property::FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetDefaultFontFamily();
-         }
+         value = impl.mController->GetDefaultFontFamily();
          break;
        }
        case Toolkit::TextEditor::Property::FONT_STYLE:
        }
        case Toolkit::TextEditor::Property::POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE );
-         }
+         value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE );
          break;
        }
        case Toolkit::TextEditor::Property::HORIZONTAL_ALIGNMENT:
        {
-         if( impl.mController )
+         const char* name = GetHorizontalAlignmentString( impl.mController->GetHorizontalAlignment() );
+         if( name )
          {
-           const char* name = GetHorizontalAlignmentString( impl.mController->GetHorizontalAlignment() );
-           if( name )
-           {
-             value = std::string( name );
-           }
+           value = std::string( name );
          }
          break;
        }
        case Toolkit::TextEditor::Property::SCROLL_THRESHOLD:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetScrollThreshold();
-         }
+         value = impl.mDecorator->GetScrollThreshold();
          break;
        }
        case Toolkit::TextEditor::Property::SCROLL_SPEED:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetScrollSpeed();
-         }
+         value = impl.mDecorator->GetScrollSpeed();
          break;
        }
        case Toolkit::TextEditor::Property::PRIMARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetColor( PRIMARY_CURSOR );
-         }
+         value = impl.mDecorator->GetColor( PRIMARY_CURSOR );
          break;
        }
        case Toolkit::TextEditor::Property::SECONDARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetColor( SECONDARY_CURSOR );
-         }
+         value = impl.mDecorator->GetColor( SECONDARY_CURSOR );
          break;
        }
        case Toolkit::TextEditor::Property::ENABLE_CURSOR_BLINK:
        }
        case Toolkit::TextEditor::Property::CURSOR_BLINK_INTERVAL:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetCursorBlinkInterval();
-         }
+         value = impl.mDecorator->GetCursorBlinkInterval();
          break;
        }
        case Toolkit::TextEditor::Property::CURSOR_BLINK_DURATION:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetCursorBlinkDuration();
-         }
+         value = impl.mDecorator->GetCursorBlinkDuration();
          break;
        }
        case Toolkit::TextEditor::Property::CURSOR_WIDTH:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetCursorWidth();
-         }
+         value = impl.mDecorator->GetCursorWidth();
          break;
        }
        case Toolkit::TextEditor::Property::GRAB_HANDLE_IMAGE:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED );
-         }
+         value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED );
          break;
        }
        case Toolkit::TextEditor::Property::GRAB_HANDLE_PRESSED_IMAGE:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_PRESSED );
-         }
+         value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_PRESSED );
          break;
        }
        case Toolkit::TextEditor::Property::SELECTION_HANDLE_IMAGE_LEFT:
        }
        case Toolkit::TextEditor::Property::SELECTION_HIGHLIGHT_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetHighlightColor();
-         }
+         value = impl.mDecorator->GetHighlightColor();
          break;
        }
        case Toolkit::TextEditor::Property::DECORATION_BOUNDING_BOX:
        {
-         if( impl.mDecorator )
-         {
-           Rect<int> boundingBox;
-           impl.mDecorator->GetBoundingBox( boundingBox );
-           value = boundingBox;
-         }
+         Rect<int> boundingBox;
+         impl.mDecorator->GetBoundingBox( boundingBox );
+         value = boundingBox;
          break;
        }
        case Toolkit::TextEditor::Property::ENABLE_MARKUP:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsMarkupProcessorEnabled();
-         }
+         value = impl.mController->IsMarkupProcessorEnabled();
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_COLOR:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputColor();
-         }
+         value = impl.mController->GetInputColor();
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputFontFamily();
-         }
+         value = impl.mController->GetInputFontFamily();
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_FONT_STYLE:
        }
        case Toolkit::TextEditor::Property::INPUT_POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputFontPointSize();
-         }
+         value = impl.mController->GetInputFontPointSize();
          break;
        }
        case Toolkit::TextEditor::Property::LINE_SPACING:
        {
-         if( impl.mController )
-         {
-           // LINE_SPACING isn't implemented for the TextEditor. Returning
-           // only shadowed value, not the real one.
-           value = impl.mLineSpacing;
-         }
+         // LINE_SPACING isn't implemented for the TextEditor. Returning
+         // only shadowed value, not the real one.
+         value = impl.mLineSpacing;
          break;
        }
        case Toolkit::TextEditor::Property::INPUT_LINE_SPACING:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputLineSpacing();
-         }
+         value = impl.mController->GetInputLineSpacing();
          break;
        }
        case Toolkit::TextEditor::Property::UNDERLINE:
        }
        case Toolkit::TextEditor::Property::PIXEL_SIZE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE );
-         }
+         value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE );
          break;
        }
        case Toolkit::TextEditor::Property::LINE_COUNT:
        {
-         if( impl.mController )
-         {
-           float width = textEditor.GetProperty( Actor::Property::SIZE_WIDTH ).Get<float>();
-           value = impl.mController->GetLineCount( width );
-         }
+         float width = textEditor.GetProperty( Actor::Property::SIZE_WIDTH ).Get<float>();
+         value = impl.mController->GetLineCount( width );
          break;
        }
        case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT:
        {
-         if( impl.mController )
-         {
-           std::string text;
-           impl.mController->GetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
-           value = text;
-         }
+         std::string text;
+         impl.mController->GetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
+         value = text;
          break;
        }
        case Toolkit::DevelTextEditor::Property::PLACEHOLDER_TEXT_COLOR:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetPlaceholderTextColor();
-         }
+         value = impl.mController->GetPlaceholderTextColor();
          break;
        }
        case Toolkit::TextEditor::Property::ENABLE_SELECTION:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsSelectionEnabled();
-         }
+         value = impl.mController->IsSelectionEnabled();
          break;
        }
        case Toolkit::TextEditor::Property::PLACEHOLDER:
        }
        case Toolkit::TextEditor::Property::LINE_WRAP_MODE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetLineWrapMode();
-         }
+         value = impl.mController->GetLineWrapMode();
          break;
        }
        case Toolkit::DevelTextEditor::Property::ENABLE_SHIFT_SELECTION:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsShiftSelectionEnabled();
-         }
+         value = impl.mController->IsShiftSelectionEnabled();
          break;
        }
        case Toolkit::DevelTextEditor::Property::ENABLE_GRAB_HANDLE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsGrabHandleEnabled();
-         }
+         value = impl.mController->IsGrabHandleEnabled();
          break;
        }
        case Toolkit::DevelTextEditor::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsMatchSystemLanguageDirection();
-         }
+         value = impl.mController->IsMatchSystemLanguageDirection();
          break;
        }
        case Toolkit::DevelTextEditor::Property::MAX_LENGTH:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetMaximumNumberOfCharacters();
-         }
+         value = impl.mController->GetMaximumNumberOfCharacters();
          break;
        }
 +      case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_START:
 +      {
 +        Uint32Pair range = impl.GetTextSelectionRange();
 +        value = static_cast<int>(range.first);
 +        break;
 +      }
 +      case Toolkit::DevelTextEditor::Property::SELECTED_TEXT_END:
 +      {
 +        Uint32Pair range = impl.GetTextSelectionRange();
 +        value = static_cast<int>(range.second);
 +        break;
 +      }
      } //switch
    }
  
@@@ -1293,7 -1077,7 +1111,7 @@@ void TextEditor::OnInitialize(
  {
    Actor self = Self();
  
 -  mController = Text::Controller::New( this, this );
 +  mController = Text::Controller::New( this, this, this);
  
    mDecorator = Text::Decorator::New( *mController,
                                       *mController );
@@@ -1742,25 -1526,6 +1560,25 @@@ void TextEditor::AddDecoration( Actor& 
    }
  }
  
 +void TextEditor::SetTextSelectionRange(const uint32_t *start, const uint32_t *end)
 +{
 +  if( mController && mController->IsShowingRealText() )
 +  {
 +    mController->SetTextSelectionRange( start, end );
 +    SetKeyInputFocus();
 +  }
 +}
 +
 +Uint32Pair TextEditor::GetTextSelectionRange() const
 +{
 +  Uint32Pair range(0, 0);
 +  if( mController && mController->IsShowingRealText() )
 +  {
 +    range = mController->GetTextSelectionRange();
 +  }
 +  return range;
 +}
 +
  void TextEditor::UpdateScrollBar()
  {
    using namespace Dali;
@@@ -21,6 -21,7 +21,7 @@@
  // EXTERNAL INCLUDES
  #include <cstring>
  #include <dali/public-api/adaptor-framework/key.h>
+ #include <dali/public-api/common/dali-common.h>
  #include <dali/devel-api/adaptor-framework/key-devel.h>
  #include <dali/devel-api/adaptor-framework/window-devel.h>
  #include <dali/devel-api/common/stage.h>
@@@ -134,8 -135,6 +135,8 @@@ DALI_DEVEL_PROPERTY_REGISTRATION( Toolk
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "textBackground",                 VECTOR4,   BACKGROUND                           )
  DALI_DEVEL_PROPERTY_REGISTRATION_READ_ONLY( Toolkit, TextField, "selectedText",         STRING,    SELECTED_TEXT                        )
  DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "renderingBackend",               INTEGER,   RENDERING_BACKEND                    )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "selectedTextStart",              INTEGER,   SELECTED_TEXT_START                  )
 +DALI_DEVEL_PROPERTY_REGISTRATION( Toolkit, TextField, "selectedTextEnd",                INTEGER,   SELECTED_TEXT_END                    )
  
  DALI_SIGNAL_REGISTRATION( Toolkit, TextField, "textChanged",        SIGNAL_TEXT_CHANGED )
  DALI_SIGNAL_REGISTRATION( Toolkit, TextField, "maxLengthReached",   SIGNAL_MAX_LENGTH_REACHED )
@@@ -184,10 -183,11 +185,11 @@@ void TextField::SetProperty( BaseObject
  
    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField SetProperty\n");
  
    if( textField )
    {
      TextField& impl( GetImpl( textField ) );
+     DALI_ASSERT_DEBUG( impl.mController && "No text contoller" );
+     DALI_ASSERT_DEBUG( impl.mDecorator && "No text decorator" );
  
      switch( index )
      {
            impl.mRenderingBackend = backend;
            impl.mRenderer.Reset();
  
-           if( impl.mController )
-           {
-             // When using the vector-based rendering, the size of the GLyphs are different
-             TextAbstraction::GlyphType glyphType = (DevelText::RENDERING_VECTOR_BASED == impl.mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH;
-             impl.mController->SetGlyphType( glyphType );
-           }
+           // When using the vector-based rendering, the size of the GLyphs are different
+           TextAbstraction::GlyphType glyphType = (DevelText::RENDERING_VECTOR_BASED == impl.mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH;
+           impl.mController->SetGlyphType( glyphType );
          }
          break;
        }
        case Toolkit::TextField::Property::TEXT:
        {
-         if( impl.mController )
-         {
-           const std::string& text = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p TEXT %s\n", impl.mController.Get(), text.c_str() );
+         const std::string& text = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p TEXT %s\n", impl.mController.Get(), text.c_str() );
  
-           impl.mController->SetText( text );
-         }
+         impl.mController->SetText( text );
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER_TEXT:
        {
-         if( impl.mController )
-         {
-           const std::string& text = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PLACEHOLDER_TEXT %s\n", impl.mController.Get(), text.c_str() );
+         const std::string& text = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PLACEHOLDER_TEXT %s\n", impl.mController.Get(), text.c_str() );
  
-           impl.mController->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
-         }
+         impl.mController->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER_TEXT_FOCUSED:
        {
-         if( impl.mController )
-         {
-           const std::string& text = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PLACEHOLDER_TEXT_FOCUSED %s\n", impl.mController.Get(), text.c_str() );
+         const std::string& text = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PLACEHOLDER_TEXT_FOCUSED %s\n", impl.mController.Get(), text.c_str() );
  
-           impl.mController->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_ACTIVE, text );
-         }
+         impl.mController->SetPlaceholderText( Controller::PLACEHOLDER_TYPE_ACTIVE, text );
          break;
        }
        case Toolkit::TextField::Property::FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           const std::string& fontFamily = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
-           impl.mController->SetDefaultFontFamily( fontFamily );
-         }
+         const std::string& fontFamily = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
+         impl.mController->SetDefaultFontFamily( fontFamily );
          break;
        }
        case Toolkit::TextField::Property::FONT_STYLE:
        }
        case Toolkit::TextField::Property::POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           const float pointSize = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p POINT_SIZE %f\n", impl.mController.Get(), pointSize );
+         const float pointSize = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p POINT_SIZE %f\n", impl.mController.Get(), pointSize );
  
-           if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
-           {
-             impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE );
-           }
+         if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
+         {
+           impl.mController->SetDefaultFontSize( pointSize, Text::Controller::POINT_SIZE );
          }
          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 );
+         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 );
-         }
+         impl.mController->SetMaximumNumberOfCharacters( max );
          break;
        }
        case Toolkit::TextField::Property::EXCEED_POLICY:
        }
        case Toolkit::TextField::Property::HORIZONTAL_ALIGNMENT:
        {
-         if( impl.mController )
+         Text::HorizontalAlignment::Type alignment( static_cast< Text::HorizontalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+         if( GetHorizontalAlignmentEnumeration( value, alignment ) )
          {
-           Text::HorizontalAlignment::Type alignment( static_cast< Text::HorizontalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
-           if( GetHorizontalAlignmentEnumeration( value, alignment ) )
-           {
-             DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p HORIZONTAL_ALIGNMENT %d\n", impl.mController.Get(), alignment );
-             impl.mController->SetHorizontalAlignment( alignment );
-           }
+           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p HORIZONTAL_ALIGNMENT %d\n", impl.mController.Get(), alignment );
+           impl.mController->SetHorizontalAlignment( alignment );
          }
          break;
        }
        case Toolkit::TextField::Property::VERTICAL_ALIGNMENT:
        {
-         if( impl.mController )
+         Toolkit::Text::VerticalAlignment::Type alignment( static_cast< Text::VerticalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
+         if( GetVerticalAlignmentEnumeration( value, alignment ) )
          {
-           Toolkit::Text::VerticalAlignment::Type alignment( static_cast< Text::VerticalAlignment::Type >( -1 ) ); // Set to invalid value to ensure a valid mode does get set
-           if( GetVerticalAlignmentEnumeration( value, alignment ) )
-           {
-             impl.mController->SetVerticalAlignment( alignment );
-             DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p VERTICAL_ALIGNMENT %d\n", impl.mController.Get(), alignment );
-           }
+           impl.mController->SetVerticalAlignment( alignment );
+           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p VERTICAL_ALIGNMENT %d\n", impl.mController.Get(), alignment );
          }
          break;
        }
        case Toolkit::TextField::Property::TEXT_COLOR:
        {
-         if( impl.mController )
+         const Vector4& textColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
+         if( impl.mController->GetDefaultColor() != textColor )
          {
-           const Vector4& textColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
-           if( impl.mController->GetDefaultColor() != textColor )
-           {
-             impl.mController->SetDefaultColor( textColor );
-             impl.mController->SetInputColor( textColor );
-             impl.mRenderer.Reset();
-           }
+           impl.mController->SetDefaultColor( textColor );
+           impl.mController->SetInputColor( textColor );
+           impl.mRenderer.Reset();
          }
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER_TEXT_COLOR:
        {
-         if( impl.mController )
+         const Vector4& textColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PLACEHOLDER_TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
+         if( impl.mController->GetPlaceholderTextColor() != textColor )
          {
-           const Vector4& textColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PLACEHOLDER_TEXT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), textColor.r, textColor.g, textColor.b, textColor.a );
-           if( impl.mController->GetPlaceholderTextColor() != textColor )
-           {
-             impl.mController->SetPlaceholderTextColor( textColor );
-             impl.mRenderer.Reset();
-           }
+           impl.mController->SetPlaceholderTextColor( textColor );
+           impl.mRenderer.Reset();
          }
          break;
        }
        case Toolkit::TextField::Property::PRIMARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           const Vector4& color = value.Get< Vector4 >();
-           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 );
+         const Vector4& color = value.Get< Vector4 >();
+         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->SetCursorColor( PRIMARY_CURSOR, color );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetCursorColor( PRIMARY_CURSOR, color );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextField::Property::SECONDARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           const Vector4& color = value.Get< Vector4 >();
-           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 );
+         const Vector4& color = value.Get< Vector4 >();
+         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->SetCursorColor( SECONDARY_CURSOR, color );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetCursorColor( SECONDARY_CURSOR, color );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextField::Property::ENABLE_CURSOR_BLINK:
        {
-         if( impl.mController )
-         {
-           const bool enable = value.Get< bool >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p ENABLE_CURSOR_BLINK %d\n", impl.mController.Get(), enable );
+         const bool enable = value.Get< bool >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p ENABLE_CURSOR_BLINK %d\n", impl.mController.Get(), enable );
  
-           impl.mController->SetEnableCursorBlink( enable );
-           impl.RequestTextRelayout();
-         }
+         impl.mController->SetEnableCursorBlink( enable );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextField::Property::CURSOR_BLINK_INTERVAL:
        {
-         if( impl.mDecorator )
-         {
-           const float interval = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_BLINK_INTERVAL %f\n", impl.mController.Get(), interval );
+         const float interval = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_BLINK_INTERVAL %f\n", impl.mController.Get(), interval );
  
-           impl.mDecorator->SetCursorBlinkInterval( interval );
-         }
+         impl.mDecorator->SetCursorBlinkInterval( interval );
          break;
        }
        case Toolkit::TextField::Property::CURSOR_BLINK_DURATION:
        {
-         if( impl.mDecorator )
-         {
-           const float duration = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_BLINK_DURATION %f\n", impl.mController.Get(), duration );
+         const float duration = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p CURSOR_BLINK_DURATION %f\n", impl.mController.Get(), duration );
  
-           impl.mDecorator->SetCursorBlinkDuration( 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 );
+         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 );
-         }
+         impl.mDecorator->SetCursorWidth( width );
+         impl.mController->GetLayoutEngine().SetCursorWidth( width );
          break;
        }
        case Toolkit::TextField::Property::GRAB_HANDLE_IMAGE:
          const std::string imageFileName = value.Get< std::string >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p GRAB_HANDLE_IMAGE %s\n", impl.mController.Get(), imageFileName.c_str() );
  
-         if( impl.mDecorator && imageFileName.size() )
+         if( imageFileName.size() )
          {
            impl.mDecorator->SetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED, imageFileName );
            impl.RequestTextRelayout();
          const std::string imageFileName = value.Get< std::string >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p GRAB_HANDLE_PRESSED_IMAGE %s\n", impl.mController.Get(), imageFileName.c_str() );
  
-         if( impl.mDecorator && imageFileName.size() )
+         if( imageFileName.size() )
          {
            impl.mDecorator->SetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_PRESSED, imageFileName );
            impl.RequestTextRelayout();
          const float threshold = value.Get< float >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p SCROLL_THRESHOLD %f\n", impl.mController.Get(), threshold );
  
-         if( impl.mDecorator )
-         {
-           impl.mDecorator->SetScrollThreshold( threshold );
-         }
+         impl.mDecorator->SetScrollThreshold( threshold );
          break;
        }
        case Toolkit::TextField::Property::SCROLL_SPEED:
          const float speed = value.Get< float >();
          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "TextField %p SCROLL_SPEED %f\n", impl.mController.Get(), speed );
  
-         if( impl.mDecorator )
-         {
-           impl.mDecorator->SetScrollSpeed( speed );
-         }
+         impl.mDecorator->SetScrollSpeed( speed );
          break;
        }
        case Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_LEFT:
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE, HANDLE_IMAGE_PRESSED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( LEFT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
        {
          const std::string filename = GetImageFileNameFromPropertyValue( value );
  
-         if( impl.mDecorator && filename.size() )
+         if( filename.size() )
          {
            impl.mDecorator->SetHandleImage( RIGHT_SELECTION_HANDLE_MARKER, HANDLE_IMAGE_RELEASED, filename );
            impl.RequestTextRelayout();
          const Vector4 color = value.Get< Vector4 >();
          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 )
-         {
-           impl.mDecorator->SetHighlightColor( color );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetHighlightColor( color );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextField::Property::DECORATION_BOUNDING_BOX:
        {
-         if( impl.mDecorator )
-         {
-           const Rect<int> box = value.Get< Rect<int> >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p DECORATION_BOUNDING_BOX %d,%d %dx%d\n", impl.mController.Get(), box.x, box.y, box.width, box.height );
+         const Rect<int> box = value.Get< Rect<int> >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p DECORATION_BOUNDING_BOX %d,%d %dx%d\n", impl.mController.Get(), box.x, box.y, box.width, box.height );
  
-           impl.mDecorator->SetBoundingBox( box );
-           impl.RequestTextRelayout();
-         }
+         impl.mDecorator->SetBoundingBox( box );
+         impl.RequestTextRelayout();
          break;
        }
        case Toolkit::TextField::Property::INPUT_METHOD_SETTINGS:
        }
        case Toolkit::TextField::Property::INPUT_COLOR:
        {
-         if( impl.mController )
-         {
-           const Vector4 inputColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p INPUT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), inputColor.r, inputColor.g, inputColor.b, inputColor.a );
+         const Vector4 inputColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p INPUT_COLOR %f,%f,%f,%f\n", impl.mController.Get(), inputColor.r, inputColor.g, inputColor.b, inputColor.a );
  
-           impl.mController->SetInputColor( inputColor );
-         }
+         impl.mController->SetInputColor( inputColor );
          break;
        }
        case Toolkit::TextField::Property::ENABLE_MARKUP:
        {
-         if( impl.mController )
-         {
-           const bool enableMarkup = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_MARKUP %d\n", impl.mController.Get(), enableMarkup );
+         const bool enableMarkup = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_MARKUP %d\n", impl.mController.Get(), enableMarkup );
  
-           impl.mController->SetMarkupProcessorEnabled( enableMarkup );
-         }
+         impl.mController->SetMarkupProcessorEnabled( enableMarkup );
          break;
        }
        case Toolkit::TextField::Property::INPUT_FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           const std::string& fontFamily = value.Get< std::string >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p INPUT_FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
-           impl.mController->SetInputFontFamily( fontFamily );
-         }
+         const std::string& fontFamily = value.Get< std::string >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p INPUT_FONT_FAMILY %s\n", impl.mController.Get(), fontFamily.c_str() );
+         impl.mController->SetInputFontFamily( fontFamily );
          break;
        }
        case Toolkit::TextField::Property::INPUT_FONT_STYLE:
        }
        case Toolkit::TextField::Property::INPUT_POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           const float pointSize = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p INPUT_POINT_SIZE %f\n", impl.mController.Get(), pointSize );
-           impl.mController->SetInputFontPointSize( pointSize );
-         }
+         const float pointSize = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p INPUT_POINT_SIZE %f\n", impl.mController.Get(), pointSize );
+         impl.mController->SetInputFontPointSize( pointSize );
          break;
        }
        case Toolkit::TextField::Property::UNDERLINE:
        }
        case Toolkit::TextField::Property::PIXEL_SIZE:
        {
-         if( impl.mController )
-         {
-           const float pixelSize = value.Get< float >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize );
+         const float pixelSize = value.Get< float >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p PIXEL_SIZE %f\n", impl.mController.Get(), pixelSize );
  
-           if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
-           {
-             impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
-           }
+         if( !Equals( impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
+         {
+           impl.mController->SetDefaultFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
          }
          break;
        }
        case Toolkit::TextField::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 );
-         }
+         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::TextField::Property::PLACEHOLDER:
        }
        case Toolkit::TextField::Property::ELLIPSIS:
        {
-         if( impl.mController )
-         {
-           const bool ellipsis = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis );
+         const bool ellipsis = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ELLIPSIS %d\n", impl.mController.Get(), ellipsis );
  
-           impl.mController->SetTextElideEnabled( ellipsis );
-         }
+         impl.mController->SetTextElideEnabled( ellipsis );
          break;
        }
        case Toolkit::DevelTextField::Property::ENABLE_SHIFT_SELECTION:
        {
-         if( impl.mController )
-         {
-           const bool shiftSelection = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_SHIFT_SELECTION %d\n", impl.mController.Get(), shiftSelection );
+         const bool shiftSelection = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_SHIFT_SELECTION %d\n", impl.mController.Get(), shiftSelection );
  
-           impl.mController->SetShiftSelectionEnabled( shiftSelection );
-         }
+         impl.mController->SetShiftSelectionEnabled( shiftSelection );
          break;
        }
        case Toolkit::DevelTextField::Property::ENABLE_GRAB_HANDLE:
        {
-         if( impl.mController )
-         {
-           const bool grabHandleEnabled = value.Get<bool>();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_GRAB_HANDLE %d\n", impl.mController.Get(), grabHandleEnabled );
+         const bool grabHandleEnabled = value.Get<bool>();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p ENABLE_GRAB_HANDLE %d\n", impl.mController.Get(), grabHandleEnabled );
  
-           impl.mController->SetGrabHandleEnabled( grabHandleEnabled );
-         }
+         impl.mController->SetGrabHandleEnabled( grabHandleEnabled );
          break;
        }
        case Toolkit::DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
        {
-         if( impl.mController )
-         {
-           impl.mController->SetMatchSystemLanguageDirection(value.Get< bool >());
-         }
+         impl.mController->SetMatchSystemLanguageDirection(value.Get< bool >());
          break;
        }
        case Toolkit::DevelTextField::Property::ENABLE_GRAB_HANDLE_POPUP:
        {
-         if( impl.mController )
-         {
-           const bool grabHandlePopupEnabled = value.Get<bool>();
-           DALI_LOG_INFO(gLogFilter, Debug::General, "TextField %p ENABLE_GRAB_HANDLE_POPUP %d\n", impl.mController.Get(), grabHandlePopupEnabled);
+         const bool grabHandlePopupEnabled = value.Get<bool>();
+         DALI_LOG_INFO(gLogFilter, Debug::General, "TextField %p ENABLE_GRAB_HANDLE_POPUP %d\n", impl.mController.Get(), grabHandlePopupEnabled);
  
-           impl.mController->SetGrabHandlePopupEnabled(grabHandlePopupEnabled);
-           break;
-         }
+         impl.mController->SetGrabHandlePopupEnabled(grabHandlePopupEnabled);
+         break;
        }
        case Toolkit::DevelTextField::Property::BACKGROUND:
        {
-         if( impl.mController )
-         {
-           const Vector4 backgroundColor = value.Get< Vector4 >();
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p BACKGROUND %f,%f,%f,%f\n", impl.mController.Get(), backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a );
+         const Vector4 backgroundColor = value.Get< Vector4 >();
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p BACKGROUND %f,%f,%f,%f\n", impl.mController.Get(), backgroundColor.r, backgroundColor.g, backgroundColor.b, backgroundColor.a );
  
-           impl.mController->SetBackgroundEnabled( true );
-           impl.mController->SetBackgroundColor( backgroundColor );
-         }
+         impl.mController->SetBackgroundEnabled( true );
+         impl.mController->SetBackgroundColor( backgroundColor );
          break;
        }
 +      case Toolkit::DevelTextField::Property::SELECTED_TEXT_START:
 +      {
 +        if( impl.mController )
 +        {
 +          uint32_t start = static_cast<uint32_t>(value.Get< int >());
 +          DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p SELECTED_TEXT_START %d\n", impl.mController.Get(), start );
 +          impl.SetTextSelectionRange( &start, nullptr );
 +        }
 +        break;
 +      }
 +      case Toolkit::DevelTextField::Property::SELECTED_TEXT_END:
 +      {
 +        if( impl.mController )
 +        {
 +          uint32_t end = static_cast<uint32_t>(value.Get< int >());
 +          DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p SELECTED_TEXT_END %d\n", impl.mController.Get(), end );
 +          impl.SetTextSelectionRange( nullptr, &end );
 +        }
 +        break;
 +      }
      } // switch
    } // textfield
  }
@@@ -841,6 -722,8 +744,8 @@@ Property::Value TextField::GetProperty
    if( textField )
    {
      TextField& impl( GetImpl( textField ) );
+     DALI_ASSERT_DEBUG( impl.mController && "No text contoller" );
+     DALI_ASSERT_DEBUG( impl.mDecorator && "No text decorator" );
  
      switch( index )
      {
        }
        case Toolkit::TextField::Property::TEXT:
        {
-         if( impl.mController )
-         {
-           std::string text;
-           impl.mController->GetText( text );
-           DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p returning text: %s\n", impl.mController.Get(), text.c_str() );
-           value = text;
-         }
+         std::string text;
+         impl.mController->GetText( text );
+         DALI_LOG_INFO( gLogFilter, Debug::General, "TextField %p returning text: %s\n", impl.mController.Get(), text.c_str() );
+         value = text;
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER_TEXT:
        {
-         if( impl.mController )
-         {
-           std::string text;
-           impl.mController->GetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
-           value = text;
-         }
+         std::string text;
+         impl.mController->GetPlaceholderText( Controller::PLACEHOLDER_TYPE_INACTIVE, text );
+         value = text;
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER_TEXT_FOCUSED:
        {
-         if( impl.mController )
-         {
-           std::string text;
-           impl.mController->GetPlaceholderText( Controller::PLACEHOLDER_TYPE_ACTIVE, text );
-           value = text;
-         }
+         std::string text;
+         impl.mController->GetPlaceholderText( Controller::PLACEHOLDER_TYPE_ACTIVE, text );
+         value = text;
          break;
        }
        case Toolkit::TextField::Property::FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetDefaultFontFamily();
-         }
+         value = impl.mController->GetDefaultFontFamily();
          break;
        }
        case Toolkit::TextField::Property::FONT_STYLE:
        }
        case Toolkit::TextField::Property::POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE );
-         }
+         value = impl.mController->GetDefaultFontSize( Text::Controller::POINT_SIZE );
          break;
        }
        case Toolkit::TextField::Property::MAX_LENGTH:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetMaximumNumberOfCharacters();
-         }
+         value = impl.mController->GetMaximumNumberOfCharacters();
          break;
        }
        case Toolkit::TextField::Property::EXCEED_POLICY:
        }
        case Toolkit::TextField::Property::HORIZONTAL_ALIGNMENT:
        {
-         if( impl.mController )
-         {
-           const char* name = Text::GetHorizontalAlignmentString( impl.mController->GetHorizontalAlignment() );
+         const char* name = Text::GetHorizontalAlignmentString( impl.mController->GetHorizontalAlignment() );
  
-           if ( name )
-           {
-             value = std::string( name );
-           }
+         if ( name )
+         {
+           value = std::string( name );
          }
          break;
        }
        case Toolkit::TextField::Property::VERTICAL_ALIGNMENT:
        {
-         if( impl.mController )
-         {
-           const char* name = Text::GetVerticalAlignmentString( impl.mController->GetVerticalAlignment() );
+         const char* name = Text::GetVerticalAlignmentString( impl.mController->GetVerticalAlignment() );
  
-           if( name )
-           {
-             value = std::string( name );
-           }
+         if( name )
+         {
+           value = std::string( name );
          }
          break;
        }
        case Toolkit::TextField::Property::TEXT_COLOR:
        {
-         if ( impl.mController )
-         {
-           value = impl.mController->GetDefaultColor();
-         }
+         value = impl.mController->GetDefaultColor();
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER_TEXT_COLOR:
        {
-         if ( impl.mController )
-         {
-           value = impl.mController->GetPlaceholderTextColor();
-         }
+         value = impl.mController->GetPlaceholderTextColor();
          break;
        }
        case Toolkit::TextField::Property::PRIMARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetColor( PRIMARY_CURSOR );
-         }
+         value = impl.mDecorator->GetColor( PRIMARY_CURSOR );
          break;
        }
        case Toolkit::TextField::Property::SECONDARY_CURSOR_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetColor( SECONDARY_CURSOR );
-         }
+         value = impl.mDecorator->GetColor( SECONDARY_CURSOR );
          break;
        }
        case Toolkit::TextField::Property::ENABLE_CURSOR_BLINK:
        }
        case Toolkit::TextField::Property::CURSOR_BLINK_INTERVAL:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetCursorBlinkInterval();
-         }
+         value = impl.mDecorator->GetCursorBlinkInterval();
          break;
        }
        case Toolkit::TextField::Property::CURSOR_BLINK_DURATION:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetCursorBlinkDuration();
-         }
+         value = impl.mDecorator->GetCursorBlinkDuration();
          break;
        }
        case Toolkit::TextField::Property::CURSOR_WIDTH:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetCursorWidth();
-         }
+         value = impl.mDecorator->GetCursorWidth();
          break;
        }
        case Toolkit::TextField::Property::GRAB_HANDLE_IMAGE:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED );
-         }
+         value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_RELEASED );
          break;
        }
        case Toolkit::TextField::Property::GRAB_HANDLE_PRESSED_IMAGE:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_PRESSED );
-         }
+         value = impl.mDecorator->GetHandleImage( GRAB_HANDLE, HANDLE_IMAGE_PRESSED );
          break;
        }
        case Toolkit::TextField::Property::SCROLL_THRESHOLD:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetScrollThreshold();
-         }
+         value = impl.mDecorator->GetScrollThreshold();
          break;
        }
        case Toolkit::TextField::Property::SCROLL_SPEED:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetScrollSpeed();
-         }
+         value = impl.mDecorator->GetScrollSpeed();
          break;
        }
        case Toolkit::TextField::Property::SELECTION_HANDLE_IMAGE_LEFT:
        }
        case Toolkit::TextField::Property::SELECTION_HIGHLIGHT_COLOR:
        {
-         if( impl.mDecorator )
-         {
-           value = impl.mDecorator->GetHighlightColor();
-         }
+         value = impl.mDecorator->GetHighlightColor();
          break;
        }
        case Toolkit::TextField::Property::DECORATION_BOUNDING_BOX:
        {
-         if( impl.mDecorator )
-         {
-           Rect<int> boundingBox;
-           impl.mDecorator->GetBoundingBox( boundingBox );
-           value = boundingBox;
-         }
+         Rect<int> boundingBox;
+         impl.mDecorator->GetBoundingBox( boundingBox );
+         value = boundingBox;
          break;
        }
        case Toolkit::TextField::Property::INPUT_METHOD_SETTINGS:
        }
        case Toolkit::TextField::Property::INPUT_COLOR:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputColor();
-         }
+         value = impl.mController->GetInputColor();
          break;
        }
        case Toolkit::TextField::Property::ENABLE_MARKUP:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsMarkupProcessorEnabled();
-         }
+         value = impl.mController->IsMarkupProcessorEnabled();
          break;
        }
        case Toolkit::TextField::Property::INPUT_FONT_FAMILY:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputFontFamily();
-         }
+         value = impl.mController->GetInputFontFamily();
          break;
        }
        case Toolkit::TextField::Property::INPUT_FONT_STYLE:
        }
        case Toolkit::TextField::Property::INPUT_POINT_SIZE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetInputFontPointSize();
-         }
+         value = impl.mController->GetInputFontPointSize();
          break;
        }
        case Toolkit::TextField::Property::UNDERLINE:
        }
        case Toolkit::TextField::Property::PIXEL_SIZE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE );
-         }
+         value = impl.mController->GetDefaultFontSize( Text::Controller::PIXEL_SIZE );
          break;
        }
        case Toolkit::TextField::Property::ENABLE_SELECTION:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsSelectionEnabled();
-         }
+         value = impl.mController->IsSelectionEnabled();
          break;
        }
        case Toolkit::TextField::Property::PLACEHOLDER:
        }
        case Toolkit::TextField::Property::ELLIPSIS:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsTextElideEnabled();
-         }
+         value = impl.mController->IsTextElideEnabled();
          break;
        }
        case Toolkit::DevelTextField::Property::ENABLE_SHIFT_SELECTION:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsShiftSelectionEnabled();
-         }
+         value = impl.mController->IsShiftSelectionEnabled();
          break;
        }
        case Toolkit::DevelTextField::Property::ENABLE_GRAB_HANDLE:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsGrabHandleEnabled();
-         }
+         value = impl.mController->IsGrabHandleEnabled();
          break;
        }
        case Toolkit::DevelTextField::Property::MATCH_SYSTEM_LANGUAGE_DIRECTION:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsMatchSystemLanguageDirection();
-         }
+         value = impl.mController->IsMatchSystemLanguageDirection();
          break;
        }
        case Toolkit::DevelTextField::Property::ENABLE_GRAB_HANDLE_POPUP:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->IsGrabHandlePopupEnabled();
-         }
+         value = impl.mController->IsGrabHandlePopupEnabled();
          break;
        }
        case Toolkit::DevelTextField::Property::BACKGROUND:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetBackgroundColor();
-         }
+         value = impl.mController->GetBackgroundColor();
          break;
        }
        case Toolkit::DevelTextField::Property::SELECTED_TEXT:
        {
-         if( impl.mController )
-         {
-           value = impl.mController->GetSelectedText( );
-         }
+         value = impl.mController->GetSelectedText( );
          break;
        }
 +      case Toolkit::DevelTextField::Property::SELECTED_TEXT_START:
 +      {
 +        Uint32Pair range = impl.GetTextSelectionRange( );
 +        value = static_cast<int>(range.first);
 +        break;
 +      }
 +      case Toolkit::DevelTextField::Property::SELECTED_TEXT_END:
 +      {
 +        Uint32Pair range = impl.GetTextSelectionRange( );
 +        value = static_cast<int>(range.second);
 +        break;
 +      }
      } //switch
    }
  
@@@ -1287,26 -1056,6 +1090,26 @@@ void TextField::SelectNone(
    }
  }
  
 +void TextField::SetTextSelectionRange(const uint32_t *start, const uint32_t *end)
 +{
 +  if( mController && mController->IsShowingRealText() )
 +  {
 +    mController->SetTextSelectionRange( start, end );
 +    SetKeyInputFocus();
 +  }
 +}
 +
 +Uint32Pair TextField::GetTextSelectionRange() const
 +{
 +  Uint32Pair range;
 +  if( mController && mController->IsShowingRealText() )
 +  {
 +    range = mController->GetTextSelectionRange();
 +  }
 +  return range;
 +}
 +
 +
  InputMethodContext TextField::GetInputMethodContext()
  {
    return mInputMethodContext;
@@@ -1359,7 -1108,7 +1162,7 @@@ void TextField::OnInitialize(
  {
    Actor self = Self();
  
 -  mController = Text::Controller::New( this, this );
 +  mController = Text::Controller::New( this, this ,this);
  
    // When using the vector-based rendering, the size of the GLyphs are different
    TextAbstraction::GlyphType glyphType = (DevelText::RENDERING_VECTOR_BASED == mRenderingBackend) ? TextAbstraction::VECTOR_GLYPH : TextAbstraction::BITMAP_GLYPH;