129 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
using System;
 | 
						|
using System.Text;
 | 
						|
using System.Drawing;
 | 
						|
using System.ComponentModel;
 | 
						|
using DevComponents.AdvTree;
 | 
						|
using System.Drawing.Drawing2D;
 | 
						|
using DevComponents.DotNetBar;
 | 
						|
 | 
						|
namespace DevComponents.WinForms.Drawing
 | 
						|
{
 | 
						|
    internal class RectangleShape : Shape
 | 
						|
    {
 | 
						|
        #region Internal Implementation
 | 
						|
        /// <summary>
 | 
						|
        /// Renders rectangle on canvas.
 | 
						|
        /// </summary>
 | 
						|
        /// <param name="g">Target graphics to render shape on.</param>
 | 
						|
        /// <param name="bounds">Shape bounds.</param>
 | 
						|
        public override void Paint(Graphics g, Rectangle bounds)
 | 
						|
        {
 | 
						|
            if (bounds.Width < 2 || bounds.Height < 2 || g == null || _Fill == null && _Border == null) return;
 | 
						|
 | 
						|
            GraphicsPath path = null;
 | 
						|
            
 | 
						|
            if (!_CornerRadius.IsZero)
 | 
						|
            {
 | 
						|
                path = DisplayHelp.GetRoundedRectanglePath(bounds, _CornerRadius.TopLeft, _CornerRadius.TopRight, 
 | 
						|
                    _CornerRadius.BottomRight, _CornerRadius.BottomLeft);
 | 
						|
            }
 | 
						|
 | 
						|
            if (_Fill != null)
 | 
						|
            {
 | 
						|
                Brush brush = _Fill.CreateBrush(bounds);
 | 
						|
                if (brush != null)
 | 
						|
                {
 | 
						|
                    SmoothingMode sm = g.SmoothingMode;
 | 
						|
                    if (brush is SolidBrush && path==null)
 | 
						|
                        g.SmoothingMode = SmoothingMode.None;
 | 
						|
                    if (path == null)
 | 
						|
                        g.FillRectangle(brush, bounds);
 | 
						|
                    else
 | 
						|
                        g.FillPath(brush, path);
 | 
						|
                    g.SmoothingMode = sm;
 | 
						|
                    brush.Dispose();
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            if (_Border != null)
 | 
						|
            {
 | 
						|
                Pen pen = _Border.CreatePen();
 | 
						|
                if (pen != null)
 | 
						|
                {
 | 
						|
                    if (path == null)
 | 
						|
                        g.DrawRectangle(pen, bounds);
 | 
						|
                    else
 | 
						|
                        g.DrawPath(pen, path);
 | 
						|
 | 
						|
                    pen.Dispose();
 | 
						|
                }
 | 
						|
            }
 | 
						|
 | 
						|
            Shape content = this.Content;
 | 
						|
            if (content != null)
 | 
						|
            {
 | 
						|
                Rectangle contentBounds = Border.Deflate(bounds, _Border);
 | 
						|
                Region oldClip = null;
 | 
						|
                if (path != null && ClipToBounds)
 | 
						|
                {
 | 
						|
                    oldClip = g.Clip;
 | 
						|
                    g.SetClip(path, CombineMode.Intersect);
 | 
						|
                }
 | 
						|
                content.Paint(g, contentBounds);
 | 
						|
                if (oldClip != null) g.Clip = oldClip;
 | 
						|
            }
 | 
						|
 | 
						|
            if (path != null) path.Dispose();
 | 
						|
        }
 | 
						|
 | 
						|
        private Border _Border;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets shape border.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null), Description("Indicates shape border.")]
 | 
						|
        public Border Border
 | 
						|
        {
 | 
						|
            get { return _Border; }
 | 
						|
            set { _Border = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        private Fill _Fill = null;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the shape fill.
 | 
						|
        /// </summary>
 | 
						|
        [DefaultValue(null), Description("Indicates shape fill")]
 | 
						|
        public Fill Fill
 | 
						|
        {
 | 
						|
            get { return _Fill; }
 | 
						|
            set { _Fill = value; }
 | 
						|
        }
 | 
						|
 | 
						|
        private CornerRadius _CornerRadius;
 | 
						|
        /// <summary>
 | 
						|
        /// Gets or sets the CornerRadius.
 | 
						|
        /// </summary>
 | 
						|
        public CornerRadius CornerRadius
 | 
						|
        {
 | 
						|
            get { return _CornerRadius; }
 | 
						|
            set { _CornerRadius = value; }
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Gets whether property should be serialized.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public bool ShouldSerializeCornerRadius()
 | 
						|
        {
 | 
						|
            return !_CornerRadius.IsZero;
 | 
						|
        }
 | 
						|
        /// <summary>
 | 
						|
        /// Resets the property to its default value.
 | 
						|
        /// </summary>
 | 
						|
        [EditorBrowsable(EditorBrowsableState.Never)]
 | 
						|
        public void ResetCornerRadius()
 | 
						|
        {
 | 
						|
            CornerRadius = new CornerRadius();
 | 
						|
        }
 | 
						|
        #endregion
 | 
						|
    }
 | 
						|
}
 |