2 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include <dali-toolkit/internal/text/text-controller-input-font-handler.h>
25 #include <dali-toolkit/internal/text/text-controller-impl.h>
36 * @brief Adds a new font description run for the selected text.
38 * The new font parameters are added after the call to this method.
40 * @param[in] eventData The event data pointer.
41 * @param[in] logicalModel The logical model where to add the new font description run.
42 * @param[out] startOfSelectedText Index to the first selected character.
43 * @param[out] lengthOfSelectedText Number of selected characters.
45 FontDescriptionRun& UpdateSelectionFontStyleRun(EventData* eventData,
46 LogicalModelPtr logicalModel,
47 CharacterIndex& startOfSelectedText,
48 Length& lengthOfSelectedText)
50 const bool handlesCrossed = eventData->mLeftSelectionPosition > eventData->mRightSelectionPosition;
52 // Get start and end position of selection
53 startOfSelectedText = handlesCrossed ? eventData->mRightSelectionPosition : eventData->mLeftSelectionPosition;
54 lengthOfSelectedText = (handlesCrossed ? eventData->mLeftSelectionPosition : eventData->mRightSelectionPosition) - startOfSelectedText;
57 const VectorBase::SizeType numberOfRuns = logicalModel->mFontDescriptionRuns.Count();
58 logicalModel->mFontDescriptionRuns.Resize(numberOfRuns + 1u);
60 FontDescriptionRun& fontDescriptionRun = *(logicalModel->mFontDescriptionRuns.Begin() + numberOfRuns);
62 fontDescriptionRun.characterRun.characterIndex = startOfSelectedText;
63 fontDescriptionRun.characterRun.numberOfCharacters = lengthOfSelectedText;
65 // Recalculate the selection highlight as the metrics may have changed.
66 eventData->mUpdateLeftSelectionPosition = true;
67 eventData->mUpdateRightSelectionPosition = true;
68 eventData->mUpdateHighlightBox = true;
70 return fontDescriptionRun;
73 } // unnamed namespace
75 void Controller::InputFontHandler::SetInputFontFamily(Controller& controller, const std::string& fontFamily)
77 if(NULL != controller.mImpl->mEventData)
79 controller.mImpl->mEventData->mInputStyle.familyName = fontFamily;
80 controller.mImpl->mEventData->mInputStyle.isFamilyDefined = true;
82 if(EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState)
84 CharacterIndex startOfSelectedText = 0u;
85 Length lengthOfSelectedText = 0u;
87 if(EventData::SELECTING == controller.mImpl->mEventData->mState)
89 // Update a font description run for the selecting state.
90 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun(controller.mImpl->mEventData,
91 controller.mImpl->mModel->mLogicalModel,
93 lengthOfSelectedText);
95 fontDescriptionRun.familyLength = fontFamily.size();
96 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
97 memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
98 fontDescriptionRun.familyDefined = true;
100 // The memory allocated for the font family name is freed when the font description is removed from the logical model.
102 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
103 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
104 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
108 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
109 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
110 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
113 // Request to relayout.
114 controller.mImpl->mOperationsPending = static_cast<OperationsMask>(controller.mImpl->mOperationsPending |
122 controller.mImpl->mRecalculateNaturalSize = true;
123 controller.mImpl->RequestRelayout();
125 // As the font changes, recalculate the handle positions is needed.
126 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
127 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
128 controller.mImpl->mEventData->mUpdateHighlightBox = true;
129 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
134 const std::string& Controller::InputFontHandler::GetInputFontFamily(const Controller& controller)
136 if(NULL != controller.mImpl->mEventData)
138 return controller.mImpl->mEventData->mInputStyle.familyName;
141 // Return the default font's family if there is no EventData.
142 return controller.GetDefaultFontFamily();
145 void Controller::InputFontHandler::SetInputFontWeight(const Controller& controller, FontWeight weight)
147 if(NULL != controller.mImpl->mEventData)
149 controller.mImpl->mEventData->mInputStyle.weight = weight;
150 controller.mImpl->mEventData->mInputStyle.isWeightDefined = true;
152 if(EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState)
154 CharacterIndex startOfSelectedText = 0u;
155 Length lengthOfSelectedText = 0u;
157 if(EventData::SELECTING == controller.mImpl->mEventData->mState)
159 // Update a font description run for the selecting state.
160 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun(controller.mImpl->mEventData,
161 controller.mImpl->mModel->mLogicalModel,
163 lengthOfSelectedText);
165 fontDescriptionRun.weight = weight;
166 fontDescriptionRun.weightDefined = true;
168 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
169 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
170 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
174 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
175 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
176 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
179 // Request to relayout.
180 controller.mImpl->mOperationsPending = static_cast<OperationsMask>(controller.mImpl->mOperationsPending |
188 controller.mImpl->mRecalculateNaturalSize = true;
189 controller.mImpl->RequestRelayout();
191 // As the font might change, recalculate the handle positions is needed.
192 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
193 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
194 controller.mImpl->mEventData->mUpdateHighlightBox = true;
195 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
200 bool Controller::InputFontHandler::IsInputFontWeightDefined(const Controller& controller)
202 bool defined = false;
204 if(NULL != controller.mImpl->mEventData)
206 defined = controller.mImpl->mEventData->mInputStyle.isWeightDefined;
212 FontWeight Controller::InputFontHandler::GetInputFontWeight(const Controller& controller)
214 if(NULL != controller.mImpl->mEventData)
216 return controller.mImpl->mEventData->mInputStyle.weight;
219 return controller.GetDefaultFontWeight();
222 void Controller::InputFontHandler::SetInputFontWidth(Controller& controller, FontWidth width)
224 if(NULL != controller.mImpl->mEventData)
226 controller.mImpl->mEventData->mInputStyle.width = width;
227 controller.mImpl->mEventData->mInputStyle.isWidthDefined = true;
229 if(EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState)
231 CharacterIndex startOfSelectedText = 0u;
232 Length lengthOfSelectedText = 0u;
234 if(EventData::SELECTING == controller.mImpl->mEventData->mState)
236 // Update a font description run for the selecting state.
237 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun(controller.mImpl->mEventData,
238 controller.mImpl->mModel->mLogicalModel,
240 lengthOfSelectedText);
242 fontDescriptionRun.width = width;
243 fontDescriptionRun.widthDefined = true;
245 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
246 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
247 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
251 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
252 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
253 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
256 // Request to relayout.
257 controller.mImpl->mOperationsPending = static_cast<OperationsMask>(controller.mImpl->mOperationsPending |
265 controller.mImpl->mRecalculateNaturalSize = true;
266 controller.mImpl->RequestRelayout();
268 // As the font might change, recalculate the handle positions is needed.
269 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
270 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
271 controller.mImpl->mEventData->mUpdateHighlightBox = true;
272 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
277 bool Controller::InputFontHandler::IsInputFontWidthDefined(const Controller& controller)
279 bool defined = false;
281 if(NULL != controller.mImpl->mEventData)
283 defined = controller.mImpl->mEventData->mInputStyle.isWidthDefined;
289 FontWidth Controller::InputFontHandler::GetInputFontWidth(const Controller& controller)
291 if(NULL != controller.mImpl->mEventData)
293 return controller.mImpl->mEventData->mInputStyle.width;
296 return controller.GetDefaultFontWidth();
299 void Controller::InputFontHandler::SetInputFontSlant(Controller& controller, FontSlant slant)
301 if(NULL != controller.mImpl->mEventData)
303 controller.mImpl->mEventData->mInputStyle.slant = slant;
304 controller.mImpl->mEventData->mInputStyle.isSlantDefined = true;
306 if(EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState)
308 CharacterIndex startOfSelectedText = 0u;
309 Length lengthOfSelectedText = 0u;
311 if(EventData::SELECTING == controller.mImpl->mEventData->mState)
313 // Update a font description run for the selecting state.
314 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun(controller.mImpl->mEventData,
315 controller.mImpl->mModel->mLogicalModel,
317 lengthOfSelectedText);
319 fontDescriptionRun.slant = slant;
320 fontDescriptionRun.slantDefined = true;
322 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
323 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
324 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
328 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
329 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
330 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
333 // Request to relayout.
334 controller.mImpl->mOperationsPending = static_cast<OperationsMask>(controller.mImpl->mOperationsPending |
342 controller.mImpl->mRecalculateNaturalSize = true;
343 controller.mImpl->RequestRelayout();
345 // As the font might change, recalculate the handle positions is needed.
346 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
347 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
348 controller.mImpl->mEventData->mUpdateHighlightBox = true;
349 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
354 bool Controller::InputFontHandler::IsInputFontSlantDefined(const Controller& controller)
356 bool defined = false;
358 if(NULL != controller.mImpl->mEventData)
360 defined = controller.mImpl->mEventData->mInputStyle.isSlantDefined;
366 FontSlant Controller::InputFontHandler::GetInputFontSlant(const Controller& controller)
368 if(NULL != controller.mImpl->mEventData)
370 return controller.mImpl->mEventData->mInputStyle.slant;
373 return controller.GetDefaultFontSlant();
376 void Controller::InputFontHandler::SetInputFontPointSize(Controller& controller, float size)
378 if(NULL != controller.mImpl->mEventData)
380 controller.mImpl->mEventData->mInputStyle.size = size;
381 controller.mImpl->mEventData->mInputStyle.isSizeDefined = true;
383 if(EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState)
385 CharacterIndex startOfSelectedText = 0u;
386 Length lengthOfSelectedText = 0u;
388 if(EventData::SELECTING == controller.mImpl->mEventData->mState)
390 // Update a font description run for the selecting state.
391 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun(controller.mImpl->mEventData,
392 controller.mImpl->mModel->mLogicalModel,
394 lengthOfSelectedText);
396 fontDescriptionRun.size = static_cast<PointSize26Dot6>(size * controller.mImpl->GetFontSizeScale() * 64.f);
397 fontDescriptionRun.sizeDefined = true;
399 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
400 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
401 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
405 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
406 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
407 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
410 // Request to relayout.
411 controller.mImpl->mOperationsPending = static_cast<OperationsMask>(controller.mImpl->mOperationsPending |
419 controller.mImpl->mRecalculateNaturalSize = true;
420 controller.mImpl->RequestRelayout();
422 // As the font might change, recalculate the handle positions is needed.
423 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
424 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
425 controller.mImpl->mEventData->mUpdateHighlightBox = true;
426 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
431 float Controller::InputFontHandler::GetInputFontPointSize(const Controller& controller)
433 if(NULL != controller.mImpl->mEventData)
435 return controller.mImpl->mEventData->mInputStyle.size;
438 // Return the default font's point size if there is no EventData.
439 return controller.GetDefaultFontSize(Text::Controller::POINT_SIZE);
443 } // namespace Toolkit