Merge "add drag&drop support in actor level" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / layouts / layout-engine.h
1 #ifndef DALI_TOOLKIT_TEXT_LAYOUT_ENGINE_H
2 #define DALI_TOOLKIT_TEXT_LAYOUT_ENGINE_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 // EXTERNAL INCLUDE
22 #include <dali/public-api/common/dali-vector.h>
23 #include <dali/public-api/math/vector2.h>
24 #include <dali/public-api/actors/actor-enumerations.h>
25
26 // INTERNAL INCLUDE
27 #include <dali-toolkit/public-api/text/text-enumerations.h>
28 #include <dali-toolkit/internal/text/line-run.h>
29 #include <dali-toolkit/internal/text/metrics.h>
30
31 namespace Dali
32 {
33
34 namespace Toolkit
35 {
36
37 namespace Text
38 {
39
40 namespace Layout
41 {
42
43 struct Parameters;
44
45 /**
46  * @brief LayoutEngine is responsible for calculating the visual position of glyphs in layout.
47  */
48 class Engine
49 {
50 public:
51
52   enum Type
53   {
54     SINGLE_LINE_BOX,
55     MULTI_LINE_BOX
56   };
57
58   /**
59    * @brief Create a new instance of a LayoutEngine.
60    */
61   Engine();
62
63   /**
64    * @brief Virtual destructor.
65    */
66   ~Engine();
67
68   /**
69    * @brief Provide the wrapper around FontClient used to get metrics
70    *
71    * @param[in] metrics Used to get metrics
72    */
73   void SetMetrics( MetricsPtr& metrics );
74
75   /**
76    * @brief Choose the required layout.
77    *
78    * @param[in] layout The required layout.
79    */
80   void SetLayout( Type layout );
81
82   /**
83    * @brief Query the required layout.
84    *
85    * @return The required layout.
86    */
87   Type GetLayout() const;
88
89   /**
90    * @brief Sets the width of the cursor.
91    *
92    * @param[in] width The width of the cursor in pixels.
93    */
94   void SetCursorWidth( int width );
95
96   /**
97    * @brief Retrieves the width of the cursor.
98    *
99    * @return The width of the cursor in pixels.
100    */
101   int GetCursorWidth() const;
102
103   /**
104    * @brief Store the visual position of glyphs in the VisualModel.
105    *
106    * @param[in] layoutParameters The parameters needed to layout the text.
107    * @param[out] glyphPositions The positions of all the glyphs.
108    * @param[out] lines The laid-out lines.
109    * @param[out] layoutSize The size of the text after it has been laid-out.
110    * @param[in] elideTextEnabled Whether the text elide is enabled.
111    * @param[in,out] isAutoScrollEnabled If the isAutoScrollEnabled is true and the height of the text exceeds the boundaries of the control the text is elided and the isAutoScrollEnabled is set to false to disable the autoscroll
112    *
113    * @return \e true if the text has been re-laid-out. \e false means the given width is too small to layout even a single character.
114    */
115   bool LayoutText( const Parameters& layoutParameters,
116                    Vector<Vector2>& glyphPositions,
117                    Vector<LineRun>& lines,
118                    Size& layoutSize,
119                    bool elideTextEnabled,
120                    bool& isAutoScrollEnabled );
121
122   /**
123    * @brief Re-lays out those lines with right to left characters.
124    *
125    * It doesn't change the phisical position of the glyphs in the model but sets their new position.
126    *
127    * @param[in] layoutParameters The parameters needed to layout the text.
128    * @param[in] startIndex Character index of the line from where the lines are reordered.
129    * @param[in] numberOfCharacters The number of characters.
130    * @param[in,out] glyphPositions The positions of all the glyphs.
131    */
132   void ReLayoutRightToLeftLines( const Parameters& layoutParameters,
133                                  CharacterIndex startIndex,
134                                  Length numberOfCharacters,
135                                  Vector<Vector2>& glyphPositions );
136
137   /**
138    * @brief Aligns the laid out lines.
139    *
140    * @param[in] size The size of the container where the text is laid-out.
141    * @param[in] startIndex Character index of the line from where the lines are aligned.
142    * @param[in] numberOfCharacters The number of characters.
143    * @param[in] horizontalAlignment The horizontal alignment.
144    * @param[in,out] lines The laid-out lines.
145    * @param[out] alignmentOffset The alignment offset.
146    * @param[in] layoutDirection The direction of the system language.
147    * @param[in] matchSystemLanguageDirection Whether match align for system language direction or not.
148    */
149   void Align( const Size& size,
150               CharacterIndex startIndex,
151               Length numberOfCharacters,
152               Text::HorizontalAlignment::Type horizontalAlignment,
153               Vector<LineRun>& lines,
154               float& alignmentOffset,
155               Dali::LayoutDirection::Type layoutDirection,
156               bool matchSystemLanguageDirection );
157
158   /**
159    * @brief Sets the default line spacing.
160    *
161    * @param[in] lineSpacing The line spacing.
162    */
163   void SetDefaultLineSpacing( float lineSpacing );
164
165   /**
166    * @brief Retrieves the default line spacing.
167    *
168    * @return The line spacing.
169    */
170   float GetDefaultLineSpacing() const;
171
172 private:
173
174   // Undefined
175   Engine( const Engine& handle );
176
177   // Undefined
178   Engine& operator=( const Engine& handle );
179
180 private:
181
182   struct Impl;
183   Impl* mImpl;
184 };
185
186 } // namespace Layout
187
188 } // namespace Text
189
190 } // namespace Toolkit
191
192 } // namespace Dali
193
194 #endif // DALI_TOOLKIT_TEXT_LAYOUT_ENGINE_H