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);
|
|
}
|
|
|
|
}
|
|
}
|