public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
if (value is string) {
string text = (string)value;
CultureInfo retVal = null;
CultureInfo currentUICulture = Thread.CurrentThread.CurrentUICulture;
if (culture != null && culture.Equals(CultureInfo.InvariantCulture)) {
Thread.CurrentThread.CurrentUICulture = culture;
}
try {
// Look for the default culture info.
//
if (text == null || text.Length == 0 || string.Compare(text, DefaultCultureString, true, CultureInfo.CurrentCulture) == 0) {
retVal = CultureInfo.InvariantCulture;
}
// Now look in our set of installed cultures.
//
if (retVal == null) {
ICollection values = GetStandardValues(context);
IEnumerator e = values.GetEnumerator();
while (e.MoveNext()) {
CultureInfo info = (CultureInfo)e.Current;
if (info != null && string.Compare(info.DisplayName, text, true, CultureInfo.CurrentCulture) == 0) {
retVal = info;
break;
}
}
}
// Now try to create a new culture info from this value
//
if (retVal == null) {
try {
retVal = new CultureInfo(text);
}
catch {}
}
// Finally, try to find a partial match
//
if (retVal == null) {
text = text.ToLower(CultureInfo.CurrentCulture);
IEnumerator e = values.GetEnumerator();
while (e.MoveNext()) {
CultureInfo info = (CultureInfo)e.Current;
if (info != null && info.DisplayName.ToLower(CultureInfo.CurrentCulture).StartsWith(text)) {
retVal = info;
break;
}
}
}
}
finally {
Thread.CurrentThread.CurrentUICulture = currentUICulture;
}
// No good. We can't support it.
//
if (retVal == null) {
throw new ArgumentException(SR.GetString(SR.CultureInfoConverterInvalidCulture, (string)value));
}
return retVal;
}
return base.ConvertFrom(context, culture, value);
}