TextView - Split width exceed policy and EllipsizeEnd height exceed policy combinatio...
[platform/core/uifw/dali-toolkit.git] / base / dali-toolkit / internal / controls / text-view / text-view-word-processor.h
1 #ifndef __DALI_TOOLKIT_INTERNAL_TEXT_VIEW_WORD_PROCESSOR_H__
2 #define __DALI_TOOLKIT_INTERNAL_TEXT_VIEW_WORD_PROCESSOR_H__
3
4 //
5 // Copyright (c) 2014 Samsung Electronics Co., Ltd.
6 //
7 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 // INTERNAL INCLUDES
21 #include "text-view-impl.h"
22 #include "text-view-processor-types.h"
23
24 namespace Dali
25 {
26
27 namespace Toolkit
28 {
29
30 namespace Internal
31 {
32
33 namespace TextViewProcessor
34 {
35
36 /**
37  * Creates a data structure with info to layout the word, and data structures with useful info to modify the layout data structure if characters are added or removed.
38  *
39  * @param[in] word The styled word.
40  * @param[out] wordLayoutInfo Layout info for all characters of the word.
41  */
42 void CreateWordTextInfo( const MarkupProcessor::StyledTextArray& word,
43                          TextViewProcessor::WordLayoutInfo& wordLayoutInfo );
44
45 /**
46  * Removes a given number of characters from the given word.
47  *
48  * It calls the RemoveCharactersFromWord() function to remove characters from the word.
49  *
50  * If the word is a white space \e mergeWords will return \e true and \e textInfoMergeIndicesBegin and \e textInfoMergeIndicesEnd will be set to merge the two adjacent words.
51  * If the word is a new line character \e mergeLines will return \e true and \e textInfoMergeIndicesBegin and \e textInfoMergeIndicesEnd will be set to merge the two lines.
52  *
53  * @param[in,out] relayoutData Natural size (metrics), layout, text-actor info.
54  * @param[in] numberOfCharacters The number of characters to be deleted.
55  * @param[out] mergeWords Whether adjacent words need to be merged.
56  * @param[out] mergeLines Whether current line need to be merged with the next one.
57  * @param[in,out] textInfoIndicesBegin Indices to the line, word and characters from where to delete characters. It returns from where words need to be removed.
58  * @param[out] textInfoIndicesEnd If lines or words need to be merged it returns info to delete them (If a word is merged, it has to be removed. Equal for lines).
59  * @param[out] textInfoMergeIndicesBegin The indices to the first part of the line, group and word to be merged.
60  * @param[out] textInfoMergeIndicesEnd The indices to the last part of the line, group and word to be merged.
61  * @param[in,out] groupLayout Layout info of the group of words where the word is located.
62  * @param[out] removedTextActors Stores handles of temoved text-actors.
63  */
64 void RemoveCharactersFromWordInfo( TextView::RelayoutData& relayoutData,
65                                    std::size_t numberOfCharacters,
66                                    bool& mergeWords,
67                                    bool& mergeLines,
68                                    TextViewProcessor::TextInfoIndices& textInfoIndicesBegin,
69                                    TextViewProcessor::TextInfoIndices& textInfoIndicesEnd,
70                                    TextViewProcessor::TextInfoIndices& textInfoMergeIndicesBegin,
71                                    TextViewProcessor::TextInfoIndices& textInfoMergeIndicesEnd,
72                                    TextViewProcessor::WordGroupLayoutInfo& groupLayout,
73                                    std::vector<TextActor>& removedTextActors );
74 /**
75  * Removes a given number of characters from the given word.
76  *
77  * @pre \e positon and \e position + \e numberOfCharacters can't exceed the bounds of the word.
78  *
79  * @param[in] position Character index within the word with the starting position to be deleted.
80  * @param[in] numberOfCharacters The number of characters to be deleted.
81  * @param[in,out] wordLayout The input is the layout info of the word. The output is the layout info of the word without the removed characters.
82  */
83 void RemoveCharactersFromWord( std::size_t position,
84                                std::size_t numberOfCharacters,
85                                WordLayoutInfo& wordLayout );
86
87 /**
88  * Splits a word in two.
89  *
90  * Removes part of the text from the input word and creates a new word with the removed text.
91  *
92  * i.e. The result of split 'word' by the position 3 would be 'wor' and 'd'.
93  *
94  * @note It deletes whatever there is in the last part of the word.
95  *
96  * @param[in] position Character index where to split the word.
97  * @param[in,out] firstWordLayoutInfo The input is the layout info of the given word. The output is the first part of the input word (from the character \e 0 to the character \e position - \e 1).
98  * @param[out] lastWordLayoutInfo Layout info of the last part of the given word ( from the character \e position to the end of the word).
99  */
100 void SplitWord( std::size_t position,
101                 WordLayoutInfo& firstWordLayoutInfo,
102                 WordLayoutInfo& lastWordLayoutInfo );
103
104 /**
105  * Merges the two given words by adding characters of the last word to the firs one.
106  *
107  * @note Does nothing if last part of the word is empty.
108  * @note If the first part of the word is empty it just copy the last part to it.
109  * @note It asserts if the first or the last word is a word separator (white space) or a line separator (new line character)
110  *
111  * @param[in,out] firstWordLayoutInfo The input is the layout info of the first word. The output is the layout info of the merged word.
112  * @param[in] lastWordLayoutInfo Layout info of the last word.
113  */
114 void MergeWord( WordLayoutInfo& firstWordLayoutInfo,
115                 const WordLayoutInfo& lastWordLayoutInfo );
116
117 /**
118  * Retrieves the layout information of the first character of the given word.
119  *
120  * @param[in] wordLayoutInfo The word layout.
121  *
122  * @return Layout information of the first character of the word.
123  */
124 CharacterLayoutInfo GetFirstCharacterLayoutInfo( const WordLayoutInfo& wordLayoutInfo );
125
126 /**
127  * Retrieves the layout information of the last character of the given word.
128  *
129  * @param[in] wordLayoutInfo The word layout.
130  *
131  * @return Layout information of the last character of the word.
132  */
133 CharacterLayoutInfo GetLastCharacterLayoutInfo( const WordLayoutInfo& wordLayoutInfo );
134
135 /**
136  * Collects text-actors from the given word, within the given indices, and stores them into the text-actor vector.
137  *
138  * @param[out] textActors Stores the text-actors of the given word.
139  * @param[in] characterIndexBegin The first text-actor to be stored.
140  * @param[in] characterIndexEnd The last text-actor to be stored.
141  */
142 void CollectTextActors( std::vector<TextActor>& textActors, const WordLayoutInfo& word, std::size_t characterIndexBegin, std::size_t characterIndexEnd );
143
144 /**
145  * Collects text-actors from the given group of words, within the given indices, and stores them into the text-actor vector.
146  *
147  * @param[out] textActors Stores the text-actors of the given group of words.
148  * @param[in] group The group of words.
149  * @param[in] wordIndexBegin Index to the first word.
150  * @param[in] wordIndexEnd Index to the last word.
151  */
152 void CollectTextActorsFromWords( std::vector<TextActor>& textActors, const WordGroupLayoutInfo& group, std::size_t wordIndexBegin, std::size_t wordIndexEnd );
153
154 } //namespace TextViewProcessor
155
156 } //namespace Internal
157
158 } //namespace Toolkit
159
160 } //namespace Dali
161
162 #endif // __DALI_TOOLKIT_INTERNAL_TEXT_VIEW_WORD_PROCESSOR_H__