2 * Copyright (c) 2021 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/hidden-text.h>
22 #include <dali-toolkit/public-api/controls/text-controls/text-editor.h>
24 using namespace Dali::Toolkit;
26 const int DEFAULT_SHOW_DURATION = 1000;
34 const char* const PROPERTY_MODE = "mode";
35 const char* const PROPERTY_SUBSTITUTE_CHARACTER = "substituteCharacter";
36 const char* const PROPERTY_SUBSTITUTE_COUNT = "substituteCount";
37 const char* const PROPERTY_SHOW_DURATION = "showDuration";
39 HiddenText::HiddenText(Observer* observer)
40 : mObserver(observer),
41 mHideMode(static_cast<int>(Toolkit::HiddenInput::Mode::HIDE_NONE)),
42 mSubstituteText(STAR),
43 mDisplayDuration(DEFAULT_SHOW_DURATION),
45 mPreviousTextCount(0u),
46 mIsLastCharacterShow(false)
48 mTimer = Timer::New(mDisplayDuration);
49 mTimer.TickSignal().Connect(this, &HiddenText::OnTick);
52 void HiddenText::SetProperties(const Property::Map& map)
54 const Property::Map::SizeType count = map.Count();
56 for(Property::Map::SizeType position = 0; position < count; ++position)
58 KeyValuePair keyValue = map.GetKeyValue(position);
59 Property::Key& key = keyValue.first;
60 Property::Value& value = keyValue.second;
62 if(key == Toolkit::HiddenInput::Property::MODE || key == PROPERTY_MODE)
66 else if(key == Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER || key == PROPERTY_SUBSTITUTE_CHARACTER)
68 value.Get(mSubstituteText);
70 else if(key == Toolkit::HiddenInput::Property::SUBSTITUTE_COUNT || key == PROPERTY_SUBSTITUTE_COUNT)
72 value.Get(mSubstituteCount);
74 else if(key == Toolkit::HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION || key == PROPERTY_SHOW_DURATION)
76 value.Get(mDisplayDuration);
81 void HiddenText::GetProperties(Property::Map& map)
83 map[Toolkit::HiddenInput::Property::MODE] = mHideMode;
84 map[Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER] = mSubstituteText;
85 map[Toolkit::HiddenInput::Property::SUBSTITUTE_COUNT] = mSubstituteCount;
86 map[Toolkit::HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION] = mDisplayDuration;
89 void HiddenText::Substitute(const Vector<Character>& source, Vector<Character>& destination, Length cursorPos)
91 const Length characterCount = source.Count();
93 destination.Resize(characterCount);
95 uint32_t* begin = destination.Begin();
96 uint32_t* end = begin + characterCount;
97 uint32_t* hideStart = NULL;
98 uint32_t* hideEnd = NULL;
99 uint32_t* sourcePos = source.Begin();
103 case Toolkit::HiddenInput::Mode::HIDE_NONE:
109 case Toolkit::HiddenInput::Mode::HIDE_ALL:
115 case Toolkit::HiddenInput::Mode::HIDE_COUNT:
118 hideEnd = begin + mSubstituteCount;
121 case Toolkit::HiddenInput::Mode::SHOW_COUNT:
123 hideStart = begin + mSubstituteCount;
127 case Toolkit::HiddenInput::Mode::SHOW_LAST_CHARACTER:
131 if(mPreviousTextCount < characterCount)
133 if(mDisplayDuration > 0)
135 mTimer.SetInterval(mDisplayDuration);
137 mIsLastCharacterShow = true;
146 mIsLastCharacterShow = false;
153 if(mHideMode == Toolkit::HiddenInput::Mode::SHOW_LAST_CHARACTER)
155 Length currentPos = 0u;
156 for(; begin < end; ++begin)
158 if(begin >= hideStart && begin < hideEnd && cursorPos > 0u && currentPos != cursorPos - 1u)
160 *begin = static_cast<uint32_t>(mSubstituteText);
164 *begin = mIsLastCharacterShow ? *sourcePos : static_cast<uint32_t>(mSubstituteText);
172 for(; begin < end; ++begin)
174 if(begin >= hideStart && begin < hideEnd)
176 *begin = static_cast<uint32_t>(mSubstituteText);
181 *begin = *sourcePos++;
185 mPreviousTextCount = characterCount;
188 void HiddenText::InitPreviousTextCount()
190 mPreviousTextCount = 0u;
193 int HiddenText::GetHideMode()
198 bool HiddenText::OnTick()
200 if(mObserver != NULL)
202 mObserver->DisplayTimeExpired();
204 mIsLastCharacterShow = false;
210 } // namespace Toolkit