public int Compare(object left, object right)
            {
                ZeroitColor cLeft  = (ZeroitColor)left;
                ZeroitColor cRight = (ZeroitColor)right;

                return(string.Compare(cLeft.Name, cRight.Name, false, CultureInfo.InvariantCulture));
            }
        public static ZeroitColor ArgbToKnownColor(int targetARGB)
        {
            EnsureColorTable();
            for (int index = 0; index < colorTable.Length; ++index)
            {
                int argb = colorTable[index];
                if (argb == targetARGB)
                {
                    ZeroitColor color = ZeroitColor.FromKnownColor((Zeroit.Framework.Utilities.KnownColor)index);
                    if (!color.IsSystemColor)
                    {
                        return(color);
                    }
                }
            }

            return(ZeroitColor.FromArgb(targetARGB));
        }
/// <include file='doc\ColorConverter.uex' path='docs/doc[@for="ColorConverter.ConvertTo"]/*' />
/// <devdoc>
///      Converts the given object to another type.  The most common types to convert
///      are to and from a string object.  The default implementation will make a call
///      to ToString on the object if the object is valid and if the destination
///      type is string.  If this cannot convert to the desitnation type, this will
///      throw a NotSupportedException.
/// </devdoc>
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
        {
            if (destinationType == null)
            {
                throw new ArgumentNullException("destinationType");
            }

            if (value is ZeroitColor)
            {
                if (destinationType == typeof(string))
                {
                    ZeroitColor c = (ZeroitColor)value;

                    if (c == ZeroitColor.Empty)
                    {
                        return(string.Empty);
                    }
                    else
                    {
// If this is a known color, then ZeroitColor can provide its own
// name.  Otherwise, we fabricate an ARGB value for it.
//
                        if (c.IsKnownColor)
                        {
                            return(c.Name);
                        }
                        else if (c.IsNamedColor)
                        {
                            return("'" + c.Name + "'");
                        }
                        else
                        {
                            if (culture == null)
                            {
                                culture = CultureInfo.CurrentCulture;
                            }
                            string        sep          = culture.TextInfo.ListSeparator + " ";
                            TypeConverter intConverter = TypeDescriptor.GetConverter(typeof(int));
                            string[]      args;
                            int           nArg = 0;

                            if (c.A < 255)
                            {
                                args         = new string[4];
                                args[nArg++] = intConverter.ConvertToString(context, culture, (object)c.A);
                            }
                            else
                            {
                                args = new string[3];
                            }

// Note: ConvertToString will raise exception if value cannot be converted.
                            args[nArg++] = intConverter.ConvertToString(context, culture, (object)c.R);
                            args[nArg++] = intConverter.ConvertToString(context, culture, (object)c.G);
                            args[nArg++] = intConverter.ConvertToString(context, culture, (object)c.B);

// Now slam all of these together with the fantastic Join
// method.
//
                            return(string.Join(sep, args));
                        }
                    }
                }
                if (destinationType == typeof(InstanceDescriptor))
                {
                    MemberInfo member = null;
                    object[]   args   = null;

                    ZeroitColor c = (ZeroitColor)value;

                    if (c.IsEmpty)
                    {
                        member = typeof(ZeroitColor).GetField("Empty");
                    }
                    else if (c.IsSystemColor)
                    {
                        member = typeof(SystemColors).GetProperty(c.Name);
                    }
                    else if (c.IsKnownColor)
                    {
                        member = typeof(ZeroitColor).GetProperty(c.Name);
                    }
                    else if (c.A != 255)
                    {
                        member = typeof(ZeroitColor).GetMethod("FromArgb", new Type[] { typeof(int), typeof(int), typeof(int), typeof(int) });
                        args   = new object[] { c.A, c.R, c.G, c.B };
                    }
                    else if (c.IsNamedColor)
                    {
                        member = typeof(ZeroitColor).GetMethod("FromName", new Type[] { typeof(string) });
                        args   = new object[] { c.Name };
                    }
                    else
                    {
                        member = typeof(ZeroitColor).GetMethod("FromArgb", new Type[] { typeof(int), typeof(int), typeof(int) });
                        args   = new object[] { c.R, c.G, c.B };
                    }

                    Debug.Assert(member != null, "Could not convert color to member.  Did someone change method name / signature and not update Colorconverter?");
                    if (member != null)
                    {
                        return(new InstanceDescriptor(member, args));
                    }
                    else
                    {
                        return(null);
                    }
                }
            }

            return(base.ConvertTo(context, culture, value, destinationType));
        }
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            string strValue = value as string;

            if (strValue != null)
            {
                object obj  = null;
                string text = strValue.Trim();

                if (text.Length == 0)
                {
                    obj = ZeroitColor.Empty;
                }
                else
                {
// First, check to see if this is a standard name.
//
                    obj = GetNamedColor(text);

                    if (obj == null)
                    {
                        if (culture == null)
                        {
                            culture = CultureInfo.CurrentCulture;
                        }

                        char sep = culture.TextInfo.ListSeparator[0];
                        bool tryMappingToKnownColor = true;

                        TypeConverter intConverter = TypeDescriptor.GetConverter(typeof(int));

// If the value is a 6 digit hex number only, then
// we want to treat the Alpha as 255, not 0
//
                        if (text.IndexOf(sep) == -1)
                        {
// text can be '' (empty quoted string)
                            if (text.Length >= 2 && (text[0] == '\'' || text[0] == '"') && text[0] == text[text.Length - 1])
                            {
// In quotes means a named value
                                string colorName = text.Substring(1, text.Length - 2);
                                obj = ZeroitColor.FromName(colorName);
                                tryMappingToKnownColor = false;
                            }
                            else if ((text.Length == 7 && text[0] == '#') ||
                                     (text.Length == 8 && (text.StartsWith("0x") || text.StartsWith("0X"))) ||
                                     (text.Length == 8 && (text.StartsWith("&h") || text.StartsWith("&H"))))
                            {
// Note: ConvertFromString will raise exception if value cannot be converted.
                                obj = ZeroitColor.FromArgb(unchecked ((int)(0xFF000000 | (uint)(int)intConverter.ConvertFromString(context, culture, text))));
                            }
                        }

// Nope.  Parse the RGBA from the text.
//
                        if (obj == null)
                        {
                            string[] tokens = text.Split(new char[] { sep });
                            int[]    values = new int[tokens.Length];
                            for (int i = 0; i < values.Length; i++)
                            {
                                values[i] = unchecked ((int)intConverter.ConvertFromString(context, culture, tokens[i]));
                            }

// We should now have a number of parsed integer values.
// We support 1, 3, or 4 arguments:
//
// 1 -- full ARGB encoded
// 3 -- RGB
// 4 -- ARGB
//
                            switch (values.Length)
                            {
                            case 1:
                                obj = ZeroitColor.FromArgb(values[0]);
                                break;

                            case 3:
                                obj = ZeroitColor.FromArgb(values[0], values[1], values[2]);
                                break;

                            case 4:
                                obj = ZeroitColor.FromArgb(values[0], values[1], values[2], values[3]);
                                break;
                            }
                            tryMappingToKnownColor = true;
                        }

                        if ((obj != null) && tryMappingToKnownColor)
                        {
// Now check to see if this color matches one of our known colors.
// If it does, then substitute it.  We can only do this for "Colors"
// because system colors morph with user settings.
//
                            int targetARGB = ((ZeroitColor)obj).ToArgb();

                            foreach (ZeroitColor c in Colors.Values)
                            {
                                if (c.ToArgb() == targetARGB)
                                {
                                    obj = c;
                                    break;
                                }
                            }
                        }
                    }

                    if (obj == null)
                    {
                        throw new ArgumentException("InvalidColor", text);
                    }
                }
                return(obj);
            }
            return(base.ConvertFrom(context, culture, value));
        }