private void Initialize()
{
_testString = new StringBuilder();
_stringDescriptor = new List<CharDescriptor>();
CaseConversion caseConversion = CaseConversion.None; // The conversion specified in the mask.
bool escapedChar = false; // indicates the current char is to be escaped.
int testPosition = 0; // the position of the char in the test string.
CharType charType = CharType.Literal; // the mask language char type.
char ch; // the char under test.
string locSymbol = string.Empty; // the locale symbol corresponding to a separator in the mask.
// in some cultures a symbol is represented with more than one
// char, for instance '$' for en-JA is '$J'.
//
// Traverse the mask to generate the test string and the string descriptor table so we don't have
// to traverse those strings anymore.
//
for (int maskPos = 0; maskPos < _mask.Length; maskPos++)
{
ch = _mask[maskPos];
if (!escapedChar) // if false treat the char as literal.
{
switch (ch)
{
//
// Mask language placeholders.
// set the corresponding localized char to be added to the test string.
//
case '.': // decimal separator.
locSymbol = _culture.NumberFormat.NumberDecimalSeparator;
charType = CharType.Separator;
break;
case ',': // thousands separator.
locSymbol = _culture.NumberFormat.NumberGroupSeparator;
charType = CharType.Separator;
break;
case ':': // time separator.
locSymbol = _culture.DateTimeFormat.TimeSeparator;
charType = CharType.Separator;
break;
case '/': // date separator.
locSymbol = _culture.DateTimeFormat.DateSeparator;
charType = CharType.Separator;
break;
case '$': // currency symbol.
locSymbol = _culture.NumberFormat.CurrencySymbol;
charType = CharType.Separator;
break;
//
// Mask language modifiers.
// StringDescriptor won't have an entry for modifiers, the modified character
// descriptor contains an entry for case conversion that is set accordingly.
// Just set the appropriate flag for the characters that follow and continue.
//
case '<': // convert all chars that follow to lowercase.
caseConversion = CaseConversion.ToLower;
continue;
case '>': // convert all chars that follow to uppercase.
caseConversion = CaseConversion.ToUpper;
continue;
case '|': // no convertion performed on the chars that follow.
caseConversion = CaseConversion.None;
continue;
case '\\': // escape char - next will be a literal.
escapedChar = true;
charType = CharType.Literal;
continue;
//
// Mask language edit identifiers (#, 9, &, C, A, a, ?).
// Populate a CharDescriptor structure desrcribing the editable char corresponding to this
// identifier.
//
case '0': // digit required.
case 'L': // letter required.
case '&': // any character required.
case 'A': // alphanumeric (letter or digit) required.
_requiredEditChars++;
ch = _promptChar; // replace edit identifier with prompt.
charType = CharType.EditRequired; // set char as editable.
break;
case '?': // letter optional (space OK).
case '9': // digit optional (space OK).
case '#': // digit or plus/minus sign optional (space OK).
case 'C': // any character optional (space OK).
case 'a': // alphanumeric (letter or digit) optional.
_optionalEditChars++;
ch = _promptChar; // replace edit identifier with prompt.
charType = CharType.EditOptional; // set char as editable.
break;
//
// Literals just break so they're added to the test string.
//
default:
charType = CharType.Literal;
break;
}
}
else
{
escapedChar = false; // reset flag since the escaped char is now going to be added to the test string.
}
// Populate a character descriptor for the current character (or loc symbol).
CharDescriptor chDex = new CharDescriptor(maskPos, charType);
if (IsEditPosition(chDex))
{
chDex.CaseConversion = caseConversion;
}
// Now let's add the character to the string description table.
// For code clarity we treat all characters as localizable symbols (can have multi-char representation).
if (charType != CharType.Separator)
{
locSymbol = ch.ToString();
}
foreach (char chVal in locSymbol)
{
_testString.Append(chVal);
_stringDescriptor.Add(chDex);
testPosition++;
}
}
//
// Trim test string to needed size.
//
_testString.Capacity = _testString.Length;
}