Fix key event propagation in text controller
[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) 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
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 Sets disabled color opacity.
508    *
509    * @param[in] opacity The color opacity value in disabled state.
510    */
511   void SetDisabledColorOpacity(float opacity);
512
513   /**
514    * @brief Retrieves the disabled color opacity.
515    *
516    * @return The disabled color opacity value for disabled state.
517    */
518   float GetDisabledColorOpacity() const;
519
520   /**
521    * @brief Enable or disable the placeholder text elide.
522    * @param enabled Whether to enable the placeholder text elide.
523    */
524   void SetPlaceholderTextElideEnabled(bool enabled);
525
526   /**
527    * @brief Whether the placeholder text elide property is enabled.
528    * @return True if the placeholder text elide property is enabled, false otherwise.
529    */
530   bool IsPlaceholderTextElideEnabled() const;
531
532   /**
533    * @brief Enable or disable the text selection.
534    * @param[in] enabled Whether to enable the text selection.
535    */
536   void SetSelectionEnabled(bool enabled);
537
538   /**
539    * @brief Whether the text selection is enabled or not.
540    * @return True if the text selection is enabled
541    */
542   bool IsSelectionEnabled() const;
543
544   /**
545    * @brief Enable or disable the text selection using Shift key.
546    * @param enabled Whether to enable the text selection using Shift key
547    */
548   void SetShiftSelectionEnabled(bool enabled);
549
550   /**
551    * @brief Whether the text selection using Shift key is enabled or not.
552    * @return True if the text selection using Shift key is enabled
553    */
554   bool IsShiftSelectionEnabled() 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 SetGrabHandleEnabled(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 IsGrabHandleEnabled() const;
569
570   /**
571    * @brief Enable or disable the grab handles for text selection.
572    *
573    * @param[in] enabled Whether to enable the grab handles
574    */
575   void SetGrabHandlePopupEnabled(bool enabled);
576
577   /**
578    * @brief Returns whether the grab handles are enabled.
579    *
580    * @return True if the grab handles are enabled
581    */
582   bool IsGrabHandlePopupEnabled() const;
583
584   /**
585    * @brief Sets input type to password
586    *
587    * @note The string is displayed hidden character
588    *
589    * @param[in] passwordInput True if password input is enabled.
590    */
591   void SetInputModePassword(bool passwordInput);
592
593   /**
594    * @brief Returns whether the input mode type is set as password.
595    *
596    * @return True if input mode type is password
597    */
598   bool IsInputModePassword();
599
600   /**
601    * @brief Sets the action when there is a double tap event on top of a text area with no text.
602    *
603    * @param[in] action The action to do.
604    */
605   void SetNoTextDoubleTapAction(NoTextTap::Action action);
606
607   /**
608    * @brief Retrieves the action when there is a double tap event on top of a text area with no text.
609    *
610    * @return The action to do.
611    */
612   NoTextTap::Action GetNoTextDoubleTapAction() const;
613
614   /**
615    * @briefSets the action when there is a long press event on top of a text area with no text.
616    *
617    * @param[in] action The action to do.
618    */
619   void SetNoTextLongPressAction(NoTextTap::Action action);
620
621   /**
622    * @brief Retrieves the action when there is a long press event on top of a text area with no text.
623    *
624    * @return The action to do.
625    */
626   NoTextTap::Action GetNoTextLongPressAction() const;
627
628   /**
629    * @brief Query if Underline settings were provided by string or map
630    * @return bool true if set by string
631    */
632   bool IsUnderlineSetByString();
633
634   /**
635    * Set method underline setting were set by
636    * @param[in] bool, true if set by string
637    */
638   void UnderlineSetByString(bool setByString);
639
640   /**
641    * @brief Query if shadow settings were provided by string or map
642    * @return bool true if set by string
643    */
644   bool IsShadowSetByString();
645
646   /**
647    * Set method shadow setting were set by
648    * @param[in] bool, true if set by string
649    */
650   void ShadowSetByString(bool setByString);
651
652   /**
653    * @brief Query if outline settings were provided by string or map
654    * @return bool true if set by string
655    */
656   bool IsOutlineSetByString();
657
658   /**
659    * Set method outline setting were set by
660    * @param[in] bool, true if set by string
661    */
662   void OutlineSetByString(bool setByString);
663
664   /**
665    * @brief Query if font style settings were provided by string or map
666    * @return bool true if set by string
667    */
668   bool IsFontStyleSetByString();
669
670   /**
671    * Set method font style setting were set by
672    * @param[in] bool, true if set by string
673    */
674   void FontStyleSetByString(bool setByString);
675
676   /**
677    * @brief Query if Strikethrough settings were provided by string or map
678    * @return bool true if set by string
679    */
680   bool IsStrikethroughSetByString();
681
682   /**
683    * Set method Strikethrough setting were set by
684    * @param[in] bool, true if set by string
685    */
686   void StrikethroughSetByString(bool setByString);
687
688   /**
689    * @brief Set the override used for strikethrough height, 0 indicates height will be supplied by font metrics
690    *
691    * @param[in] height The height in pixels of the strikethrough
692    */
693   void SetStrikethroughHeight(float height);
694
695   /**
696    * @brief Retrieves the override height of an strikethrough, 0 indicates height is supplied by font metrics
697    *
698    * @return The height of the strikethrough, or 0 if height is not overrided.
699    */
700   float GetStrikethroughHeight() const;
701
702   /**
703    * @brief Set the strikethrough color.
704    *
705    * @param[in] color color of strikethrough.
706    */
707   void SetStrikethroughColor(const Vector4& color);
708
709   /**
710    * @brief Retrieve the strikethrough color.
711    *
712    * @return The strikethrough color.
713    */
714   const Vector4& GetStrikethroughColor() const;
715
716   /**
717    * @brief Set the strikethrough enabled flag.
718    *
719    * @param[in] enabled The strikethrough enabled flag.
720    */
721   void SetStrikethroughEnabled(bool enabled);
722
723   /**
724    * @brief Returns whether the text has a strikethrough or not.
725    *
726    * @return The strikethrough state.
727    */
728   bool IsStrikethroughEnabled() const;
729
730 public: // Update.
731   /**
732    * @brief Replaces any text previously set.
733    *
734    * @note This will be converted into UTF-32 when stored in the text model.
735    * @param[in] text A string of UTF-8 characters.
736    */
737   void SetText(const std::string& text);
738
739   /**
740    * @brief Retrieve any text previously set.
741    *
742    * @param[out] text A string of UTF-8 characters.
743    */
744   void GetText(std::string& text) const;
745
746   /**
747    * @brief Replaces any placeholder text previously set.
748    *
749    * @param[in] type Different placeholder-text can be shown when the control is active/inactive.
750    * @param[in] text A string of UTF-8 characters.
751    */
752   void SetPlaceholderText(PlaceholderType type, const std::string& text);
753
754   /**
755    * @brief Retrieve any placeholder text previously set.
756    *
757    * @param[in] type Different placeholder-text can be shown when the control is active/inactive.
758    * @param[out] A string of UTF-8 characters.
759    */
760   void GetPlaceholderText(PlaceholderType type, std::string& text) const;
761
762   /**
763    * @ brief Update the text after a font change
764    * @param[in] newDefaultFont The new font to change to
765    */
766   void UpdateAfterFontChange(const std::string& newDefaultFont);
767
768   /**
769    * @brief The method acquires currently selected text
770    * @param selectedText variable to place selected text in
771    */
772   void RetrieveSelection(std::string& selectedText) const;
773
774   /**
775    * @brief The method sets selection in given range
776    * @param start index of first character
777    * @param end   index of first character after selection
778    */
779   void SetSelection(int start, int end);
780
781   /**
782    * @brief This method retrieve indexes of current selection
783    *
784    * @return a pair, where first element is left index of selection and second is the right one
785    */
786   std::pair<int, int> GetSelectionIndexes() const;
787
788   /**
789    * Place string in system clipboard
790    * @param source std::string
791    */
792   void CopyStringToClipboard(const std::string& source);
793
794   /**
795    * Place currently selected text in system clipboard
796    * @param deleteAfterSending flag pointing if text should be deleted after sending to clipboard
797    */
798   void SendSelectionToClipboard(bool deleteAfterSending);
799
800 public: // Default style & Input style
801   /**
802    * @brief Set the default font family.
803    *
804    * @param[in] defaultFontFamily The default font family.
805    */
806   void SetDefaultFontFamily(const std::string& defaultFontFamily);
807
808   /**
809    * @brief Retrieve the default font family.
810    *
811    * @return The default font family.
812    */
813   const std::string& GetDefaultFontFamily() const;
814
815   /**
816    * @brief Sets the placeholder text font family.
817    * @param[in] placeholderTextFontFamily The placeholder text font family.
818    */
819   void SetPlaceholderFontFamily(const std::string& placeholderTextFontFamily);
820
821   /**
822    * @brief Retrieves the placeholder text font family.
823    *
824    * @return The placeholder text font family
825    */
826   const std::string& GetPlaceholderFontFamily() const;
827
828   /**
829    * @brief Sets the default font weight.
830    *
831    * @param[in] weight The font weight.
832    */
833   void SetDefaultFontWeight(FontWeight weight);
834
835   /**
836    * @brief Whether the font's weight has been defined.
837    */
838   bool IsDefaultFontWeightDefined() const;
839
840   /**
841    * @brief Retrieves the default font weight.
842    *
843    * @return The default font weight.
844    */
845   FontWeight GetDefaultFontWeight() const;
846
847   /**
848    * @brief Sets the placeholder text font weight.
849    *
850    * @param[in] weight The font weight
851    */
852   void SetPlaceholderTextFontWeight(FontWeight weight);
853
854   /**
855    * @brief Whether the font's weight has been defined.
856    *
857    * @return True if the placeholder text font weight is defined
858    */
859   bool IsPlaceholderTextFontWeightDefined() const;
860
861   /**
862    * @brief Retrieves the placeholder text font weight.
863    *
864    * @return The placeholder text font weight
865    */
866   FontWeight GetPlaceholderTextFontWeight() const;
867
868   /**
869    * @brief Sets the default font width.
870    *
871    * @param[in] width The font width.
872    */
873   void SetDefaultFontWidth(FontWidth width);
874
875   /**
876    * @brief Whether the font's width has been defined.
877    */
878   bool IsDefaultFontWidthDefined() const;
879
880   /**
881    * @brief Retrieves the default font width.
882    *
883    * @return The default font width.
884    */
885   FontWidth GetDefaultFontWidth() const;
886
887   /**
888    * @brief Sets the placeholder text font width.
889    *
890    * @param[in] width The font width
891    */
892   void SetPlaceholderTextFontWidth(FontWidth width);
893
894   /**
895    * @brief Whether the font's width has been defined.
896    *
897    * @return True if the placeholder text font width is defined
898    */
899   bool IsPlaceholderTextFontWidthDefined() const;
900
901   /**
902    * @brief Retrieves the placeholder text font width.
903    *
904    * @return The placeholder text font width
905    */
906   FontWidth GetPlaceholderTextFontWidth() const;
907
908   /**
909    * @brief Sets the default font slant.
910    *
911    * @param[in] slant The font slant.
912    */
913   void SetDefaultFontSlant(FontSlant slant);
914
915   /**
916    * @brief Whether the font's slant has been defined.
917    */
918   bool IsDefaultFontSlantDefined() const;
919
920   /**
921    * @brief Retrieves the default font slant.
922    *
923    * @return The default font slant.
924    */
925   FontSlant GetDefaultFontSlant() const;
926
927   /**
928    * @brief Sets the placeholder text font slant.
929    *
930    * @param[in] slant The font slant
931    */
932   void SetPlaceholderTextFontSlant(FontSlant slant);
933
934   /**
935    * @brief Whether the font's slant has been defined.
936    *
937    * @return True if the placeholder text font slant is defined
938    */
939   bool IsPlaceholderTextFontSlantDefined() const;
940
941   /**
942    * @brief Retrieves the placeholder text font slant.
943    *
944    * @return The placeholder text font slant
945    */
946   FontSlant GetPlaceholderTextFontSlant() const;
947
948   /**
949    * @brief Set the default font size.
950    *
951    * @param[in] fontSize The default font size
952    * @param[in] type The font size type is point size or pixel size
953    */
954   void SetDefaultFontSize(float fontSize, FontSizeType type);
955
956   /**
957    * @brief Retrieve the default point size.
958    *
959    * @param[in] type The font size type
960    * @return The default point size.
961    */
962   float GetDefaultFontSize(FontSizeType type) const;
963
964   /**
965    * @brief Set the font size scale.
966    *
967    * @param[in] scale The font size scale
968    */
969   void SetFontSizeScale(float scale);
970
971   /**
972    * @brief Get the font size scale.
973    *
974    * @return The font size scale.
975    */
976   float GetFontSizeScale() const;
977
978   /**
979    * @brief Set the font size scale enabled flag.
980    *
981    * @param[in] enabled whether to enable the font size scale.
982    */
983   void SetFontSizeScaleEnabled(bool enabled);
984
985   /**
986    * @brief Returns whether the font size scale is enabled or not.
987    *
988    * @return @e true if the font size scale is enabled, otherwise returns @e false.
989    */
990   bool IsFontSizeScaleEnabled() const;
991
992   /**
993    * @brief Sets the Placeholder text font size.
994    * @param[in] fontSize The placeholder text font size
995    * @param[in] type The font size type is point size or pixel size
996    */
997   void SetPlaceholderTextFontSize(float fontSize, FontSizeType type);
998
999   /**
1000    * @brief Retrieves the Placeholder text font size.
1001    * @param[in] type The font size type
1002    * @return The placeholder font size
1003    */
1004   float GetPlaceholderTextFontSize(FontSizeType type) const;
1005
1006   /**
1007    * @brief Sets the text's default color.
1008    *
1009    * @param color The default color.
1010    */
1011   void SetDefaultColor(const Vector4& color);
1012
1013   /**
1014    * @brief Retrieves the text's default color.
1015    *
1016    * @return The default color.
1017    */
1018   const Vector4& GetDefaultColor() const;
1019
1020   /**
1021    * @brief Sets the user interaction enabled.
1022    *
1023    * @param enabled whether to enable the user interaction.
1024    */
1025   void SetUserInteractionEnabled(bool enabled);
1026
1027   /**
1028    * @brief Whether the user interaction is enabled.
1029    *
1030    * @return true if the user interaction is enabled, false otherwise.
1031    */
1032   bool IsUserInteractionEnabled() const;
1033
1034   /**
1035    * @brief Set the text color
1036    *
1037    * @param textColor The text color
1038    */
1039   void SetPlaceholderTextColor(const Vector4& textColor);
1040
1041   /**
1042    * @brief Retrieve the text color
1043    *
1044    * @return The text color
1045    */
1046   const Vector4& GetPlaceholderTextColor() const;
1047
1048   /**
1049    * @brief Set the shadow offset.
1050    *
1051    * @param[in] shadowOffset The shadow offset, 0,0 indicates no shadow.
1052    */
1053   void SetShadowOffset(const Vector2& shadowOffset);
1054
1055   /**
1056    * @brief Retrieve the shadow offset.
1057    *
1058    * @return The shadow offset.
1059    */
1060   const Vector2& GetShadowOffset() const;
1061
1062   /**
1063    * @brief Set the shadow color.
1064    *
1065    * @param[in] shadowColor The shadow color.
1066    */
1067   void SetShadowColor(const Vector4& shadowColor);
1068
1069   /**
1070    * @brief Retrieve the shadow color.
1071    *
1072    * @return The shadow color.
1073    */
1074   const Vector4& GetShadowColor() const;
1075
1076   /**
1077    * @brief Set the shadow blur radius.
1078    *
1079    * @param[in] shadowBlurRadius The shadow blur radius, 0,0 indicates no blur.
1080    */
1081   void SetShadowBlurRadius(const float& shadowBlurRadius);
1082
1083   /**
1084    * @brief Retrieve the shadow blur radius.
1085    *
1086    * @return The shadow blur radius.
1087    */
1088   const float& GetShadowBlurRadius() const;
1089
1090   /**
1091    * @brief Set the underline color.
1092    *
1093    * @param[in] color color of underline.
1094    */
1095   void SetUnderlineColor(const Vector4& color);
1096
1097   /**
1098    * @brief Retrieve the underline color.
1099    *
1100    * @return The underline color.
1101    */
1102   const Vector4& GetUnderlineColor() const;
1103
1104   /**
1105    * @brief Set the underline enabled flag.
1106    *
1107    * @param[in] enabled The underline enabled flag.
1108    */
1109   void SetUnderlineEnabled(bool enabled);
1110
1111   /**
1112    * @brief Returns whether the text is underlined or not.
1113    *
1114    * @return The underline state.
1115    */
1116   bool IsUnderlineEnabled() const;
1117
1118   /**
1119    * @brief Set the override used for underline height, 0 indicates height will be supplied by font metrics
1120    *
1121    * @param[in] height The height in pixels of the underline
1122    */
1123   void SetUnderlineHeight(float height);
1124
1125   /**
1126    * @brief Retrieves the override height of an underline, 0 indicates height is supplied by font metrics
1127    *
1128    * @return The height of the underline, or 0 if height is not overrided.
1129    */
1130   float GetUnderlineHeight() const;
1131
1132   /**
1133    * @brief Sets the underline type.
1134    * @param[in] type The underline type.
1135    */
1136   void SetUnderlineType(Text::Underline::Type type);
1137
1138   /**
1139    * @brief Retrieve underline type.
1140    * @return The underline type.
1141    */
1142   Text::Underline::Type GetUnderlineType() const;
1143
1144   /**
1145    * @brief Set the width of the dashes of the dashed underline.
1146    *
1147    * @param[in] width The width in pixels of the dashes of the dashed underline.
1148    */
1149   void SetDashedUnderlineWidth(float width);
1150
1151   /**
1152    * @brief Retrieves the width of the dashes of the dashed underline.
1153    *
1154    * @return The width of the dashes of the dashed underline.
1155    */
1156   float GetDashedUnderlineWidth() const;
1157
1158   /**
1159    * @brief Set the gap between the dashes of the dashed underline.
1160    *
1161    * @param[in] gap The gap between the dashes of the dashed underline.
1162    */
1163   void SetDashedUnderlineGap(float gap);
1164
1165   /**
1166    * @brief Retrieves the gap between the dashes of the dashed underline.
1167    *
1168    * @return The The gap between the dashes of the dashed underline.
1169    */
1170   float GetDashedUnderlineGap() const;
1171
1172   /**
1173    * @brief Set the outline color.
1174    *
1175    * @param[in] color color of outline.
1176    */
1177   void SetOutlineColor(const Vector4& color);
1178
1179   /**
1180    * @brief Retrieve the outline color.
1181    *
1182    * @return The outline color.
1183    */
1184   const Vector4& GetOutlineColor() const;
1185
1186   /**
1187    * @brief Set the outline width
1188    *
1189    * @param[in] width The width in pixels of the outline, 0 indicates no outline
1190    */
1191   void SetOutlineWidth(uint16_t width);
1192
1193   /**
1194    * @brief Retrieves the width of an outline
1195    *
1196    * @return The width of the outline.
1197    */
1198   uint16_t GetOutlineWidth() const;
1199
1200   /**
1201    * @brief Set the background color.
1202    *
1203    * @param[in] color color of background.
1204    */
1205   void SetBackgroundColor(const Vector4& color);
1206
1207   /**
1208    * @brief Retrieve the background color.
1209    *
1210    * @return The background color.
1211    */
1212   const Vector4& GetBackgroundColor() const;
1213
1214   /**
1215    * @brief Set the background enabled flag.
1216    *
1217    * @param[in] enabled The background enabled flag.
1218    */
1219   void SetBackgroundEnabled(bool enabled);
1220
1221   /**
1222    * @brief Returns whether to enable text background or not.
1223    *
1224    * @return Whether text background is enabled.
1225    */
1226   bool IsBackgroundEnabled() const;
1227
1228   /**
1229    * @brief Sets the emboss's properties string.
1230    *
1231    * @note The string is stored to be recovered.
1232    *
1233    * @param[in] embossProperties The emboss's properties string.
1234    */
1235   void SetDefaultEmbossProperties(const std::string& embossProperties);
1236
1237   /**
1238    * @brief Retrieves the emboss's properties string.
1239    *
1240    * @return The emboss's properties string.
1241    */
1242   const std::string& GetDefaultEmbossProperties() const;
1243
1244   /**
1245    * @brief Sets the outline's properties string.
1246    *
1247    * @note The string is stored to be recovered.
1248    *
1249    * @param[in] outlineProperties The outline's properties string.
1250    */
1251   void SetDefaultOutlineProperties(const std::string& outlineProperties);
1252
1253   /**
1254    * @brief Retrieves the outline's properties string.
1255    *
1256    * @return The outline's properties string.
1257    */
1258   const std::string& GetDefaultOutlineProperties() const;
1259
1260   /**
1261    * @brief Sets the default line spacing.
1262    *
1263    * @param[in] lineSpacing The line spacing.
1264    *
1265    * @return True if lineSpacing has been updated, false otherwise
1266    */
1267   bool SetDefaultLineSpacing(float lineSpacing);
1268
1269   /**
1270    * @brief Retrieves the default line spacing.
1271    *
1272    * @return The line spacing.
1273    */
1274   float GetDefaultLineSpacing() const;
1275
1276   /**
1277    * @brief Sets the default line size.
1278    *
1279    * @param[in] lineSize The line size.
1280    *
1281    * @return True if lineSize has been updated, false otherwise
1282    */
1283   bool SetDefaultLineSize(float lineSize);
1284
1285   /**
1286    * @brief Retrieves the default line size.
1287    *
1288    * @return The line size.
1289    */
1290   float GetDefaultLineSize() const;
1291
1292   /**
1293    * @brief Sets the relative line size to the original line size.
1294    *
1295    * @param[in] relativeLineSize The relativeline size.
1296    *
1297    * @return True if relativeLineSize has been updated, false otherwise
1298    */
1299   bool SetRelativeLineSize(float lineSize);
1300
1301   /**
1302    * @brief Retrieves the relative line size.
1303    *
1304    * @return The relative line size.
1305    */
1306   float GetRelativeLineSize() const;
1307
1308   /**
1309    * @brief Sets the input text's color.
1310    *
1311    * @param[in] color The input text's color.
1312    */
1313   void SetInputColor(const Vector4& color);
1314
1315   /**
1316    * @brief Retrieves the input text's color.
1317    *
1318    * @return The input text's color.
1319    */
1320   const Vector4& GetInputColor() const;
1321
1322   /**
1323    * @brief Sets the input text's font family name.
1324    *
1325    * @param[in] fontFamily The text's font family name.
1326    */
1327   void SetInputFontFamily(const std::string& fontFamily);
1328
1329   /**
1330    * @brief Retrieves the input text's font family name.
1331    *
1332    * @return The input text's font family name.
1333    */
1334   const std::string& GetInputFontFamily() const;
1335
1336   /**
1337    * @brief Sets the input font's weight.
1338    *
1339    * @param[in] weight The input font's weight.
1340    */
1341   void SetInputFontWeight(FontWeight weight);
1342
1343   /**
1344    * @return Whether the font's weight has been defined.
1345    */
1346   bool IsInputFontWeightDefined() const;
1347
1348   /**
1349    * @brief Retrieves the input font's weight.
1350    *
1351    * @return The input font's weight.
1352    */
1353   FontWeight GetInputFontWeight() const;
1354
1355   /**
1356    * @brief Sets the input font's width.
1357    *
1358    * @param[in] width The input font's width.
1359    */
1360   void SetInputFontWidth(FontWidth width);
1361
1362   /**
1363    * @return Whether the font's width has been defined.
1364    */
1365   bool IsInputFontWidthDefined() const;
1366
1367   /**
1368    * @brief Retrieves the input font's width.
1369    *
1370    * @return The input font's width.
1371    */
1372   FontWidth GetInputFontWidth() const;
1373
1374   /**
1375    * @brief Sets the input font's slant.
1376    *
1377    * @param[in] slant The input font's slant.
1378    */
1379   void SetInputFontSlant(FontSlant slant);
1380
1381   /**
1382    * @return Whether the font's slant has been defined.
1383    */
1384   bool IsInputFontSlantDefined() const;
1385
1386   /**
1387    * @brief Retrieves the input font's slant.
1388    *
1389    * @return The input font's slant.
1390    */
1391   FontSlant GetInputFontSlant() const;
1392
1393   /**
1394    * @brief Sets the input font's point size.
1395    *
1396    * @param[in] size The input font's point size.
1397    */
1398   void SetInputFontPointSize(float size);
1399
1400   /**
1401    * @brief Retrieves the input font's point size.
1402    *
1403    * @return The input font's point size.
1404    */
1405   float GetInputFontPointSize() const;
1406
1407   /**
1408    * @brief Sets the input line spacing.
1409    *
1410    * @param[in] lineSpacing The line spacing.
1411    */
1412   void SetInputLineSpacing(float lineSpacing);
1413
1414   /**
1415    * @brief Retrieves the input line spacing.
1416    *
1417    * @return The line spacing.
1418    */
1419   float GetInputLineSpacing() const;
1420
1421   /**
1422    * @brief Sets the input shadow's properties string.
1423    *
1424    * @note The string is stored to be recovered.
1425    *
1426    * @param[in] shadowProperties The shadow's properties string.
1427    */
1428   void SetInputShadowProperties(const std::string& shadowProperties);
1429
1430   /**
1431    * @brief Retrieves the input shadow's properties string.
1432    *
1433    * @return The shadow's properties string.
1434    */
1435   const std::string& GetInputShadowProperties() const;
1436
1437   /**
1438    * @brief Sets the input underline's properties string.
1439    *
1440    * @note The string is stored to be recovered.
1441    *
1442    * @param[in] underlineProperties The underline's properties string.
1443    */
1444   void SetInputUnderlineProperties(const std::string& underlineProperties);
1445
1446   /**
1447    * @brief Retrieves the input underline's properties string.
1448    *
1449    * @return The underline's properties string.
1450    */
1451   const std::string& GetInputUnderlineProperties() const;
1452
1453   /**
1454    * @brief Sets the input emboss's properties string.
1455    *
1456    * @note The string is stored to be recovered.
1457    *
1458    * @param[in] embossProperties The emboss's properties string.
1459    */
1460   void SetInputEmbossProperties(const std::string& embossProperties);
1461
1462   /**
1463    * @brief Retrieves the input emboss's properties string.
1464    *
1465    * @return The emboss's properties string.
1466    */
1467   const std::string& GetInputEmbossProperties() const;
1468
1469   /**
1470    * @brief Sets input the outline's properties string.
1471    *
1472    * @note The string is stored to be recovered.
1473    *
1474    * @param[in] outlineProperties The outline's properties string.
1475    */
1476   void SetInputOutlineProperties(const std::string& outlineProperties);
1477
1478   /**
1479    * @brief Retrieves the input outline's properties string.
1480    *
1481    * @return The outline's properties string.
1482    */
1483   const std::string& GetInputOutlineProperties() const;
1484
1485   /**
1486    * @brief Sets the input strikethrough's properties string.
1487    *
1488    * @note The string is stored to be recovered.
1489    *
1490    * @param[in] strikethroughProperties The strikethrough's properties string.
1491    */
1492   void SetInputStrikethroughProperties(const std::string& strikethroughProperties);
1493
1494   /**
1495    * @brief Retrieves the input strikethrough's properties string.
1496    *
1497    * @return The strikethrough's properties string.
1498    */
1499   const std::string& GetInputStrikethroughProperties() const;
1500
1501   /**
1502    * @brief Set the control's interface.
1503    *
1504    * @param[in] controlInterface The control's interface.
1505    */
1506   void SetControlInterface(ControlInterface* controlInterface);
1507
1508   /**
1509    * @brief Set the anchor control's interface.
1510    *
1511    * @param[in] anchorControlInterface The control's interface.
1512    */
1513   void SetAnchorControlInterface(AnchorControlInterface* anchorControlInterface);
1514
1515   /**
1516    * @brief Sets the character spacing.
1517    *
1518    * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed).
1519    *
1520    * @param[in] characterSpacing The character spacing.
1521    */
1522   void SetCharacterSpacing(float characterSpacing);
1523
1524   /**
1525    * @brief Retrieves the character spacing.
1526    *
1527    * @note A positive value will make the characters far apart (expanded) and a negative value will bring them closer (condensed).
1528    *
1529    * @return The character spacing.
1530    */
1531   const float GetCharacterSpacing() const;
1532
1533 public: // Queries & retrieves.
1534   /**
1535    * @brief Return the layout engine.
1536    *
1537    * @return A reference to the layout engine.
1538    */
1539   Layout::Engine& GetLayoutEngine();
1540
1541   /**
1542    * @brief Return a view of the text.
1543    *
1544    * @return A reference to the view.
1545    */
1546   View& GetView();
1547
1548   /**
1549    * @copydoc Control::GetNaturalSize()
1550    */
1551   Vector3 GetNaturalSize();
1552
1553   /**
1554    * @copydoc Control::GetHeightForWidth()
1555    */
1556   float GetHeightForWidth(float width);
1557
1558   /**
1559    * @brief Calculates the point size for text for given layout()
1560    */
1561   void FitPointSizeforLayout(Size layoutSize);
1562
1563   /**
1564    * @brief Checks if the point size fits within the layout size.
1565    *
1566    * @return Whether the point size fits within the layout size.
1567    */
1568   bool CheckForTextFit(float pointSize, Size& layoutSize);
1569
1570   /**
1571    * @brief Retrieves the text's number of lines for a given width.
1572    * @param[in] width The width of the text's area.
1573    * @ return The number of lines.
1574    */
1575   int GetLineCount(float width);
1576
1577   /**
1578    * @brief Retrieves the text's model.
1579    *
1580    * @return A pointer to the text's model.
1581    */
1582   const ModelInterface* const GetTextModel() const;
1583
1584   /**
1585    * @brief Used to get scrolled distance by user input
1586    *
1587    * @return Distance from last scroll offset to new scroll offset
1588    */
1589   float GetScrollAmountByUserInput();
1590
1591   /**
1592    * @brief Get latest scroll amount, control size and layout size
1593    *
1594    * This method is used to get information of control's scroll
1595    * @param[out] scrollPosition The current scrolled position
1596    * @param[out] controlHeight The size of a UI control
1597    * @param[out] layoutHeight The size of a bounding box to layout text within.
1598    *
1599    * @return Whether the text scroll position is changed or not after last update.
1600    */
1601   bool GetTextScrollInfo(float& scrollPosition, float& controlHeight, float& layoutHeight);
1602
1603   /**
1604    * @brief Used to set the hidden input option
1605    */
1606   void SetHiddenInputOption(const Property::Map& options);
1607
1608   /**
1609    * @brief Used to get the hidden input option
1610    */
1611   void GetHiddenInputOption(Property::Map& options);
1612
1613   /**
1614    * @brief Used to set the input filter option
1615    */
1616   void SetInputFilterOption(const Property::Map& options);
1617
1618   /**
1619    * @brief Used to get the input filter option
1620    */
1621   void GetInputFilterOption(Property::Map& options);
1622
1623   /**
1624    * @brief Sets the Placeholder Properties.
1625    *
1626    * @param[in] map The placeholder property map
1627    */
1628   void SetPlaceholderProperty(const Property::Map& map);
1629
1630   /**
1631    * @brief Retrieves the Placeholder Property map.
1632    *
1633    * @param[out] map The property map
1634    */
1635   void GetPlaceholderProperty(Property::Map& map);
1636
1637   /**
1638    * @brief Checks text direction.
1639    * @return The text direction.
1640    */
1641   Toolkit::DevelText::TextDirection::Type GetTextDirection();
1642
1643   /**
1644    * @brief Retrieves vertical line alignment
1645    * @return The vertical line alignment
1646    */
1647   Toolkit::DevelText::VerticalLineAlignment::Type GetVerticalLineAlignment() const;
1648
1649   /**
1650    * @brief Sets vertical line alignment
1651    * @param[in] alignment The vertical line alignment for the text
1652    */
1653   void SetVerticalLineAlignment(Toolkit::DevelText::VerticalLineAlignment::Type alignment);
1654
1655   /**
1656    * @brief Retrieves ellipsis position
1657    * @return The ellipsis position
1658    */
1659   Toolkit::DevelText::EllipsisPosition::Type GetEllipsisPosition() const;
1660
1661   /**
1662    * @brief Sets ellipsis position
1663    * @param[in] ellipsisPosition The ellipsis position for the text
1664    */
1665   void SetEllipsisPosition(Toolkit::DevelText::EllipsisPosition::Type ellipsisPosition);
1666
1667   /**
1668    * @brief Retrieves ignoreSpaceAfterText value from model
1669    * @return The value of ignoreSpaceAfterText
1670    */
1671   bool IsIgnoreSpacesAfterText() const;
1672
1673   /**
1674    * @brief Sets ignoreSpaceAfterText value to model
1675    * @param[in] ignore The value of ignoreSpacesAfterText for the text
1676    */
1677   void SetIgnoreSpacesAfterText(bool ignore);
1678
1679   /**
1680    * @brief Sets SetMatchLayoutDirection value to model
1681    * @param[in] match The value of matchLayoutDirection for the text
1682    */
1683   void SetMatchLayoutDirection(DevelText::MatchLayoutDirection type);
1684
1685   /**
1686    * @brief Retrieves matchLayoutDirection value from model
1687    * @return The value of matchLayoutDirection
1688    */
1689   DevelText::MatchLayoutDirection GetMatchLayoutDirection() const;
1690
1691   /**
1692    * @brief Sets layoutDirection type value.
1693    * @param[in] layoutDirection The value of the layout direction type.
1694    */
1695   void SetLayoutDirection(Dali::LayoutDirection::Type layoutDirection);
1696
1697   /**
1698    * @brief Gets layoutDirection type value.
1699    * @param[in] actor The actor which will get the layout direction type.
1700    * @return The value of the layout direction type.
1701    */
1702   Dali::LayoutDirection::Type GetLayoutDirection(Dali::Actor& actor) const;
1703
1704   /**
1705    * @brief Get the rendered size of a specific text range.
1706    * if the requested text is at multilines, multiple sizes will be returned for each text located in a separate line.
1707    * if a line contains characters with different directions, multiple sizes will be returned for each block of contiguous characters with the same direction.
1708    *
1709    * @param[in] startIndex start index of the text requested to calculate size for.
1710    * @param[in] endIndex end index(included) of the text requested to calculate size for.
1711    * @return list of sizes of the reuested text.
1712    */
1713   Vector<Vector2> GetTextSize(CharacterIndex startIndex, CharacterIndex endIndex);
1714
1715   /**
1716    * @brief Get the top/left rendered position of a specific text range.
1717    * if the requested text is at multilines, multiple positions will be returned for each text located in a separate line.
1718    * if a line contains characters with different directions, multiple positions will be returned for each block of contiguous characters with the same direction.
1719    *
1720    * @param[in] startIndex start index of the text requested to get position to.
1721    * @param[in] endIndex end index(included) of the text requested to get position to.
1722    * @return list of positions of the requested text.
1723    */
1724   Vector<Vector2> GetTextPosition(CharacterIndex startIndex, CharacterIndex endIndex);
1725
1726   /**
1727    * @brief Gets the bounding box of a specific text range.
1728    *
1729    * @param[in] startIndex start index of the text requested to get bounding box to.
1730    * @param[in] endIndex end index(included) of the text requested to get bounding box to.
1731    * @return bounding box of the requested text.
1732    */
1733   Rect<> GetTextBoundingRectangle(CharacterIndex startIndex, CharacterIndex endIndex);
1734
1735   /**
1736    * @brief Sets the layout direction changed.
1737    */
1738   void ChangedLayoutDirection();
1739
1740   /**
1741    * @brief Retrieves if showing real text or not.
1742    * @return The value of showing real text.
1743    */
1744   bool IsShowingRealText() const;
1745
1746 public: // Relayout.
1747   /**
1748    * @brief Triggers a relayout which updates View (if necessary).
1749    *
1750    * @note UI Controls are expected to minimize calls to this method e.g. call once after size negotiation.
1751    * @param[in] size A the size of a bounding box to layout text within.
1752    * @param[in] layoutDirection The direction of the system language.
1753    *
1754    * @return Whether the text model or decorations were updated.
1755    */
1756   UpdateTextType Relayout(const Size& size, Dali::LayoutDirection::Type layoutDirection = Dali::LayoutDirection::LEFT_TO_RIGHT);
1757
1758   /**
1759    * @brief Request a relayout using the ControlInterface.
1760    */
1761   void RequestRelayout();
1762
1763 public: // Input style change signals.
1764   /**
1765    * @return Whether the queue of input style changed signals is empty.
1766    */
1767   bool IsInputStyleChangedSignalsQueueEmpty();
1768
1769   /**
1770    * @brief Process all pending input style changed signals.
1771    *
1772    * Calls the Text::ControlInterface::InputStyleChanged() method which is overriden by the
1773    * text controls. Text controls may send signals to state the input style has changed.
1774    */
1775   void ProcessInputStyleChangedSignals();
1776
1777 public: // Text-input Event Queuing.
1778   /**
1779    * @brief Called by editable UI controls when keyboard focus is gained.
1780    */
1781   void KeyboardFocusGainEvent();
1782
1783   /**
1784    * @brief Called by editable UI controls when focus is lost.
1785    */
1786   void KeyboardFocusLostEvent();
1787
1788   /**
1789    * @brief Called by editable UI controls when key events are received.
1790    *
1791    * @param[in] event The key event.
1792    * @param[in] type Used to distinguish between regular key events and InputMethodContext events.
1793    */
1794   bool KeyEvent(const Dali::KeyEvent& event);
1795
1796   /**
1797    * @brief Called by anchor when a tap gesture occurs.
1798    * @param[in] x The x position relative to the top-left of the parent control.
1799    * @param[in] y The y position relative to the top-left of the parent control.
1800    */
1801   void AnchorEvent(float x, float y);
1802
1803   /**
1804    * @brief Called by editable UI controls when a tap gesture occurs.
1805    * @param[in] tapCount The number of taps.
1806    * @param[in] x The x position relative to the top-left of the parent control.
1807    * @param[in] y The y position relative to the top-left of the parent control.
1808    */
1809   void TapEvent(unsigned int tapCount, float x, float y);
1810
1811   /**
1812    * @brief Called by editable UI controls when a pan gesture occurs.
1813    *
1814    * @param[in] state The state of the gesture.
1815    * @param[in] displacement This distance panned since the last pan gesture.
1816    */
1817   void PanEvent(GestureState state, const Vector2& displacement);
1818
1819   /**
1820    * @brief Called by editable UI controls when a long press gesture occurs.
1821    *
1822    * @param[in] state The state of the gesture.
1823    * @param[in] x The x position relative to the top-left of the parent control.
1824    * @param[in] y The y position relative to the top-left of the parent control.
1825    */
1826   void LongPressEvent(GestureState state, float x, float y);
1827
1828   /**
1829    * @brief Used to get the Primary cursor position.
1830    *
1831    * @return Primary cursor position.
1832    */
1833   CharacterIndex GetPrimaryCursorPosition() const;
1834
1835   /**
1836    * @brief Used to set the Primary cursor position.
1837    *
1838    * @param[in] index for the Primary cursor position.
1839    * @param[in] focused true if UI control has gained focus to receive key event, false otherwise.
1840    * @return[in] true if cursor position changed, false otherwise.
1841    */
1842   bool SetPrimaryCursorPosition(CharacterIndex index, bool focused);
1843
1844   /**
1845    * @brief Creates a selection event.
1846    *
1847    * It could be called from the TapEvent (double tap) or when the text selection popup's sellect all button is pressed.
1848    *
1849    * @param[in] x The x position relative to the top-left of the parent control.
1850    * @param[in] y The y position relative to the top-left of the parent control.
1851    * @param[in] selection type like the whole text is selected or unselected.
1852    */
1853   void SelectEvent(float x, float y, SelectionType selection);
1854
1855   /**
1856    * @copydoc Text::SelectableControlInterface::SetTextSelectionRange()
1857    */
1858   void SetTextSelectionRange(const uint32_t* start, const uint32_t* end);
1859
1860   /**
1861    * @copydoc Text::SelectableControlInterface::GetTextSelectionRange()
1862    */
1863   Uint32Pair GetTextSelectionRange() const;
1864
1865   /**
1866    * @copydoc Text::SelectableControlInterface::SelectWholeText()
1867    */
1868   void SelectWholeText();
1869
1870   /**
1871    * @copydoc Text::EditableControlInterface::CopyText()
1872    */
1873   string CopyText();
1874
1875   /**
1876    * @copydoc Text::EditableControlInterface::CutText()
1877    */
1878   string CutText();
1879
1880   /**
1881    * @copydoc Text::EditableControlInterface::PasteText()
1882    */
1883   void PasteText();
1884
1885   /**
1886    * @copydoc Text::SelectableControlInterface::SelectNone()
1887    */
1888   void SelectNone();
1889
1890   /**
1891    * @copydoc Text::SelectableControlInterface::SelectText()
1892    */
1893   void SelectText(const uint32_t start, const uint32_t end);
1894
1895   /**
1896    * @copydoc Text::SelectableControlInterface::GetSelectedText()
1897    */
1898   string GetSelectedText() const;
1899
1900   /**
1901    * @copydoc Text::EditableControlInterface::IsEditable()
1902    */
1903   virtual bool IsEditable() const;
1904
1905   /**
1906    * @copydoc Text::EditableControlInterface::SetEditable()
1907    */
1908   virtual void SetEditable(bool editable);
1909
1910   /**
1911    * @copydoc Dali::Toolkit::Internal::TextEditor::ScrollBy()
1912    */
1913   virtual void ScrollBy(Vector2 scroll);
1914
1915   /**
1916    * @copydoc Dali::Toolkit::Internal::TextEditor::GetHorizontalScrollPosition()
1917    */
1918   float GetHorizontalScrollPosition();
1919
1920   /**
1921    * @copydoc Dali::Toolkit::Internal::TextEditor::GetVerticalScrollPosition()
1922    */
1923   float GetVerticalScrollPosition();
1924
1925   /**
1926    * @brief Event received from input method context
1927    *
1928    * @param[in] inputMethodContext The input method context.
1929    * @param[in] inputMethodContextEvent The event received.
1930    * @return A data struture indicating if update is needed, cursor position and current text.
1931    */
1932   InputMethodContext::CallbackData OnInputMethodContextEvent(InputMethodContext& inputMethodContext, const InputMethodContext::EventData& inputMethodContextEvent);
1933
1934   /**
1935    * @brief Event from Clipboard notifying an Item has been selected for pasting
1936    */
1937   void PasteClipboardItemEvent();
1938
1939   /**
1940    * @brief Return true when text control should clear key input focus when escape key is pressed.
1941    *
1942    * @return Whether text control should clear key input focus or not when escape key is pressed.
1943    */
1944   bool ShouldClearFocusOnEscape() const;
1945
1946   /**
1947    * @brief Create an actor that renders the text background color
1948    *
1949    * @return the created actor or an empty handle if no background color needs to be rendered.
1950    */
1951   Actor CreateBackgroundActor();
1952
1953   /**
1954    * @brief Used to reset the cursor position after setting a new text.
1955    *
1956    * @param[in] cursorIndex Where to place the cursor.
1957    */
1958   void ResetCursorPosition(CharacterIndex cursorIndex);
1959
1960   /**
1961    * @brief The method acquires current position of cursor
1962    * @return unsigned value with cursor position
1963    */
1964   CharacterIndex GetCursorPosition();
1965
1966   /**
1967    * @brief Resets a provided vector with actors that marks the position of anchors in markup enabled text
1968    *
1969    * @param[out] anchorActors the vector of actor (empty collection if no anchors available).
1970    */
1971   void GetAnchorActors(std::vector<Toolkit::TextAnchor>& anchorActors);
1972
1973   /**
1974    * @brief Return an index of first anchor in the anchor vector whose boundaries includes given character offset
1975    *
1976    * @param[in] characterOffset A position in text coords.
1977    *
1978    * @return the index in anchor vector (-1 if an anchor not found)
1979    */
1980   int GetAnchorIndex(size_t characterOffset);
1981
1982 protected: // Inherit from Text::Decorator::ControllerInterface.
1983   /**
1984    * @copydoc Dali::Toolkit::Text::Decorator::ControllerInterface::GetTargetSize()
1985    */
1986   void GetTargetSize(Vector2& targetSize) override;
1987
1988   /**
1989    * @copydoc Dali::Toolkit::Text::Decorator::ControllerInterface::AddDecoration()
1990    */
1991   void AddDecoration(Actor& actor, DecorationType type, bool needsClipping) override;
1992
1993   /**
1994    * @copydoc Dali::Toolkit::Text::Decorator::ControllerInterface::DecorationEvent()
1995    */
1996   void DecorationEvent(HandleType handle, HandleState state, float x, float y) override;
1997
1998 protected: // Inherit from TextSelectionPopup::TextPopupButtonCallbackInterface.
1999   /**
2000    * @copydoc Dali::Toolkit::TextSelectionPopup::TextPopupButtonCallbackInterface::TextPopupButtonTouched()
2001    */
2002   void TextPopupButtonTouched(Dali::Toolkit::TextSelectionPopup::Buttons button) override;
2003
2004 protected: // Inherit from HiddenText.
2005   /**
2006    * @brief Invoked from HiddenText when showing time of the last character was expired
2007    */
2008   void DisplayTimeExpired() override;
2009
2010 private: // Private contructors & copy operator.
2011   /**
2012    * @brief Private constructor.
2013    */
2014   Controller()
2015   : Controller(nullptr, nullptr, nullptr, nullptr)
2016   {
2017   }
2018
2019   /**
2020    * @brief Private constructor.
2021    */
2022   Controller(ControlInterface* controlInterface)
2023   : Controller(controlInterface, nullptr, nullptr, nullptr)
2024   {
2025   }
2026
2027   /**
2028    * @brief Private constructor.
2029    */
2030   Controller(ControlInterface*           controlInterface,
2031              EditableControlInterface*   editableControlInterface,
2032              SelectableControlInterface* selectableControlInterface,
2033              AnchorControlInterface*     anchorControlInterface);
2034
2035   Controller(const Controller& handle) = delete;
2036   Controller& operator=(const Controller& handle) = delete;
2037
2038 protected: // Destructor.
2039   /**
2040    * @brief A reference counted object may only be deleted by calling Unreference().
2041    */
2042   virtual ~Controller();
2043
2044 public:
2045   struct Impl; ///< Made public for testing purposes
2046
2047 private:
2048   struct EventHandler;
2049   struct InputFontHandler;
2050   struct InputProperties;
2051   struct PlaceholderHandler;
2052   struct Relayouter;
2053   struct TextUpdater;
2054
2055   Impl* mImpl;
2056 };
2057
2058 } // namespace Dali::Toolkit::Text
2059
2060 #endif // DALI_TOOLKIT_TEXT_CONTROLLER_H