[AT-SPI] Introduce TextControlAccessible
[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) 2021 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/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     Toolkit::Control&                stencil,
64     std::vector<Actor>&              clippingDecorationActors,
65     std::vector<Toolkit::TextAnchor>& anchorActors,
66     Text::Controller::UpdateTextType updateTextType);
67
68   /**
69    * Common method to synchronize TextAnchor actors with Anchor objects in text's logical model.
70    * @param[in] parent The actor that is a parent of anchor actors
71    * @param[in] controller pointer to the text controller
72    * @param[in,out] anchorActors Anchor actors
73    */
74   static void SynchronizeTextAnchorsInParent(
75     Actor                             parent,
76     Text::ControllerPtr               controller,
77     std::vector<Toolkit::TextAnchor>& anchorActors);
78 };
79
80 class TextControlAccessible : public DevelControl::ControlAccessible,
81                               public virtual Dali::Accessibility::Text,
82                               public virtual Dali::Accessibility::Hypertext
83 {
84 public:
85   using DevelControl::ControlAccessible::ControlAccessible;
86
87   // Text
88
89   /**
90    * @copydoc Dali::Accessibility::Text::GetCharacterCount()
91    */
92   std::size_t GetCharacterCount() const override;
93
94   /**
95    * @copydoc Dali::Accessibility::Text::GetCursorOffset()
96    */
97   std::size_t GetCursorOffset() const override;
98
99   /**
100    * @copydoc Dali::Accessibility::Text::GetRangeExtents()
101    */
102   Rect<> GetRangeExtents(std::size_t startOffset, std::size_t endOffset, Accessibility::CoordinateType type) override;
103
104   /**
105    * @copydoc Dali::Accessibility::Text::GetRangeOfSelection()
106    */
107   Accessibility::Range GetRangeOfSelection(std::size_t selectionIndex) const override;
108
109   /**
110    * @copydoc Dali::Accessibility::Text::GetText()
111    */
112   std::string GetText(std::size_t startOffset, std::size_t endOffset) const override;
113
114   /**
115    * @copydoc Dali::Accessibility::Text::GetTextAtOffset()
116    */
117   Accessibility::Range GetTextAtOffset(std::size_t offset, Accessibility::TextBoundary boundary) const override;
118
119   /**
120    * @copydoc Dali::Accessibility::Text::RemoveSelection()
121    */
122   bool RemoveSelection(std::size_t selectionIndex) override;
123
124   /**
125    * @copydoc Dali::Accessibility::Text::SetCursorOffset()
126    */
127   bool SetCursorOffset(std::size_t offset) override;
128
129   /**
130    * @copydoc Dali::Accessibility::Text::SetRangeOfSelection()
131    */
132   bool SetRangeOfSelection(std::size_t selectionIndex, std::size_t startOffset, std::size_t endOffset) override;
133
134   // Hypertext
135
136   /**
137    * @copydoc Dali::Accessibility::Hypertext::GetLink()
138    */
139   Accessibility::Hyperlink* GetLink(std::int32_t linkIndex) const override;
140
141   /**
142    * @copydoc Dali::Accessibility::Hypertext::GetLinkCount()
143    */
144   std::int32_t GetLinkCount() const override;
145
146   /**
147    * @copydoc Dali::Accessibility::Hypertext::GetLinkIndex()
148    */
149   std::int32_t GetLinkIndex(std::int32_t characterOffset) const override;
150
151 protected:
152   /**
153    * @brief Gets whole text.
154    *
155    * @return The text
156    */
157   std::string GetWholeText() const;
158
159   /**
160    * @brief Gets text anchors.
161    *
162    * @return Text anchors
163    */
164   virtual const std::vector<Toolkit::TextAnchor>& GetTextAnchors() const = 0;
165
166   /**
167    * @brief Gets text controller.
168    *
169    * @return The text controller
170    */
171   virtual Toolkit::Text::ControllerPtr GetTextController() const = 0;
172
173   /**
174    * @brief Get substitute character for hidden text.
175    *
176    * @return The substitute character (Unicode codepoint)
177    */
178   virtual std::uint32_t GetSubstituteCharacter() const;
179
180   /**
181    * @brief Checks whether text should be hidden (replaced with substitute characters).
182    *
183    * @return True if text should be hidden, false otherwise
184    */
185   virtual bool IsHiddenInput() const;
186
187   /**
188    * @brief Checks whether [startPosition, endPosition) is a valid, non-empty range within a given string.
189    *
190    * @param string Source string
191    * @param begin Start index (inclusive)
192    * @param end End index (exclusive)
193    * @return true if the range is valid, false otherwise
194    */
195   static bool ValidateRange(const std::string& string, std::size_t begin, std::size_t end);
196 };
197
198 class EditableTextControlAccessible : public TextControlAccessible,
199                                       public virtual Dali::Accessibility::EditableText
200 {
201 public:
202   using TextControlAccessible::TextControlAccessible;
203
204   /**
205    * @copydoc Dali::Toolkit::DevelControl::ControlAccessible::CalculateStates()
206    */
207   Accessibility::States CalculateStates() override;
208
209   // Text
210
211   /**
212    * @copydoc Dali::Accessibility::Text::GetCursorOffset()
213    */
214   std::size_t GetCursorOffset() const override;
215
216   /**
217    * @copydoc Dali::Accessibility::Text::SetCursorOffset()
218    */
219   bool SetCursorOffset(std::size_t offset) override;
220
221   // EditableText
222
223   /**
224    * @copydoc Dali::Accessibility::EditableText::CopyText()
225    */
226   bool CopyText(size_t startPosition, size_t endPosition) override;
227
228   /**
229    * @copydoc Dali::Accessibility::EditableText::CutText()
230    */
231   bool CutText(size_t startPosition, size_t endPosition) override;
232
233   /**
234    * @copydoc Dali::Accessibility::EditableText::DeleteText()
235    */
236   bool DeleteText(size_t startPosition, size_t endPosition) override;
237
238   /**
239    * @copydoc Dali::Accessibility::EditableText::InsertText()
240    */
241   bool InsertText(size_t startPosition, std::string text) override;
242
243   /**
244    * @copydoc Dali::Accessibility::EditableText::SetTextContents()
245    */
246   bool SetTextContents(std::string newContents) override;
247
248 protected:
249   /**
250    * @brief Requests text relayout.
251    */
252   virtual void RequestTextRelayout() = 0;
253 };
254
255 } // namespace Dali::Toolkit::Internal
256
257 #endif //DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H