File: UI\WebControls\WebColorConverter.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="WebColorConverter.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Web.UI.WebControls {
 
    using System;
    using System.Collections;    
    using System.ComponentModel;
    using System.ComponentModel.Design;
    using System.Drawing;
    using System.Text;
    using System.Web.Util;
    using System.Web.UI;
    using System.Globalization;
 
    /// <devdoc>
    /// </devdoc>
    public class WebColorConverter : ColorConverter {
 
        private static Hashtable htmlSysColorTable;
 
 
        /// <internalonly/>
        /// <devdoc>
        /// </devdoc>
        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) {
            if (value is string) {
                string colorText = ((string)value).Trim();
                Color c = Color.Empty;
 
                // empty color
                if (String.IsNullOrEmpty(colorText))
                    return c;
 
                // #RRGGBB notation is handled by ColorConverter
                if (colorText[0] == '#') {
                    return base.ConvertFrom(context, culture, value);
                }
 
                // special case. HTML requires LightGrey, but System.Drawing.KnownColor has LightGray
                if (StringUtil.EqualsIgnoreCase(colorText, "LightGrey")) {
                    return Color.LightGray;
                }
 
                // System color
                if (htmlSysColorTable == null) {
                    InitializeHTMLSysColorTable();
                }
                object o = htmlSysColorTable[colorText];
                if (o != null) {
                    return (Color)o;
                }
            }
 
            // ColorConverter handles all named and KnownColors
            return base.ConvertFrom(context, culture, value);
        }
 
 
        /// <internalonly/>
        /// <devdoc>
        /// </devdoc>
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
            if (destinationType == null) {
                throw new ArgumentNullException("destinationType");
            }
 
            if (destinationType == typeof(string)) {
                if (value != null) {
                    Color c = (Color)value;
 
                    if (c == Color.Empty) {
                        return String.Empty;
                    }
 
                    /*
                    if (c.IsKnownColor) {
                        // Handle Web system colors and any 'special' named colors
 
                        string colorString = null;
                        switch (c.ToKnownColor()) {
                            case KnownColor.ActiveBorder: colorString = "ActiveBorder"; break;
                            case KnownColor.ActiveCaption: colorString = "ActiveCaption"; break;
                            case KnownColor.AppWorkspace: colorString = "AppWorkspace"; break;
                            case KnownColor.Desktop: colorString = "Background"; break;
                            case KnownColor.Control: colorString = "ButtonFace"; break;
                            case KnownColor.ControlLight: colorString = "ButtonHighlight"; break;
                            case KnownColor.ControlDark: colorString = "ButtonShadow"; break;
                            case KnownColor.ControlText: colorString = "ButtonText"; break;
                            case KnownColor.ActiveCaptionText: colorString = "CaptionText"; break;
                            case KnownColor.GrayText: colorString = "GrayText"; break;
                            case KnownColor.HotTrack:
                            case KnownColor.Highlight: colorString = "Highlight"; break;
                            case KnownColor.HighlightText: colorString = "HighlightText"; break;
                            case KnownColor.InactiveBorder: colorString = "InactiveBorder"; break;
                            case KnownColor.InactiveCaption: colorString = "InactiveCaption"; break;
                            case KnownColor.InactiveCaptionText: colorString = "InactiveCaptionText"; break;
                            case KnownColor.Info: colorString = "InfoBackground"; break;
                            case KnownColor.InfoText: colorString = "InfoText"; break;
                            case KnownColor.Menu: colorString = "Menu"; break;
                            case KnownColor.MenuText: colorString = "MenuText"; break;
                            case KnownColor.ScrollBar: colorString = "Scrollbar"; break;
                            case KnownColor.ControlDarkDark: colorString = "ThreeDDarkShadow"; break;
                            case KnownColor.ControlLightLight: colorString = "ButtonHighlight"; break;
                            case KnownColor.Window: colorString = "Window"; break;
                            case KnownColor.WindowFrame: colorString = "WindowFrame"; break;
                            case KnownColor.WindowText: colorString = "WindowText"; break;
                            
                            case KnownColor.LightGray: colorString = "LightGrey"; break;
                        }
 
                        if (colorString != null) {
                            return colorString;
                        }
                    }
                    */
 
                    if (c.IsKnownColor == false) {
                        // in the Web scenario, colors should be formatted in #RRGGBB notation
                        StringBuilder sb = new StringBuilder("#", 7);
                        sb.Append((c.R).ToString("X2", CultureInfo.InvariantCulture));
                        sb.Append((c.G).ToString("X2", CultureInfo.InvariantCulture));
                        sb.Append((c.B).ToString("X2", CultureInfo.InvariantCulture));
                        return sb.ToString();
                    }
                }
            }
 
            return base.ConvertTo(context, culture, value, destinationType);
        }
 
        private static void InitializeHTMLSysColorTable() {
            Hashtable t = new Hashtable(StringComparer.OrdinalIgnoreCase);
            t["activeborder"] = Color.FromKnownColor(KnownColor.ActiveBorder);
            t["activecaption"] = Color.FromKnownColor(KnownColor.ActiveCaption);
            t["appworkspace"] = Color.FromKnownColor(KnownColor.AppWorkspace);
            t["background"] = Color.FromKnownColor(KnownColor.Desktop);
            t["buttonface"] = Color.FromKnownColor(KnownColor.Control);
            t["buttonhighlight"] = Color.FromKnownColor(KnownColor.ControlLightLight);
            t["buttonshadow"] = Color.FromKnownColor(KnownColor.ControlDark);
            t["buttontext"] = Color.FromKnownColor(KnownColor.ControlText);
            t["captiontext"] = Color.FromKnownColor(KnownColor.ActiveCaptionText);
            t["graytext"] = Color.FromKnownColor(KnownColor.GrayText);
            t["highlight"] = Color.FromKnownColor(KnownColor.Highlight);
            t["highlighttext"] = Color.FromKnownColor(KnownColor.HighlightText);
            t["inactiveborder"] = Color.FromKnownColor(KnownColor.InactiveBorder);
            t["inactivecaption"] = Color.FromKnownColor(KnownColor.InactiveCaption);
            t["inactivecaptiontext"] = Color.FromKnownColor(KnownColor.InactiveCaptionText);
            t["infobackground"] = Color.FromKnownColor(KnownColor.Info);
            t["infotext"] = Color.FromKnownColor(KnownColor.InfoText);
            t["menu"] = Color.FromKnownColor(KnownColor.Menu);
            t["menutext"] = Color.FromKnownColor(KnownColor.MenuText);
            t["scrollbar"] = Color.FromKnownColor(KnownColor.ScrollBar);
            t["threeddarkshadow"] = Color.FromKnownColor(KnownColor.ControlDarkDark);
            t["threedface"] = Color.FromKnownColor(KnownColor.Control);
            t["threedhighlight"] = Color.FromKnownColor(KnownColor.ControlLight);
            t["threedlightshadow"] = Color.FromKnownColor(KnownColor.ControlLightLight);
            t["window"] = Color.FromKnownColor(KnownColor.Window);
            t["windowframe"] = Color.FromKnownColor(KnownColor.WindowFrame);
            t["windowtext"] = Color.FromKnownColor(KnownColor.WindowText);
            htmlSysColorTable = t;
        }
    }
}