Add a callback for navigation policy in web view.
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / text-controller.h
1 #ifndef DALI_TOOLKIT_TEXT_CONTROLLER_H
2 #define DALI_TOOLKIT_TEXT_CONTROLLER_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
21 // EXTERNAL INCLUDES
22 #include <dali/devel-api/adaptor-framework/input-method-context.h>
23 #include <dali/public-api/events/gesture.h>
24
25 // INTERNAL INCLUDES
26 #include <dali-toolkit/devel-api/controls/text-controls/text-anchor-devel.h>
27 #include <dali-toolkit/devel-api/controls/text-controls/text-label-devel.h>
28 #include <dali-toolkit/devel-api/controls/text-controls/text-selection-popup-callback-interface.h>
29 #include <dali-toolkit/devel-api/text/text-enumerations-devel.h>
30 #include <dali-toolkit/internal/text/decorator/text-decorator.h>
31 #include <dali-toolkit/internal/text/hidden-text.h>
32 #include <dali-toolkit/internal/text/input-filter.h>
33 #include <dali-toolkit/internal/text/layouts/layout-engine.h>
34 #include <dali-toolkit/internal/text/text-anchor-control-interface.h>
35 #include <dali-toolkit/internal/text/text-model-interface.h>
36 #include <dali-toolkit/internal/text/text-selectable-control-interface.h>
37 #include <dali-toolkit/public-api/text/text-enumerations.h>
38
39 namespace Dali::Toolkit::Text
40 {
41 class Controller;
42 class ControlInterface;
43 class EditableControlInterface;
44 class View;
45 class RenderingController;
46
47 /**
48    * @brief Text selection operations .
49    */
50 enum SelectionType
51 {
52   INTERACTIVE = 0x0000, ///< Select the word where the cursor is located.
53   ALL         = 0x0001, ///< Select the whole text.
54   NONE        = 0x0002, ///< Unselect the whole text.
55   RANGE       = 0x0003  ///< Select the range text.
56 };
57
58 typedef IntrusivePtr<Controller> ControllerPtr;
59
60 /**
61  * @brief A Text Controller is used by UI Controls which display text.
62  *
63  * It manipulates the Logical & Visual text models on behalf of the UI Controls.
64  * It provides a view of the text that can be used by rendering back-ends.
65  *
66  * For selectable/editable UI controls, the controller handles input events from the UI control
67  * and decorations (grab handles etc) via the Decorator::ControllerInterface interface.
68  *
69  * The text selection popup button callbacks are as well handled via the TextSelectionPopupCallbackInterface interface.
70  */
71 class Controller : public RefObject, public Decorator::ControllerInterface, public TextSelectionPopupCallbackInterface, public HiddenText::Observer
72 {
73 public: // Enumerated types.
74   /**
75    * @brief Text related operations to be done in the relayout process.
76    */
77   enum OperationsMask
78   {
79     NO_OPERATION       = 0x0000,
80     CONVERT_TO_UTF32   = 0x0001,
81     GET_SCRIPTS        = 0x0002,
82     VALIDATE_FONTS     = 0x0004,
83     GET_LINE_BREAKS    = 0x0008,
84     BIDI_INFO          = 0x0010,
85     SHAPE_TEXT         = 0x0020,
86     GET_GLYPH_METRICS  = 0x0040,
87     LAYOUT             = 0x0080,
88     UPDATE_LAYOUT_SIZE = 0x0100,
89     REORDER            = 0x0200,
90     ALIGN              = 0x0400,
91     COLOR              = 0x0800,
92     UPDATE_DIRECTION   = 0x1000,
93     ALL_OPERATIONS     = 0xFFFF
94   };
95
96   /**
97    * @brief Used to distinguish between regular key events and InputMethodContext events
98    */
99   enum InsertType
100   {
101     COMMIT,
102     PRE_EDIT
103   };
104
105   /**
106    * @brief Used to specify whether to update the input style.
107    */
108   enum UpdateInputStyleType
109   {
110     UPDATE_INPUT_STYLE,
111     DONT_UPDATE_INPUT_STYLE
112   };
113
114   /**
115    * @brief Used to specify what has been updated after the Relayout() method has been called.
116    */
117   enum UpdateTextType
118   {
119     NONE_UPDATED      = 0x0, ///< Nothing has been updated.
120     MODEL_UPDATED     = 0x1, ///< The text's model has been updated.
121     DECORATOR_UPDATED = 0x2  ///< The decoration has been updated.
122   };
123
124   /**
125    * @brief Different placeholder-text can be shown when the control is active/inactive.
126    */
127   enum PlaceholderType
128   {
129     PLACEHOLDER_TYPE_ACTIVE,
130     PLACEHOLDER_TYPE_INACTIVE,
131   };
132
133   /**
134    * @brief Enumeration for Font Size Type.
135    */
136   enum FontSizeType
137   {
138     POINT_SIZE, // The size of font in points.
139     PIXEL_SIZE  // The size of font in pixels.
140   };
141
142   struct NoTextTap
143   {
144     enum Action
145     {
146       NO_ACTION,           ///< Does no action if there is a tap on top of an area with no text.
147       HIGHLIGHT,           ///< Highlights the nearest text (at the beginning or end of the text) and shows the text's selection popup.
148       SHOW_SELECTION_POPUP ///< Shows the text's selection popup.
149     };
150   };
151
152   struct TextFitInfo
153   {
154     enum Property
155     {
156       TEXT_FIT_ENABLE,
157       TEXT_FIT_MIN_SIZE,
158       TEXT_FIT_MAX_SIZE,
159       TEXT_FIT_STEP_SIZE,
160       TEXT_FIT_FONT_SIZE_TYPE
161     };
162   };
163
164 public: // Constructor.
165   /**
166    * @brief Create a new instance of a Controller.
167    *
168    * @return A pointer to a new Controller.
169    */
170   static ControllerPtr New()
171   {
172     return ControllerPtr(new Controller());
173   }
174
175   /**
176    * @brief Create a new instance of a Controller.
177    *
178    * @param[in] controlInterface The control's interface.
179    *
180    * @return A pointer to a new Controller.
181    */
182   static ControllerPtr New(ControlInterface* controlInterface)
183   {
184     return ControllerPtr(new Controller(controlInterface));
185   }
186
187   /**
188    * @brief Create a new instance of a Controller.
189    *
190    * @param[in] controlInterface The control's interface.
191    * @param[in] editableControlInterface The editable control's interface.
192    * @param[in] selectableControlInterface The selectable control's interface.
193    * @param[in] anchorControlInterface The anchor control's interface.
194    *
195    * @return A pointer to a new Controller.
196    */
197   static ControllerPtr New(ControlInterface*           controlInterface,
198                            EditableControlInterface*   editableControlInterface,
199                            SelectableControlInterface* selectableControlInterface,
200                            AnchorControlInterface*     anchorControlInterface)
201   {
202     return ControllerPtr(new Controller(controlInterface,
203                                         editableControlInterface,
204                                         selectableControlInterface,
205                                         anchorControlInterface));
206   }
207
208 public: // Configure the text controller.
209   /**
210    * @brief Called to enable text input.
211    *
212    * @note Selectable or editable controls should call this once after Controller::New().
213    * @param[in] decorator Used to create cursor, selection handle decorations etc.
214    * @param[in] inputMethodContext Used to manager ime.
215    */
216   void EnableTextInput(DecoratorPtr decorator, InputMethodContext& inputMethodContext);
217
218   /**
219    * @brief Used to switch between bitmap & vector based glyphs
220    *
221    * @param[in] glyphType The type of glyph; note that metrics for bitmap & vector based glyphs are different.
222    */
223   void SetGlyphType(TextAbstraction::GlyphType glyphType);
224
225   /**
226    * @brief Enables/disables the mark-up processor.
227    *
228    * By default is disabled.
229    *
230    * @param[in] enable Whether to enable the mark-up processor.
231    */
232   void SetMarkupProcessorEnabled(bool enable);
233
234   /**
235    * @brief Retrieves whether the mark-up processor is enabled.
236    *
237    * By default is disabled.
238    *
239    * @return @e true if the mark-up processor is enabled, otherwise returns @e false.
240    */
241   bool IsMarkupProcessorEnabled() const;
242
243   /**
244    * @brief Retrieves whether the current text contains anchors.
245    *
246    * @return @e true if the current text contains anchors. @e false.
247    */
248   bool HasAnchors() const;
249
250   /**
251    * @brief Enables/disables the auto text scrolling
252    *
253    * By default is disabled.
254    *
255    * @param[in] enable Whether to enable the auto scrolling
256    */
257   void SetAutoScrollEnabled(bool enable);
258
259   /**
260    * @brief Retrieves whether auto text scrolling is enabled.
261    *
262    * By default is disabled.
263    *
264    * @return @e true if auto scrolling is enabled, otherwise returns @e false.
265    */
266   bool IsAutoScrollEnabled() const;
267
268   /**
269    * @brief Get direction of the text from the first line of text,
270    * @return bool rtl (right to left) is true
271    */
272   CharacterDirection GetAutoScrollDirection() const;
273
274   /**
275    * @brief Get the alignment offset of the first line of text.
276    *
277    * @return The alignment offset.
278    */
279   float GetAutoScrollLineAlignment() const;
280
281   /**
282    * @brief Enables the horizontal scrolling.
283    *
284    * @param[in] enable Whether to enable the horizontal scrolling.
285    */
286   void SetHorizontalScrollEnabled(bool enable);
287
288   /**
289    * @brief Retrieves whether the horizontal scrolling is enabled.
290    *
291    * @return @e true if the horizontal scrolling is enabled, otherwise it returns @e false.
292    */
293   bool IsHorizontalScrollEnabled() const;
294
295   /**
296    * @brief Enables the vertical scrolling.
297    *
298    * @param[in] enable Whether to enable the vertical scrolling.
299    */
300   void SetVerticalScrollEnabled(bool enable);
301
302   /**
303    * @brief Retrieves whether the verticall scrolling is enabled.
304    *
305    * @return @e true if the vertical scrolling is enabled, otherwise it returns @e false.
306    */
307   bool IsVerticalScrollEnabled() const;
308
309   /**
310    * @brief Enables the smooth handle panning.
311    *
312    * @param[in] enable Whether to enable the smooth handle panning.
313    */
314   void SetSmoothHandlePanEnabled(bool enable);
315
316   /**
317    * @brief Retrieves whether the smooth handle panning is enabled.
318    *
319    * @return @e true if the smooth handle panning is enabled.
320    */
321   bool IsSmoothHandlePanEnabled() const;
322
323   /**
324    * @brief Sets the maximum number of characters that can be inserted into the TextModel
325    *
326    * @param[in] maxCharacters maximum number of characters to be accepted
327    */
328   void SetMaximumNumberOfCharacters(Length maxCharacters);
329
330   /**
331    * @brief Sets the maximum number of characters that can be inserted into the TextModel
332    *
333    * @param[in] maxCharacters maximum number of characters to be accepted
334    */
335   int GetMaximumNumberOfCharacters();
336
337   /**
338    * @brief Called to enable/disable cursor blink.
339    *
340    * @note Only editable controls should calls this.
341    * @param[in] enabled Whether the cursor should blink or not.
342    */
343   void SetEnableCursorBlink(bool enable);
344
345   /**
346    * @brief Query whether cursor blink is enabled.
347    *
348    * @return Whether the cursor should blink or not.
349    */
350   bool GetEnableCursorBlink() const;
351
352   /**
353    * @brief Whether to enable the multi-line layout.
354    *
355    * @param[in] enable \e true enables the multi-line (by default)
356    */
357   void SetMultiLineEnabled(bool enable);
358
359   /**
360    * @return Whether the multi-line layout is enabled.
361    */
362   bool IsMultiLineEnabled() const;
363
364   /**
365    * @brief Sets the text's horizontal alignment.
366    *
367    * @param[in] alignment The horizontal alignment.
368    */
369   void SetHorizontalAlignment(HorizontalAlignment::Type alignment);
370
371   /**
372    * @copydoc ModelInterface::GetHorizontalAlignment()
373    */
374   HorizontalAlignment::Type GetHorizontalAlignment() const;
375
376   /**
377    * @brief Sets the text's vertical alignment.
378    *
379    * @param[in] alignment The vertical alignment.
380    */
381   void SetVerticalAlignment(VerticalAlignment::Type alignment);
382
383   /**
384    * @copydoc ModelInterface::GetVerticalAlignment()
385    */
386   VerticalAlignment::Type GetVerticalAlignment() const;
387
388   /**
389    * @brief Sets the text's wrap mode
390    * @param[in] text wrap mode The unit of wrapping
391    */
392   void SetLineWrapMode(Text::LineWrap::Mode textWarpMode);
393
394   /**
395    * @brief Retrieve text wrap mode previously set.
396    * @return text wrap mode
397    */
398   Text::LineWrap::Mode GetLineWrapMode() const;
399
400   /**
401    * @brief Enable or disable the text elide.
402    *
403    * @param[in] enabled Whether to enable the text elide.
404    */
405   void SetTextElideEnabled(bool enabled);
406
407   /**
408    * @copydoc ModelInterface::IsTextElideEnabled()
409    */
410   bool IsTextElideEnabled() const;
411
412   /**
413    * @brief Enable or disable the text fit.
414    *
415    * @param[in] enabled Whether to enable the text fit.
416    */
417   void SetTextFitEnabled(bool enabled);
418
419   /**
420    * @brief Whether the text fit is enabled or not.
421    *
422    * @return True if the text fit is enabled
423    */
424   bool IsTextFitEnabled() const;
425
426   /**
427    * @brief Sets minimum size valid for text fit.
428    *
429    * @param[in] minimum size value.
430    * @param[in] type The font size type is point size or pixel size
431    */
432   void SetTextFitMinSize(float pointSize, FontSizeType type);
433
434   /**
435    * @brief Retrieves the minimum point size valid for text fit.
436    *
437    * @return The minimum point size valid for text fit
438    */
439   float GetTextFitMinSize() const;
440
441   /**
442    * @brief Sets maximum size valid for text fit.
443    *
444    * @param[in] maximum size value.
445    * @param[in] type The font size type is point size or pixel size
446    */
447   void SetTextFitMaxSize(float pointSize, FontSizeType type);
448
449   /**
450    * @brief Retrieves the maximum point size valid for text fit.
451    *
452    * @return The maximum point size valid for text fit
453    */
454   float GetTextFitMaxSize() const;
455
456   /**
457    * @brief Sets step size for font increase valid for text fit.
458    *
459    * @param[in] step size value.
460    * @param[in] type The font size type is point size or pixel size
461    */
462   void SetTextFitStepSize(float step, FontSizeType type);
463
464   /**
465    * @brief Retrieves the step point size valid for text fit.
466    *
467    * @return The step point size valid for text fit
468    */
469   float GetTextFitStepSize() const;
470
471   /**
472    * @brief Sets content size valid for text fit.
473    *
474    * @param[in] Content size value.
475    */
476   void SetTextFitContentSize(Vector2 size);
477
478   /**
479    * @brief Retrieves the content size valid for text fit.
480    *
481    * @return The content size valid for text fit
482    */
483   Vector2 GetTextFitContentSize() const;
484
485   /**
486    * @brief Retrieve the fited point size.
487    *
488    * @return The fited point size.
489    */
490   float GetTextFitPointSize() const;
491
492   /**
493    * @brief Sets whether the text fit properties have changed.
494    *
495    * @param[in] changed Whether to changed the text fit.
496    */
497   void SetTextFitChanged(bool changed);
498
499   /**
500    * @brief Whether the text fit properties are changed or not.
501    *
502    * @return True if the text fit properties are changed
503    */
504   bool IsTextFitChanged() const;
505
506   /**
507    * @brief Enable or disable the placeholder text elide.
508    * @param enabled Whether to enable the placeholder text elide.
509    */
510   void SetPlaceholderTextElideEnabled(bool enabled);
511
512   /**
513    * @brief Whether the placeholder text elide property is enabled.
514    * @return True if the placeholder text elide property is enabled, false otherwise.
515    */
516   bool IsPlaceholderTextElideEnabled() const;
517
518   /**
519    * @brief Enable or disable the text selection.
520    * @param[in] enabled Whether to enable the text selection.
521    */
522   void SetSelectionEnabled(bool enabled);
523
524   /**
525    * @brief Whether the text selection is enabled or not.
526    * @return True if the text selection is enabled
527    */
528   bool IsSelectionEnabled() const;
529
530   /**
531    * @brief Enable or disable the text selection using Shift key.
532    * @param enabled Whether to enable the text selection using Shift key
533    */
534   void SetShiftSelectionEnabled(bool enabled);
535
536   /**
537    * @brief Whether the text selection using Shift key is enabled or not.
538    * @return True if the text selection using Shift key is enabled
539    */
540   bool IsShiftSelectionEnabled() const;
541
542   /**
543    * @brief Enable or disable the grab handles for text selection.
544    *
545    * @param[in] enabled Whether to enable the grab handles
546    */
547   void SetGrabHandleEnabled(bool enabled);
548
549   /**
550    * @brief Returns whether the grab handles are enabled.
551    *
552    * @return True if the grab handles are enabled
553    */
554   bool IsGrabHandleEnabled() const;
555
556   /**
557    * @brief Enable or disable the grab handles for text selection.
558    *
559    * @param[in] enabled Whether to enable the grab handles
560    */
561   void SetGrabHandlePopupEnabled(bool enabled);
562
563   /**
564    * @brief Returns whether the grab handles are enabled.
565    *
566    * @return True if the grab handles are enabled
567    */
568   bool IsGrabHandlePopupEnabled() const;
569
570   /**
571    * @brief Sets input type to password
572    *
573    * @note The string is displayed hidden character
574    *
575    * @param[in] passwordInput True if password input is enabled.
576    */
577   void SetInputModePassword(bool passwordInput);
578
579   /**
580    * @brief Returns whether the input mode type is set as password.
581    *
582    * @return True if input mode type is password
583    */
584   bool IsInputModePassword();
585
586   /**
587    * @brief Sets the action when there is a double tap event on top of a text area with no text.
588    *
589    * @param[in] action The action to do.
590    */
591   void SetNoTextDoubleTapAction(NoTextTap::Action action);
592
593   /**
594    * @brief Retrieves the action when there is a double tap event on top of a text area with no text.
595    *
596    * @return The action to do.
597    */
598   NoTextTap::Action GetNoTextDoubleTapAction() const;
599
600   /**
601    * @briefSets the action when there is a long press event on top of a text area with no text.
602    *
603    * @param[in] action The action to do.
604    */
605   void SetNoTextLongPressAction(NoTextTap::Action action);
606
607   /**
608    * @brief Retrieves the action when there is a long press event on top of a text area with no text.
609    *
610    * @return The action to do.
611    */
612   NoTextTap::Action GetNoTextLongPressAction() const;
613
614   /**
615    * @brief Query if Underline settings were provided by string or map
616    * @return bool true if set by string
617    */
618   bool IsUnderlineSetByString();
619
620   /**
621    * Set method underline setting were set by
622    * @param[in] bool, true if set by string
623    */
624   void UnderlineSetByString(bool setByString);
625
626   /**
627    * @brief Query if shadow settings were provided by string or map
628    * @return bool true if set by string
629    */
630   bool IsShadowSetByString();
631
632   /**
633    * Set method shadow setting were set by
634    * @param[in] bool, true if set by string
635    */
636   void ShadowSetByString(bool setByString);
637
638   /**
639    * @brief Query if outline settings were provided by string or map
640    * @return bool true if set by string
641    */
642   bool IsOutlineSetByString();
643
644   /**
645    * Set method outline setting were set by
646    * @param[in] bool, true if set by string
647    */
648   void OutlineSetByString(bool setByString);
649
650   /**
651    * @brief Query if font style settings were provided by string or map
652    * @return bool true if set by string
653    */
654   bool IsFontStyleSetByString();
655
656   /**
657    * Set method font style setting were set by
658    * @param[in] bool, true if set by string
659    */
660   void FontStyleSetByString(bool setByString);
661
662 public: // Update.
663   /**
664    * @brief Replaces any text previously set.
665    *
666    * @note This will be converted into UTF-32 when stored in the text model.
667    * @param[in] text A string of UTF-8 characters.
668    */
669   void SetText(const std::string& text);
670
671   /**
672    * @brief Retrieve any text previously set.
673    *
674    * @param[out] text A string of UTF-8 characters.
675    */
676   void GetText(std::string& text) const;
677
678   /**
679    * @brief Replaces any placeholder text previously set.
680    *
681    * @param[in] type Different placeholder-text can be shown when the control is active/inactive.
682    * @param[in] text A string of UTF-8 characters.
683    */
684   void SetPlaceholderText(PlaceholderType type, const std::string& text);
685
686   /**
687    * @brief Retrieve any placeholder text previously set.
688    *
689    * @param[in] type Different placeholder-text can be shown when the control is active/inactive.
690    * @param[out] A string of UTF-8 characters.
691    */
692   void GetPlaceholderText(PlaceholderType type, std::string& text) const;
693
694   /**
695    * @ brief Update the text after a font change
696    * @param[in] newDefaultFont The new font to change to
697    */
698   void UpdateAfterFontChange(const std::string& newDefaultFont);
699
700   /**
701    * @brief The method acquires currently selected text
702    * @param selectedText variable to place selected text in
703    */
704   void RetrieveSelection(std::string& selectedText) const;
705
706   /**
707    * @brief The method sets selection in given range
708    * @param start index of first character
709    * @param end   index of first character after selection
710    */
711   void SetSelection(int start, int end);
712
713   /**
714    * @brief This method retrieve indexes of current selection
715    *
716    * @return a pair, where first element is left index of selection and second is the right one
717    */
718   std::pair<int, int> GetSelectionIndexes() const;
719
720   /**
721    * Place string in system clipboard
722    * @param source std::string
723    */
724   void CopyStringToClipboard(const std::string& source);
725
726   /**
727    * Place currently selected text in system clipboard
728    * @param deleteAfterSending flag pointing if text should be deleted after sending to clipboard
729    */
730   void SendSelectionToClipboard(bool deleteAfterSending);
731
732 public: // Default style & Input style
733   /**
734    * @brief Set the default font family.
735    *
736    * @param[in] defaultFontFamily The default font family.
737    */
738   void SetDefaultFontFamily(const std::string& defaultFontFamily);
739
740   /**
741    * @brief Retrieve the default font family.
742    *
743    * @return The default font family.
744    */
745   const std::string& GetDefaultFontFamily() const;
746
747   /**
748    * @brief Sets the placeholder text font family.
749    * @param[in] placeholderTextFontFamily The placeholder text font family.
750    */
751   void SetPlaceholderFontFamily(const std::string& placeholderTextFontFamily);
752
753   /**
754    * @brief Retrieves the placeholder text font family.
755    *
756    * @return The placeholder text font family
757    */
758   const std::string& GetPlaceholderFontFamily() const;
759
760   /**
761    * @brief Sets the default font weight.
762    *
763    * @param[in] weight The font weight.
764    */
765   void SetDefaultFontWeight(FontWeight weight);
766
767   /**
768    * @brief Whether the font's weight has been defined.
769    */
770   bool IsDefaultFontWeightDefined() const;
771
772   /**
773    * @brief Retrieves the default font weight.
774    *
775    * @return The default font weight.
776    */
777   FontWeight GetDefaultFontWeight() const;
778
779   /**
780    * @brief Sets the placeholder text font weight.
781    *
782    * @param[in] weight The font weight
783    */
784   void SetPlaceholderTextFontWeight(FontWeight weight);
785
786   /**
787    * @brief Whether the font's weight has been defined.
788    *
789    * @return True if the placeholder text font weight is defined
790    */
791   bool IsPlaceholderTextFontWeightDefined() const;
792
793   /**
794    * @brief Retrieves the placeholder text font weight.
795    *
796    * @return The placeholder text font weight
797    */
798   FontWeight GetPlaceholderTextFontWeight() const;
799
800   /**
801    * @brief Sets the default font width.
802    *
803    * @param[in] width The font width.
804    */
805   void SetDefaultFontWidth(FontWidth width);
806
807   /**
808    * @brief Whether the font's width has been defined.
809    */
810   bool IsDefaultFontWidthDefined() const;
811
812   /**
813    * @brief Retrieves the default font width.
814    *
815    * @return The default font width.
816    */
817   FontWidth GetDefaultFontWidth() const;
818
819   /**
820    * @brief Sets the placeholder text font width.
821    *
822    * @param[in] width The font width
823    */
824   void SetPlaceholderTextFontWidth(FontWidth width);
825
826   /**
827    * @brief Whether the font's width has been defined.
828    *
829    * @return True if the placeholder text font width is defined
830    */
831   bool IsPlaceholderTextFontWidthDefined() const;
832
833   /**
834    * @brief Retrieves the placeholder text font width.
835    *
836    * @return The placeholder text font width
837    */
838   FontWidth GetPlaceholderTextFontWidth() const;
839
840   /**
841    * @brief Sets the default font slant.
842    *
843    * @param[in] slant The font slant.
844    */
845   void SetDefaultFontSlant(FontSlant slant);
846
847   /**
848    * @brief Whether the font's slant has been defined.
849    */
850   bool IsDefaultFontSlantDefined() const;
851
852   /**
853    * @brief Retrieves the default font slant.
854    *
855    * @return The default font slant.
856    */
857   FontSlant GetDefaultFontSlant() const;
858
859   /**
860    * @brief Sets the placeholder text font slant.
861    *
862    * @param[in] slant The font slant
863    */
864   void SetPlaceholderTextFontSlant(FontSlant slant);
865
866   /**
867    * @brief Whether the font's slant has been defined.
868    *
869    * @return True if the placeholder text font slant is defined
870    */
871   bool IsPlaceholderTextFontSlantDefined() const;
872
873   /**
874    * @brief Retrieves the placeholder text font slant.
875    *
876    * @return The placeholder text font slant
877    */
878   FontSlant GetPlaceholderTextFontSlant() const;
879
880   /**
881    * @brief Set the default font size.
882    *
883    * @param[in] fontSize The default font size
884    * @param[in] type The font size type is point size or pixel size
885    */
886   void SetDefaultFontSize(float fontSize, FontSizeType type);
887
888   /**
889    * @brief Retrieve the default point size.
890    *
891    * @param[in] type The font size type
892    * @return The default point size.
893    */
894   float GetDefaultFontSize(FontSizeType type) const;
895
896   /**
897    * @brief Set the font size scale.
898    *
899    * @param[in] scale The font size scale
900    */
901   void SetFontSizeScale(float scale);
902
903   /**
904    * @brief Get the font size scale.
905    *
906    * @return The font size scale.
907    */
908   float GetFontSizeScale() const;
909
910   /**
911    * @brief Sets the Placeholder text font size.
912    * @param[in] fontSize The placeholder text font size
913    * @param[in] type The font size type is point size or pixel size
914    */
915   void SetPlaceholderTextFontSize(float fontSize, FontSizeType type);
916
917   /**
918    * @brief Retrieves the Placeholder text font size.
919    * @param[in] type The font size type
920    * @return The placeholder font size
921    */
922   float GetPlaceholderTextFontSize(FontSizeType type) const;
923
924   /**
925    * @brief Sets the text's default color.
926    *
927    * @param color The default color.
928    */
929   void SetDefaultColor(const Vector4& color);
930
931   /**
932    * @brief Retrieves the text's default color.
933    *
934    * @return The default color.
935    */
936   const Vector4& GetDefaultColor() const;
937
938   /**
939    * @brief Set the text color
940    *
941    * @param textColor The text color
942    */
943   void SetPlaceholderTextColor(const Vector4& textColor);
944
945   /**
946    * @brief Retrieve the text color
947    *
948    * @return The text color
949    */
950   const Vector4& GetPlaceholderTextColor() const;
951
952   /**
953    * @brief Set the shadow offset.
954    *
955    * @param[in] shadowOffset The shadow offset, 0,0 indicates no shadow.
956    */
957   void SetShadowOffset(const Vector2& shadowOffset);
958
959   /**
960    * @brief Retrieve the shadow offset.
961    *
962    * @return The shadow offset.
963    */
964   const Vector2& GetShadowOffset() const;
965
966   /**
967    * @brief Set the shadow color.
968    *
969    * @param[in] shadowColor The shadow color.
970    */
971   void SetShadowColor(const Vector4& shadowColor);
972
973   /**
974    * @brief Retrieve the shadow color.
975    *
976    * @return The shadow color.
977    */
978   const Vector4& GetShadowColor() const;
979
980   /**
981    * @brief Set the shadow blur radius.
982    *
983    * @param[in] shadowBlurRadius The shadow blur radius, 0,0 indicates no blur.
984    */
985   void SetShadowBlurRadius(const float& shadowBlurRadius);
986
987   /**
988    * @brief Retrieve the shadow blur radius.
989    *
990    * @return The shadow blur radius.
991    */
992   const float& GetShadowBlurRadius() const;
993
994   /**
995    * @brief Set the underline color.
996    *
997    * @param[in] color color of underline.
998    */
999   void SetUnderlineColor(const Vector4& color);
1000
1001   /**
1002    * @brief Retrieve the underline color.
1003    *
1004    * @return The underline color.
1005    */
1006   const Vector4& GetUnderlineColor() const;
1007
1008   /**
1009    * @brief Set the underline enabled flag.
1010    *
1011    * @param[in] enabled The underline enabled flag.
1012    */
1013   void SetUnderlineEnabled(bool enabled);
1014
1015   /**
1016    * @brief Returns whether the text is underlined or not.
1017    *
1018    * @return The underline state.
1019    */
1020   bool IsUnderlineEnabled() const;
1021
1022   /**
1023    * @brief Set the override used for underline height, 0 indicates height will be supplied by font metrics
1024    *
1025    * @param[in] height The height in pixels of the underline
1026    */
1027   void SetUnderlineHeight(float height);
1028
1029   /**
1030    * @brief Retrieves the override height of an underline, 0 indicates height is supplied by font metrics
1031    *
1032    * @return The height of the underline, or 0 if height is not overrided.
1033    */
1034   float GetUnderlineHeight() const;
1035
1036   /**
1037    * @brief Set the outline color.
1038    *
1039    * @param[in] color color of outline.
1040    */
1041   void SetOutlineColor(const Vector4& color);
1042
1043   /**
1044    * @brief Retrieve the outline color.
1045    *
1046    * @return The outline color.
1047    */
1048   const Vector4& GetOutlineColor() const;
1049
1050   /**
1051    * @brief Set the outline width
1052    *
1053    * @param[in] width The width in pixels of the outline, 0 indicates no outline
1054    */
1055   void SetOutlineWidth(uint16_t width);
1056
1057   /**
1058    * @brief Retrieves the width of an outline
1059    *
1060    * @return The width of the outline.
1061    */
1062   uint16_t GetOutlineWidth() const;
1063
1064   /**
1065    * @brief Set the background color.
1066    *
1067    * @param[in] color color of background.
1068    */
1069   void SetBackgroundColor(const Vector4& color);
1070
1071   /**
1072    * @brief Retrieve the background color.
1073    *
1074    * @return The background color.
1075    */
1076   const Vector4& GetBackgroundColor() const;
1077
1078   /**
1079    * @brief Set the background enabled flag.
1080    *
1081    * @param[in] enabled The background enabled flag.
1082    */
1083   void SetBackgroundEnabled(bool enabled);
1084
1085   /**
1086    * @brief Returns whether to enable text background or not.
1087    *
1088    * @return Whether text background is enabled.
1089    */
1090   bool IsBackgroundEnabled() const;
1091
1092   /**
1093    * @brief Sets the emboss's properties string.
1094    *
1095    * @note The string is stored to be recovered.
1096    *
1097    * @param[in] embossProperties The emboss's properties string.
1098    */
1099   void SetDefaultEmbossProperties(const std::string& embossProperties);
1100
1101   /**
1102    * @brief Retrieves the emboss's properties string.
1103    *
1104    * @return The emboss's properties string.
1105    */
1106   const std::string& GetDefaultEmbossProperties() const;
1107
1108   /**
1109    * @brief Sets the outline's properties string.
1110    *
1111    * @note The string is stored to be recovered.
1112    *
1113    * @param[in] outlineProperties The outline's properties string.
1114    */
1115   void SetDefaultOutlineProperties(const std::string& outlineProperties);
1116
1117   /**
1118    * @brief Retrieves the outline's properties string.
1119    *
1120    * @return The outline's properties string.
1121    */
1122   const std::string& GetDefaultOutlineProperties() const;
1123
1124   /**
1125    * @brief Sets the default line spacing.
1126    *
1127    * @param[in] lineSpacing The line spacing.
1128    *
1129    * @return True if lineSpacing has been updated, false otherwise
1130    */
1131   bool SetDefaultLineSpacing(float lineSpacing);
1132
1133   /**
1134    * @brief Retrieves the default line spacing.
1135    *
1136    * @return The line spacing.
1137    */
1138   float GetDefaultLineSpacing() const;
1139
1140   /**
1141    * @brief Sets the default line size.
1142    *
1143    * @param[in] lineSize The line size.
1144    *
1145    * @return True if lineSize has been updated, false otherwise
1146    */
1147   bool SetDefaultLineSize(float lineSize);
1148
1149   /**
1150    * @brief Retrieves the default line size.
1151    *
1152    * @return The line size.
1153    */
1154   float GetDefaultLineSize() const;
1155
1156   /**
1157    * @brief Sets the input text's color.
1158    *
1159    * @param[in] color The input text's color.
1160    */
1161   void SetInputColor(const Vector4& color);
1162
1163   /**
1164    * @brief Retrieves the input text's color.
1165    *
1166    * @return The input text's color.
1167    */
1168   const Vector4& GetInputColor() const;
1169
1170   /**
1171    * @brief Sets the input text's font family name.
1172    *
1173    * @param[in] fontFamily The text's font family name.
1174    */
1175   void SetInputFontFamily(const std::string& fontFamily);
1176
1177   /**
1178    * @brief Retrieves the input text's font family name.
1179    *
1180    * @return The input text's font family name.
1181    */
1182   const std::string& GetInputFontFamily() const;
1183
1184   /**
1185    * @brief Sets the input font's weight.
1186    *
1187    * @param[in] weight The input font's weight.
1188    */
1189   void SetInputFontWeight(FontWeight weight);
1190
1191   /**
1192    * @return Whether the font's weight has been defined.
1193    */
1194   bool IsInputFontWeightDefined() const;
1195
1196   /**
1197    * @brief Retrieves the input font's weight.
1198    *
1199    * @return The input font's weight.
1200    */
1201   FontWeight GetInputFontWeight() const;
1202
1203   /**
1204    * @brief Sets the input font's width.
1205    *
1206    * @param[in] width The input font's width.
1207    */
1208   void SetInputFontWidth(FontWidth width);
1209
1210   /**
1211    * @return Whether the font's width has been defined.
1212    */
1213   bool IsInputFontWidthDefined() const;
1214
1215   /**
1216    * @brief Retrieves the input font's width.
1217    *
1218    * @return The input font's width.
1219    */
1220   FontWidth GetInputFontWidth() const;
1221
1222   /**
1223    * @brief Sets the input font's slant.
1224    *
1225    * @param[in] slant The input font's slant.
1226    */
1227   void SetInputFontSlant(FontSlant slant);
1228
1229   /**
1230    * @return Whether the font's slant has been defined.
1231    */
1232   bool IsInputFontSlantDefined() const;
1233
1234   /**
1235    * @brief Retrieves the input font's slant.
1236    *
1237    * @return The input font's slant.
1238    */
1239   FontSlant GetInputFontSlant() const;
1240
1241   /**
1242    * @brief Sets the input font's point size.
1243    *
1244    * @param[in] size The input font's point size.
1245    */
1246   void SetInputFontPointSize(float size);
1247
1248   /**
1249    * @brief Retrieves the input font's point size.
1250    *
1251    * @return The input font's point size.
1252    */
1253   float GetInputFontPointSize() const;
1254
1255   /**
1256    * @brief Sets the input line spacing.
1257    *
1258    * @param[in] lineSpacing The line spacing.
1259    */
1260   void SetInputLineSpacing(float lineSpacing);
1261
1262   /**
1263    * @brief Retrieves the input line spacing.
1264    *
1265    * @return The line spacing.
1266    */
1267   float GetInputLineSpacing() const;
1268
1269   /**
1270    * @brief Sets the input shadow's properties string.
1271    *
1272    * @note The string is stored to be recovered.
1273    *
1274    * @param[in] shadowProperties The shadow's properties string.
1275    */
1276   void SetInputShadowProperties(const std::string& shadowProperties);
1277
1278   /**
1279    * @brief Retrieves the input shadow's properties string.
1280    *
1281    * @return The shadow's properties string.
1282    */
1283   const std::string& GetInputShadowProperties() const;
1284
1285   /**
1286    * @brief Sets the input underline's properties string.
1287    *
1288    * @note The string is stored to be recovered.
1289    *
1290    * @param[in] underlineProperties The underline's properties string.
1291    */
1292   void SetInputUnderlineProperties(const std::string& underlineProperties);
1293
1294   /**
1295    * @brief Retrieves the input underline's properties string.
1296    *
1297    * @return The underline's properties string.
1298    */
1299   const std::string& GetInputUnderlineProperties() const;
1300
1301   /**
1302    * @brief Sets the input emboss's properties string.
1303    *
1304    * @note The string is stored to be recovered.
1305    *
1306    * @param[in] embossProperties The emboss's properties string.
1307    */
1308   void SetInputEmbossProperties(const std::string& embossProperties);
1309
1310   /**
1311    * @brief Retrieves the input emboss's properties string.
1312    *
1313    * @return The emboss's properties string.
1314    */
1315   const std::string& GetInputEmbossProperties() const;
1316
1317   /**
1318    * @brief Sets input the outline's properties string.
1319    *
1320    * @note The string is stored to be recovered.
1321    *
1322    * @param[in] outlineProperties The outline's properties string.
1323    */
1324   void SetInputOutlineProperties(const std::string& outlineProperties);
1325
1326   /**
1327    * @brief Retrieves the input outline's properties string.
1328    *
1329    * @return The outline's properties string.
1330    */
1331   const std::string& GetInputOutlineProperties() const;
1332
1333   /**
1334    * @brief Set the control's interface.
1335    *
1336    * @param[in] controlInterface The control's interface.
1337    */
1338   void SetControlInterface(ControlInterface* controlInterface);
1339
1340   /**
1341    * @brief Set the anchor control's interface.
1342    *
1343    * @param[in] anchorControlInterface The control's interface.
1344    */
1345   void SetAnchorControlInterface(AnchorControlInterface* anchorControlInterface);
1346
1347 public: // Queries & retrieves.
1348   /**
1349    * @brief Return the layout engine.
1350    *
1351    * @return A reference to the layout engine.
1352    */
1353   Layout::Engine& GetLayoutEngine();
1354
1355   /**
1356    * @brief Return a view of the text.
1357    *
1358    * @return A reference to the view.
1359    */
1360   View& GetView();
1361
1362   /**
1363    * @copydoc Control::GetNaturalSize()
1364    */
1365   Vector3 GetNaturalSize();
1366
1367   /**
1368    * @copydoc Control::GetHeightForWidth()
1369    */
1370   float GetHeightForWidth(float width);
1371
1372   /**
1373    * @brief Calculates the point size for text for given layout()
1374    */
1375   void FitPointSizeforLayout(Size layoutSize);
1376
1377   /**
1378    * @brief Checks if the point size fits within the layout size.
1379    *
1380    * @return Whether the point size fits within the layout size.
1381    */
1382   bool CheckForTextFit(float pointSize, Size& layoutSize);
1383
1384   /**
1385    * @brief Retrieves the text's number of lines for a given width.
1386    * @param[in] width The width of the text's area.
1387    * @ return The number of lines.
1388    */
1389   int GetLineCount(float width);
1390
1391   /**
1392    * @brief Retrieves the text's model.
1393    *
1394    * @return A pointer to the text's model.
1395    */
1396   const ModelInterface* const GetTextModel() const;
1397
1398   /**
1399    * @brief Used to get scrolled distance by user input
1400    *
1401    * @return Distance from last scroll offset to new scroll offset
1402    */
1403   float GetScrollAmountByUserInput();
1404
1405   /**
1406    * @brief Get latest scroll amount, control size and layout size
1407    *
1408    * This method is used to get information of control's scroll
1409    * @param[out] scrollPosition The current scrolled position
1410    * @param[out] controlHeight The size of a UI control
1411    * @param[out] layoutHeight The size of a bounding box to layout text within.
1412    *
1413    * @return Whether the text scroll position is changed or not after last update.
1414    */
1415   bool GetTextScrollInfo(float& scrollPosition, float& controlHeight, float& layoutHeight);
1416
1417   /**
1418    * @brief Used to set the hidden input option
1419    */
1420   void SetHiddenInputOption(const Property::Map& options);
1421
1422   /**
1423    * @brief Used to get the hidden input option
1424    */
1425   void GetHiddenInputOption(Property::Map& options);
1426
1427   /**
1428    * @brief Used to set the input filter option
1429    */
1430   void SetInputFilterOption(const Property::Map& options);
1431
1432   /**
1433    * @brief Used to get the input filter option
1434    */
1435   void GetInputFilterOption(Property::Map& options);
1436
1437   /**
1438    * @brief Sets the Placeholder Properties.
1439    *
1440    * @param[in] map The placeholder property map
1441    */
1442   void SetPlaceholderProperty(const Property::Map& map);
1443
1444   /**
1445    * @brief Retrieves the Placeholder Property map.
1446    *
1447    * @param[out] map The property map
1448    */
1449   void GetPlaceholderProperty(Property::Map& map);
1450
1451   /**
1452    * @brief Checks text direction.
1453    * @return The text direction.
1454    */
1455   Toolkit::DevelText::TextDirection::Type GetTextDirection();
1456
1457   /**
1458    * @brief Retrieves vertical line alignment
1459    * @return The vertical line alignment
1460    */
1461   Toolkit::DevelText::VerticalLineAlignment::Type GetVerticalLineAlignment() const;
1462
1463   /**
1464    * @brief Sets vertical line alignment
1465    * @param[in] alignment The vertical line alignment for the text
1466    */
1467   void SetVerticalLineAlignment(Toolkit::DevelText::VerticalLineAlignment::Type alignment);
1468
1469   /**
1470    * @brief Retrieves ellipsis position
1471    * @return The ellipsis position
1472    */
1473   Toolkit::DevelText::EllipsisPosition::Type GetEllipsisPosition() const;
1474
1475   /**
1476    * @brief Sets ellipsis position
1477    * @param[in] ellipsisPosition The ellipsis position for the text
1478    */
1479   void SetEllipsisPosition(Toolkit::DevelText::EllipsisPosition::Type ellipsisPosition);
1480
1481   /**
1482    * @brief Retrieves ignoreSpaceAfterText value from model
1483    * @return The value of ignoreSpaceAfterText
1484    */
1485   bool IsIgnoreSpacesAfterText() const;
1486
1487   /**
1488    * @brief Sets ignoreSpaceAfterText value to model
1489    * @param[in] ignore The value of ignoreSpacesAfterText for the text
1490    */
1491   void SetIgnoreSpacesAfterText(bool ignore);
1492
1493   /**
1494    * @brief Sets SetMatchLayoutDirection value to model
1495    * @param[in] match The value of matchLayoutDirection for the text
1496    */
1497   void SetMatchLayoutDirection(DevelText::MatchLayoutDirection type);
1498
1499   /**
1500    * @brief Retrieves matchLayoutDirection value from model
1501    * @return The value of matchLayoutDirection
1502    */
1503   DevelText::MatchLayoutDirection GetMatchLayoutDirection() const;
1504
1505   /**
1506    * @brief Sets layoutDirection type value.
1507    * @param[in] layoutDirection The value of the layout direction type.
1508    */
1509   void SetLayoutDirection(Dali::LayoutDirection::Type layoutDirection);
1510
1511   /**
1512    * @brief Gets layoutDirection type value.
1513    * @param[in] actor The actor which will get the layout direction type.
1514    * @return The value of the layout direction type.
1515    */
1516   Dali::LayoutDirection::Type GetLayoutDirection(Dali::Actor& actor) const;
1517
1518   /**
1519    * @brief Get the rendered size of a specific text range.
1520    * if the requested text is at multilines, multiple sizes will be returned for each text located in a separate line.
1521    * if a line contains characters with different directions, multiple sizes will be returned for each block of contiguous characters with the same direction.
1522    *
1523    * @param[in] startIndex start index of the text requested to calculate size for.
1524    * @param[in] endIndex end index(included) of the text requested to calculate size for.
1525    * @return list of sizes of the reuested text.
1526    */
1527   Vector<Vector2> GetTextSize(CharacterIndex startIndex, CharacterIndex endIndex);
1528
1529   /**
1530    * @brief Get the top/left rendered position of a specific text range.
1531    * if the requested text is at multilines, multiple positions will be returned for each text located in a separate line.
1532    * if a line contains characters with different directions, multiple positions will be returned for each block of contiguous characters with the same direction.
1533    *
1534    * @param[in] startIndex start index of the text requested to get position to.
1535    * @param[in] endIndex end index(included) of the text requested to get position to.
1536    * @return list of positions of the requested text.
1537    */
1538   Vector<Vector2> GetTextPosition(CharacterIndex startIndex, CharacterIndex endIndex);
1539
1540   /**
1541    * @brief Sets the layout direction changed.
1542    */
1543   void ChangedLayoutDirection();
1544
1545   /**
1546    * @brief Retrieves if showing real text or not.
1547    * @return The value of showing real text.
1548    */
1549   bool IsShowingRealText() const;
1550
1551 public: // Relayout.
1552   /**
1553    * @brief Triggers a relayout which updates View (if necessary).
1554    *
1555    * @note UI Controls are expected to minimize calls to this method e.g. call once after size negotiation.
1556    * @param[in] size A the size of a bounding box to layout text within.
1557    * @param[in] layoutDirection The direction of the system language.
1558    *
1559    * @return Whether the text model or decorations were updated.
1560    */
1561   UpdateTextType Relayout(const Size& size, Dali::LayoutDirection::Type layoutDirection = Dali::LayoutDirection::LEFT_TO_RIGHT);
1562
1563   /**
1564    * @brief Request a relayout using the ControlInterface.
1565    */
1566   void RequestRelayout();
1567
1568 public: // Input style change signals.
1569   /**
1570    * @return Whether the queue of input style changed signals is empty.
1571    */
1572   bool IsInputStyleChangedSignalsQueueEmpty();
1573
1574   /**
1575    * @brief Process all pending input style changed signals.
1576    *
1577    * Calls the Text::ControlInterface::InputStyleChanged() method which is overriden by the
1578    * text controls. Text controls may send signals to state the input style has changed.
1579    */
1580   void ProcessInputStyleChangedSignals();
1581
1582 public: // Text-input Event Queuing.
1583   /**
1584    * @brief Called by editable UI controls when keyboard focus is gained.
1585    */
1586   void KeyboardFocusGainEvent();
1587
1588   /**
1589    * @brief Called by editable UI controls when focus is lost.
1590    */
1591   void KeyboardFocusLostEvent();
1592
1593   /**
1594    * @brief Called by editable UI controls when key events are received.
1595    *
1596    * @param[in] event The key event.
1597    * @param[in] type Used to distinguish between regular key events and InputMethodContext events.
1598    */
1599   bool KeyEvent(const Dali::KeyEvent& event);
1600
1601   /**
1602    * @brief Called by anchor when a tap gesture occurs.
1603    * @param[in] x The x position relative to the top-left of the parent control.
1604    * @param[in] y The y position relative to the top-left of the parent control.
1605    */
1606   void AnchorEvent(float x, float y);
1607
1608   /**
1609    * @brief Called by editable UI controls when a tap gesture occurs.
1610    * @param[in] tapCount The number of taps.
1611    * @param[in] x The x position relative to the top-left of the parent control.
1612    * @param[in] y The y position relative to the top-left of the parent control.
1613    */
1614   void TapEvent(unsigned int tapCount, float x, float y);
1615
1616   /**
1617    * @brief Called by editable UI controls when a pan gesture occurs.
1618    *
1619    * @param[in] state The state of the gesture.
1620    * @param[in] displacement This distance panned since the last pan gesture.
1621    */
1622   void PanEvent(GestureState state, const Vector2& displacement);
1623
1624   /**
1625    * @brief Called by editable UI controls when a long press gesture occurs.
1626    *
1627    * @param[in] state The state of the gesture.
1628    * @param[in] x The x position relative to the top-left of the parent control.
1629    * @param[in] y The y position relative to the top-left of the parent control.
1630    */
1631   void LongPressEvent(GestureState state, float x, float y);
1632
1633   /**
1634    * @brief Used to get the Primary cursor position.
1635    *
1636    * @return Primary cursor position.
1637    */
1638   CharacterIndex GetPrimaryCursorPosition() const;
1639
1640   /**
1641    * @brief Used to set the Primary cursor position.
1642    *
1643    * @param[in] index for the Primary cursor position.
1644    * @param[in] focused true if UI control has gained focus to receive key event, false otherwise.
1645    * @return[in] true if cursor position changed, false otherwise.
1646    */
1647   bool SetPrimaryCursorPosition(CharacterIndex index, bool focused);
1648
1649   /**
1650    * @brief Creates a selection event.
1651    *
1652    * It could be called from the TapEvent (double tap) or when the text selection popup's sellect all button is pressed.
1653    *
1654    * @param[in] x The x position relative to the top-left of the parent control.
1655    * @param[in] y The y position relative to the top-left of the parent control.
1656    * @param[in] selection type like the whole text is selected or unselected.
1657    */
1658   void SelectEvent(float x, float y, SelectionType selection);
1659
1660   /**
1661    * @copydoc Text::SelectableControlInterface::SetTextSelectionRange()
1662    */
1663   void SetTextSelectionRange(const uint32_t* start, const uint32_t* end);
1664
1665   /**
1666    * @copydoc Text::SelectableControlInterface::GetTextSelectionRange()
1667    */
1668   Uint32Pair GetTextSelectionRange() const;
1669
1670   /**
1671    * @copydoc Text::SelectableControlInterface::SelectWholeText()
1672    */
1673   void SelectWholeText();
1674
1675   /**
1676    * @copydoc Text::EditableControlInterface::CopyText()
1677    */
1678   string CopyText();
1679
1680   /**
1681    * @copydoc Text::EditableControlInterface::CutText()
1682    */
1683   string CutText();
1684
1685   /**
1686    * @copydoc Text::EditableControlInterface::PasteText()
1687    */
1688   void PasteText();
1689
1690   /**
1691    * @copydoc Text::SelectableControlInterface::SelectNone()
1692    */
1693   void SelectNone();
1694
1695   /**
1696    * @copydoc Text::SelectableControlInterface::SelectText()
1697    */
1698   void SelectText(const uint32_t start, const uint32_t end);
1699
1700   /**
1701    * @copydoc Text::SelectableControlInterface::GetSelectedText()
1702    */
1703   string GetSelectedText() const;
1704
1705   /**
1706    * @copydoc Text::EditableControlInterface::IsEditable()
1707    */
1708   virtual bool IsEditable() const;
1709
1710   /**
1711    * @copydoc Text::EditableControlInterface::SetEditable()
1712    */
1713   virtual void SetEditable(bool editable);
1714
1715   /**
1716    * @copydoc Dali::Toolkit::Internal::TextEditor::ScrollBy()
1717    */
1718   virtual void ScrollBy(Vector2 scroll);
1719
1720   /**
1721    * @copydoc Dali::Toolkit::Internal::TextEditor::GetHorizontalScrollPosition()
1722    */
1723   float GetHorizontalScrollPosition();
1724
1725   /**
1726    * @copydoc Dali::Toolkit::Internal::TextEditor::GetVerticalScrollPosition()
1727    */
1728   float GetVerticalScrollPosition();
1729
1730   /**
1731    * @brief Event received from input method context
1732    *
1733    * @param[in] inputMethodContext The input method context.
1734    * @param[in] inputMethodContextEvent The event received.
1735    * @return A data struture indicating if update is needed, cursor position and current text.
1736    */
1737   InputMethodContext::CallbackData OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent);
1738
1739   /**
1740    * @brief Event from Clipboard notifying an Item has been selected for pasting
1741    */
1742   void PasteClipboardItemEvent();
1743
1744   /**
1745    * @brief Return true when text control should clear key input focus when escape key is pressed.
1746    *
1747    * @return Whether text control should clear key input focus or not when escape key is pressed.
1748    */
1749   bool ShouldClearFocusOnEscape() const;
1750
1751   /**
1752    * @brief Create an actor that renders the text background color
1753    *
1754    * @return the created actor or an empty handle if no background color needs to be rendered.
1755    */
1756   Actor CreateBackgroundActor();
1757
1758   /**
1759    * @brief Used to reset the cursor position after setting a new text.
1760    *
1761    * @param[in] cursorIndex Where to place the cursor.
1762    */
1763   void ResetCursorPosition(CharacterIndex cursorIndex);
1764
1765   /**
1766    * @brief The method acquires current position of cursor
1767    * @return unsigned value with cursor position
1768    */
1769   CharacterIndex GetCursorPosition();
1770
1771   /**
1772    * @brief Resets a provided vector with actors that marks the position of anchors in markup enabled text
1773    *
1774    * @param[out] anchorActors the vector of actor (empty collection if no anchors available).
1775    */
1776   void GetAnchorActors(std::vector<Toolkit::TextAnchor>& anchorActors);
1777
1778   /**
1779    * @brief Return an index of first anchor in the anchor vector whose boundaries includes given character offset
1780    *
1781    * @param[in] characterOffset A position in text coords.
1782    *
1783    * @return the index in anchor vector (-1 if an anchor not found)
1784    */
1785   int GetAnchorIndex(size_t characterOffset);
1786
1787 protected: // Inherit from Text::Decorator::ControllerInterface.
1788   /**
1789    * @copydoc Dali::Toolkit::Text::Decorator::ControllerInterface::GetTargetSize()
1790    */
1791   void GetTargetSize(Vector2& targetSize) override;
1792
1793   /**
1794    * @copydoc Dali::Toolkit::Text::Decorator::ControllerInterface::AddDecoration()
1795    */
1796   void AddDecoration(Actor& actor, bool needsClipping) override;
1797
1798   /**
1799    * @copydoc Dali::Toolkit::Text::Decorator::ControllerInterface::DecorationEvent()
1800    */
1801   void DecorationEvent(HandleType handle, HandleState state, float x, float y) override;
1802
1803 protected: // Inherit from TextSelectionPopup::TextPopupButtonCallbackInterface.
1804   /**
1805    * @copydoc Dali::Toolkit::TextSelectionPopup::TextPopupButtonCallbackInterface::TextPopupButtonTouched()
1806    */
1807   void TextPopupButtonTouched(Dali::Toolkit::TextSelectionPopup::Buttons button) override;
1808
1809 protected: // Inherit from HiddenText.
1810   /**
1811    * @brief Invoked from HiddenText when showing time of the last character was expired
1812    */
1813   void DisplayTimeExpired() override;
1814
1815 private: // Private contructors & copy operator.
1816   /**
1817    * @brief Private constructor.
1818    */
1819   Controller()
1820   : Controller(nullptr, nullptr, nullptr, nullptr)
1821   {
1822   }
1823
1824   /**
1825    * @brief Private constructor.
1826    */
1827   Controller(ControlInterface* controlInterface)
1828   : Controller(controlInterface, nullptr, nullptr, nullptr)
1829   {
1830   }
1831
1832   /**
1833    * @brief Private constructor.
1834    */
1835   Controller(ControlInterface*           controlInterface,
1836              EditableControlInterface*   editableControlInterface,
1837              SelectableControlInterface* selectableControlInterface,
1838              AnchorControlInterface*     anchorControlInterface);
1839
1840   Controller(const Controller& handle) = delete;
1841   Controller& operator=(const Controller& handle) = delete;
1842
1843 protected: // Destructor.
1844   /**
1845    * @brief A reference counted object may only be deleted by calling Unreference().
1846    */
1847   virtual ~Controller();
1848
1849 public:
1850   struct Impl; ///< Made public for testing purposes
1851
1852 private:
1853   struct EventHandler;
1854   struct InputFontHandler;
1855   struct InputProperties;
1856   struct PlaceholderHandler;
1857   struct Relayouter;
1858   struct TextUpdater;
1859
1860   Impl* mImpl;
1861 };
1862
1863 } // namespace Dali::Toolkit::Text
1864
1865 #endif // DALI_TOOLKIT_TEXT_CONTROLLER_H