SourceCode/PROMS/DotNetBar Source Code/Rendering/SuperTabLinearGradientColorTable.cs

340 lines
8.5 KiB
C#

using System;
using System.ComponentModel;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Globalization;
namespace DevComponents.DotNetBar.Rendering
{
[TypeConverter(typeof(SuperTabLinearGradientColorTableConvertor))]
public class SuperTabLinearGradientColorTable
{
#region Events
/// <summary>
/// Event raised when the SuperTabLinearGradientColorTable is changed
/// </summary>
[Description("Event raised when the SuperTabLinearGradientColorTable is changed")]
public event EventHandler<EventArgs> ColorTableChanged;
#endregion
#region Private variables
private Color[] _Colors;
private float[] _Positions;
private int _GradientAngle = 90;
private bool? _AdaptiveGradient;
#endregion
#region Constructors
public SuperTabLinearGradientColorTable()
{
}
public SuperTabLinearGradientColorTable(Color color)
{
_Colors = new Color[1];
_Colors[0] = color;
}
public SuperTabLinearGradientColorTable(Color start, Color end)
{
_Colors = new Color[2];
_Colors[0] = start;
_Colors[1] = end;
}
public SuperTabLinearGradientColorTable(Color start, Color end, int gradient)
{
_Colors = new Color[2];
_Colors[0] = start;
_Colors[1] = end;
_GradientAngle = gradient;
}
public SuperTabLinearGradientColorTable(Color[] colors, float[] positions)
{
_Colors = colors;
_Positions = positions;
}
#endregion
#region Public properties
#region Colors
/// <summary>
/// Gets or sets the Gradient Colors
/// </summary>
[Browsable(true), DefaultValue(null)]
[NotifyParentProperty(true)]
[Description("Indicates the Gradient Colors.")]
public Color[] Colors
{
get { return (_Colors); }
set
{
if (_Colors != value)
{
_Colors = value;
OnColorTableChanged();
}
}
}
#endregion
#region Positions
/// <summary>
/// Gets or sets the Gradient Color Positions
/// </summary>
[Browsable(true), DefaultValue(null)]
[NotifyParentProperty(true)]
[Description("Indicates the Gradient Color Positions.")]
public float[] Positions
{
get { return (_Positions); }
set
{
if (_Positions != value)
{
_Positions = value;
OnColorTableChanged();
}
}
}
#endregion
#region GradientAngle
/// <summary>
/// Gets or sets the Gradient angle
/// </summary>
[Browsable(true), DefaultValue(90)]
[NotifyParentProperty(true)]
[Description("Indicates the Gradient angle.")]
public int GradientAngle
{
get { return (_GradientAngle); }
set
{
if (_GradientAngle != value)
{
_GradientAngle = value;
OnColorTableChanged();
}
}
}
#endregion
#region AdaptiveGradient
/// <summary>
/// Gets or sets whether the Gradient will adapt to changes in the TabAlignment
/// </summary>
[Browsable(true), DefaultValue(null)]
[NotifyParentProperty(true)]
[Description("Indicates whether the Gradient will adapt to changes in the TabAlignment.")]
public bool? AdaptiveGradient
{
get { return (_AdaptiveGradient); }
set
{
if (_AdaptiveGradient != value)
{
_AdaptiveGradient = value;
OnColorTableChanged();
}
}
}
#endregion
#region IsEmpty
/// <summary>
/// Gets whether color definition is empty
/// </summary>
[Browsable(false)]
public bool IsEmpty
{
get
{
return ((_Colors == null || _Colors.Length == 0) &&
(_Positions == null || _Positions.Length == 0) &&
_GradientAngle == 90 && _AdaptiveGradient.HasValue == false);
}
}
#endregion
#endregion
#region OnColorTableChanged
protected void OnColorTableChanged()
{
if (ColorTableChanged != null)
ColorTableChanged(this, EventArgs.Empty);
}
#endregion
#region GetBrush
public Brush GetBrush(Rectangle r)
{
return (GetBrush(r, _GradientAngle));
}
public Brush GetBrush(Rectangle r, int angle)
{
if (_Colors != null && _Colors.Length > 0)
{
if (_Colors.Length == 1)
return (new SolidBrush(Colors[0]));
LinearGradientBrush lbr =
new LinearGradientBrush(r, Color.White, Color.White, angle);
lbr.InterpolationColors = GetColorBlend();
return (lbr);
}
return (null);
}
#region GetColorBlend
private ColorBlend GetColorBlend()
{
ColorBlend cb = new ColorBlend(_Colors.Length);
float[] cp = _Positions;
if (cp == null || cp.Length != _Colors.Length)
{
cp = new float[_Colors.Length];
float f = 1 / _Colors.Length;
for (int i = 0; i < cp.Length; i++)
cp[i] = i * f;
cp[_Colors.Length - 1] = 1;
}
for (int i = 0; i < _Colors.Length; i++)
cb.Colors[i] = _Colors[i];
cb.Positions = cp;
return (cb);
}
#endregion
#endregion
#region GetColorBlendCollection
public BackgroundColorBlendCollection GetColorBlendCollection()
{
BackgroundColorBlendCollection cbc = new BackgroundColorBlendCollection();
float[] cp = _Positions;
if (cp == null || cp.Length != _Colors.Length)
{
cp = new float[_Colors.Length];
float f = 1 / _Colors.Length;
for (int i = 0; i < cp.Length; i++)
cp[i] = i * f;
cp[_Colors.Length - 1] = 1;
}
for (int i = 0; i < _Colors.Length; i++)
cbc.Add(new BackgroundColorBlend(_Colors[i], cp[i]));
return (cbc);
}
#endregion
#region ICloneable Members
public object Clone()
{
SuperTabLinearGradientColorTable gct = new SuperTabLinearGradientColorTable();
gct.Colors = Colors;
gct.Positions = Positions;
gct.GradientAngle = GradientAngle;
gct.AdaptiveGradient = AdaptiveGradient;
return (gct);
}
#endregion
}
#region SuperTabLinearGradientColorTableConvertor
public class SuperTabLinearGradientColorTableConvertor : ExpandableObjectConverter
{
public override object ConvertTo(
ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (destinationType == typeof(string))
{
SuperTabLinearGradientColorTable lct =
value as SuperTabLinearGradientColorTable;
if (lct != null)
{
ColorConverter cvt = new ColorConverter();
if (lct.Colors != null)
{
if (lct.Colors[0] != Color.Empty)
return (cvt.ConvertToString(lct.Colors[0]));
if (lct.Colors.Length > 1 && lct.Colors[1] != Color.Empty)
return (cvt.ConvertToString(lct.Colors[1]));
}
if (lct.GradientAngle != 90)
return (lct.GradientAngle.ToString());
return (String.Empty);
}
}
return (base.ConvertTo(context, culture, value, destinationType));
}
}
#endregion
}