Merge "Fix for the cursor position with the arabic script." into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / cursor-helper-functions.h
1 #ifndef __DALI_TOOLKIT_TEXT_CURSOR_HELPER_FUNCTIONS_H__
2 #define __DALI_TOOLKIT_TEXT_CURSOR_HELPER_FUNCTIONS_H__
3
4 /*
5  * Copyright (c) 2016 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 // INTERNAL INCLUDES
22 #include <dali-toolkit/internal/text/logical-model-impl.h>
23 #include <dali-toolkit/internal/text/metrics.h>
24 #include <dali-toolkit/internal/text/visual-model-impl.h>
25
26 namespace Dali
27 {
28
29 namespace Toolkit
30 {
31
32 namespace Text
33 {
34
35 struct CursorInfo
36 {
37   CursorInfo()
38   : primaryPosition(),
39     secondaryPosition(),
40     lineOffset( 0.f ),
41     lineHeight( 0.f ),
42     primaryCursorHeight( 0.f ),
43     secondaryCursorHeight( 0.f ),
44     isSecondaryCursor( false )
45   {}
46
47   ~CursorInfo()
48   {}
49
50   Vector2 primaryPosition;       ///< The primary cursor's position (in text's coords).
51   Vector2 secondaryPosition;     ///< The secondary cursor's position (in text's coords).
52   float   lineOffset;            ///< The vertical offset where the line containing the cursor starts.
53   float   lineHeight;            ///< The height of the line where the cursor is placed.
54   float   primaryCursorHeight;   ///< The primary cursor's height.
55   float   secondaryCursorHeight; ///< The secondary cursor's height.
56   bool    isSecondaryCursor;     ///< Whether the secondary cursor is valid.
57 };
58
59 /**
60  * @brief Retrieves the closest line for a given touch point.
61  *
62  * It returns the first line if the touch point is above the text and the last line if the touch point is below.
63  *
64  * @param[in] visualModel The visual model.
65  * @param[in] visualY The touch point 'y' in text's coords.
66  *
67  * @return A line index.
68  */
69 LineIndex GetClosestLine( VisualModelPtr visualModel,
70                           float visualY );
71
72 /**
73  * @brief Calculates the vertical line's offset for a given line.
74  *
75  * @pre @p lineIndex must be between 0 and the number of lines (both inclusive).
76  *
77  * @param[in] lines The laid-out lines.
78  * @param[in] lineIndex Index to the line.
79  *
80  * @return The vertical offset of the given line.
81  */
82 float CalculateLineOffset( const Vector<LineRun>& lines,
83                            LineIndex lineIndex );
84
85 /**
86  * @brief Retrieves the cursor's logical position for a given touch point x,y
87  *
88  * @param[in] visualModel The visual model.
89  * @param[in] logicalModel The logical model.
90  * @param[in] metrics A wrapper around FontClient used to get metrics.
91  * @param[in] visualX The touch point 'x' in text's coords.
92  * @param[in] visualY The touch point 'y' in text's coords.
93  *
94  * @return The logical cursor position (in characters). 0 is just before the first character, a value equal to the number of characters is just after the last character.
95  */
96 CharacterIndex GetClosestCursorIndex( VisualModelPtr visualModel,
97                                       LogicalModelPtr logicalModel,
98                                       MetricsPtr metrics,
99                                       float visualX,
100                                       float visualY );
101
102
103 /**
104  * @brief Calculates the cursor's position for a given character index in the logical order.
105  *
106  * It retrieves as well the line's height and the cursor's height and
107  * if there is a valid alternative cursor, its position and height.
108  *
109  * @param[in] visualModel The visual model.
110  * @param[in] logicalModel The logical model.
111  * @param[in] metrics A wrapper around FontClient used to get metrics.
112  * @param[in] logical The logical cursor position (in characters). 0 is just before the first character, a value equal to the number of characters is just after the last character.
113  * @param[out] cursorInfo The line's height, the cursor's height, the cursor's position and whether there is an alternative cursor.
114  */
115 void GetCursorPosition( VisualModelPtr visualModel,
116                         LogicalModelPtr logicalModel,
117                         MetricsPtr metrics,
118                         CharacterIndex logical,
119                         CursorInfo& cursorInfo );
120
121 /**
122  * @brief Find the indices to the first and last characters of a word for the given touch point.
123  *
124  * @param[in] visualModel The visual model.
125  * @param[in] logicalModel The logical model.
126  * @param[in] metrics A wrapper around FontClient used to get metrics.
127  * @param[in] visualX The touch point 'x' in text's coords.
128  * @param[in] visualY The touch point 'y' in text's coords.
129  * @param[out] startIndex Index to the first character of the selected word.
130  * @param[out] endIndex Index to the last character of the selected word.
131  *
132  * @return @e true if the indices are found.
133  */
134 bool FindSelectionIndices( VisualModelPtr visualModel,
135                            LogicalModelPtr logicalModel,
136                            MetricsPtr metrics,
137                            float visualX,
138                            float visualY,
139                            CharacterIndex& startIndex,
140                            CharacterIndex& endIndex );
141
142 } // namespace Text
143
144 } // namespace Toolkit
145
146 } // namespace Dali
147
148 #endif // __DALI_TOOLKIT_TEXT_CURSOR_HELPER_FUNCTIONS_H__