1 #ifndef DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H
2 #define DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H
5 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
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>
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>
36 namespace Dali::Toolkit::Internal
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
55 static void RenderText(
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);
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
75 static void SynchronizeTextAnchorsInParent(
77 Text::ControllerPtr controller,
78 std::vector<Toolkit::TextAnchor>& anchorActors);
81 class TextControlAccessible : public DevelControl::ControlAccessible,
82 public virtual Dali::Accessibility::Text,
83 public virtual Dali::Accessibility::Hypertext
86 using DevelControl::ControlAccessible::ControlAccessible;
91 * @copydoc Dali::Accessibility::Text::GetCharacterCount()
93 std::size_t GetCharacterCount() const override;
96 * @copydoc Dali::Accessibility::Text::GetCursorOffset()
98 std::size_t GetCursorOffset() const override;
101 * @copydoc Dali::Accessibility::Text::GetRangeExtents()
103 Rect<> GetRangeExtents(std::size_t startOffset, std::size_t endOffset, Accessibility::CoordinateType type) override;
106 * @copydoc Dali::Accessibility::Text::GetRangeOfSelection()
108 Accessibility::Range GetRangeOfSelection(std::size_t selectionIndex) const override;
111 * @copydoc Dali::Accessibility::Text::GetText()
113 std::string GetText(std::size_t startOffset, std::size_t endOffset) const override;
116 * @copydoc Dali::Accessibility::Text::GetTextAtOffset()
118 Accessibility::Range GetTextAtOffset(std::size_t offset, Accessibility::TextBoundary boundary) const override;
121 * @copydoc Dali::Accessibility::Text::RemoveSelection()
123 bool RemoveSelection(std::size_t selectionIndex) override;
126 * @copydoc Dali::Accessibility::Text::SetCursorOffset()
128 bool SetCursorOffset(std::size_t offset) override;
131 * @copydoc Dali::Accessibility::Text::SetRangeOfSelection()
133 bool SetRangeOfSelection(std::size_t selectionIndex, std::size_t startOffset, std::size_t endOffset) override;
138 * @copydoc Dali::Accessibility::Hypertext::GetLink()
140 Accessibility::Hyperlink* GetLink(std::int32_t linkIndex) const override;
143 * @copydoc Dali::Accessibility::Hypertext::GetLinkCount()
145 std::int32_t GetLinkCount() const override;
148 * @copydoc Dali::Accessibility::Hypertext::GetLinkIndex()
150 std::int32_t GetLinkIndex(std::int32_t characterOffset) const override;
154 * @brief Gets whole text.
158 std::string GetWholeText() const;
161 * @brief Gets text anchors.
163 * @return Text anchors
165 virtual const std::vector<Toolkit::TextAnchor>& GetTextAnchors() const = 0;
168 * @brief Gets text controller.
170 * @return The text controller
172 virtual Toolkit::Text::ControllerPtr GetTextController() const = 0;
175 * @brief Get substitute character for hidden text.
177 * @return The substitute character (Unicode codepoint)
179 virtual std::uint32_t GetSubstituteCharacter() const;
182 * @brief Checks whether text should be hidden (replaced with substitute characters).
184 * @return True if text should be hidden, false otherwise
186 virtual bool IsHiddenInput() const;
189 * @brief Checks whether [startPosition, endPosition) is a valid, non-empty range within a given string.
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
196 static bool ValidateRange(const std::string& string, std::size_t begin, std::size_t end);
199 class EditableTextControlAccessible : public TextControlAccessible,
200 public virtual Dali::Accessibility::EditableText
203 using TextControlAccessible::TextControlAccessible;
206 * @copydoc Dali::Toolkit::DevelControl::ControlAccessible::CalculateStates()
208 Accessibility::States CalculateStates() override;
213 * @copydoc Dali::Accessibility::Text::GetCursorOffset()
215 std::size_t GetCursorOffset() const override;
218 * @copydoc Dali::Accessibility::Text::SetCursorOffset()
220 bool SetCursorOffset(std::size_t offset) override;
225 * @copydoc Dali::Accessibility::EditableText::CopyText()
227 bool CopyText(size_t startPosition, size_t endPosition) override;
230 * @copydoc Dali::Accessibility::EditableText::CutText()
232 bool CutText(size_t startPosition, size_t endPosition) override;
235 * @copydoc Dali::Accessibility::EditableText::DeleteText()
237 bool DeleteText(size_t startPosition, size_t endPosition) override;
240 * @copydoc Dali::Accessibility::EditableText::InsertText()
242 bool InsertText(size_t startPosition, std::string text) override;
245 * @copydoc Dali::Accessibility::EditableText::SetTextContents()
247 bool SetTextContents(std::string newContents) override;
251 * @brief Requests text relayout.
253 virtual void RequestTextRelayout() = 0;
256 } // namespace Dali::Toolkit::Internal
258 #endif //DALI_TOOLKIT_INTERNAL_TEXT_CONTROLS_COMMON_TEXT_UTILS_H