// CLASS HEADER
#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 <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>
TextView::TextViewProcessorMetadata::TextViewProcessorMetadata()
: mType( TextView::TextSet ),
- mPosition( 0 ),
- mNumberOfCharacters( 0 ),
- mText()
+ mPosition( 0u ),
+ mNumberOfCharacters( 0u ),
+ mText(),
+ mStyleMask(TextStyle::NONE)
{
}
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( std::size_t position, std::size_t numberOfCharacters, const std::string& 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( 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
RELAYOUT_ALIGNMENT |
RELAYOUT_VISIBILITY |
RELAYOUT_TEXT_ACTOR_UPDATE |
- RELAYOUT_INSERT_TO_TEXT_VIEW |
- RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+ RELAYOUT_INSERT_TO_TEXT_VIEW );
}
}
}
}
// 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 );
}
}
RELAYOUT_ALIGNMENT |
RELAYOUT_VISIBILITY |
RELAYOUT_TEXT_ACTOR_UPDATE |
- RELAYOUT_INSERT_TO_TEXT_VIEW |
- RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+ RELAYOUT_INSERT_TO_TEXT_VIEW );
}
}
}
RELAYOUT_ALIGNMENT |
RELAYOUT_VISIBILITY |
RELAYOUT_TEXT_ACTOR_UPDATE |
- RELAYOUT_INSERT_TO_TEXT_VIEW |
- RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
+ RELAYOUT_INSERT_TO_TEXT_VIEW );
}
}
}
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 );
}
}
}
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();
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()
if( hasGlyphActors )
{
mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_VIEW );
- mRelayoutOperations = static_cast<RelayoutOperationMask>( mRelayoutOperations | RELAYOUT_INSERT_TO_TEXT_ACTOR_LIST );
}
-
}
}
}
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();
}
TextView::LayoutParameters::LayoutParameters()
: mMultilinePolicy( Toolkit::TextView::SplitByNewLineChar ),
+ mExceedPolicy( TextView::Original ),
mWidthExceedPolicy( Toolkit::TextView::Original ),
mHeightExceedPolicy( Toolkit::TextView::Original ),
mHorizontalAlignment( Toolkit::Alignment::HorizontalCenter ),
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()
+{
}
TextView::LayoutParameters::LayoutParameters( Toolkit::TextView::MultilinePolicy multilinePolicy,
Toolkit::Alignment::Type alignmentType,
Toolkit::TextView::LineJustification lineJustification,
float lineHeightOffset,
- const std::string& ellipsizeText,
bool markUpEnabled )
: mMultilinePolicy( multilinePolicy ),
+ mExceedPolicy( TextView::Original ),
mWidthExceedPolicy( widthExceedPolicy ),
mHeightExceedPolicy( heightExceedPolicy ),
mHorizontalAlignment(),
mVerticalAlignment(),
mLineJustification( lineJustification ),
mLineHeightOffset( lineHeightOffset ),
- mEllipsizeText(),
mMarkUpEnabled( markUpEnabled )
{
// Sets alignment
mHorizontalAlignment = horizontalAlignment;
mVerticalAlignment = verticalAlignment;
-
- // Sets ellipsize text
- MarkupProcessor::StyledTextArray styledEllipsize;
- MarkupProcessor::GetStyledTextArray( ellipsizeText, mEllipsizeText, mMarkUpEnabled );
}
TextView::LayoutParameters::LayoutParameters( const TextView::LayoutParameters& layoutParameters )
: mMultilinePolicy( layoutParameters.mMultilinePolicy ),
+ mExceedPolicy( TextView::Original ),
mWidthExceedPolicy( layoutParameters.mWidthExceedPolicy ),
mHeightExceedPolicy( layoutParameters.mHeightExceedPolicy ),
mHorizontalAlignment( layoutParameters.mHorizontalAlignment ),
mVerticalAlignment( layoutParameters.mVerticalAlignment ),
mLineJustification( layoutParameters.mLineJustification ),
mLineHeightOffset( layoutParameters.mLineHeightOffset ),
- mEllipsizeText( layoutParameters.mEllipsizeText ),
mMarkUpEnabled( layoutParameters.mMarkUpEnabled )
{
}
mVerticalAlignment = layoutParameters.mVerticalAlignment;
mLineJustification = layoutParameters.mLineJustification;
mLineHeightOffset = layoutParameters.mLineHeightOffset;
- mEllipsizeText = layoutParameters.mEllipsizeText;
mMarkUpEnabled = layoutParameters.mMarkUpEnabled;
return *this;
static_cast<Toolkit::Alignment::Type>( Toolkit::Alignment::HorizontalCenter | Toolkit::Alignment::VerticalCenter ),
Toolkit::TextView::Left,
PointSize( 0.f ),
- std::string( "..." ),
false ),
mVisualParameters(),
mRelayoutData(),
mPreviousSnapshotModeEnabled( false ),
mMarkUpEnabled( false )
{
- TextViewProcessor::CreateWordTextInfo( mLayoutParameters.mEllipsizeText,
- mRelayoutData.mTextLayoutInfo.mEllipsizeLayoutInfo );
+ // Creates the ellipsis layout info.
+ CreateEllipsizeLayout();
}
TextView::~TextView()
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();
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 )
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 );
}
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;
}
}
{
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 )
}
}
-void TextView::OnTextPan( Actor actor, PanGesture gesture )
+void TextView::OnTextPan( Actor actor, const PanGesture& gesture )
{
if( 1u == gesture.numberOfTouches )
{
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>() );
void TextView::OnFadeBoundaryPropertySet( Property::Value propertyValue )
{
Vector4 value( propertyValue.Get<Vector4>() );
- DALI_ASSERT_ALWAYS( value.x >= 0 && value.y >= 0 && value.z >= 0 && value.w >= 0
+ 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. " );
Toolkit::TextView::FadeBoundary fadeBoundary( PixelSize( static_cast<unsigned int>( value.x ) ),