File: compmod\system\componentmodel\design\HelpKeywordAttribute.cs
Project: ndp\fx\src\System.csproj (System)
//------------------------------------------------------------------------------
// <copyright file="HelpKeywordAttribute.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
/*
 */
 
namespace System.ComponentModel.Design {
    using System;
    using System.Security.Permissions;
 
    /// <devdoc>
    /// Allows specification of the context keyword that will be specified for this class or member.  By default,
    /// the help keyword for a class is the Type's full name, and for a member it's the full name of the type that declared the property,
    /// plus the property name itself.
    ///
    /// For example, consider System.Windows.Forms.Button and it's Text property:
    ///
    /// The class keyword is "System.Windows.Forms.Button", but the Text property keyword is "System.Windows.Forms.Control.Text", because the Text
    /// property is declared on the System.Windows.Forms.Control class rather than the Button class itself; the Button class inherits the property.  
    /// By contrast, the DialogResult property is declared on the Button so its keyword would be "System.Windows.Forms.Button.DialogResult".
    ///
    /// When the help system gets the keywords, it will first look at this attribute.  At the class level, it will return the string specified by the 
    /// HelpContextAttribute.  Note this will not be used for members of the Type in question.  They will still reflect the declaring Type's actual
    /// full name, plus the member name.  To override this, place the attribute on the member itself.
    ///
    /// Example:
    ///
    /// [HelpKeywordAttribute(typeof(Component))] 
    /// public class MyComponent : Component {
    /// 
    /// 
    ///     public string Property1 { get{return "";};
    ///
    ///     [HelpKeywordAttribute("SomeNamespace.SomeOtherClass.Property2")]
    ///     public string Property2 { get{return "";};
    ///
    /// }
    ///
    ///
    /// For the above class (default without attribution):
    ///
    /// Class keyword: "System.ComponentModel.Component" ("MyNamespace.MyComponent')
    /// Property1 keyword: "MyNamespace.MyComponent.Property1" (default)
    /// Property2 keyword: "SomeNamespace.SomeOtherClass.Property2" ("MyNamespace.MyComponent.Property2")
    ///
    /// </devdoc>
    [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]
    [Serializable]
    public sealed class HelpKeywordAttribute : Attribute {
 
        /// <devdoc>
        /// Default value for HelpKeywordAttribute, which is null.  
        /// </devdoc>
        public static readonly HelpKeywordAttribute Default = new HelpKeywordAttribute();   
 
        private string contextKeyword;
 
        /// <devdoc>
        /// Default constructor, which creates an attribute with a null HelpKeyword.
        /// </devdoc>
        public HelpKeywordAttribute() {
        }
 
        /// <devdoc>
        /// Creates a HelpKeywordAttribute with the value being the given keyword string.
        /// </devdoc>
        public HelpKeywordAttribute(string keyword) {
            if (keyword == null) {
                throw new ArgumentNullException("keyword");
            }
            this.contextKeyword = keyword;
        }
 
        /// <devdoc>
        /// Creates a HelpKeywordAttribute with the value being the full name of the given type.
        /// </devdoc>
        public HelpKeywordAttribute(Type t) {
            if (t == null) {
                throw new ArgumentNullException("t");
            }
            this.contextKeyword = t.FullName;
        }
 
        /// <devdoc>
        /// Retrieves the HelpKeyword this attribute supplies.
        /// </devdoc>
        public string HelpKeyword {
            get {
                return contextKeyword;
            }
        }
 
 
        /// <devdoc>
        /// Two instances of a HelpKeywordAttribute are equal if they're HelpKeywords are equal.
        /// </devdoc>
        public override bool Equals(object obj) {
            if (obj == this) {
                return true;
            }
            if ((obj != null) && (obj is HelpKeywordAttribute)) {
                return ((HelpKeywordAttribute)obj).HelpKeyword == HelpKeyword;
            }
 
            return false;
        }
 
        /// <devdoc>
        /// </devdoc>
        public override int GetHashCode() {
            return base.GetHashCode();
        }
 
        /// <devdoc>
        /// Returns true if this Attribute's HelpKeyword is null.
        /// </devdoc>
        public override bool IsDefaultAttribute() {
            return this.Equals(Default);
        }
    }
}