266 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			266 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Text;
 | |
| using System.ComponentModel;
 | |
| using System.Drawing.Drawing2D;
 | |
| using System.Drawing;
 | |
| using System.Globalization;
 | |
| using System.ComponentModel.Design.Serialization;
 | |
| using System.Reflection;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Describes the round rectangle shape.
 | |
|     /// </summary>
 | |
|     [System.ComponentModel.ToolboxItem(false), System.ComponentModel.DesignTimeVisible(false), TypeConverter(typeof(RoundRectangleShapeDescriptorConverter))]
 | |
|     public class RoundRectangleShapeDescriptor : ShapeDescriptor
 | |
|     {
 | |
|         #region Constructor
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the RoundCornerDescriptor class.
 | |
|         /// </summary>
 | |
|         public RoundRectangleShapeDescriptor()
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the RoundCornerDescriptor class.
 | |
|         /// </summary>
 | |
|         public RoundRectangleShapeDescriptor(int cornerSize) : this(cornerSize, cornerSize, cornerSize, cornerSize)
 | |
|         {
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Initializes a new instance of the RoundCornerDescriptor class.
 | |
|         /// </summary>
 | |
|         /// <param name="topLeft"></param>
 | |
|         /// <param name="topRight"></param>
 | |
|         /// <param name="bottomLeft"></param>
 | |
|         /// <param name="bottomRight"></param>
 | |
|         public RoundRectangleShapeDescriptor(int topLeft, int topRight, int bottomLeft, int bottomRight)
 | |
|         {
 | |
|             _TopLeft = topLeft;
 | |
|             _TopRight = topRight;
 | |
|             _BottomLeft = bottomLeft;
 | |
|             _BottomRight = bottomRight;
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region Internal Implementation
 | |
|         private int _TopLeft = 0;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the top-left round corner size.
 | |
|         /// </summary>
 | |
|         [DefaultValue(0), Description("Gets or sets the top-left round corner size.")]
 | |
|         public int TopLeft
 | |
|         {
 | |
|             get { return _TopLeft; }
 | |
|             set
 | |
|             {
 | |
|                 if (_TopLeft != value)
 | |
|                 {
 | |
|                     _TopLeft = Math.Max(0, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private int _TopRight = 0;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the top-right round corner size.
 | |
|         /// </summary>
 | |
|         [DefaultValue(0), Description("Gets or sets the top-right round corner size.")]
 | |
|         public int TopRight
 | |
|         {
 | |
|             get { return _TopRight; }
 | |
|             set
 | |
|             {
 | |
|                 if (_TopRight != value)
 | |
|                 {
 | |
|                     _TopRight = Math.Max(0, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private int _BottomLeft = 0;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the bottom-left round corner size.
 | |
|         /// </summary>
 | |
|         [DefaultValue(0), Description("Gets or sets the bottom-left round corner size.")]
 | |
|         public int BottomLeft
 | |
|         {
 | |
|             get { return _BottomLeft; }
 | |
|             set
 | |
|             {
 | |
|                 if (_BottomLeft != value)
 | |
|                 {
 | |
|                     _BottomLeft = Math.Max(0, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private int _BottomRight = 0;
 | |
|         /// <summary>
 | |
|         /// Gets or sets the bottom-right round corner size.
 | |
|         /// </summary>
 | |
|         [DefaultValue(0), Description("Gets or sets the bottom-right round corner size.")]
 | |
|         public int BottomRight
 | |
|         {
 | |
|             get { return _BottomRight; }
 | |
|             set
 | |
|             {
 | |
|                 if (_BottomRight != value)
 | |
|                 {
 | |
|                     _BottomRight = Math.Max(0, value);
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets whether all corner size values are set to zero which results in no rounded corners.
 | |
|         /// </summary>
 | |
|         [Browsable(false)]
 | |
|         public bool IsEmpty
 | |
|         {
 | |
|             get { return _TopLeft == 0 && _TopRight == 0 && _BottomLeft == 0 && _BottomRight == 0; }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets whether all corner size values are set to same value.
 | |
|         /// </summary>
 | |
|         [Browsable(false)]
 | |
|         public bool IsUniform
 | |
|         {
 | |
|             get { return _TopLeft == _TopRight && _TopLeft == _BottomLeft && _TopLeft == _BottomRight; }
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
|         #region IShapeDescriptor Members
 | |
| 
 | |
|         public override System.Drawing.Drawing2D.GraphicsPath GetShape(System.Drawing.Rectangle bounds)
 | |
|         {
 | |
|             if (!CanDrawShape(bounds))
 | |
|                 return null;
 | |
| 
 | |
|             return GetShape(bounds, _TopLeft, _TopRight, _BottomLeft, _BottomRight);
 | |
|         }
 | |
| 
 | |
| 
 | |
|         public override GraphicsPath GetInnerShape(Rectangle bounds, int borderSize)
 | |
|         {
 | |
|             return GetShape(bounds, Math.Max(0, _TopLeft - borderSize), Math.Max(0, _TopRight - borderSize), 
 | |
|                 Math.Max(0, _BottomLeft - borderSize), Math.Max(0, _BottomRight - borderSize));
 | |
|         }
 | |
| 
 | |
|         private GraphicsPath GetShape(Rectangle bounds, int topLeft, int topRight, int bottomLeft, int bottomRight)
 | |
|         {
 | |
|             if (topLeft == 0 && topRight == 0 && bottomLeft == 0 && bottomRight == 0)
 | |
|             {
 | |
|                 GraphicsPath path = new GraphicsPath();
 | |
|                 //bounds.Width--;
 | |
|                 //bounds.Height--;
 | |
|                 path.AddRectangle(bounds);
 | |
|                 return path;
 | |
|             }
 | |
| 
 | |
|             return DisplayHelp.GetRoundedRectanglePath(bounds, topLeft, topRight, bottomLeft, bottomRight, eStyleBackgroundPathPart.Complete,
 | |
|                 eCornerType.Rounded, eCornerType.Rounded, eCornerType.Rounded, eCornerType.Rounded, 0);
 | |
|         }
 | |
| 
 | |
|         public override bool CanDrawShape(System.Drawing.Rectangle bounds)
 | |
|         {
 | |
|             if (bounds.Width < Math.Max(_TopLeft + _TopRight, _BottomLeft + _BottomRight) + 1 ||
 | |
|                 bounds.Height < Math.Max(_TopLeft + _TopRight, _BottomLeft + _BottomRight) + 1 || bounds.Height <= 1 || bounds.Width <= 1) 
 | |
|                 return false;
 | |
| 
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         private static RoundRectangleShapeDescriptor _RectangleShape = new RoundRectangleShapeDescriptor();
 | |
|         public static RoundRectangleShapeDescriptor RectangleShape
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _RectangleShape;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static RoundRectangleShapeDescriptor _RoundCorner2 = new RoundRectangleShapeDescriptor(2);
 | |
|         public static RoundRectangleShapeDescriptor RoundCorner2
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _RoundCorner2;
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         private static RoundRectangleShapeDescriptor _RoundCorner3 = new RoundRectangleShapeDescriptor(3);
 | |
|         public static RoundRectangleShapeDescriptor RoundCorner3
 | |
|         {
 | |
|             get
 | |
|             {
 | |
|                 return _RoundCorner3;
 | |
|             }
 | |
|         }
 | |
|         #endregion
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     /// <summary>
 | |
|     /// Represents DocumentDockContainer object converter.
 | |
|     /// </summary>
 | |
|     public class RoundRectangleShapeDescriptorConverter : TypeConverter
 | |
|     {
 | |
|         public RoundRectangleShapeDescriptorConverter() { }
 | |
| 
 | |
|         public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
 | |
|         {
 | |
|             if (destinationType == typeof(InstanceDescriptor))
 | |
|                 return true;
 | |
|             return base.CanConvertTo(context, destinationType);
 | |
|         }
 | |
| 
 | |
|         public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
 | |
|         {
 | |
|             if (destinationType == null)
 | |
|                 throw new ArgumentNullException("destinationType");
 | |
| 
 | |
|             if ((destinationType == typeof(InstanceDescriptor)) && (value is RoundRectangleShapeDescriptor))
 | |
|             {
 | |
|                 RoundRectangleShapeDescriptor doc = (RoundRectangleShapeDescriptor)value;
 | |
|                 Type[] constructorParams = null;
 | |
|                 MemberInfo constructorMemberInfo = null;
 | |
|                 object[] constructorValues = null;
 | |
| 
 | |
|                 if (doc.IsEmpty)
 | |
|                 {
 | |
|                     constructorParams = new Type[0];
 | |
|                     constructorMemberInfo = typeof(RoundRectangleShapeDescriptor).GetConstructor(constructorParams);
 | |
|                     constructorValues = new object[0];
 | |
|                 }
 | |
|                 else if (doc.IsUniform)
 | |
|                 {
 | |
|                     constructorParams = new Type[1] { typeof(int) };
 | |
|                     constructorMemberInfo = typeof(RoundRectangleShapeDescriptor).GetConstructor(constructorParams);
 | |
|                     constructorValues = new object[1] { doc.TopLeft };
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     constructorParams = new Type[4] { typeof(int), typeof(int), typeof(int), typeof(int) };
 | |
|                     constructorMemberInfo = typeof(RoundRectangleShapeDescriptor).GetConstructor(constructorParams);
 | |
|                     constructorValues = new object[4] { doc.TopLeft, doc.TopRight, doc.BottomLeft, doc.BottomRight};
 | |
|                 }
 | |
| 
 | |
|                 if (constructorMemberInfo != null)
 | |
|                 {
 | |
|                     return new InstanceDescriptor(constructorMemberInfo, constructorValues);
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return base.ConvertTo(context, culture, value, destinationType);
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 |