Merge "Fix RemoveText issue in text controller" into devel/master
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / text-controller-input-properties.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali-toolkit/internal/text/text-controller-input-properties.h>
20
21 // EXTERNAL INCLUDES
22 //#include <dali-toolkit/devel-api/controls/control-depth-index-ranges.h>
23 //#include <dali/devel-api/adaptor-framework/window-devel.h>
24 //#include <dali/integration-api/debug.h>
25 #include <memory.h>
26 #include <cmath>
27 #include <limits>
28
29 // INTERNAL INCLUDES
30 #include <dali-toolkit/devel-api/text/text-enumerations-devel.h>
31 #include <dali-toolkit/internal/text/text-controller-event-handler.h>
32 #include <dali-toolkit/internal/text/text-controller-impl.h>
33 #include <dali-toolkit/internal/text/text-controller-input-font-handler.h>
34 #include <dali-toolkit/internal/text/text-controller-placeholder-handler.h>
35 #include <dali-toolkit/internal/text/text-controller-relayouter.h>
36 #include <dali-toolkit/internal/text/text-controller-text-updater.h>
37 #include <dali-toolkit/internal/text/text-editable-control-interface.h>
38
39 namespace
40 {
41 const std::string EMPTY_STRING("");
42 }
43
44 namespace Dali::Toolkit::Text
45 {
46
47 void Controller::InputProperties::SetInputColor(Controller& controller, const Vector4& color)
48 {
49   if(controller.mImpl->mEventData)
50   {
51     controller.mImpl->mEventData->mInputStyle.textColor      = color;
52     controller.mImpl->mEventData->mInputStyle.isDefaultColor = false;
53
54     if(EventData::SELECTING == controller.mImpl->mEventData->mState || EventData::EDITING == controller.mImpl->mEventData->mState || EventData::INACTIVE == controller.mImpl->mEventData->mState)
55     {
56       if(EventData::SELECTING == controller.mImpl->mEventData->mState)
57       {
58         const bool handlesCrossed = controller.mImpl->mEventData->mLeftSelectionPosition > controller.mImpl->mEventData->mRightSelectionPosition;
59
60         // Get start and end position of selection
61         const CharacterIndex startOfSelectedText  = handlesCrossed ? controller.mImpl->mEventData->mRightSelectionPosition : controller.mImpl->mEventData->mLeftSelectionPosition;
62         const Length         lengthOfSelectedText = (handlesCrossed ? controller.mImpl->mEventData->mLeftSelectionPosition : controller.mImpl->mEventData->mRightSelectionPosition) - startOfSelectedText;
63
64         // Add the color run.
65         const VectorBase::SizeType numberOfRuns = controller.mImpl->mModel->mLogicalModel->mColorRuns.Count();
66         controller.mImpl->mModel->mLogicalModel->mColorRuns.Resize(numberOfRuns + 1u);
67
68         ColorRun& colorRun                       = *(controller.mImpl->mModel->mLogicalModel->mColorRuns.Begin() + numberOfRuns);
69         colorRun.color                           = color;
70         colorRun.characterRun.characterIndex     = startOfSelectedText;
71         colorRun.characterRun.numberOfCharacters = lengthOfSelectedText;
72
73         controller.mImpl->mTextUpdateInfo.mCharacterIndex             = startOfSelectedText;
74         controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = lengthOfSelectedText;
75         controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd    = lengthOfSelectedText;
76       }
77       else
78       {
79         controller.mImpl->mTextUpdateInfo.mCharacterIndex             = 0;
80         controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToRemove = controller.mImpl->mTextUpdateInfo.mPreviousNumberOfCharacters;
81         controller.mImpl->mTextUpdateInfo.mNumberOfCharactersToAdd    = controller.mImpl->mModel->mLogicalModel->mText.Count();
82       }
83
84       // Request to relayout.
85       controller.mImpl->mOperationsPending = static_cast<OperationsMask>(controller.mImpl->mOperationsPending | COLOR);
86       controller.mImpl->RequestRelayout();
87     }
88   }
89 }
90
91 const Vector4& Controller::InputProperties::GetInputColor(const Controller& controller)
92 {
93   // Return event text input color if we have it, otherwise just return the default text's color
94   return controller.mImpl->mEventData ? controller.mImpl->mEventData->mInputStyle.textColor : controller.mImpl->mTextColor;
95 }
96
97 void Controller::InputProperties::SetInputLineSpacing(Controller& controller, float lineSpacing)
98 {
99   if(controller.mImpl->mEventData)
100   {
101     controller.mImpl->mEventData->mInputStyle.lineSpacing          = lineSpacing;
102     controller.mImpl->mEventData->mInputStyle.isLineSpacingDefined = true;
103   }
104 }
105
106 float Controller::InputProperties::GetInputLineSpacing(const Controller& controller)
107 {
108   return controller.mImpl->mEventData ? controller.mImpl->mEventData->mInputStyle.lineSpacing : 0.0f;
109 }
110
111 void Controller::InputProperties::SetInputShadowProperties(Controller& controller, const std::string& shadowProperties)
112 {
113   if(controller.mImpl->mEventData)
114   {
115     controller.mImpl->mEventData->mInputStyle.shadowProperties = shadowProperties;
116   }
117 }
118
119 const std::string& Controller::InputProperties::GetInputShadowProperties(const Controller& controller)
120 {
121   return controller.mImpl->mEventData ? controller.mImpl->mEventData->mInputStyle.shadowProperties : EMPTY_STRING;
122 }
123
124 void Controller::InputProperties::SetInputUnderlineProperties(Controller& controller, const std::string& underlineProperties)
125 {
126   if(controller.mImpl->mEventData)
127   {
128     controller.mImpl->mEventData->mInputStyle.underlineProperties = underlineProperties;
129   }
130 }
131
132 const std::string& Controller::InputProperties::GetInputUnderlineProperties(const Controller& controller)
133 {
134   return controller.mImpl->mEventData ? controller.mImpl->mEventData->mInputStyle.underlineProperties : EMPTY_STRING;
135 }
136
137 void Controller::InputProperties::SetInputEmbossProperties(Controller& controller, const std::string& embossProperties)
138 {
139   if(controller.mImpl->mEventData)
140   {
141     controller.mImpl->mEventData->mInputStyle.embossProperties = embossProperties;
142   }
143 }
144
145 const std::string& Controller::InputProperties::GetInputEmbossProperties(const Controller& controller)
146 {
147   return controller.mImpl->mEventData ? controller.mImpl->mEventData->mInputStyle.embossProperties : controller.GetDefaultEmbossProperties();
148 }
149
150 void Controller::InputProperties::SetInputOutlineProperties(Controller& controller, const std::string& outlineProperties)
151 {
152   if(controller.mImpl->mEventData)
153   {
154     controller.mImpl->mEventData->mInputStyle.outlineProperties = outlineProperties;
155   }
156 }
157
158 const std::string& Controller::InputProperties::GetInputOutlineProperties(const Controller& controller)
159 {
160   return controller.mImpl->mEventData ? controller.mImpl->mEventData->mInputStyle.outlineProperties : controller.GetDefaultOutlineProperties();
161 }
162
163 void Controller::InputProperties::SetInputModePassword(Controller& controller, bool passwordInput)
164 {
165   if(controller.mImpl->mEventData)
166   {
167     controller.mImpl->mEventData->mPasswordInput = passwordInput;
168   }
169 }
170
171 bool Controller::InputProperties::IsInputModePassword(Controller& controller)
172 {
173   return controller.mImpl->mEventData && controller.mImpl->mEventData->mPasswordInput;
174 }
175
176 } // namespace Dali::Toolkit::Text