Merge "Fix for Text::Controller." into devel/master
authorPaul Wisbey <p.wisbey@samsung.com>
Thu, 23 Mar 2017 10:00:28 +0000 (03:00 -0700)
committerGerrit Code Review <gerrit@review.vlan103.tizen.org>
Thu, 23 Mar 2017 10:00:29 +0000 (03:00 -0700)
1  2 
dali-toolkit/internal/text/text-controller.cpp

@@@ -1751,8 -1751,7 +1751,8 @@@ bool Controller::KeyEvent( const Dali::
  {
    DALI_ASSERT_DEBUG( mImpl->mEventData && "Unexpected KeyEvent" );
  
 -  bool textChanged( false );
 +  bool textChanged = false;
 +  bool relayoutNeeded = false;
  
    if( ( NULL != mImpl->mEventData ) &&
        ( keyEvent.state == KeyEvent::Down ) )
      {
        // Escape key is a special case which causes focus loss
        KeyboardFocusLostEvent();
 +
 +      // Will request for relayout.
 +      relayoutNeeded = true;
      }
      else if( ( Dali::DALI_KEY_CURSOR_LEFT  == keyCode ) ||
               ( Dali::DALI_KEY_CURSOR_RIGHT == keyCode ) ||
        Event event( Event::CURSOR_KEY_EVENT );
        event.p1.mInt = keyCode;
        mImpl->mEventData->mEventQueue.push_back( event );
 +
 +      // Will request for relayout.
 +      relayoutNeeded = true;
      }
      else if( Dali::DALI_KEY_BACKSPACE == keyCode )
      {
        textChanged = BackspaceKeyEvent();
 +
 +      // Will request for relayout.
 +      relayoutNeeded = true;
      }
      else if( IsKey( keyEvent, Dali::DALI_KEY_POWER ) ||
               IsKey( keyEvent, Dali::DALI_KEY_MENU ) ||
        // Power key/Menu/Home key behaviour does not allow edit mode to resume.
        mImpl->ChangeState( EventData::INACTIVE );
  
 +      // Will request for relayout.
 +      relayoutNeeded = true;
 +
        // This branch avoids calling the InsertText() method of the 'else' branch which can delete selected text.
      }
      else if( Dali::DALI_KEY_SHIFT_LEFT == keyCode )
  
        // Do nothing.
      }
 +    else if( ( Dali::DALI_KEY_VOLUME_UP == keyCode ) || ( Dali::DALI_KEY_VOLUME_DOWN == keyCode ) )
 +    {
 +      // This branch avoids calling the InsertText() method of the 'else' branch which can delete selected text.
 +      // Do nothing.
 +    }
      else
      {
        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p keyString %s\n", this, keyString.c_str() );
  
        InsertText( keyString, COMMIT );
        textChanged = true;
 +
 +      // Will request for relayout.
 +      relayoutNeeded = true;
      }
  
      if ( ( mImpl->mEventData->mState != EventData::INTERRUPTED ) &&
           ( mImpl->mEventData->mState != EventData::INACTIVE ) &&
           ( !isNullKey ) &&
 -         ( Dali::DALI_KEY_SHIFT_LEFT != keyCode ) )
 +         ( Dali::DALI_KEY_SHIFT_LEFT != keyCode ) &&
 +         ( Dali::DALI_KEY_VOLUME_UP != keyCode ) &&
 +         ( Dali::DALI_KEY_VOLUME_DOWN != keyCode ) )
      {
        // Should not change the state if the key is the shift send by the imf manager.
        // Otherwise, when the state is SELECTING the text controller can't send the right
        // surrounding info to the imf.
        mImpl->ChangeState( EventData::EDITING );
 +
 +      // Will request for relayout.
 +      relayoutNeeded = true;
      }
  
 -    mImpl->RequestRelayout();
 +    if( relayoutNeeded )
 +    {
 +      mImpl->RequestRelayout();
 +    }
    }
  
    if( textChanged &&
@@@ -2305,8 -2276,9 +2305,9 @@@ void Controller::TextPopupButtonTouched
  
  void Controller::InsertText( const std::string& text, Controller::InsertType type )
  {
-   bool removedPrevious( false );
-   bool maxLengthReached( false );
+   bool removedPrevious = false;
+   bool removedSelected = false;
+   bool maxLengthReached = false;
  
    DALI_ASSERT_DEBUG( NULL != mImpl->mEventData && "Unexpected InsertText" )
  
    // TODO: At the moment the underline runs are only for pre-edit.
    mImpl->mModel->mVisualModel->mUnderlineRuns.Clear();
  
-   // Keep the current number of characters.
-   const Length currentNumberOfCharacters = mImpl->IsShowingRealText() ? mImpl->mModel->mLogicalModel->mText.Count() : 0u;
    // Remove the previous IMF pre-edit.
    if( mImpl->mEventData->mPreEditFlag && ( 0u != mImpl->mEventData->mPreEditLength ) )
    {
    else
    {
      // Remove the previous Selection.
-     removedPrevious = RemoveSelectedText();
+     removedSelected = RemoveSelectedText();
    }
  
    Vector<Character> utf32Characters;
      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Inserted %d characters, new size %d new cursor %d\n", maxSizeOfNewText, mImpl->mModel->mLogicalModel->mText.Count(), mImpl->mEventData->mPrimaryCursorPosition );
    }
  
-   const Length numberOfCharacters = mImpl->IsShowingRealText() ? mImpl->mModel->mLogicalModel->mText.Count() : 0u;
    if( ( 0u == mImpl->mModel->mLogicalModel->mText.Count() ) &&
        mImpl->IsPlaceholderAvailable() )
    {
      mImpl->ClearPreEditFlag();
    }
    else if( removedPrevious ||
+            removedSelected ||
             ( 0 != utf32Characters.Count() ) )
    {
      // Queue an inserted event
      mImpl->QueueModifyEvent( ModifyEvent::TEXT_INSERTED );
  
      mImpl->mEventData->mUpdateCursorPosition = true;
-     if( numberOfCharacters < currentNumberOfCharacters )
+     if( removedSelected )
      {
        mImpl->mEventData->mScrollAfterDelete = true;
      }