[dali_2.3.24] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / controller / text-controller-text-updater.cpp
index addb91a..59da80a 100644 (file)
 
 // EXTERNAL INCLUDES
 #include <dali/integration-api/debug.h>
+#include <dali/public-api/math/math-utils.h>
 #include <memory.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/text/character-set-conversion.h>
 #include <dali-toolkit/internal/text/characters-helper-functions.h>
-#include <dali-toolkit/internal/text/emoji-helper.h>
-#include <dali-toolkit/internal/text/markup-processor/markup-processor.h>
 #include <dali-toolkit/internal/text/controller/text-controller-impl.h>
 #include <dali-toolkit/internal/text/controller/text-controller-placeholder-handler.h>
+#include <dali-toolkit/internal/text/emoji-helper.h>
+#include <dali-toolkit/internal/text/markup-processor/markup-processor.h>
 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
 
 namespace
@@ -101,7 +102,9 @@ void Controller::TextUpdater::SetText(Controller& controller, const std::string&
     const uint8_t* utf8     = NULL;
     if(impl.mMarkupProcessorEnabled)
     {
-      ProcessMarkupString(text, markupProcessData);
+      MarkupPropertyData markupPropertyData(impl.mAnchorColor, impl.mAnchorClickedColor);
+
+      ProcessMarkupString(text, markupPropertyData, markupProcessData);
       textSize = markupProcessData.markupProcessedText.size();
 
       // This is a bit horrible but std::string returns a (signed) char*
@@ -205,7 +208,8 @@ void Controller::TextUpdater::InsertText(Controller& controller, const std::stri
     removedPrevious = RemoveText(controller,
                                  -static_cast<int>(eventData->mPrimaryCursorPosition - eventData->mPreEditStartPosition),
                                  eventData->mPreEditLength,
-                                 DONT_UPDATE_INPUT_STYLE);
+                                 DONT_UPDATE_INPUT_STYLE,
+                                 true);
 
     eventData->mPrimaryCursorPosition = eventData->mPreEditStartPosition;
     eventData->mPreEditLength         = 0u;
@@ -221,19 +225,41 @@ void Controller::TextUpdater::InsertText(Controller& controller, const std::stri
 
   if(!text.empty())
   {
+    std::string redefinedText = text;
+
+    if(controller.mImpl->mInputFilter != NULL)
+    {
+      bool accepted = false;
+      bool rejected = false;
+
+      accepted = impl.mInputFilter->Filter(Toolkit::InputFilter::Property::ACCEPTED, redefinedText);
+      rejected = impl.mInputFilter->Filter(Toolkit::InputFilter::Property::REJECTED, redefinedText);
+
+      if(accepted)
+      {
+        // Signal emits when the string to be inserted is filtered by the accepted filter.
+        controller.mImpl->mEditableControlInterface->InputFiltered(Toolkit::InputFilter::Property::ACCEPTED);
+      }
+      if(rejected)
+      {
+        // Signal emits when the string to be inserted is filtered by the rejected filter.
+        controller.mImpl->mEditableControlInterface->InputFiltered(Toolkit::InputFilter::Property::REJECTED);
+      }
+    }
+
     //  Convert text into UTF-32
-    utf32Characters.Resize(text.size());
+    utf32Characters.Resize(redefinedText.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());
+    const uint8_t* utf8 = reinterpret_cast<const uint8_t*>(redefinedText.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());
+    characterCount = Utf8ToUtf32(utf8, redefinedText.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());
+    DALI_ASSERT_DEBUG(redefinedText.size() >= utf32Characters.Count() && "Invalid UTF32 conversion length");
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "UTF8 size %d, UTF32 size %d\n", redefinedText.size(), utf32Characters.Count());
   }
 
   if(0u != utf32Characters.Count()) // Check if Utf8ToUtf32 conversion succeeded
@@ -301,7 +327,7 @@ void Controller::TextUpdater::InsertText(Controller& controller, const std::stri
     const bool addFontWeightRun = (style.weight != inputStyle.weight) && inputStyle.isWeightDefined;
     const bool addFontWidthRun  = (style.width != inputStyle.width) && inputStyle.isWidthDefined;
     const bool addFontSlantRun  = (style.slant != inputStyle.slant) && inputStyle.isSlantDefined;
-    const bool addFontSizeRun   = (style.size != inputStyle.size) && inputStyle.isSizeDefined;
+    const bool addFontSizeRun   = (!Dali::Equals(style.size, inputStyle.size)) && inputStyle.isSizeDefined;
 
     // Add style runs.
     if(addColorRun)
@@ -372,7 +398,7 @@ void Controller::TextUpdater::InsertText(Controller& controller, const std::stri
     {
       pos = modifyText.Begin() + cursorIndex;
     }
-    unsigned int realPos = pos - modifyText.Begin();
+    unsigned int realPos = static_cast<unsigned int>(pos - modifyText.Begin());
     modifyText.Insert(pos, utf32Characters.Begin(), utf32Characters.Begin() + maxSizeOfNewText);
 
     if(NULL != impl.mEditableControlInterface)
@@ -470,9 +496,10 @@ bool Controller::TextUpdater::RemoveText(
   Controller&          controller,
   int                  cursorOffset,
   int                  numberOfCharacters,
-  UpdateInputStyleType type)
+  UpdateInputStyleType type,
+  bool                 isDeletingPreEdit)
 {
-  bool removed = false;
+  bool removed   = false;
   bool removeAll = false;
 
   Controller::Impl& impl      = *controller.mImpl;
@@ -583,7 +610,10 @@ bool Controller::TextUpdater::RemoveText(
       if(removeAll)
       {
         impl.ClearPreEditFlag();
-        textUpdateInfo.mNumberOfCharactersToAdd = 0;
+        if(!isDeletingPreEdit)
+        {
+          textUpdateInfo.mNumberOfCharactersToAdd = 0;
+        }
       }
 
       // Updates the text style runs by removing characters. Runs with no characters are removed.
@@ -624,7 +654,7 @@ bool Controller::TextUpdater::RemoveText(
 
       DALI_LOG_INFO(gLogFilter, Debug::General, "Controller::RemoveText %p removed %d\n", &controller, numberOfCharacters);
       removeAll = false;
-      removed = true;
+      removed   = true;
     }
   }
 
@@ -675,6 +705,9 @@ void Controller::TextUpdater::ResetText(Controller& controller)
   Controller::Impl& impl         = *controller.mImpl;
   LogicalModelPtr&  logicalModel = impl.mModel->mLogicalModel;
 
+  // Reset spanned-text
+  logicalModel->mSpannedTextPlaced = false;
+
   // Reset buffers.
   logicalModel->mText.Clear();