2 * Copyright (c) 2017 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 uint32_t STAR = 0x2A; // Set default substitute character as '*'
27 const int DEFAULT_SHOW_DURATION = 1000;
38 const char * const PROPERTY_MODE = "mode";
39 const char * const PROPERTY_SUBSTITUTE_CHARACTER = "substituteCharacter";
40 const char * const PROPERTY_SUBSTITUTE_COUNT = "substituteCount";
41 const char * const PROPERTY_SHOW_DURATION = "showDuration";
43 HiddenText::HiddenText( Observer* observer )
44 : mObserver( observer ),
45 mHideMode( static_cast< int >( Toolkit::HiddenInput::Mode::HIDE_NONE ) ),
46 mSubstituteText( STAR ),
47 mDisplayDuration( DEFAULT_SHOW_DURATION ),
48 mSubstituteCount( 0 ),
49 mPreviousTextCount( 0 )
51 mTimer = Timer::New( mDisplayDuration );
52 mTimer.TickSignal().Connect( this, &HiddenText::OnTick );
55 void HiddenText::SetProperties( const Property::Map& map )
57 const Property::Map::SizeType count = map.Count();
59 for ( Property::Map::SizeType position = 0; position < count; ++position )
61 KeyValuePair keyValue = map.GetKeyValue( position );
62 Property::Key& key = keyValue.first;
63 Property::Value& value = keyValue.second;
65 if( key == Toolkit::HiddenInput::Property::MODE || key == PROPERTY_MODE )
67 value.Get( mHideMode );
69 else if( key == Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER || key == PROPERTY_SUBSTITUTE_CHARACTER )
71 value.Get( mSubstituteText );
73 else if( key == Toolkit::HiddenInput::Property::SUBSTITUTE_COUNT || key == PROPERTY_SUBSTITUTE_COUNT )
75 value.Get( mSubstituteCount );
77 else if( key == Toolkit::HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION || key == PROPERTY_SHOW_DURATION )
79 value.Get( mDisplayDuration );
84 void HiddenText::GetProperties( Property::Map& map )
86 map[Toolkit::HiddenInput::Property::MODE] = mHideMode;
87 map[Toolkit::HiddenInput::Property::SUBSTITUTE_CHARACTER] = mSubstituteText;
88 map[Toolkit::HiddenInput::Property::SUBSTITUTE_COUNT] = mSubstituteCount;
89 map[Toolkit::HiddenInput::Property::SHOW_LAST_CHARACTER_DURATION] = mDisplayDuration;
92 void HiddenText::Substitute( const Vector<Character>& source, Vector<Character>& destination )
94 const Length characterCount = source.Count();
96 destination.Resize( characterCount );
98 uint32_t* begin = destination.Begin();
99 uint32_t* end = begin + characterCount;
100 uint32_t* hideStart = NULL;
101 uint32_t* hideEnd = NULL;
102 uint32_t* sourcePos = source.Begin();
106 case Toolkit::HiddenInput::Mode::HIDE_NONE:
112 case Toolkit::HiddenInput::Mode::HIDE_ALL:
118 case Toolkit::HiddenInput::Mode::HIDE_COUNT:
121 hideEnd = begin + mSubstituteCount;
124 case Toolkit::HiddenInput::Mode::SHOW_COUNT:
126 hideStart = begin + mSubstituteCount;
130 case Toolkit::HiddenInput::Mode::SHOW_LAST_CHARACTER:
132 if (mPreviousTextCount < characterCount)
136 if ( mDisplayDuration > 0 )
138 mTimer.SetInterval( mDisplayDuration );
154 for (; begin < end; ++begin )
156 if (begin >= hideStart && begin < hideEnd)
158 *begin = static_cast<uint32_t>(mSubstituteText);
163 *begin = *sourcePos++;
166 mPreviousTextCount = characterCount;
169 bool HiddenText::OnTick()
171 if( mObserver != NULL )
173 mObserver->DisplayTimeExpired();
181 } // namespace Toolkit