Merge "Show CopyPaste Poup on long press" into devel/master
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Wed, 1 Jul 2015 18:13:34 +0000 (11:13 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Wed, 1 Jul 2015 18:13:34 +0000 (11:13 -0700)
1  2 
dali-toolkit/internal/text/text-controller-impl.cpp

@@@ -171,6 -171,11 +171,11 @@@ bool Controller::Impl::ProcessInputEven
            OnTapEvent( *iter );
            break;
          }
+         case Event::LONG_PRESS_EVENT:
+         {
+           OnLongPressEvent( *iter );
+           break;
+         }
          case Event::PAN_EVENT:
          {
            OnPanEvent( *iter );
@@@ -539,6 -544,15 +544,15 @@@ void Controller::Impl::OnPanEvent( cons
    }
  }
  
+ void Controller::Impl::OnLongPressEvent( const Event& event )
+ {
+   if  ( EventData::EDITING == mEventData->mState )
+   {
+     ChangeState ( EventData::EDITING_WITH_POPUP );
+     mEventData->mDecoratorUpdated = true;
+   }
+ }
  void Controller::Impl::OnHandleEvent( const Event& event )
  {
    if( NULL == mEventData )
@@@ -998,7 -1012,10 +1012,10 @@@ void Controller::Impl::SetPopupButtons(
    }
    else if  ( EventData::EDITING_WITH_POPUP == mEventData->mState )
    {
-     buttonsToShow = TextSelectionPopup::Buttons( TextSelectionPopup::SELECT | TextSelectionPopup::SELECT_ALL );
+     if ( mLogicalModel->mText.Count() && !IsShowingPlaceholderText())
+     {
+       buttonsToShow = TextSelectionPopup::Buttons( TextSelectionPopup::SELECT | TextSelectionPopup::SELECT_ALL );
+     }
  
      if ( !IsClipboardEmpty() )
      {
@@@ -1228,7 -1245,6 +1245,7 @@@ CharacterIndex Controller::Impl::GetClo
  
    // Get the glyphs per character table.
    const Length* const glyphsPerCharacterBuffer = mVisualModel->mGlyphsPerCharacter.Begin();
 +  const Length* const charactersPerGlyphBuffer = mVisualModel->mCharactersPerGlyph.Begin();
  
    // If the vector is void, there is no right to left characters.
    const bool hasRightToLeftCharacters = NULL != visualToLogicalBuffer;
      // The character in logical order.
      const CharacterIndex characterLogicalOrderIndex = hasRightToLeftCharacters ? *( visualToLogicalBuffer + visualIndex ) : visualIndex;
  
 +    // Get the script of the character.
 +    const Script script = mLogicalModel->GetScript( characterLogicalOrderIndex );
 +
      // The first glyph for that character in logical order.
      const GlyphIndex glyphLogicalOrderIndex = *( charactersToGlyphBuffer + characterLogicalOrderIndex );
 -
      // The number of glyphs for that character
      const Length numberOfGlyphs = *( glyphsPerCharacterBuffer + characterLogicalOrderIndex );
  
  
      const Vector2& position = *( positionsBuffer + glyphLogicalOrderIndex );
  
 -    // Find the mid-point of the area containing the glyph
 -    const float glyphCenter = -glyphMetrics.xBearing + position.x + 0.5f * glyphMetrics.advance;
 +    // Prevents to jump the whole Latin ligatures like fi, ff, ...
 +    const Length numberOfCharactersInLigature = ( TextAbstraction::LATIN == script ) ? *( charactersPerGlyphBuffer + glyphLogicalOrderIndex ) : 1u;
 +    const float glyphAdvance = glyphMetrics.advance / static_cast<float>( numberOfCharactersInLigature );
 +
 +    for( GlyphIndex index = 0u; !matched && ( index < numberOfCharactersInLigature ); ++index )
 +    {
 +      // Find the mid-point of the area containing the glyph
 +      const float glyphCenter = -glyphMetrics.xBearing + position.x + ( static_cast<float>( index ) + 0.5f ) * glyphAdvance;
 +
 +      if( visualX < glyphCenter )
 +      {
 +        visualIndex += index;
 +        matched = true;
 +        break;
 +      }
 +    }
  
 -    if( visualX < glyphCenter )
 +    if( matched )
      {
 -      matched = true;
        break;
      }
    }
  
    logicalIndex = hasRightToLeftCharacters ? *( visualToLogicalCursorBuffer + visualIndex ) : visualIndex;
    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "%p closest visualIndex %d logicalIndex %d\n", this, visualIndex, logicalIndex );
 +
    return logicalIndex;
  }