File: UI\WebControls\HyperLinkStyle.cs
Project: ndp\fx\src\xsp\system\Web\System.Web.csproj (System.Web)
//------------------------------------------------------------------------------
// <copyright file="TreeNode.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
 
namespace System.Web.UI.WebControls {
    using System.ComponentModel;
    using System.Drawing;
    using System.Drawing.Design;
    using System.Globalization;
    using System.Text;
    using System.Web.UI;
    using System.Web.Util;
 
    // This class renders selectively attributes from the owner class, filtering out anything not font or forecolor
    internal sealed class HyperLinkStyle : Style {
        private bool _doNotRenderDefaults = false;
        private Style _owner; // This is a style because of the newed IsSet (we need the Style.IsSet, not the new one)
 
        public HyperLinkStyle(Style owner) {
            _owner = owner;
        }
 
        public bool DoNotRenderDefaults {
            get {
                return _doNotRenderDefaults;
            }
            set {
                _doNotRenderDefaults = value;
            }
        }
 
        public sealed override bool IsEmpty {
            get {
                return  (RegisteredCssClass.Length == 0) && 
                    !(_owner.IsSet(PROP_CSSCLASS) ||
                    _owner.IsSet(PROP_FORECOLOR) ||
                    _owner.IsSet(PROP_FONT_NAMES) ||
                    _owner.IsSet(PROP_FONT_SIZE) ||
                    _owner.IsSet(PROP_FONT_BOLD) ||
                    _owner.IsSet(PROP_FONT_ITALIC) ||
                    _owner.IsSet(PROP_FONT_UNDERLINE) ||
                    _owner.IsSet(PROP_FONT_OVERLINE) ||
                    _owner.IsSet(PROP_FONT_STRIKEOUT));
            }
        }
 
        public sealed override void AddAttributesToRender(HtmlTextWriter writer, WebControl owner) {
            string cssClass = String.Empty;
            bool renderInlineStyle = true;
 
            if (_owner.IsSet(PROP_CSSCLASS)) {
                cssClass = _owner.CssClass;
            }
            if (RegisteredCssClass.Length != 0) {
                renderInlineStyle = false;
                if (cssClass.Length != 0) {
                    cssClass = cssClass + " " + RegisteredCssClass;
                }
                else {
                    cssClass = RegisteredCssClass;
                }
            }
 
            if (cssClass.Length > 0) {
                writer.AddAttribute(HtmlTextWriterAttribute.Class, cssClass);
            }
 
            if (renderInlineStyle) {
                CssStyleCollection styleAttributes = GetStyleAttributes(owner);
                styleAttributes.Render(writer);
            }
        }
 
        protected override sealed void FillStyleAttributes(CssStyleCollection attributes, IUrlResolutionService urlResolver) {
            Debug.Assert(_owner != null);
 
            StateBag viewState = ViewState;
 
            Color c;
 
            // ForeColor
            if (_owner.IsSet(PROP_FORECOLOR)) {
                c = _owner.ForeColor;
                if (!c.IsEmpty) {
                    attributes.Add(HtmlTextWriterStyle.Color, ColorTranslator.ToHtml(c));
                }
            }
            // Not defaulting to black anymore for not entirely satisfying but reasonable reasons (VSWhidbey 356729)
 
            // need to call the property get in case we have font properties from view state and have not
            // created the font object
            FontInfo font = _owner.Font;
 
            // Font.Names
            string[] names = font.Names;
            if (names.Length > 0) {
                attributes.Add(HtmlTextWriterStyle.FontFamily, String.Join(",", names));
            }
 
            // Font.Size
            FontUnit fu = font.Size;
            if (fu.IsEmpty == false) {
                attributes.Add(HtmlTextWriterStyle.FontSize, fu.ToString(CultureInfo.InvariantCulture));
            }
 
            // Font.Bold
            if (_owner.IsSet(PROP_FONT_BOLD)) {
                if (font.Bold) {
                    attributes.Add(HtmlTextWriterStyle.FontWeight, "bold");
                }
                else {
                    attributes.Add(HtmlTextWriterStyle.FontWeight, "normal");
                }
            }
 
            // Font.Italic
            if (_owner.IsSet(PROP_FONT_ITALIC)) {
                if (font.Italic == true) {
                    attributes.Add(HtmlTextWriterStyle.FontStyle, "italic");
                }
                else {
                    attributes.Add(HtmlTextWriterStyle.FontStyle, "normal");
                }
            }
 
            string textDecoration = String.Empty;
            if (font.Underline) {
                textDecoration = "underline";
            }
            if (font.Overline) {
                textDecoration += " overline";
            }
            if (font.Strikeout) {
                textDecoration += " line-through";
            }
            if (textDecoration.Length > 0) {
                attributes.Add(HtmlTextWriterStyle.TextDecoration, textDecoration);
            }
            else {
                if (!DoNotRenderDefaults) {
                    attributes.Add(HtmlTextWriterStyle.TextDecoration, "none");
                }
            }
            // Removing the border with an inline style if the class name was set
            if (_owner.IsSet(PROP_CSSCLASS)) {
                attributes.Add(HtmlTextWriterStyle.BorderStyle, "none");
            }
        }
    }
}