Merge "Calculate a new height when full relayout needed" into devel/master
authorHyunJu Shin <hyunjushin@samsung.com>
Fri, 14 Jul 2017 07:56:59 +0000 (07:56 +0000)
committerGerrit Code Review <gerrit@review.ap-northeast-2.compute.internal>
Fri, 14 Jul 2017 07:56:59 +0000 (07:56 +0000)
1  2 
dali-toolkit/internal/text/text-controller.cpp

  #include <dali-toolkit/internal/text/character-set-conversion.h>
  #include <dali-toolkit/internal/text/layouts/layout-parameters.h>
  #include <dali-toolkit/internal/text/markup-processor.h>
 +#include <dali-toolkit/internal/text/multi-language-support.h>
  #include <dali-toolkit/internal/text/text-controller-impl.h>
  #include <dali-toolkit/internal/text/text-editable-control-interface.h>
 +#include <dali-toolkit/internal/text/text-font-style.h>
  
  namespace
  {
@@@ -47,13 -45,6 +47,13 @@@ const float MAX_FLOAT = std::numeric_li
  
  const std::string EMPTY_STRING("");
  
 +const char * const PLACEHOLDER_TEXT = "placeholderText";
 +const char * const PLACEHOLDER_COLOR = "placeholderColor";
 +const char * const PLACEHOLDER_FONT_FAMILY = "placeholderFontFamily";
 +const char * const PLACEHOLDER_FONT_STYLE = "placeholderFontStyle";
 +const char * const PLACEHOLDER_POINT_SIZE = "placeholderPointSize";
 +const char * const PLACEHOLDER_PIXEL_SIZE = "placeholderPixelSize";
 +
  float ConvertToEven( float value )
  {
    int intValue(static_cast<int>( value ));
@@@ -401,16 -392,6 +401,16 @@@ bool Controller::IsTextElideEnabled() c
    return mImpl->mModel->mElideEnabled;
  }
  
 +void Controller::SetSelectionEnabled( bool enabled )
 +{
 +  mImpl->mEventData->mSelectionEnabled = enabled;
 +}
 +
 +bool Controller::IsSelectionEnabled() const
 +{
 +  return mImpl->mEventData->mSelectionEnabled;
 +}
 +
  // public : Update
  
  void Controller::SetText( const std::string& text )
@@@ -637,33 -618,6 +637,33 @@@ const std::string& Controller::GetDefau
    return EMPTY_STRING;
  }
  
 +void Controller::SetPlaceholderFontFamily( const std::string& placeholderTextFontFamily )
 +{
 +  if( NULL != mImpl->mEventData )
 +  {
 +    if( NULL == mImpl->mEventData->mPlaceholderFont )
 +    {
 +      mImpl->mEventData->mPlaceholderFont = new FontDefaults();
 +    }
 +
 +    mImpl->mEventData->mPlaceholderFont->mFontDescription.family = placeholderTextFontFamily;
 +    DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::SetPlaceholderFontFamily %s\n", placeholderTextFontFamily.c_str());
 +    mImpl->mEventData->mPlaceholderFont->familyDefined = !placeholderTextFontFamily.empty();
 +
 +    mImpl->RequestRelayout();
 +  }
 +}
 +
 +const std::string& Controller::GetPlaceholderFontFamily() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->mFontDescription.family;
 +  }
 +
 +  return EMPTY_STRING;
 +}
 +
  void Controller::SetDefaultFontWeight( FontWeight weight )
  {
    if( NULL == mImpl->mFontDefaults )
@@@ -695,41 -649,6 +695,41 @@@ FontWeight Controller::GetDefaultFontWe
    return TextAbstraction::FontWeight::NORMAL;
  }
  
 +void Controller::SetPlaceholderTextFontWeight( FontWeight weight )
 +{
 +  if( NULL != mImpl->mEventData )
 +  {
 +    if( NULL == mImpl->mEventData->mPlaceholderFont )
 +    {
 +      mImpl->mEventData->mPlaceholderFont = new FontDefaults();
 +    }
 +
 +    mImpl->mEventData->mPlaceholderFont->mFontDescription.weight = weight;
 +    mImpl->mEventData->mPlaceholderFont->weightDefined = true;
 +
 +    mImpl->RequestRelayout();
 +  }
 +}
 +
 +bool Controller::IsPlaceholderTextFontWeightDefined() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->weightDefined;
 +  }
 +  return false;
 +}
 +
 +FontWeight Controller::GetPlaceholderTextFontWeight() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->mFontDescription.weight;
 +  }
 +
 +  return TextAbstraction::FontWeight::NORMAL;
 +}
 +
  void Controller::SetDefaultFontWidth( FontWidth width )
  {
    if( NULL == mImpl->mFontDefaults )
@@@ -761,41 -680,6 +761,41 @@@ FontWidth Controller::GetDefaultFontWid
    return TextAbstraction::FontWidth::NORMAL;
  }
  
 +void Controller::SetPlaceholderTextFontWidth( FontWidth width )
 +{
 +  if( NULL != mImpl->mEventData )
 +  {
 +    if( NULL == mImpl->mEventData->mPlaceholderFont )
 +    {
 +      mImpl->mEventData->mPlaceholderFont = new FontDefaults();
 +    }
 +
 +    mImpl->mEventData->mPlaceholderFont->mFontDescription.width = width;
 +    mImpl->mEventData->mPlaceholderFont->widthDefined = true;
 +
 +    mImpl->RequestRelayout();
 +  }
 +}
 +
 +bool Controller::IsPlaceholderTextFontWidthDefined() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->widthDefined;
 +  }
 +  return false;
 +}
 +
 +FontWidth Controller::GetPlaceholderTextFontWidth() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->mFontDescription.width;
 +  }
 +
 +  return TextAbstraction::FontWidth::NORMAL;
 +}
 +
  void Controller::SetDefaultFontSlant( FontSlant slant )
  {
    if( NULL == mImpl->mFontDefaults )
@@@ -827,41 -711,6 +827,41 @@@ FontSlant Controller::GetDefaultFontSla
    return TextAbstraction::FontSlant::NORMAL;
  }
  
 +void Controller::SetPlaceholderTextFontSlant( FontSlant slant )
 +{
 +  if( NULL != mImpl->mEventData )
 +  {
 +    if( NULL == mImpl->mEventData->mPlaceholderFont )
 +    {
 +      mImpl->mEventData->mPlaceholderFont = new FontDefaults();
 +    }
 +
 +    mImpl->mEventData->mPlaceholderFont->mFontDescription.slant = slant;
 +    mImpl->mEventData->mPlaceholderFont->slantDefined = true;
 +
 +    mImpl->RequestRelayout();
 +  }
 +}
 +
 +bool Controller::IsPlaceholderTextFontSlantDefined() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->slantDefined;
 +  }
 +  return false;
 +}
 +
 +FontSlant Controller::GetPlaceholderTextFontSlant() const
 +{
 +  if( ( NULL != mImpl->mEventData ) && ( NULL != mImpl->mEventData->mPlaceholderFont ) )
 +  {
 +    return mImpl->mEventData->mPlaceholderFont->mFontDescription.slant;
 +  }
 +
 +  return TextAbstraction::FontSlant::NORMAL;
 +}
 +
  void Controller::SetDefaultFontSize( float fontSize, FontSizeType type )
  {
    if( NULL == mImpl->mFontDefaults )
      }
      case PIXEL_SIZE:
      {
 -      // Point size = Pixel size * 72 / DPI
 +      // Point size = Pixel size * 72.f / DPI
        unsigned int horizontalDpi = 0u;
        unsigned int verticalDpi = 0u;
        TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
        fontClient.GetDpi( horizontalDpi, verticalDpi );
  
 -      mImpl->mFontDefaults->mDefaultPointSize = ( fontSize * 72 ) / horizontalDpi;
 +      mImpl->mFontDefaults->mDefaultPointSize = ( fontSize * 72.f ) / static_cast< float >( horizontalDpi );
        mImpl->mFontDefaults->sizeDefined = true;
        break;
      }
 -    default:
 -    {
 -      DALI_ASSERT_ALWAYS( false );
 -    }
    }
  
    // Clear the font-specific data
@@@ -911,97 -764,18 +911,97 @@@ float Controller::GetDefaultFontSize( F
        }
        case PIXEL_SIZE:
        {
 -        // Pixel size = Point size * DPI / 72
 +        // Pixel size = Point size * DPI / 72.f
 +        unsigned int horizontalDpi = 0u;
 +        unsigned int verticalDpi = 0u;
 +        TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
 +        fontClient.GetDpi( horizontalDpi, verticalDpi );
 +
 +        value = mImpl->mFontDefaults->mDefaultPointSize * static_cast< float >( horizontalDpi ) / 72.f;
 +        break;
 +      }
 +    }
 +    return value;
 +  }
 +
 +  return value;
 +}
 +
 +void Controller::SetPlaceholderTextFontSize( float fontSize, FontSizeType type )
 +{
 +  if( NULL != mImpl->mEventData )
 +  {
 +    if( NULL == mImpl->mEventData->mPlaceholderFont )
 +    {
 +      mImpl->mEventData->mPlaceholderFont = new FontDefaults();
 +    }
 +
 +    switch( type )
 +    {
 +      case POINT_SIZE:
 +      {
 +        mImpl->mEventData->mPlaceholderFont->mDefaultPointSize = fontSize;
 +        mImpl->mEventData->mPlaceholderFont->sizeDefined = true;
 +        mImpl->mEventData->mIsPlaceholderPixelSize = false; // Font size flag
 +        break;
 +      }
 +      case PIXEL_SIZE:
 +      {
 +        // Point size = Pixel size * 72.f / DPI
          unsigned int horizontalDpi = 0u;
          unsigned int verticalDpi = 0u;
          TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
          fontClient.GetDpi( horizontalDpi, verticalDpi );
  
 -        value = mImpl->mFontDefaults->mDefaultPointSize * horizontalDpi / 72;
 +        mImpl->mEventData->mPlaceholderFont->mDefaultPointSize = ( fontSize * 72.f ) / static_cast< float >( horizontalDpi );
 +        mImpl->mEventData->mPlaceholderFont->sizeDefined = true;
 +        mImpl->mEventData->mIsPlaceholderPixelSize = true; // Font size flag
          break;
        }
 -      default:
 +    }
 +
 +    mImpl->RequestRelayout();
 +  }
 +}
 +
 +float Controller::GetPlaceholderTextFontSize( FontSizeType type ) const
 +{
 +  float value = 0.0f;
 +  if( NULL != mImpl->mEventData )
 +  {
 +    switch( type )
 +    {
 +      case POINT_SIZE:
        {
 -        DALI_ASSERT_ALWAYS( false );
 +        if( NULL != mImpl->mEventData->mPlaceholderFont )
 +        {
 +          value = mImpl->mEventData->mPlaceholderFont->mDefaultPointSize;
 +        }
 +        else
 +        {
 +          // If the placeholder text font size is not set, then return the default font size.
 +          value = GetDefaultFontSize( POINT_SIZE );
 +        }
 +        break;
 +      }
 +      case PIXEL_SIZE:
 +      {
 +        if( NULL != mImpl->mEventData->mPlaceholderFont )
 +        {
 +          // Pixel size = Point size * DPI / 72.f
 +          unsigned int horizontalDpi = 0u;
 +          unsigned int verticalDpi = 0u;
 +          TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
 +          fontClient.GetDpi( horizontalDpi, verticalDpi );
 +
 +          value = mImpl->mEventData->mPlaceholderFont->mDefaultPointSize * static_cast< float >( horizontalDpi ) / 72.f;
 +        }
 +        else
 +        {
 +          // If the placeholder text font size is not set, then return the default font size.
 +          value = GetDefaultFontSize( PIXEL_SIZE );
 +        }
 +        break;
        }
      }
      return value;
@@@ -1792,7 -1566,8 +1792,8 @@@ float Controller::GetHeightForWidth( fl
    ProcessModifyEvents();
  
    Size layoutSize;
-   if( fabsf( width - mImpl->mModel->mVisualModel->mControlSize.width ) > Math::MACHINE_EPSILON_1000 )
+   if( fabsf( width - mImpl->mModel->mVisualModel->mControlSize.width ) > Math::MACHINE_EPSILON_1000 ||
+                                                            mImpl->mTextUpdateInfo.mFullRelayoutNeeded )
    {
      // Operations that can be done only once until the text changes.
      const OperationsMask onlyOnceOperations = static_cast<OperationsMask>( CONVERT_TO_UTF32  |
@@@ -1903,86 -1678,6 +1904,86 @@@ void Controller::GetHiddenInputOption(P
    }
  }
  
 +void Controller::SetPlaceholderProperty( const Property::Map& map )
 +{
 +  const Property::Map::SizeType count = map.Count();
 +
 +  for( Property::Map::SizeType position = 0; position < count; ++position )
 +  {
 +    KeyValuePair keyValue = map.GetKeyValue( position );
 +    Property::Key& key = keyValue.first;
 +    Property::Value& value = keyValue.second;
 +
 +    if( key == PLACEHOLDER_TEXT )
 +    {
 +      std::string text = "";
 +      value.Get( text );
 +      SetPlaceholderText( text );
 +    }
 +    else if( key == PLACEHOLDER_COLOR )
 +    {
 +      Vector4 textColor;
 +      value.Get( textColor );
 +      if( GetPlaceholderTextColor() != textColor )
 +      {
 +        SetPlaceholderTextColor( textColor );
 +      }
 +    }
 +    else if( key == PLACEHOLDER_FONT_FAMILY )
 +    {
 +      std::string fontFamily = "";
 +      value.Get( fontFamily );
 +      SetPlaceholderFontFamily( fontFamily );
 +    }
 +    else if( key == PLACEHOLDER_FONT_STYLE )
 +    {
 +      SetFontStyleProperty( this, value, Text::FontStyle::PLACEHOLDER );
 +    }
 +    else if( key == PLACEHOLDER_POINT_SIZE )
 +    {
 +      float pointSize;
 +      value.Get( pointSize );
 +      if( !Equals( GetPlaceholderTextFontSize( Text::Controller::POINT_SIZE ), pointSize ) )
 +      {
 +        SetPlaceholderTextFontSize( pointSize, Text::Controller::POINT_SIZE );
 +      }
 +    }
 +    else if( key == PLACEHOLDER_PIXEL_SIZE )
 +    {
 +      float pixelSize;
 +      value.Get( pixelSize );
 +      if( !Equals( GetPlaceholderTextFontSize( Text::Controller::PIXEL_SIZE ), pixelSize ) )
 +      {
 +        SetPlaceholderTextFontSize( pixelSize, Text::Controller::PIXEL_SIZE );
 +      }
 +    }
 +  }
 +}
 +
 +void Controller::GetPlaceholderProperty( Property::Map& map )
 +{
 +  if( NULL != mImpl->mEventData )
 +  {
 +    map[ PLACEHOLDER_TEXT ] = mImpl->mEventData->mPlaceholderText;
 +    map[ PLACEHOLDER_COLOR ] = mImpl->mEventData->mPlaceholderTextColor;
 +    map[ PLACEHOLDER_FONT_FAMILY ] = GetPlaceholderFontFamily();
 +
 +    Property::Value fontStyleMapGet;
 +    GetFontStyleProperty( this, fontStyleMapGet, Text::FontStyle::PLACEHOLDER );
 +    map[ PLACEHOLDER_FONT_STYLE ] = fontStyleMapGet;
 +
 +    // Choose font size : POINT_SIZE or PIXEL_SIZE
 +    if( !mImpl->mEventData->mIsPlaceholderPixelSize )
 +    {
 +      map[ PLACEHOLDER_POINT_SIZE ] = GetPlaceholderTextFontSize( Text::Controller::POINT_SIZE );
 +    }
 +    else
 +    {
 +      map[ PLACEHOLDER_PIXEL_SIZE ] = GetPlaceholderTextFontSize( Text::Controller::PIXEL_SIZE );
 +    }
 +  }
 +}
 +
  // public : Relayout.
  
  Controller::UpdateTextType Controller::Relayout( const Size& size )
@@@ -2947,18 -2642,8 +2948,18 @@@ void Controller::InsertText( const std:
      }
  
      // Mark the first paragraph to be updated.
 -    mImpl->mTextUpdateInfo.mCharacterIndex = std::min( cursorIndex, mImpl->mTextUpdateInfo.mCharacterIndex );
 -    mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd += maxSizeOfNewText;
 +    if( Layout::Engine::SINGLE_LINE_BOX == mImpl->mLayoutEngine.GetLayout() )
 +    {
 +      mImpl->mTextUpdateInfo.mCharacterIndex = 0;
 +      mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
 +      mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = numberOfCharactersInModel + maxSizeOfNewText;
 +      mImpl->mTextUpdateInfo.mClearAll = true;
 +    }
 +    else
 +    {
 +      mImpl->mTextUpdateInfo.mCharacterIndex = std::min( cursorIndex, mImpl->mTextUpdateInfo.mCharacterIndex );
 +      mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd += maxSizeOfNewText;
 +    }
  
      // Update the cursor index.
      cursorIndex += maxSizeOfNewText;
@@@ -3056,18 -2741,8 +3057,18 @@@ bool Controller::RemoveText( int cursor
          ( ( cursorIndex + numberOfCharacters ) <= mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters ) )
      {
        // Mark the paragraphs to be updated.
 -      mImpl->mTextUpdateInfo.mCharacterIndex = std::min( cursorIndex, mImpl->mTextUpdateInfo.mCharacterIndex );
 -      mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove += numberOfCharacters;
 +      if( Layout::Engine::SINGLE_LINE_BOX == mImpl->mLayoutEngine.GetLayout() )
 +      {
 +        mImpl->mTextUpdateInfo.mCharacterIndex = 0;
 +        mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
 +        mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters - numberOfCharacters;
 +        mImpl->mTextUpdateInfo.mClearAll = true;
 +      }
 +      else
 +      {
 +        mImpl->mTextUpdateInfo.mCharacterIndex = std::min( cursorIndex, mImpl->mTextUpdateInfo.mCharacterIndex );
 +        mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove += numberOfCharacters;
 +      }
  
        // Update the input style and remove the text's style before removing the text.