Add a callback to get textfitted font size.
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / hidden-text.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/hidden-text.h>
20
21 // INTERNAL INCLUDES
22 #include <dali-toolkit/public-api/controls/text-controls/text-editor.h>
23
24 using namespace Dali::Toolkit;
25
26 const uint32_t STAR                  = 0x2A; // Set default substitute character as '*'
27 const int      DEFAULT_SHOW_DURATION = 1000;
28
29 namespace Dali
30 {
31 namespace Toolkit
32 {
33 namespace Text
34 {
35 const char* const PROPERTY_MODE                 = "mode";
36 const char* const PROPERTY_SUBSTITUTE_CHARACTER = "substituteCharacter";
37 const char* const PROPERTY_SUBSTITUTE_COUNT     = "substituteCount";
38 const char* const PROPERTY_SHOW_DURATION        = "showDuration";
39
40 HiddenText::HiddenText(Observer* observer)
41 : mObserver(observer),
42   mHideMode(static_cast<int>(Toolkit::HiddenInput::Mode::HIDE_NONE)),
43   mSubstituteText(STAR),
44   mDisplayDuration(DEFAULT_SHOW_DURATION),
45   mSubstituteCount(0),
46   mPreviousTextCount(0)
47 {
48   mTimer = Timer::New(mDisplayDuration);
49   mTimer.TickSignal().Connect(this, &HiddenText::OnTick);
50 }
51
52 void HiddenText::SetProperties(const Property::Map& map)
53 {
54   const Property::Map::SizeType count = map.Count();
55
56   for(Property::Map::SizeType position = 0; position < count; ++position)
57   {
58     KeyValuePair     keyValue = map.GetKeyValue(position);
59     Property::Key&   key      = keyValue.first;
60     Property::Value& value    = keyValue.second;
61
62     if(key == Toolkit::HiddenInput::Property::MODE || key == PROPERTY_MODE)
63     {
64       value.Get(mHideMode);
65     }
66     else if(key == Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER || key == PROPERTY_SUBSTITUTE_CHARACTER)
67     {
68       value.Get(mSubstituteText);
69     }
70     else if(key == Toolkit::HiddenInput::Property::SUBSTITUTE_COUNT || key == PROPERTY_SUBSTITUTE_COUNT)
71     {
72       value.Get(mSubstituteCount);
73     }
74     else if(key == Toolkit::HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION || key == PROPERTY_SHOW_DURATION)
75     {
76       value.Get(mDisplayDuration);
77     }
78   }
79 }
80
81 void HiddenText::GetProperties(Property::Map& map)
82 {
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;
87 }
88
89 void HiddenText::Substitute(const Vector<Character>& source, Vector<Character>& destination)
90 {
91   const Length characterCount = source.Count();
92
93   destination.Resize(characterCount);
94
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();
100
101   switch(mHideMode)
102   {
103     case Toolkit::HiddenInput::Mode::HIDE_NONE:
104     {
105       hideStart = NULL;
106       hideEnd   = NULL;
107       break;
108     }
109     case Toolkit::HiddenInput::Mode::HIDE_ALL:
110     {
111       hideStart = begin;
112       hideEnd   = end;
113       break;
114     }
115     case Toolkit::HiddenInput::Mode::HIDE_COUNT:
116     {
117       hideStart = begin;
118       hideEnd   = begin + mSubstituteCount;
119       break;
120     }
121     case Toolkit::HiddenInput::Mode::SHOW_COUNT:
122     {
123       hideStart = begin + mSubstituteCount;
124       hideEnd   = end;
125       break;
126     }
127     case Toolkit::HiddenInput::Mode::SHOW_LAST_CHARACTER:
128     {
129       if(mPreviousTextCount < characterCount)
130       {
131         hideStart = begin;
132         hideEnd   = end - 1;
133         if(mDisplayDuration > 0)
134         {
135           mTimer.SetInterval(mDisplayDuration);
136           mTimer.Start();
137         }
138         else
139         {
140           OnTick();
141         }
142       }
143       else
144       {
145         hideStart = begin;
146         hideEnd   = end;
147       }
148       break;
149     }
150   }
151   for(; begin < end; ++begin)
152   {
153     if(begin >= hideStart && begin < hideEnd)
154     {
155       *begin = static_cast<uint32_t>(mSubstituteText);
156       sourcePos++;
157     }
158     else
159     {
160       *begin = *sourcePos++;
161     }
162   }
163   mPreviousTextCount = characterCount;
164 }
165
166 bool HiddenText::OnTick()
167 {
168   if(mObserver != NULL)
169   {
170     mObserver->DisplayTimeExpired();
171   }
172
173   return false;
174 }
175
176 } // namespace Text
177
178 } // namespace Toolkit
179
180 } // namespace Dali