[dali_2.3.19] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / controls / text-controls / common-text-utils.h
1 #ifndef DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H
2 #define DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H
3
4 /*
5  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19
20 // EXTERNAL INCLUDES
21 #include <dali/devel-api/atspi-interfaces/editable-text.h>
22 #include <dali/devel-api/atspi-interfaces/hypertext.h>
23 #include <dali/devel-api/atspi-interfaces/text.h>
24 #include <dali/public-api/actors/actor.h>
25 #include <dali/public-api/common/vector-wrapper.h>
26
27 // INTERNAL INCLUDES
28 #include <dali-toolkit/devel-api/controls/control-accessible.h>
29 #include <dali-toolkit/devel-api/controls/text-controls/text-anchor-devel.h>
30 #include <dali-toolkit/internal/text/decorator/text-decorator.h>
31 #include <dali-toolkit/internal/text/rendering/text-renderer.h>
32 #include <dali-toolkit/internal/text/controller/text-controller.h>
33 #include <dali-toolkit/public-api/controls/control.h>
34 #include <dali-toolkit/public-api/controls/text-controls/text-editor.h>
35
36 namespace Dali::Toolkit::Internal
37 {
38 class CommonTextUtils
39 {
40 public:
41   /**
42    * Common method to render text, setting up background, foreground actors with decorators/stencil.
43    * @param[in] textActor The TextEditor or TextField
44    * @param[in] renderer pointer to the text renderer
45    * @param[in] controller pointer to the text controller
46    * @param[in] decorator pointer to the text decorator
47    * @param[in,out] alignmentOffset Alignment offset
48    * @param[in,out] renderableActor Actor for rendering text
49    * @param[in,out] backgroundActor Actor for rendering background
50    * @param[in,out] stencil Clipping actor
51    * @param[in,out] clippingDecorationActors Clipping decoration actors
52    * @param[in,out] anchorActors Anchor actors
53    * @param[in] updateTextType How the text has been updated
54    */
55   static void RenderText(
56     Actor                            textActor,
57     Text::RendererPtr                renderer,
58     Text::ControllerPtr              controller,
59     Text::DecoratorPtr               decorator,
60     float&                           alignmentOffset,
61     Actor&                           renderableActor,
62     Actor&                           backgroundActor,
63     Actor&                           cursorLayerActor,
64     Toolkit::Control&                stencil,
65     std::vector<Actor>&              clippingDecorationActors,
66     std::vector<Toolkit::TextAnchor>& anchorActors,
67     Text::Controller::UpdateTextType updateTextType);
68
69   /**
70    * Common method to synchronize TextAnchor actors with Anchor objects in text's logical model.
71    * @param[in] parent The actor that is a parent of anchor actors
72    * @param[in] controller pointer to the text controller
73    * @param[in,out] anchorActors Anchor actors
74    */
75   static void SynchronizeTextAnchorsInParent(
76     Actor                             parent,
77     Text::ControllerPtr               controller,
78     std::vector<Toolkit::TextAnchor>& anchorActors);
79 };
80
81 class TextControlAccessible : public DevelControl::ControlAccessible,
82                               public virtual Dali::Accessibility::Text,
83                               public virtual Dali::Accessibility::Hypertext
84 {
85 public:
86   using DevelControl::ControlAccessible::ControlAccessible;
87
88   // Text
89
90   /**
91    * @copydoc Dali::Accessibility::Text::GetCharacterCount()
92    */
93   std::size_t GetCharacterCount() const override;
94
95   /**
96    * @copydoc Dali::Accessibility::Text::GetCursorOffset()
97    */
98   std::size_t GetCursorOffset() const override;
99
100   /**
101    * @copydoc Dali::Accessibility::Text::GetRangeExtents()
102    */
103   Rect<> GetRangeExtents(std::size_t startOffset, std::size_t endOffset, Accessibility::CoordinateType type) override;
104
105   /**
106    * @copydoc Dali::Accessibility::Text::GetRangeOfSelection()
107    */
108   Accessibility::Range GetRangeOfSelection(std::size_t selectionIndex) const override;
109
110   /**
111    * @copydoc Dali::Accessibility::Text::GetText()
112    */
113   std::string GetText(std::size_t startOffset, std::size_t endOffset) const override;
114
115   /**
116    * @copydoc Dali::Accessibility::Text::GetTextAtOffset()
117    */
118   Accessibility::Range GetTextAtOffset(std::size_t offset, Accessibility::TextBoundary boundary) const override;
119
120   /**
121    * @copydoc Dali::Accessibility::Text::RemoveSelection()
122    */
123   bool RemoveSelection(std::size_t selectionIndex) override;
124
125   /**
126    * @copydoc Dali::Accessibility::Text::SetCursorOffset()
127    */
128   bool SetCursorOffset(std::size_t offset) override;
129
130   /**
131    * @copydoc Dali::Accessibility::Text::SetRangeOfSelection()
132    */
133   bool SetRangeOfSelection(std::size_t selectionIndex, std::size_t startOffset, std::size_t endOffset) override;
134
135   // Hypertext
136
137   /**
138    * @copydoc Dali::Accessibility::Hypertext::GetLink()
139    */
140   Accessibility::Hyperlink* GetLink(std::int32_t linkIndex) const override;
141
142   /**
143    * @copydoc Dali::Accessibility::Hypertext::GetLinkCount()
144    */
145   std::int32_t GetLinkCount() const override;
146
147   /**
148    * @copydoc Dali::Accessibility::Hypertext::GetLinkIndex()
149    */
150   std::int32_t GetLinkIndex(std::int32_t characterOffset) const override;
151
152 protected:
153   /**
154    * @brief Gets whole text.
155    *
156    * @return The text
157    */
158   std::string GetWholeText() const;
159
160   /**
161    * @brief Gets text anchors.
162    *
163    * @return Text anchors
164    */
165   virtual const std::vector<Toolkit::TextAnchor>& GetTextAnchors() const = 0;
166
167   /**
168    * @brief Gets text controller.
169    *
170    * @return The text controller
171    */
172   virtual Toolkit::Text::ControllerPtr GetTextController() const = 0;
173
174   /**
175    * @brief Get substitute character for hidden text.
176    *
177    * @return The substitute character (Unicode codepoint)
178    */
179   virtual std::uint32_t GetSubstituteCharacter() const;
180
181   /**
182    * @brief Checks whether text should be hidden (replaced with substitute characters).
183    *
184    * @return True if text should be hidden, false otherwise
185    */
186   virtual bool IsHiddenInput() const;
187
188   /**
189    * @brief Checks whether [startPosition, endPosition) is a valid, non-empty range within a given string.
190    *
191    * @param string Source string
192    * @param begin Start index (inclusive)
193    * @param end End index (exclusive)
194    * @return true if the range is valid, false otherwise
195    */
196   static bool ValidateRange(const std::string& string, std::size_t begin, std::size_t end);
197 };
198
199 class EditableTextControlAccessible : public TextControlAccessible,
200                                       public virtual Dali::Accessibility::EditableText
201 {
202 public:
203   using TextControlAccessible::TextControlAccessible;
204
205   /**
206    * @copydoc Dali::Toolkit::DevelControl::ControlAccessible::CalculateStates()
207    */
208   Accessibility::States CalculateStates() override;
209
210   // Text
211
212   /**
213    * @copydoc Dali::Accessibility::Text::GetCursorOffset()
214    */
215   std::size_t GetCursorOffset() const override;
216
217   /**
218    * @copydoc Dali::Accessibility::Text::SetCursorOffset()
219    */
220   bool SetCursorOffset(std::size_t offset) override;
221
222   // EditableText
223
224   /**
225    * @copydoc Dali::Accessibility::EditableText::CopyText()
226    */
227   bool CopyText(size_t startPosition, size_t endPosition) override;
228
229   /**
230    * @copydoc Dali::Accessibility::EditableText::CutText()
231    */
232   bool CutText(size_t startPosition, size_t endPosition) override;
233
234   /**
235    * @copydoc Dali::Accessibility::EditableText::DeleteText()
236    */
237   bool DeleteText(size_t startPosition, size_t endPosition) override;
238
239   /**
240    * @copydoc Dali::Accessibility::EditableText::InsertText()
241    */
242   bool InsertText(size_t startPosition, std::string text) override;
243
244   /**
245    * @copydoc Dali::Accessibility::EditableText::SetTextContents()
246    */
247   bool SetTextContents(std::string newContents) override;
248
249 protected:
250   /**
251    * @brief Requests text relayout.
252    */
253   virtual void RequestTextRelayout() = 0;
254 };
255
256 } // namespace Dali::Toolkit::Internal
257
258 #endif //DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H