[dali_2.3.22] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / text-controls / common-text-utils.cpp
index 833b81b..b18cb98 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -15,6 +15,7 @@
  */
 
 // EXTERNAL INCLUDES
+#include <dali/devel-api/text-abstraction/segmentation.h>
 #include <dali/public-api/actors/layer.h>
 
 // INTERNAL INCLUDES
@@ -55,6 +56,7 @@ void CommonTextUtils::RenderText(
   float&                            alignmentOffset,
   Actor&                            renderableActor,
   Actor&                            backgroundActor,
+  Actor&                            cursorLayerActor,
   Toolkit::Control&                 stencil,
   std::vector<Actor>&               clippingDecorationActors,
   std::vector<Toolkit::TextAnchor>& anchorActors,
@@ -152,6 +154,12 @@ void CommonTextUtils::RenderText(
         backgroundActor.LowerToBottom();
       }
     }
+
+    if(cursorLayerActor)
+    {
+      cursorLayerActor.RaiseToTop();
+    }
+
     SynchronizeTextAnchorsInParent(textActor, controller, anchorActors);
   }
 }
@@ -195,7 +203,7 @@ Accessibility::Range TextControlAccessible::GetRangeOfSelection(std::size_t sele
   auto endOffset   = static_cast<std::size_t>(indices.second);
   auto text        = GetText(startOffset, endOffset);
 
-  return {startOffset, endOffset, text};
+  return {startOffset, endOffset, std::move(text)};
 }
 
 std::string TextControlAccessible::GetText(std::size_t startOffset, std::size_t endOffset) const
@@ -260,11 +268,11 @@ Accessibility::Range TextControlAccessible::GetTextAtOffset(std::size_t offset,
 
       if(boundary == Dali::Accessibility::TextBoundary::WORD)
       {
-        Accessibility::Accessible::FindWordSeparationsUtf8(reinterpret_cast<const utf8_t*>(text.c_str()), textSize, "", breaks.data());
+        TextAbstraction::Segmentation::Get().GetWordBreakPositionsUtf8(reinterpret_cast<const uint8_t*>(text.c_str()), textSize, breaks.data());
       }
       else
       {
-        Accessibility::Accessible::FindLineSeparationsUtf8(reinterpret_cast<const utf8_t*>(text.c_str()), textSize, "", breaks.data());
+        TextAbstraction::Segmentation::Get().GetLineBreakPositionsUtf8(reinterpret_cast<const uint8_t*>(text.c_str()), textSize, breaks.data());
       }
 
       std::size_t index   = 0u;
@@ -308,7 +316,7 @@ Accessibility::Range TextControlAccessible::GetTextAtOffset(std::size_t offset,
       break;
     }
 
-    case Dali::Accessibility::TextBoundary::SENTENCE: // Not supported by default
+    case Dali::Accessibility::TextBoundary::SENTENCE:  // Not supported by default
     case Dali::Accessibility::TextBoundary::PARAGRAPH: // Not supported by libunibreak library
     default:
     {
@@ -474,19 +482,19 @@ bool EditableTextControlAccessible::DeleteText(std::size_t startPosition, std::s
     return false;
   }
 
-  return SetTextContents(text.erase(startPosition, endPosition - startPosition));
+  return SetTextContents(std::move(text.erase(startPosition, endPosition - startPosition)));
 }
 
 bool EditableTextControlAccessible::InsertText(std::size_t startPosition, std::string newText)
 {
   auto text = GetWholeText();
 
-  if(!ValidateRange(text, startPosition, startPosition + 1))
+  if(!ValidateRange(text, startPosition, startPosition + 1) && !(startPosition == text.size()))
   {
     return false;
   }
 
-  return SetTextContents(text.insert(startPosition, std::move(newText)));
+  return SetTextContents(std::move(text.insert(startPosition, newText)));
 }
 
 bool EditableTextControlAccessible::SetTextContents(std::string newContents)