Merge "Updated shader source to set precision explicitly" into tizen
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / internal / controls / text-view / text-view-impl.cpp
index 6bfaed3..3e08d27 100644 (file)
@@ -1,30 +1,36 @@
-//
-// Copyright (c) 2014 Samsung Electronics Co., Ltd.
-//
-// Licensed under the Flora License, Version 1.0 (the License);
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//     http://floralicense.org/license/
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an AS IS BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-//
+/*
+ * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
 
 // CLASS HEADER
-#include "text-view-impl.h"
+#include <dali-toolkit/internal/controls/text-view/text-view-impl.h>
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/common/stage.h>
+#include <dali/public-api/object/type-registry.h>
+#include <dali/public-api/render-tasks/render-task-list.h>
 
 // INTERNAL INCLUDES
-#include "split-by-new-line-char-policies.h"
-#include "split-by-word-policies.h"
-#include "split-by-char-policies.h"
-#include "text-view-processor.h"
-#include "text-view-word-processor.h"
-#include "relayout-utilities.h"
-#include "text-view-processor-dbg.h"
+#include <dali-toolkit/internal/controls/text-view/split-by-new-line-char-policies.h>
+#include <dali-toolkit/internal/controls/text-view/split-by-word-policies.h>
+#include <dali-toolkit/internal/controls/text-view/split-by-char-policies.h>
+#include <dali-toolkit/internal/controls/text-view/text-processor-bidirectional-info.h>
+#include <dali-toolkit/internal/controls/text-view/text-view-processor.h>
+#include <dali-toolkit/internal/controls/text-view/text-view-word-processor.h>
+#include <dali-toolkit/internal/controls/text-view/relayout-utilities.h>
 
 namespace Dali
 {
@@ -33,6 +39,15 @@ namespace Toolkit
 {
 
 const Property::Index TextView::PROPERTY_MARKUP_ENABLED( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX );
+const Property::Index TextView::PROPERTY_TEXT( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 1 );
+const Property::Index TextView::PROPERTY_MULTILINE_POLICY( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 2 );
+const Property::Index TextView::PROPERTY_WIDTH_EXCEED_POLICY( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 3 );
+const Property::Index TextView::PROPERTY_HEIGHT_EXCEED_POLICY( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 4 );
+const Property::Index TextView::PROPERTY_LINE_JUSTIFICATION( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 5 );
+const Property::Index TextView::PROPERTY_FADE_BOUNDARY( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 6 );
+const Property::Index TextView::PROPERTY_LINE_HEIGHT_OFFSET( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 7 );
+const Property::Index TextView::PROPERTY_HORIZONTAL_ALIGNMENT( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 8 );
+const Property::Index TextView::PROPERTY_VERTICAL_ALIGNMENT( Internal::TextView::TEXTVIEW_PROPERTY_START_INDEX + 9 );
 
 namespace Internal
 {
@@ -40,18 +55,9 @@ namespace Internal
 namespace
 {
 
-const char* const PROPERTY_TEXT = "text";
-const char* const PROPERTY_MULTILINE_POLICY = "multiline-policy";
-const char* const PROPERTY_WIDTH_EXCEED_POLICY = "width-exceed-policy";
-const char* const PROPERTY_HEIGHT_EXCEED_POLICY = "height-exceed-policy";
-const char* const PROPERTY_LINE_JUSTIFICATION = "line-justification";
-const char* const PROPERTY_FADE_BOUNDARY_LEFT = "fade-boundary-left";
-const char* const PROPERTY_FADE_BOUNDARY_RIGHT = "fade-boundary-right";
-const char* const PROPERTY_FADE_BOUNDARY_TOP = "fade-boundary-top";
-const char* const PROPERTY_FADE_BOUNDARY_BOTTOM = "fade-boundary-bottom";
-const char* const PROPERTY_LINE_HEIGHT_OFFSET = "line-height-offset";
-const char* const PROPERTY_HORIZONTAL_ALIGNMENT = "horizontal-alignment";
-const char* const PROPERTY_VERTICAL_ALIGNMENT = "vertical-alignment";
+const char* MULTILINE_POLICY_NAME[] = {"SplitByNewLineChar", "SplitByWord", "SplitByChar"};
+const char* EXCEED_POLICY_NAME[] = {"Original", "Truncate", "Fade", "Split","ShrinkToFit","EllipsizeEnd"};
+const char* LINE_JUSTIFICATION_NAME[] = {"Left","Center","Right","Justified"};
 
 // Currently on desktop machines 2k x 2k is the maximum frame buffer size, on target is 4k x 4k.
 const float MAX_OFFSCREEN_RENDERING_SIZE = 2048.f;
@@ -66,7 +72,16 @@ TypeRegistration typeRegistration( typeid(Toolkit::TextView), typeid(Toolkit::Co
 
 SignalConnectorType signalConnector1( typeRegistration, Toolkit::TextView::SIGNAL_TEXT_SCROLLED , &TextView::DoConnectSignal );
 
-PropertyRegistration property1( typeRegistration, "markup-enabled", Toolkit::TextView::PROPERTY_MARKUP_ENABLED, Property::BOOLEAN, &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property1( typeRegistration,  "markup-enabled",       Toolkit::TextView::PROPERTY_MARKUP_ENABLED,       Property::BOOLEAN, &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property2( typeRegistration,  "text",                 Toolkit::TextView::PROPERTY_TEXT,                 Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property3( typeRegistration,  "multiline-policy",     Toolkit::TextView::PROPERTY_MULTILINE_POLICY,     Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property4( typeRegistration,  "width-exceed-policy",  Toolkit::TextView::PROPERTY_WIDTH_EXCEED_POLICY,  Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property5( typeRegistration,  "height-exceed-policy", Toolkit::TextView::PROPERTY_HEIGHT_EXCEED_POLICY, Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property6( typeRegistration,  "line-justification",   Toolkit::TextView::PROPERTY_LINE_JUSTIFICATION,   Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property7( typeRegistration,  "fade-boundary",        Toolkit::TextView::PROPERTY_FADE_BOUNDARY,        Property::VECTOR4, &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property8( typeRegistration, "line-height-offset",    Toolkit::TextView::PROPERTY_LINE_HEIGHT_OFFSET,   Property::FLOAT,   &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property9( typeRegistration, "horizontal-alignment",  Toolkit::TextView::PROPERTY_HORIZONTAL_ALIGNMENT, Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
+PropertyRegistration property10( typeRegistration, "vertical-alignment",   Toolkit::TextView::PROPERTY_VERTICAL_ALIGNMENT,   Property::STRING,  &TextView::SetProperty, &TextView::GetProperty );
 
 /**
  * Whether the text-view-processor operation sets, inserts, replaces, removes text.
@@ -112,8 +127,8 @@ bool IsTextViewProcessorNewStyleOperation( const TextView::TextViewProcessorMeta
 
 TextView::TextViewProcessorMetadata::TextViewProcessorMetadata()
 : mType( TextView::TextSet ),
-  mPosition( 0 ),
-  mNumberOfCharacters( 0 ),
+  mPosition( 0u ),
+  mNumberOfCharacters( 0u ),
   mText()
 {
 }
@@ -130,8 +145,8 @@ Toolkit::TextView TextView::New()
   // This can only be done after the CustomActor connection has been made...
   textView->Initialize();
 
-  // Enables by default the offscreen rendering.
-  textView->SetSnapshotModeEnabled( false ); /// @note Temporary disabled due to some issues with text quality and glyph loading.
+  // Disables by default the offscreen rendering.
+  textView->SetSnapshotModeEnabled( false );
 
   return handle;
 }
@@ -182,28 +197,43 @@ void TextView::InsertTextAt( std::size_t position, const std::string& text )
   InsertTextAt( position, styledText );
 }
 
-void TextView::InsertTextAt( const std::size_t position, const MarkupProcessor::StyledTextArray& text )
+void TextView::InsertTextAt( std::size_t position, const MarkupProcessor::StyledTextArray& text )
 {
-  // Creates metadata with the Insert operation.
-  TextViewProcessorMetadata metadata;
-  metadata.mType = TextView::TextInserted;
-  metadata.mPosition = position;
-  metadata.mText = text;
+  std::string textStr;
+  MarkupProcessor::GetPlainString( text, textStr );
 
-  // Store metadata.
-  mTextViewProcessorOperations.push_back( metadata );
+  if( TextProcessor::ContainsRightToLeftCharacter( Text( textStr ) ) ||
+      TextProcessor::ContainsRightToLeftCharacter( Text( GetText() ) ) )
+  {
+    // Temporary fix. Creates the whole layout if there is rtl text.
 
-  // Updates current styled text.
-  mCurrentStyledText.insert( mCurrentStyledText.begin() + position, text.begin(), text.end() );
+    MarkupProcessor::StyledTextArray textToSet = mCurrentStyledText;
+    textToSet.insert( textToSet.begin() + position, text.begin(), text.end() );
+    SetText( textToSet );
+  }
+  else
+  {
+    // Creates metadata with the Insert operation.
+    TextViewProcessorMetadata metadata;
+    metadata.mType = TextView::TextInserted;
+    metadata.mPosition = position;
+    metadata.mText = text;
 
-  // Request to be relaid out
-  RelayoutRequest();
+    // Store metadata.
+    mTextViewProcessorOperations.push_back( metadata );
 
-  // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed on order to retrieve the right values.
-  mRelayoutOperations = RELAYOUT_ALL;
+    // Updates current styled text.
+    mCurrentStyledText.insert( mCurrentStyledText.begin() + position, text.begin(), text.end() );
+
+    // Request to be relaid out
+    RelayoutRequest();
+
+    // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed on order to retrieve the right values.
+    mRelayoutOperations = RELAYOUT_ALL;
+  }
 }
 
-void TextView::ReplaceTextFromTo( const std::size_t position, const std::size_t numberOfCharacters, const std::string& text )
+void TextView::ReplaceTextFromTo( std::size_t position, std::size_t numberOfCharacters, const std::string& text )
 {
   // Creates a styled text with the markup or plain string.
   MarkupProcessor::StyledTextArray styledText;
@@ -213,51 +243,86 @@ void TextView::ReplaceTextFromTo( const std::size_t position, const std::size_t
   ReplaceTextFromTo( position, numberOfCharacters, styledText );
 }
 
-void TextView::ReplaceTextFromTo( const std::size_t position, const std::size_t numberOfCharacters, const MarkupProcessor::StyledTextArray& text )
+void TextView::ReplaceTextFromTo( std::size_t position, std::size_t numberOfCharacters, const MarkupProcessor::StyledTextArray& text )
 {
-  // Creates metadata with the Insert operation.
-  TextViewProcessorMetadata metadata;
-  metadata.mType = TextView::TextReplaced;
-  metadata.mPosition = position;
-  metadata.mNumberOfCharacters = numberOfCharacters;
-  metadata.mText = text;
+  std::string textStr;
+  MarkupProcessor::GetPlainString( text, textStr );
 
-  // Store metadata.
-  mTextViewProcessorOperations.push_back( metadata );
+  if( TextProcessor::ContainsRightToLeftCharacter( Text( textStr ) ) ||
+      TextProcessor::ContainsRightToLeftCharacter( Text( GetText() ) ) )
+  {
+    // Temporary fix. Creates the whole layout if there is rtl text.
 
-  // Updates current styled text.
-  MarkupProcessor::StyledTextArray::iterator it = mCurrentStyledText.begin() + position;
-  mCurrentStyledText.erase( it, it + numberOfCharacters );
-  it = mCurrentStyledText.begin() + position;
-  mCurrentStyledText.insert( it, text.begin(), text.end() );
+    // Updates current styled text.
+    MarkupProcessor::StyledTextArray textToSet = mCurrentStyledText;
 
-  // Request to be relaid out
-  RelayoutRequest();
+    MarkupProcessor::StyledTextArray::iterator it = textToSet.begin() + position;
+    textToSet.erase( it, it + numberOfCharacters );
+    it = textToSet.begin() + position;
+    textToSet.insert( it, text.begin(), text.end() );
 
-  // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed on order to retrieve the right values.
-  mRelayoutOperations = RELAYOUT_ALL;
+    SetText( textToSet );
+  }
+  else
+  {
+    // Creates metadata with the Insert operation.
+    TextViewProcessorMetadata metadata;
+    metadata.mType = TextView::TextReplaced;
+    metadata.mPosition = position;
+    metadata.mNumberOfCharacters = numberOfCharacters;
+    metadata.mText = text;
+
+    // Store metadata.
+    mTextViewProcessorOperations.push_back( metadata );
+
+    // Updates current styled text.
+    MarkupProcessor::StyledTextArray::iterator it = mCurrentStyledText.begin() + position;
+    mCurrentStyledText.erase( it, it + numberOfCharacters );
+    it = mCurrentStyledText.begin() + position;
+    mCurrentStyledText.insert( it, text.begin(), text.end() );
+
+    // Request to be relaid out
+    RelayoutRequest();
+
+    // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed on order to retrieve the right values.
+    mRelayoutOperations = RELAYOUT_ALL;
+  }
 }
 
-void TextView::RemoveTextFrom( const std::size_t position, const std::size_t numberOfCharacters )
+void TextView::RemoveTextFrom( std::size_t position, std::size_t numberOfCharacters )
 {
-  // Creates metadata with the Remove operation.
-  TextViewProcessorMetadata metadata;
-  metadata.mType = TextView::TextRemoved;
-  metadata.mPosition = position;
-  metadata.mNumberOfCharacters = numberOfCharacters;
+  if( TextProcessor::ContainsRightToLeftCharacter( Text( GetText() ) ) )
+  {
+    // Temporary fix. Creates the whole layout if there is rtl text.
 
-  // Store metadata.
-  mTextViewProcessorOperations.push_back( metadata );
+    // Updates current styled text.
+    MarkupProcessor::StyledTextArray textToSet = mCurrentStyledText;
+    MarkupProcessor::StyledTextArray::iterator it = textToSet.begin() + position;
+    textToSet.erase( it, it + numberOfCharacters );
 
-  // Updates current styled text.
-  MarkupProcessor::StyledTextArray::iterator it = mCurrentStyledText.begin() + position;
-  mCurrentStyledText.erase( it, it + numberOfCharacters );
+    SetText( textToSet );
+  }
+  else
+  {
+    // Creates metadata with the Remove operation.
+    TextViewProcessorMetadata metadata;
+    metadata.mType = TextView::TextRemoved;
+    metadata.mPosition = position;
+    metadata.mNumberOfCharacters = numberOfCharacters;
 
-  // Request to be relaid out
-  RelayoutRequest();
+    // Store metadata.
+    mTextViewProcessorOperations.push_back( metadata );
 
-  // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed on order to retrieve the right values.
-  mRelayoutOperations = RELAYOUT_ALL;
+    // Updates current styled text.
+    MarkupProcessor::StyledTextArray::iterator it = mCurrentStyledText.begin() + position;
+    mCurrentStyledText.erase( it, it + numberOfCharacters );
+
+    // Request to be relaid out
+    RelayoutRequest();
+
+    // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed on order to retrieve the right values.
+    mRelayoutOperations = RELAYOUT_ALL;
+  }
 }
 
 std::string TextView::GetText() const
@@ -274,7 +339,7 @@ std::string TextView::GetText() const
   return text;
 }
 
-void TextView::SetLineHeightOffset( const PointSize offset )
+void TextView::SetLineHeightOffset( PointSize offset )
 {
   if( fabsf( mLayoutParameters.mLineHeightOffset - offset ) > Math::MACHINE_EPSILON_1000 )
   {
@@ -302,8 +367,7 @@ void TextView::SetLineHeightOffset( const PointSize offset )
                                                                 RELAYOUT_ALIGNMENT |
                                                                 RELAYOUT_VISIBILITY |
                                                                 RELAYOUT_TEXT_ACTOR_UPDATE |
-                                                                RELAYOUT_INSERT_TO_TEXT_VIEW |
-                                                                RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+                                                                RELAYOUT_INSERT_TO_TEXT_VIEW );
     }
   }
 }
@@ -313,7 +377,7 @@ PointSize TextView::GetLineHeightOffset() const
   return PointSize( mLayoutParameters.mLineHeightOffset );
 }
 
-void TextView::SetStyleToCurrentText( const TextStyle& style, const TextStyle::Mask mask )
+void TextView::SetStyleToCurrentText( const TextStyle& style, TextStyle::Mask mask )
 {
   if( !mCurrentStyledText.empty() )
   {
@@ -369,14 +433,18 @@ void TextView::SetStyleToCurrentText( const TextStyle& style, const TextStyle::M
   }
 
   // Sets the new style to the ellipsize text
-  if( !mLayoutParameters.mEllipsizeText.empty() )
+  // TODO: fix this as a call to SetEllipsizeText will trigger the creation of new text actors.
+  if( 0u < mRelayoutData.mTextLayoutInfo.mEllipsisTextStyles.Count() )
   {
-    for( MarkupProcessor::StyledTextArray::iterator it = mLayoutParameters.mEllipsizeText.begin(), endIt = mLayoutParameters.mEllipsizeText.end(); it != endIt; ++it )
+    for( Vector<TextStyle*>::Iterator it = mRelayoutData.mTextLayoutInfo.mEllipsisTextStyles.Begin(),
+           endIt = mRelayoutData.mTextLayoutInfo.mEllipsisTextStyles.End();
+         it != endIt;
+         ++it )
     {
-      (*it).mStyle.Copy( style, mask );
+      (*it)->Copy( style, mask );
     }
 
-    SetEllipsizeText( mLayoutParameters.mEllipsizeText );
+    SetEllipsizeText( mRelayoutData.mTextLayoutInfo.mEllipsisText, mRelayoutData.mTextLayoutInfo.mEllipsisTextStyles );
   }
 }
 
@@ -468,8 +536,7 @@ void TextView::SetHeightExceedPolicy( Toolkit::TextView::ExceedPolicy policy )
                                                                 RELAYOUT_ALIGNMENT |
                                                                 RELAYOUT_VISIBILITY |
                                                                 RELAYOUT_TEXT_ACTOR_UPDATE |
-                                                                RELAYOUT_INSERT_TO_TEXT_VIEW |
-                                                                RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+                                                                RELAYOUT_INSERT_TO_TEXT_VIEW );
     }
   }
 }
@@ -496,8 +563,7 @@ void TextView::SetLineJustification( Toolkit::TextView::LineJustification justif
                                                                 RELAYOUT_ALIGNMENT |
                                                                 RELAYOUT_VISIBILITY |
                                                                 RELAYOUT_TEXT_ACTOR_UPDATE |
-                                                                RELAYOUT_INSERT_TO_TEXT_VIEW |
-                                                                RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+                                                                RELAYOUT_INSERT_TO_TEXT_VIEW );
     }
   }
 }
@@ -525,8 +591,7 @@ void TextView::SetFadeBoundary( const Toolkit::TextView::FadeBoundary& fadeBound
                                                                 RELAYOUT_REMOVE_TEXT_ACTORS |
                                                                 RELAYOUT_VISIBILITY |
                                                                 RELAYOUT_TEXT_ACTOR_UPDATE |
-                                                                RELAYOUT_INSERT_TO_TEXT_VIEW |
-                                                                RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+                                                                RELAYOUT_INSERT_TO_TEXT_VIEW );
     }
   }
 }
@@ -542,17 +607,35 @@ void TextView::SetEllipsizeText( const std::string& ellipsizeText )
   MarkupProcessor::StyledTextArray styledText;
   MarkupProcessor::GetStyledTextArray( ellipsizeText, styledText, IsMarkupProcessingEnabled() );
 
+  // Creates the ellipsis layout info and sets the text and styles.
   SetEllipsizeText( styledText );
 }
 
 void TextView::SetEllipsizeText( const MarkupProcessor::StyledTextArray& ellipsizeText )
 {
-  mLayoutParameters.mEllipsizeText = ellipsizeText;
+  // Converts the styled text array into a Text and a vector of TextStyles.
+  Text text;
+  Vector<TextStyle*> styles;
+  for( MarkupProcessor::StyledTextArray::const_iterator it = ellipsizeText.begin(), endIt = ellipsizeText.end(); it != endIt; ++it )
+  {
+    const MarkupProcessor::StyledText& styledText( *it );
 
-  mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo = TextViewProcessor::WordLayoutInfo();
+    text.Append( styledText.mText );
+    styles.PushBack( new TextStyle( styledText.mStyle ) );
+  }
 
-  TextViewProcessor::CreateWordTextInfo( mLayoutParameters.mEllipsizeText,
-                                         mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo );
+  // Creates the ellipsis layout info and sets the text and styles.
+  SetEllipsizeText( text, styles );
+}
+
+void TextView::SetEllipsizeText( const Text& ellipsizeText, const Vector<TextStyle*>& ellipsizeStyles )
+{
+  // Sets the text and styles for the ellipsis text.
+  mRelayoutData.mTextLayoutInfo.mEllipsisText = ellipsizeText;
+  mRelayoutData.mTextLayoutInfo.mEllipsisTextStyles = ellipsizeStyles;
+
+  // Creates the ellipsis layout info.
+  CreateEllipsizeLayout();
 
   // Request to be relaid out
   RelayoutRequest();
@@ -562,13 +645,7 @@ void TextView::SetEllipsizeText( const MarkupProcessor::StyledTextArray& ellipsi
 
 std::string TextView::GetEllipsizeText() const
 {
-  std::string text;
-  for( MarkupProcessor::StyledTextArray::const_iterator it = mLayoutParameters.mEllipsizeText.begin(), endIt = mLayoutParameters.mEllipsizeText.end(); it != endIt; ++it )
-  {
-    text.append( (*it).mText.GetText() );
-  }
-
-  return text;
+  return mRelayoutData.mTextLayoutInfo.mEllipsisText.GetText();
 }
 
 void TextView::GetTextLayoutInfo()
@@ -626,9 +703,7 @@ void TextView::GetTextLayoutInfo()
       if( hasGlyphActors )
       {
         mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_VIEW );
-        mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
       }
-
     }
   }
 }
@@ -702,11 +777,13 @@ void TextView::SetSnapshotModeEnabled( bool enable )
 
       mOffscreenImageActor.SetAnchorPoint( ParentOrigin::CENTER );
       mOffscreenImageActor.SetParentOrigin( ParentOrigin::CENTER );
+      mOffscreenImageActor.SetBlendFunc( BlendingFactor::ONE, BlendingFactor::ONE_MINUS_SRC_ALPHA,
+                                         BlendingFactor::ONE, BlendingFactor::ONE );
 
       Actor self = Self();
       self.Add( mOffscreenRootActor );
       self.Add( mOffscreenImageActor );
-      mOffscreenImageActor.SetScale(Vector3(1.f, -1.f, 1.f));
+      mOffscreenImageActor.SetScale( Vector3( 1.f, -1.f, 1.f ) );
     }
     else
     {
@@ -730,8 +807,7 @@ void TextView::SetSnapshotModeEnabled( bool enable )
       mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations |
                                                                 RELAYOUT_REMOVE_TEXT_ACTORS |
                                                                 RELAYOUT_TEXT_ACTOR_UPDATE |
-                                                                RELAYOUT_INSERT_TO_TEXT_VIEW |
-                                                                RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+                                                                RELAYOUT_INSERT_TO_TEXT_VIEW );
     }
     RelayoutRequest();
   }
@@ -752,7 +828,7 @@ bool TextView::IsMarkupProcessingEnabled() const
   return mMarkUpEnabled;
 }
 
-void TextView::SetScrollEnabled( const bool enable )
+void TextView::SetScrollEnabled( bool enable )
 {
   if( enable != mVisualParameters.mScrollEnabled )
   {
@@ -856,22 +932,21 @@ TextView::LayoutParameters::LayoutParameters()
   mVerticalAlignment( Toolkit::Alignment::VerticalCenter ),
   mLineJustification( Toolkit::TextView::Left ),
   mLineHeightOffset( 0.f ),
-  mEllipsizeText(),
   mMarkUpEnabled( false )
 {
-  // Sets ellipsize text
-  MarkupProcessor::StyledTextArray styledEllipsize;
-  MarkupProcessor::GetStyledTextArray( std::string( "..." ), mEllipsizeText, false );
 }
 
-TextView::LayoutParameters::LayoutParameters( const Toolkit::TextView::MultilinePolicy   multilinePolicy,
-                                              const Toolkit::TextView::ExceedPolicy      widthExceedPolicy,
-                                              const Toolkit::TextView::ExceedPolicy      heightExceedPolicy,
-                                              const Toolkit::Alignment::Type             alignmentType,
-                                              const Toolkit::TextView::LineJustification lineJustification,
-                                              const float                                lineHeightOffset,
-                                              const std::string&                         ellipsizeText,
-                                              const bool                                 markUpEnabled )
+TextView::LayoutParameters::~LayoutParameters()
+{
+}
+
+TextView::LayoutParameters::LayoutParameters( Toolkit::TextView::MultilinePolicy   multilinePolicy,
+                                              Toolkit::TextView::ExceedPolicy      widthExceedPolicy,
+                                              Toolkit::TextView::ExceedPolicy      heightExceedPolicy,
+                                              Toolkit::Alignment::Type             alignmentType,
+                                              Toolkit::TextView::LineJustification lineJustification,
+                                              float                                lineHeightOffset,
+                                              bool                                 markUpEnabled )
 : mMultilinePolicy( multilinePolicy ),
   mWidthExceedPolicy( widthExceedPolicy ),
   mHeightExceedPolicy( heightExceedPolicy ),
@@ -879,7 +954,6 @@ TextView::LayoutParameters::LayoutParameters( const Toolkit::TextView::Multiline
   mVerticalAlignment(),
   mLineJustification( lineJustification ),
   mLineHeightOffset( lineHeightOffset ),
-  mEllipsizeText(),
   mMarkUpEnabled( markUpEnabled )
 {
   // Sets alignment
@@ -892,10 +966,6 @@ TextView::LayoutParameters::LayoutParameters( const Toolkit::TextView::Multiline
 
   mHorizontalAlignment = horizontalAlignment;
   mVerticalAlignment = verticalAlignment;
-
-  // Sets ellipsize text
-  MarkupProcessor::StyledTextArray styledEllipsize;
-  MarkupProcessor::GetStyledTextArray( ellipsizeText, mEllipsizeText, mMarkUpEnabled );
 }
 
 TextView::LayoutParameters::LayoutParameters( const TextView::LayoutParameters& layoutParameters )
@@ -906,7 +976,6 @@ TextView::LayoutParameters::LayoutParameters( const TextView::LayoutParameters&
   mVerticalAlignment( layoutParameters.mVerticalAlignment ),
   mLineJustification( layoutParameters.mLineJustification ),
   mLineHeightOffset( layoutParameters.mLineHeightOffset ),
-  mEllipsizeText( layoutParameters.mEllipsizeText ),
   mMarkUpEnabled( layoutParameters.mMarkUpEnabled )
 {
 }
@@ -920,7 +989,6 @@ TextView::LayoutParameters& TextView::LayoutParameters::operator=( const TextVie
   mVerticalAlignment = layoutParameters.mVerticalAlignment;
   mLineJustification = layoutParameters.mLineJustification;
   mLineHeightOffset = layoutParameters.mLineHeightOffset;
-  mEllipsizeText = layoutParameters.mEllipsizeText;
   mMarkUpEnabled = layoutParameters.mMarkUpEnabled;
 
   return *this;
@@ -1000,7 +1068,7 @@ TextView::RelayoutData& TextView::RelayoutData::operator=( const TextView::Relay
 }
 
 TextView::TextView()
-: ControlImpl( false ),  // doesn't require touch events
+: Control( REQUIRES_STYLE_CHANGE_SIGNALS  ),
   mCurrentStyledText(),
   mTextViewProcessorOperations(),
   mLayoutParameters( Toolkit::TextView::SplitByNewLineChar,
@@ -1009,7 +1077,6 @@ TextView::TextView()
                      static_cast<Toolkit::Alignment::Type>( Toolkit::Alignment::HorizontalCenter | Toolkit::Alignment::VerticalCenter ),
                      Toolkit::TextView::Left,
                      PointSize( 0.f ),
-                     std::string( "..." ),
                      false ),
   mVisualParameters(),
   mRelayoutData(),
@@ -1025,8 +1092,8 @@ TextView::TextView()
   mPreviousSnapshotModeEnabled( false ),
   mMarkUpEnabled( false )
 {
-  TextViewProcessor::CreateWordTextInfo( mLayoutParameters.mEllipsizeText,
-                                         mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo );
+  // Creates the ellipsis layout info.
+  CreateEllipsizeLayout();
 }
 
 TextView::~TextView()
@@ -1055,7 +1122,6 @@ Vector3 TextView::GetNaturalSize()
       mRelayoutData.mGlyphActors.clear();
 
       mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_VIEW );
-      mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
     }
 
     PerformTextViewProcessorOperations();
@@ -1116,7 +1182,6 @@ float TextView::GetHeightForWidth( float width )
     if( hasGlyphActors )
     {
       mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_VIEW );
-      mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
     }
 
     if( differentWidth || hasGlyphActors )
@@ -1134,83 +1199,16 @@ float TextView::GetWidthForHeight( float height )
   return GetNaturalSize().width;
 }
 
-void TextView::OnPropertySet( Property::Index index, Property::Value propertyValue )
-{
-  if( index == mPropertyText )
-  {
-    SetText(propertyValue.Get<std::string>());
-  }
-  else if( index == mPropertyMultilinePolicy )
-  {
-    OnMultilinePolicyPropertySet(propertyValue);
-  }
-  else if( index == mPropertyWidthExceedPolicy )
-  {
-    OnWidthExceedPolicyPropertySet(propertyValue);
-  }
-  else if( index == mPropertyHeightExceedPolicy )
-  {
-    OnHeightExceedPolicyPropertySet(propertyValue);
-  }
-  else if( index == mPropertyLineJustification )
-  {
-    OnLineJustificationPropertySet(propertyValue);
-  }
-  else if( ( index == mPropertyFadeBoundaryLeft )  ||
-           ( index == mPropertyFadeBoundaryRight ) ||
-           ( index == mPropertyFadeBoundaryTop )   ||
-           ( index == mPropertyFadeBoundaryBottom ) )
-  {
-    OnFadeBoundaryPropertySet( index, propertyValue );
-  }
-  else if( index == mPropertyLineHeightOffset )
-  {
-    Dali::PointSize pointSize( propertyValue.Get<float>() );
-    SetLineHeightOffset(pointSize);
-  }
-  else if ( ( index == mPropertyHorizontalAlignment ) ||
-            ( index == mPropertyVerticalAlignment ) )
-  {
-    OnAlignmentPropertySet( index, propertyValue );
-  }
-}
 
 void TextView::OnInitialize()
 {
-  Actor self = Self();
-
-  mPropertyText = self.RegisterProperty( PROPERTY_TEXT, "", Property::READ_WRITE );
-
-  mPropertyMultilinePolicy = self.RegisterProperty( PROPERTY_MULTILINE_POLICY, "SplitByNewLineChar", Property::READ_WRITE );
-
-  mPropertyWidthExceedPolicy = self.RegisterProperty( PROPERTY_WIDTH_EXCEED_POLICY, "Original", Property::READ_WRITE );
-
-  mPropertyHeightExceedPolicy = self.RegisterProperty( PROPERTY_HEIGHT_EXCEED_POLICY, "Original", Property::READ_WRITE );
-
-  mPropertyLineJustification = self.RegisterProperty( PROPERTY_LINE_JUSTIFICATION, "Left", Property::READ_WRITE );
-
-  mPropertyFadeBoundaryLeft = self.RegisterProperty( PROPERTY_FADE_BOUNDARY_LEFT, static_cast< int >( 0 ), Property::READ_WRITE );
-
-  mPropertyFadeBoundaryRight = self.RegisterProperty( PROPERTY_FADE_BOUNDARY_RIGHT, static_cast< int >( 0 ), Property::READ_WRITE );
-
-  mPropertyFadeBoundaryTop = self.RegisterProperty( PROPERTY_FADE_BOUNDARY_TOP, static_cast< int >( 0 ), Property::READ_WRITE );
-
-  mPropertyFadeBoundaryBottom = self.RegisterProperty( PROPERTY_FADE_BOUNDARY_BOTTOM, static_cast< int >( 0 ), Property::READ_WRITE );
-
-  mPropertyLineHeightOffset = self.RegisterProperty( PROPERTY_LINE_HEIGHT_OFFSET, 0.0f, Property::READ_WRITE );
-
-  mPropertyHorizontalAlignment = self.RegisterProperty( PROPERTY_HORIZONTAL_ALIGNMENT, "HorizontalCenter", Property::READ_WRITE );
-
-  mPropertyVerticalAlignment = self.RegisterProperty( PROPERTY_VERTICAL_ALIGNMENT, "VerticalCenter", Property::READ_WRITE );
-
 }
 
 
-void TextView::OnStyleChange( StyleChange change )
+void TextView::OnFontChange( bool defaultFontChange, bool defaultFontSizeChange )
 {
-  mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo = TextViewProcessor::WordLayoutInfo();
-  TextViewProcessor::CreateWordTextInfo( mLayoutParameters.mEllipsizeText,
-                                         mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo );
+  // Creates the ellipsis layout info.
+  CreateEllipsizeLayout();
 
   SetText( mCurrentStyledText );
 }
@@ -1246,8 +1244,18 @@ void TextView::OnRelaidOut( Vector2 size, ActorSizeContainer& container )
                                                                 RELAYOUT_ALIGNMENT |
                                                                 RELAYOUT_VISIBILITY |
                                                                 RELAYOUT_TEXT_ACTOR_UPDATE |
-                                                                RELAYOUT_INSERT_TO_TEXT_VIEW |
-                                                                RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+                                                                RELAYOUT_INSERT_TO_TEXT_VIEW );
+    }
+  }
+
+  if( ( Toolkit::TextView::Fade == mLayoutParameters.mWidthExceedPolicy ) ||
+      ( Toolkit::TextView::Fade == mLayoutParameters.mHeightExceedPolicy ) )
+  {
+    if( mRelayoutOperations & RELAYOUT_ALIGNMENT )
+    {
+      // If the text of the alignment changes and a fade exceed policy is set,
+      // some characters may need new TextActor.
+      mRelayoutOperations = RELAYOUT_ALL;
     }
   }
 
@@ -1355,9 +1363,9 @@ void TextView::OptimizeTextViewProcessorOperations()
       {
         bool optimizationDone = false;
 
-        if( it + 1 != endIt )
+        if( it + 1u != endIt )
         {
-          const TextViewProcessorMetadata& nextRelayoutMetadata( *( it + 1 ) );
+          const TextViewProcessorMetadata& nextRelayoutMetadata( *( it + 1u ) );
           if( TextView::TextInserted == nextRelayoutMetadata.mType )
           {
             if( relayoutMetadata.mPosition == nextRelayoutMetadata.mPosition )
@@ -1392,7 +1400,7 @@ void TextView::OptimizeTextViewProcessorOperations()
   mTextViewProcessorOperations = textViewProcessorOperations;
 }
 
-void TextView::DoRelayOut( const Size& textViewSize, const RelayoutOperationMask relayoutOperationMask )
+void TextView::DoRelayOut( const Size& textViewSize, RelayoutOperationMask relayoutOperationMask )
 {
   // Traverse the relayout operation vector. It fills the natural size, layout and glyph-actor data structures.
   if( !mTextViewProcessorOperations.empty() )
@@ -1835,6 +1843,11 @@ void TextView::CombineExceedPolicies()
           mLayoutParameters.mExceedPolicy = SplitShrink;
           break;
         }
+        case Toolkit::TextView::EllipsizeEnd:
+        {
+          mLayoutParameters.mExceedPolicy = SplitEllipsizeEnd;
+          break;
+        }
         default:
         {
           DALI_ASSERT_ALWAYS( !"TextView::CombineExceedPolicies() Invalid width and height exceed policies combination" );
@@ -1935,6 +1948,34 @@ Actor TextView::GetRootActor() const
   return rootActor;
 }
 
+void TextView::CreateEllipsizeLayout()
+{
+  // Creates the ellipsis layout info for the ellipsis text and styles.
+  mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo = TextViewProcessor::WordLayoutInfo();
+  mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo.mCharactersLayoutInfo.resize( mRelayoutData.mTextLayoutInfo.mEllipsisText.GetLength(), TextViewProcessor::CharacterLayoutInfo() );
+  TextViewProcessor::CreateWordTextInfo( mRelayoutData.mTextLayoutInfo.mEllipsisText,
+                                         mRelayoutData.mTextLayoutInfo.mEllipsisTextStyles,
+                                         mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo );
+}
+
+void TextView::OnMarkupEnabledPeopertySet( Property::Value propertyValue )
+{
+  bool newValue( propertyValue.Get<bool>() );
+  if( newValue != IsMarkupProcessingEnabled() )
+  {
+    SetMarkupProcessingEnabled( newValue );
+    if( newValue )
+    {
+      // If markup processing has been enabled, Ensure current text is reprocessed.
+      const std::string& currentText( GetText() );
+      if( ! currentText.empty() )
+      {
+        SetText( currentText );
+      }
+    }
+  }
+}
+
 void TextView::OnMultilinePolicyPropertySet( Property::Value propertyValue )
 {
   std::string policyName( propertyValue.Get<std::string>() );
@@ -1963,10 +2004,6 @@ void TextView::OnWidthExceedPolicyPropertySet( Property::Value propertyValue )
   {
     SetWidthExceedPolicy(Toolkit::TextView::Original);
   }
-  else if(policyName == "Truncate")
-  {
-    SetWidthExceedPolicy(Toolkit::TextView::Truncate);
-  }
   else if(policyName == "Fade")
   {
     SetWidthExceedPolicy(Toolkit::TextView::Fade);
@@ -1996,10 +2033,6 @@ void TextView::OnHeightExceedPolicyPropertySet( Property::Value propertyValue )
   {
     SetHeightExceedPolicy(Toolkit::TextView::Original);
   }
-  else if(policyName == "Truncate")
-  {
-    SetHeightExceedPolicy(Toolkit::TextView::Truncate);
-  }
   else if(policyName == "Fade")
   {
     SetHeightExceedPolicy(Toolkit::TextView::Fade);
@@ -2043,37 +2076,25 @@ void TextView::OnLineJustificationPropertySet( Property::Value propertyValue )
   }
 }
 
-void TextView::OnFadeBoundaryPropertySet( Property::Index propertyIndex, Property::Value propertyValue )
+void TextView::OnFadeBoundaryPropertySet( Property::Value propertyValue )
 {
-  PixelSize boundary( propertyValue.Get<unsigned int>() );
+  Vector4 value( propertyValue.Get<Vector4>() );
+  DALI_ASSERT_ALWAYS( ( value.x >= 0.f ) && ( value.y >= 0.f ) && ( value.z >= 0.f ) && ( value.w >= 0.f )
+                      && "TextView::OnFadeBoundaryPropertySet(). Negative value is invalid. "  );
 
-  if ( propertyIndex == mPropertyFadeBoundaryLeft )
-  {
-    mVisualParameters.mFadeBoundary.mLeft = boundary;
-  }
-  else if ( propertyIndex == mPropertyFadeBoundaryRight )
-  {
-    mVisualParameters.mFadeBoundary.mRight = boundary;
-  }
-  else if ( propertyIndex == mPropertyFadeBoundaryTop )
-  {
-    mVisualParameters.mFadeBoundary.mTop = boundary;
-  }
-  else if ( propertyIndex == mPropertyFadeBoundaryBottom )
-  {
-    mVisualParameters.mFadeBoundary.mBottom = boundary;
-  }
-  else
-  {
-    DALI_ASSERT_ALWAYS( !"TextView::OnFadeBoundaryPropertySet(). Invalid Property value." );
-  }
+  Toolkit::TextView::FadeBoundary fadeBoundary( PixelSize( static_cast<unsigned int>( value.x ) ),
+                                                PixelSize( static_cast<unsigned int>( value.y ) ),
+                                                PixelSize( static_cast<unsigned int>( value.z ) ),
+                                                PixelSize( static_cast<unsigned int>( value.w ) ) );
+
+  SetFadeBoundary( fadeBoundary );
 }
 
 void TextView::OnAlignmentPropertySet( Property::Index propertyIndex, Property::Value propertyValue )
 {
   std::string value( propertyValue.Get<std::string>() );
 
-  if( propertyIndex == mPropertyHorizontalAlignment )
+  if( propertyIndex == Toolkit::TextView::PROPERTY_HORIZONTAL_ALIGNMENT )
   {
     if(value == "HorizontalLeft")
     {
@@ -2092,7 +2113,7 @@ void TextView::OnAlignmentPropertySet( Property::Index propertyIndex, Property::
       DALI_ASSERT_ALWAYS( !"TextView::OnAlignmentPropertySet(). Invalid Property value." );
     }
   }
-  else if( propertyIndex == mPropertyVerticalAlignment )
+  else if( propertyIndex == Toolkit::TextView::PROPERTY_VERTICAL_ALIGNMENT )
   {
     if( value == "VerticalTop" )
     {
@@ -2111,42 +2132,187 @@ void TextView::OnAlignmentPropertySet( Property::Index propertyIndex, Property::
       DALI_ASSERT_ALWAYS( !"TextView::OnAlignmentPropertySet(). Invalid Property value." );
     }
   }
+
+  RelayoutRequest();
+
+  // If a GetTextLayoutInfo() or GetHeightForWidth() arrives, relayout the text synchronously is needed in order to retrieve the right values.
+  if( RELAYOUT_ALL != mRelayoutOperations )
+  {
+    mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations |
+                                                              RELAYOUT_TEXT_ACTOR_UPDATE |
+                                                              RELAYOUT_ALIGNMENT |
+                                                              RELAYOUT_VISIBILITY );
+  }
+}
+
+std::string TextView::OnHorizontalAlignmentPropertyGet()
+{
+  if( mLayoutParameters.mHorizontalAlignment == Toolkit::Alignment::HorizontalLeft )
+  {
+    return "HorizontalLeft";
+  }
+  else if( mLayoutParameters.mHorizontalAlignment == Toolkit::Alignment::HorizontalCenter )
+  {
+    return "HorizontalCenter";
+  }
+  else if( mLayoutParameters.mHorizontalAlignment == Toolkit::Alignment::HorizontalRight )
+  {
+    return "HorizontalRight";
+  }
+  else
+  {
+    DALI_ASSERT_ALWAYS( !"TextView::OnHorizontalAlignmentPropertyGet(). Invalid value." );
+  }
+}
+
+std::string TextView::OnVerticalAlignmentPropertyGet()
+{
+  if( mLayoutParameters.mVerticalAlignment == Toolkit::Alignment::VerticalTop )
+   {
+     return "VerticalTop";
+   }
+   else if( mLayoutParameters.mVerticalAlignment == Toolkit::Alignment::VerticalCenter )
+   {
+     return "VerticalCenter";
+   }
+   else if( mLayoutParameters.mVerticalAlignment == Toolkit::Alignment::VerticalBottom )
+   {
+     return "VerticalBottom";
+   }
+   else
+   {
+     DALI_ASSERT_ALWAYS( !"TextView::OnVerticalAlignmentPropertyGet(). Invalid value." );
+   }
 }
 
 void TextView::SetProperty( BaseObject* object, Property::Index index, const Property::Value& value )
 {
   Toolkit::TextView textView = Toolkit::TextView::DownCast( Dali::BaseHandle( object ) );
 
-  if ( textView && ( index == Toolkit::TextView::PROPERTY_MARKUP_ENABLED ) )
+  if( textView )
   {
-    Internal::TextView& textViewImpl( GetImpl( textView ) );
-    bool newValue( value.Get<bool>() );
-    if( newValue != textViewImpl.IsMarkupProcessingEnabled() )
+    TextView& textViewImpl( GetImpl( textView ) );
+    switch( index )
     {
-      textViewImpl.SetMarkupProcessingEnabled( newValue );
-      if( newValue )
+      case Toolkit::TextView::PROPERTY_MARKUP_ENABLED:
       {
-        // If markup processing has been enabled, Ensure current text is reprocessed.
-        const std::string& currentText( textViewImpl.GetText() );
-        if( ! currentText.empty() )
-        {
-          textViewImpl.SetText( currentText );
-        }
+        textViewImpl.OnMarkupEnabledPeopertySet( value );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_TEXT:
+      {
+        textViewImpl.SetText( value.Get<std::string>() );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_MULTILINE_POLICY:
+      {
+        textViewImpl.OnMultilinePolicyPropertySet( value );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_WIDTH_EXCEED_POLICY:
+      {
+        textViewImpl.OnWidthExceedPolicyPropertySet( value );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_HEIGHT_EXCEED_POLICY:
+      {
+        textViewImpl.OnHeightExceedPolicyPropertySet( value );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_LINE_JUSTIFICATION:
+      {
+        textViewImpl.OnLineJustificationPropertySet( value );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_FADE_BOUNDARY:
+      {
+        textViewImpl.OnFadeBoundaryPropertySet( value );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_LINE_HEIGHT_OFFSET:
+      {
+        Dali::PointSize pointSize( value.Get<float>() );
+        textViewImpl.SetLineHeightOffset(pointSize);
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_HORIZONTAL_ALIGNMENT:
+      case Toolkit::TextView::PROPERTY_VERTICAL_ALIGNMENT:
+      {
+        textViewImpl.OnAlignmentPropertySet( index, value );
+        break;
       }
     }
   }
 }
 
-Property::Value TextView::GetProperty( BaseObject* object, Property::Index propertyIndex )
+Property::Value TextView::GetProperty( BaseObject* object, Property::Index index )
 {
+  Property::Value value;
+
   Toolkit::TextView textView = Toolkit::TextView::DownCast( Dali::BaseHandle( object ) );
 
-  if ( textView && ( propertyIndex == Toolkit::TextView::PROPERTY_MARKUP_ENABLED ) )
+  if( textView )
   {
-    return Property::Value( GetImpl( textView ).mMarkUpEnabled );
+    TextView& textViewImpl( GetImpl( textView ) );
+    switch( index )
+    {
+      case Toolkit::TextView::PROPERTY_MARKUP_ENABLED:
+      {
+        value = textViewImpl.IsMarkupProcessingEnabled();
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_TEXT:
+      {
+        value = textViewImpl.GetText();
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_MULTILINE_POLICY:
+      {
+        value = MULTILINE_POLICY_NAME[ textViewImpl.GetMultilinePolicy() ];
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_WIDTH_EXCEED_POLICY:
+      {
+        value = EXCEED_POLICY_NAME[ textViewImpl.GetWidthExceedPolicy() ];
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_HEIGHT_EXCEED_POLICY:
+      {
+        value = EXCEED_POLICY_NAME[ textViewImpl.GetHeightExceedPolicy() ];
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_LINE_JUSTIFICATION:
+      {
+        value = LINE_JUSTIFICATION_NAME[ textViewImpl.GetLineJustification() ];
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_FADE_BOUNDARY:
+      {
+        Toolkit::TextView::FadeBoundary boundary = textViewImpl.GetFadeBoundary();
+        value = Vector4( static_cast<float>( boundary.mLeft.value ),
+                         static_cast<float>( boundary.mRight.value ),
+                         static_cast<float>( boundary.mTop.value ),
+                         static_cast<float>( boundary.mBottom.value ) );
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_LINE_HEIGHT_OFFSET:
+      {
+        value = textViewImpl.GetLineHeightOffset().value;
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_HORIZONTAL_ALIGNMENT:
+      {
+        value = textViewImpl.OnHorizontalAlignmentPropertyGet();
+        break;
+      }
+      case Toolkit::TextView::PROPERTY_VERTICAL_ALIGNMENT:
+      {
+        value = textViewImpl.OnVerticalAlignmentPropertyGet();
+        break;
+      }
+    }
   }
-
-  return Property::Value();
+  return value;
 }
 
 } // namespace Internal