2 * Copyright (c) 2020 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>
40 * @brief Adds a new font description run for the selected text.
42 * The new font parameters are added after the call to this method.
44 * @param[in] eventData The event data pointer.
45 * @param[in] logicalModel The logical model where to add the new font description run.
46 * @param[out] startOfSelectedText Index to the first selected character.
47 * @param[out] lengthOfSelectedText Number of selected characters.
49 FontDescriptionRun& UpdateSelectionFontStyleRun( EventData* eventData,
50 LogicalModelPtr logicalModel,
51 CharacterIndex& startOfSelectedText,
52 Length& lengthOfSelectedText )
54 const bool handlesCrossed = eventData->mLeftSelectionPosition > eventData->mRightSelectionPosition;
56 // Get start and end position of selection
57 startOfSelectedText = handlesCrossed ? eventData->mRightSelectionPosition : eventData->mLeftSelectionPosition;
58 lengthOfSelectedText = ( handlesCrossed ? eventData->mLeftSelectionPosition : eventData->mRightSelectionPosition ) - startOfSelectedText;
61 const VectorBase::SizeType numberOfRuns = logicalModel->mFontDescriptionRuns.Count();
62 logicalModel->mFontDescriptionRuns.Resize( numberOfRuns + 1u );
64 FontDescriptionRun& fontDescriptionRun = *( logicalModel->mFontDescriptionRuns.Begin() + numberOfRuns );
66 fontDescriptionRun.characterRun.characterIndex = startOfSelectedText;
67 fontDescriptionRun.characterRun.numberOfCharacters = lengthOfSelectedText;
69 // Recalculate the selection highlight as the metrics may have changed.
70 eventData->mUpdateLeftSelectionPosition = true;
71 eventData->mUpdateRightSelectionPosition = true;
72 eventData->mUpdateHighlightBox = true;
74 return fontDescriptionRun;
77 } // unnamed namespace
79 void Controller::InputFontHandler::SetInputFontFamily(Controller& controller, const std::string& fontFamily)
81 if( NULL != controller.mImpl->mEventData )
83 controller.mImpl->mEventData->mInputStyle.familyName = fontFamily;
84 controller.mImpl->mEventData->mInputStyle.isFamilyDefined = true;
86 if( EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState )
88 CharacterIndex startOfSelectedText = 0u;
89 Length lengthOfSelectedText = 0u;
91 if( EventData::SELECTING == controller.mImpl->mEventData->mState )
93 // Update a font description run for the selecting state.
94 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( controller.mImpl->mEventData,
95 controller.mImpl->mModel->mLogicalModel,
97 lengthOfSelectedText );
99 fontDescriptionRun.familyLength = fontFamily.size();
100 fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
101 memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
102 fontDescriptionRun.familyDefined = true;
104 // The memory allocated for the font family name is freed when the font description is removed from the logical model.
106 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
107 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
108 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
112 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
113 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
114 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
117 // Request to relayout.
118 controller.mImpl->mOperationsPending = static_cast<OperationsMask>( controller.mImpl->mOperationsPending |
126 controller.mImpl->mRecalculateNaturalSize = true;
127 controller.mImpl->RequestRelayout();
129 // As the font changes, recalculate the handle positions is needed.
130 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
131 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
132 controller.mImpl->mEventData->mUpdateHighlightBox = true;
133 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
138 const std::string& Controller::InputFontHandler::GetInputFontFamily(const Controller& controller)
140 if( NULL != controller.mImpl->mEventData )
142 return controller.mImpl->mEventData->mInputStyle.familyName;
145 // Return the default font's family if there is no EventData.
146 return controller.GetDefaultFontFamily();
149 void Controller::InputFontHandler::SetInputFontWeight(const Controller& controller, FontWeight weight)
151 if( NULL != controller.mImpl->mEventData )
153 controller.mImpl->mEventData->mInputStyle.weight = weight;
154 controller.mImpl->mEventData->mInputStyle.isWeightDefined = true;
156 if( EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState )
158 CharacterIndex startOfSelectedText = 0u;
159 Length lengthOfSelectedText = 0u;
161 if( EventData::SELECTING == controller.mImpl->mEventData->mState )
163 // Update a font description run for the selecting state.
164 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( controller.mImpl->mEventData,
165 controller.mImpl->mModel->mLogicalModel,
167 lengthOfSelectedText );
169 fontDescriptionRun.weight = weight;
170 fontDescriptionRun.weightDefined = true;
172 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
173 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
174 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
178 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
179 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
180 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
183 // Request to relayout.
184 controller.mImpl->mOperationsPending = static_cast<OperationsMask>( controller.mImpl->mOperationsPending |
192 controller.mImpl->mRecalculateNaturalSize = true;
193 controller.mImpl->RequestRelayout();
195 // As the font might change, recalculate the handle positions is needed.
196 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
197 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
198 controller.mImpl->mEventData->mUpdateHighlightBox = true;
199 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
204 bool Controller::InputFontHandler::IsInputFontWeightDefined(const Controller& controller)
206 bool defined = false;
208 if( NULL != controller.mImpl->mEventData )
210 defined = controller.mImpl->mEventData->mInputStyle.isWeightDefined;
216 FontWeight Controller::InputFontHandler::GetInputFontWeight(const Controller& controller)
218 if( NULL != controller.mImpl->mEventData )
220 return controller.mImpl->mEventData->mInputStyle.weight;
223 return controller.GetDefaultFontWeight();
226 void Controller::InputFontHandler::SetInputFontWidth(Controller& controller, FontWidth width)
228 if( NULL != controller.mImpl->mEventData )
230 controller.mImpl->mEventData->mInputStyle.width = width;
231 controller.mImpl->mEventData->mInputStyle.isWidthDefined = true;
233 if( EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState )
235 CharacterIndex startOfSelectedText = 0u;
236 Length lengthOfSelectedText = 0u;
238 if( EventData::SELECTING == controller.mImpl->mEventData->mState )
240 // Update a font description run for the selecting state.
241 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( controller.mImpl->mEventData,
242 controller.mImpl->mModel->mLogicalModel,
244 lengthOfSelectedText );
246 fontDescriptionRun.width = width;
247 fontDescriptionRun.widthDefined = true;
249 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
250 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
251 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
255 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
256 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
257 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
260 // Request to relayout.
261 controller.mImpl->mOperationsPending = static_cast<OperationsMask>( controller.mImpl->mOperationsPending |
269 controller.mImpl->mRecalculateNaturalSize = true;
270 controller.mImpl->RequestRelayout();
272 // As the font might change, recalculate the handle positions is needed.
273 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
274 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
275 controller.mImpl->mEventData->mUpdateHighlightBox = true;
276 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
281 bool Controller::InputFontHandler::IsInputFontWidthDefined(const Controller& controller)
283 bool defined = false;
285 if( NULL != controller.mImpl->mEventData )
287 defined = controller.mImpl->mEventData->mInputStyle.isWidthDefined;
293 FontWidth Controller::InputFontHandler::GetInputFontWidth(const Controller& controller)
295 if( NULL != controller.mImpl->mEventData )
297 return controller.mImpl->mEventData->mInputStyle.width;
300 return controller.GetDefaultFontWidth();
303 void Controller::InputFontHandler::SetInputFontSlant(Controller& controller, FontSlant slant)
305 if( NULL != controller.mImpl->mEventData )
307 controller.mImpl->mEventData->mInputStyle.slant = slant;
308 controller.mImpl->mEventData->mInputStyle.isSlantDefined = true;
310 if( EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState )
312 CharacterIndex startOfSelectedText = 0u;
313 Length lengthOfSelectedText = 0u;
315 if( EventData::SELECTING == controller.mImpl->mEventData->mState )
317 // Update a font description run for the selecting state.
318 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( controller.mImpl->mEventData,
319 controller.mImpl->mModel->mLogicalModel,
321 lengthOfSelectedText );
323 fontDescriptionRun.slant = slant;
324 fontDescriptionRun.slantDefined = true;
326 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
327 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
328 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
332 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
333 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
334 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
337 // Request to relayout.
338 controller.mImpl->mOperationsPending = static_cast<OperationsMask>( controller.mImpl->mOperationsPending |
346 controller.mImpl->mRecalculateNaturalSize = true;
347 controller.mImpl->RequestRelayout();
349 // As the font might change, recalculate the handle positions is needed.
350 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
351 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
352 controller.mImpl->mEventData->mUpdateHighlightBox = true;
353 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
358 bool Controller::InputFontHandler::IsInputFontSlantDefined(const Controller& controller)
360 bool defined = false;
362 if( NULL != controller.mImpl->mEventData )
364 defined = controller.mImpl->mEventData->mInputStyle.isSlantDefined;
370 FontSlant Controller::InputFontHandler::GetInputFontSlant(const Controller& controller)
372 if( NULL != controller.mImpl->mEventData )
374 return controller.mImpl->mEventData->mInputStyle.slant;
377 return controller.GetDefaultFontSlant();
380 void Controller::InputFontHandler::SetInputFontPointSize(Controller& controller, float size)
382 if( NULL != controller.mImpl->mEventData )
384 controller.mImpl->mEventData->mInputStyle.size = size;
385 controller.mImpl->mEventData->mInputStyle.isSizeDefined = true;
387 if( EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState )
389 CharacterIndex startOfSelectedText = 0u;
390 Length lengthOfSelectedText = 0u;
392 if( EventData::SELECTING == controller.mImpl->mEventData->mState )
394 // Update a font description run for the selecting state.
395 FontDescriptionRun& fontDescriptionRun = UpdateSelectionFontStyleRun( controller.mImpl->mEventData,
396 controller.mImpl->mModel->mLogicalModel,
398 lengthOfSelectedText );
400 fontDescriptionRun.size = static_cast<PointSize26Dot6>( size * 64.f );
401 fontDescriptionRun.sizeDefined = true;
403 controller.mImpl->mTextUpdateInfo.mCharacterIndex = startOfSelectedText;
404 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
405 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = lengthOfSelectedText;
409 controller.mImpl->mTextUpdateInfo.mCharacterIndex = 0;
410 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
411 controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd = controller.mImpl->mModel->mLogicalModel->mText.Count();
414 // Request to relayout.
415 controller.mImpl->mOperationsPending = static_cast<OperationsMask>( controller.mImpl->mOperationsPending |
423 controller.mImpl->mRecalculateNaturalSize = true;
424 controller.mImpl->RequestRelayout();
426 // As the font might change, recalculate the handle positions is needed.
427 controller.mImpl->mEventData->mUpdateLeftSelectionPosition = true;
428 controller.mImpl->mEventData->mUpdateRightSelectionPosition = true;
429 controller.mImpl->mEventData->mUpdateHighlightBox = true;
430 controller.mImpl->mEventData->mScrollAfterUpdatePosition = true;
435 float Controller::InputFontHandler::GetInputFontPointSize(const Controller& controller)
437 if( NULL != controller.mImpl->mEventData )
439 return controller.mImpl->mEventData->mInputStyle.size;
442 // Return the default font's point size if there is no EventData.
443 return controller.GetDefaultFontSize( Text::Controller::POINT_SIZE );
447 } // namespace Toolkit