File: winforms\Managed\System\WinForms\FlatButtonAppearance.cs
Project: ndp\fx\src\System.Windows.Forms.csproj (System.Windows.Forms)
//------------------------------------------------------------------------------
// <copyright file="FlatButtonAppearance.cs" company="Microsoft">
//     Copyright (c) Microsoft Corporation.  All rights reserved.
// </copyright>                                                                
//------------------------------------------------------------------------------
 
namespace System.Windows.Forms {
    using System;
    using System.Drawing;
    using System.Globalization;
    using System.ComponentModel;
    using System.Windows.Forms.Layout;
 
    /// <include file='doc\FlatButtonAppearance.uex' path='docs/doc[@for="FlatButtonAppearance"]/*' />
    /// <devdoc>
    /// </devdoc>
    [TypeConverter(typeof(FlatButtonAppearanceConverter))]
    public class FlatButtonAppearance {
 
        private ButtonBase owner;
 
        private int   borderSize         = 1;
        private Color borderColor        = Color.Empty;
        private Color checkedBackColor   = Color.Empty;
        private Color mouseDownBackColor = Color.Empty;
        private Color mouseOverBackColor = Color.Empty;
 
        internal FlatButtonAppearance(ButtonBase owner) {
            this.owner = owner;
        }
 
        /// <include file='doc\FlatButtonAppearance.uex' path='docs/doc[@for="FlatButtonAppearance.BorderSize"]/*' />
        /// <devdoc>
        ///     For buttons whose FlatStyle is FlatStyle.Flat, this property specifies the size, in pixels of the border around the button.
        /// </devdoc>
        [
        Browsable(true),
        ApplicableToButton(),
        NotifyParentProperty(true),
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ButtonBorderSizeDescr),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(1),
        ]
        public int BorderSize {
            get {
                return borderSize;
            }
            set {
                if (value < 0)
                    throw new ArgumentOutOfRangeException("BorderSize", value, SR.GetString(SR.InvalidLowBoundArgumentEx, "BorderSize", value.ToString(CultureInfo.CurrentCulture), (0).ToString(CultureInfo.CurrentCulture)));
 
                if (borderSize != value) {
                    borderSize = value;
                    if (owner != null && owner.ParentInternal != null) {
                        LayoutTransaction.DoLayoutIf(owner.AutoSize, owner.ParentInternal, owner, PropertyNames.FlatAppearanceBorderSize);
                    }
                    owner.Invalidate();
                }
            }
        }
 
        /// <include file='doc\FlatButtonAppearance.uex' path='docs/doc[@for="FlatButtonAppearance.BorderColor"]/*' />
        /// <devdoc>
        ///     For buttons whose FlatStyle is FlatStyle.Flat, this property specifies the color of the border around the button.
        /// </devdoc>
        [
        Browsable(true),
        ApplicableToButton(),
        NotifyParentProperty(true),
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ButtonBorderColorDescr),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(typeof(Color), ""),
        ]
        public Color BorderColor {
            get {
                return borderColor;
            }
            set {
                if (value.Equals(Color.Transparent)) {
                    throw new NotSupportedException(SR.GetString(SR.ButtonFlatAppearanceInvalidBorderColor));
                }
                
                if (borderColor != value) {
                    borderColor = value;
                    owner.Invalidate();
                }
            }
        }
 
        /// <include file='doc\FlatButtonAppearance.uex' path='docs/doc[@for="FlatButtonAppearance.CheckedBackColor"]/*' />
        /// <devdoc>
        ///     For buttons whose FlatStyle is FlatStyle.Flat, this property specifies the color of the client area
        ///     of the button when the button state is checked and the mouse cursor is NOT within the bounds of the control.
        /// </devdoc>
        [
        Browsable(true),
        NotifyParentProperty(true),
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ButtonCheckedBackColorDescr),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(typeof(Color), ""),
        ]
        public Color CheckedBackColor {
            get {
                return checkedBackColor;
            }
            set {
                if (checkedBackColor != value) {
                    checkedBackColor = value;
                    owner.Invalidate();
                }
            }
        }
 
        /// <include file='doc\FlatButtonAppearance.uex' path='docs/doc[@for="FlatButtonAppearance.MouseDownBackColor"]/*' />
        /// <devdoc>
        ///     For buttons whose FlatStyle is FlatStyle.Flat, this property specifies the color of the client area
        ///     of the button when the mouse cursor is within the bounds of the control and the left button is pressed.
        /// </devdoc>
        [
        Browsable(true),
        ApplicableToButton(),
        NotifyParentProperty(true),
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ButtonMouseDownBackColorDescr),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(typeof(Color), ""),
        ]
        public Color MouseDownBackColor {
            get {
                return mouseDownBackColor;
            }
            set {
                if (mouseDownBackColor != value) {
                    mouseDownBackColor = value;
                    owner.Invalidate();
                }
            }
        }
 
        /// <include file='doc\FlatButtonAppearance.uex' path='docs/doc[@for="FlatButtonAppearance.MouseOverBackColor"]/*' />
        /// <devdoc>
        ///     For buttons whose FlatStyle is FlatStyle.Flat, this property specifies the color of the client
        ///     area of the button when the mouse cursor is within the bounds of the control.
        /// </devdoc>
        [
        Browsable(true),
        ApplicableToButton(),
        NotifyParentProperty(true),
        SRCategory(SR.CatAppearance),
        SRDescription(SR.ButtonMouseOverBackColorDescr),
        EditorBrowsable(EditorBrowsableState.Always),
        DefaultValue(typeof(Color), ""),
        ]
        public Color MouseOverBackColor {
            get {
                return mouseOverBackColor;
            }
            set {
                if (mouseOverBackColor != value) {
                    mouseOverBackColor = value;
                    owner.Invalidate();
                }
            }
        }
 
    }
 
    internal sealed class ApplicableToButtonAttribute : Attribute {
        public ApplicableToButtonAttribute() {
        }
    }
 
    internal class FlatButtonAppearanceConverter : ExpandableObjectConverter {
 
        // Don't let the property grid display the full type name in the value cell
        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) {
            if (destinationType == typeof(string)) {
                return "";
            }
 
            return base.ConvertTo(context, culture, value, destinationType);
        }
 
        // Don't let the property grid display the CheckedBackColor property for Button controls
        public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) {
            if (context != null && context.Instance is Button) {
                Attribute[] attributes2 = new Attribute[attributes.Length + 1];
                attributes.CopyTo(attributes2, 0);
                attributes2[attributes.Length] = new ApplicableToButtonAttribute();
                attributes = attributes2;
            }
 
            return TypeDescriptor.GetProperties(value, attributes);
        }
 
    }
 
}