IMF event fixes 54/39054/7
authorPaul Wisbey <p.wisbey@samsung.com>
Thu, 7 May 2015 12:22:12 +0000 (13:22 +0100)
committerPaul Wisbey <p.wisbey@samsung.com>
Fri, 8 May 2015 10:39:51 +0000 (11:39 +0100)
Change-Id: Ide705ec18a46ded7fd770b20ce3752446e8c7f7d

dali-toolkit/internal/text/text-controller-impl.h
dali-toolkit/internal/text/text-controller.cpp

index 79792c9..c728474 100644 (file)
@@ -274,7 +274,17 @@ struct Controller::Impl
     }
   }
 
-  void PreEditReset()
+  void ClearPreEditFlag()
+  {
+    if( mEventData )
+    {
+      mEventData->mPreEditFlag = false;
+      mEventData->mPreEditStartPosition = 0;
+      mEventData->mPreEditLength = 0;
+    }
+  }
+
+  void ResetImfManager()
   {
     // Reset incase we are in a pre-edit state.
     ImfManager imfManager = ImfManager::Get();
@@ -282,6 +292,8 @@ struct Controller::Impl
     {
       imfManager.Reset(); // Will trigger a commit message
     }
+
+    ClearPreEditFlag();
   }
 
   void UpdateModel( OperationsMask operationsRequired );
index 5e7a45b..8c3731a 100644 (file)
@@ -117,7 +117,7 @@ void Controller::SetText( const std::string& text )
   }
 
   // Reset keyboard as text changed
-  mImpl->PreEditReset();
+  mImpl->ResetImfManager();
 }
 
 void Controller::GetText( std::string& text ) const
@@ -1003,6 +1003,11 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent )
     }
     else if( Dali::DALI_KEY_BACKSPACE == keyCode )
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p DALI_KEY_BACKSPACE\n", this );
+
+      // IMF manager is no longer handling key-events
+      mImpl->ClearPreEditFlag();
+
       // Remove the character before the current cursor position
       bool removed = RemoveText( -1, 1 );
 
@@ -1021,6 +1026,11 @@ bool Controller::KeyEvent( const Dali::KeyEvent& keyEvent )
     }
     else
     {
+      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::KeyEvent %p keyString %s\n", this, keyString.c_str() );
+
+      // IMF manager is no longer handling key-events
+      mImpl->ClearPreEditFlag();
+
       InsertText( keyString, COMMIT );
     }
 
@@ -1038,61 +1048,73 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ
   bool maxLengthReached( false );
 
   DALI_ASSERT_DEBUG( NULL != mImpl->mEventData && "Unexpected InsertText" )
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::InsertText %p %s (%s) mPreEditFlag %d cursor %d\n",
-                 this, text.c_str(), (COMMIT == type ? "COMMIT" : "PRE_EDIT"), mImpl->mEventData->mPreEditFlag, mImpl->mEventData->mPrimaryCursorPosition );
+  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Controller::InsertText %p %s (%s) mPrimaryCursorPosition %d mPreEditFlag %d mPreEditStartPosition %d mPreEditLength %d\n",
+                 this, text.c_str(), (COMMIT == type ? "COMMIT" : "PRE_EDIT"),
+                 mImpl->mEventData->mPrimaryCursorPosition, mImpl->mEventData->mPreEditFlag, mImpl->mEventData->mPreEditStartPosition, mImpl->mEventData->mPreEditLength );
+
+  Vector<Character> utf32Characters;
+  Length characterCount( 0u );
 
   if( ! text.empty() )
   {
+    // The placeholder text is no longer needed
     if( mImpl->IsShowingPlaceholderText() )
     {
       ResetText();
     }
+
+    //  Convert text into UTF-32
+    utf32Characters.Resize( text.size() );
+
+    // This is a bit horrible but std::string returns a (signed) char*
+    const uint8_t* utf8 = reinterpret_cast<const uint8_t*>( text.c_str() );
+
+    // Transform a text array encoded in utf8 into an array encoded in utf32.
+    // It returns the actual number of characters.
+    characterCount = Utf8ToUtf32( utf8, text.size(), utf32Characters.Begin() );
+    utf32Characters.Resize( characterCount );
+
+    DALI_ASSERT_DEBUG( text.size() >= utf32Characters.Count() && "Invalid UTF32 conversion length" );
+    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "UTF8 size %d, UTF32 size %d\n", text.size(), utf32Characters.Count() );
   }
 
-  if( mImpl->mEventData )
+  if( 0u != utf32Characters.Count() )
   {
-    if( COMMIT == type )
-    {
-      mImpl->mEventData->mPreEditFlag = false;
-    }
-    else // PRE_EDIT
+    // Handle the IMF (predicitive text) state changes
+    if( mImpl->mEventData )
     {
       if( mImpl->mEventData->mPreEditFlag &&
           0 != mImpl->mEventData->mPreEditLength )
       {
         // Remove previous pre-edit text
+        CharacterIndex offset = mImpl->mEventData->mPrimaryCursorPosition - mImpl->mEventData->mPreEditStartPosition;
+        removedPreEdit = RemoveText( -static_cast<int>(offset), mImpl->mEventData->mPreEditLength );
+
         mImpl->mEventData->mPrimaryCursorPosition = mImpl->mEventData->mPreEditStartPosition;
-        removedPreEdit = RemoveText( -1, mImpl->mEventData->mPreEditLength );
+        mImpl->mEventData->mPreEditLength = 0;
       }
-      else
-      {
-        // Record the start of the pre-edit text
-        mImpl->mEventData->mPreEditStartPosition = mImpl->mEventData->mPrimaryCursorPosition;
-        mImpl->mEventData->mPreEditLength = text.size();
 
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "mPreEditStartPosition %d mPreEditLength %d\n", mImpl->mEventData->mPreEditStartPosition, mImpl->mEventData->mPreEditLength );
+      if( COMMIT == type )
+      {
+        // IMF manager is no longer handling key-events
+        mImpl->ClearPreEditFlag();
       }
+      else // PRE_EDIT
+      {
+        if( ! mImpl->mEventData->mPreEditFlag )
+        {
+          DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Entered PreEdit state" );
 
-      mImpl->mEventData->mPreEditFlag = true;
-    }
-  }
-
-  if( ! text.empty() )
-  {
-    //  Convert text into UTF-32
-    Vector<Character> utf32Characters;
-    utf32Characters.Resize( text.size() );
-
-    // This is a bit horrible but std::string returns a (signed) char*
-    const uint8_t* utf8 = reinterpret_cast<const uint8_t*>( text.c_str() );
+          // Record the start of the pre-edit text
+          mImpl->mEventData->mPreEditStartPosition = mImpl->mEventData->mPrimaryCursorPosition;
+        }
 
-    // Transform a text array encoded in utf8 into an array encoded in utf32.
-    // It returns the actual number of characters.
-    Length characterCount = Utf8ToUtf32( utf8, text.size(), utf32Characters.Begin() );
-    utf32Characters.Resize( characterCount );
+        mImpl->mEventData->mPreEditLength = utf32Characters.Count();
+        mImpl->mEventData->mPreEditFlag = true;
 
-    DALI_ASSERT_DEBUG( text.size() >= utf32Characters.Count() && "Invalid UTF32 conversion length" );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "UTF8 size %d, UTF32 size %d\n", text.size(), utf32Characters.Count() );
+        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "mPreEditStartPosition %d mPreEditLength %d\n", mImpl->mEventData->mPreEditStartPosition, mImpl->mEventData->mPreEditLength );
+      }
+    }
 
     const Length numberOfCharactersInModel = mImpl->mLogicalModel->GetNumberOfCharacters();
 
@@ -1119,7 +1141,8 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ
     DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Inserted %d characters, new size %d new cursor %d\n", maxSizeOfNewText, mImpl->mLogicalModel->mText.Count(), mImpl->mEventData->mPrimaryCursorPosition );
   }
 
-  if( removedPreEdit || !text.empty() )
+  if( removedPreEdit ||
+      0 != utf32Characters.Count() )
   {
     // Queue an inserted event
     mImpl->QueueModifyEvent( ModifyEvent::TEXT_INSERTED );
@@ -1131,7 +1154,7 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ
 
     mImpl->mControlInterface.MaxLengthReached();
 
-    mImpl->PreEditReset();
+    mImpl->ResetImfManager();
   }
 }
 
@@ -1178,7 +1201,7 @@ void Controller::TapEvent( unsigned int tapCount, float x, float y )
   }
 
   // Reset keyboard as tap event has occurred.
-  mImpl->PreEditReset();
+  mImpl->ResetImfManager();
 }
 
 void Controller::PanEvent( Gesture::State state, const Vector2& displacement )