247 lines
8.6 KiB
C#

using System;
using System.Text;
using System.Drawing;
using System.ComponentModel;
using DevComponents.DotNetBar.Controls;
namespace DevComponents.DotNetBar
{
/// <summary>
/// Represents the visual separator line that is displayed between items.
/// </summary>
[ToolboxItem(false)]
public class Separator : BaseItem
{
#region Private Variables
#endregion
#region Constructors
/// <summary>
/// Creates new instance of Separator.
/// </summary>
public Separator():this("") {}
/// <summary>
/// Creates new instance of Separator and assigns the name to it.
/// </summary>
/// <param name="sItemName">Item name.</param>
public Separator(string sItemName):base(sItemName)
{
}
#endregion
#region Internal Implementation
public override void Paint(ItemPaintArgs p)
{
Rectangle bounds = this.Bounds;
if (bounds.Width < 1 || bounds.Height < 1) return;
Color colorLine = p.Colors.ItemSeparator;
if (p.ContainerControl is SideNavStrip)
colorLine = p.Colors.BarDockedBorder;
if (!_SeparatorColor.IsEmpty)
colorLine = _SeparatorColor;
Color colorShade = p.Colors.ItemSeparatorShade;
if (!_ShadeColor.IsEmpty)
colorShade = _ShadeColor;
Graphics g=p.Graphics;
Rectangle r;
Padding padding = Dpi.Size(_Padding);
if (this.Orientation == eOrientation.Vertical && _SeparatorOrientation == eDesignMarkerOrientation.NotSet || _SeparatorOrientation== eDesignMarkerOrientation.Vertical)
{
r = new Rectangle(bounds.X + padding.Left, bounds.Y + padding.Top + (bounds.Height - padding.Vertical) / 2, bounds.Width - padding.Horizontal, 1);
if (!colorLine.IsEmpty)
DisplayHelp.DrawLine(g, r.X, r.Y, r.Right -1, r.Y, colorLine, 1);
}
else
{
r = new Rectangle(bounds.X + padding.Left + (bounds.Width - padding.Horizontal) / 2,
bounds.Y + padding.Top, 1, bounds.Height - padding.Vertical);
if (!colorLine.IsEmpty)
DisplayHelp.DrawLine(g, r.X, r.Y, r.X, r.Bottom - 1, colorLine, 1);
}
if (!colorShade.IsEmpty && (_FixedSize.Height>1 &&
(_SeparatorOrientation == eDesignMarkerOrientation.Vertical || this.Orientation == eOrientation.Vertical && _SeparatorOrientation == eDesignMarkerOrientation.NotSet) ||
_FixedSize.Width>1 && (_SeparatorOrientation == eDesignMarkerOrientation.Horizontal || this.Orientation == eOrientation.Horizontal && _SeparatorOrientation == eDesignMarkerOrientation.NotSet)))
{
r.Inflate(1, 1);
DisplayHelp.DrawRectangle(g, colorShade, r);
}
if (this.DesignMode && this.Focused)
{
r = this.Bounds;
r.Inflate(-1, -1);
DesignTime.DrawDesignTimeSelection(p.Graphics, r, p.Colors.ItemDesignTimeBorder);
}
this.DrawInsertMarker(p.Graphics);
}
private Padding _Padding = new Padding(2, 2, 2, 2);
/// <summary>
/// Gets or sets separator padding.
/// </summary>
[Browsable(true), Category("Appearance"), Description("Gets or sets separator padding."), DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public Padding Padding
{
get { return _Padding; }
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializePadding()
{
return _Padding.Bottom != 2 || _Padding.Top != 2 || _Padding.Left != 2 || _Padding.Right != 2;
}
[EditorBrowsable(EditorBrowsableState.Never)]
private void ResetPadding()
{
_Padding = new Padding(2, 2, 2, 2);
}
private Size _FixedSize = new Size(3, 16);
/// <summary>
/// Gets or sets the size of separator. Size specified is for separator in Vertical orientation. If orientation changes then the size will be internally switched to respect proper orientation.
/// </summary>
public Size FixedSize
{
get { return _FixedSize; }
set
{
_FixedSize = value;
NeedRecalcSize = true;
OnAppearanceChanged();
}
}
public override void RecalcSize()
{
if (this.Orientation == eOrientation.Horizontal)
m_Rect.Size = new Size(Dpi.Width(_FixedSize.Width + _Padding.Horizontal), Dpi.Height(_FixedSize.Height + _Padding.Vertical));
else
m_Rect.Size = new Size(Dpi.Width(_FixedSize.Height + Padding.Horizontal), Dpi.Height(_FixedSize.Width + _Padding.Vertical));
base.RecalcSize();
}
/// <summary>
/// Returns copy of the item.
/// </summary>
public override BaseItem Copy()
{
Separator objCopy = new Separator(m_Name);
this.CopyToItem(objCopy);
return objCopy;
}
/// <summary>
/// Copies the ButtonItem specific properties to new instance of the item.
/// </summary>
/// <param name="copy">New ButtonItem instance.</param>
protected override void CopyToItem(BaseItem copy)
{
Separator objCopy = copy as Separator;
base.CopyToItem(objCopy);
objCopy.FixedSize = _FixedSize;
objCopy.Padding.Left = _Padding.Left;
objCopy.Padding.Right = _Padding.Right;
objCopy.Padding.Top = _Padding.Top;
objCopy.Padding.Bottom = _Padding.Bottom;
}
private eDesignMarkerOrientation _SeparatorOrientation = eDesignMarkerOrientation.NotSet;
/// <summary>
/// Indicates splitter orientation.
/// </summary>
[DefaultValue(eDesignMarkerOrientation.NotSet), Category("Appearance"), Description("Indicates splitter orientation.")]
public eDesignMarkerOrientation SeparatorOrientation
{
get { return _SeparatorOrientation; }
set
{
if (_SeparatorOrientation != value)
{
eDesignMarkerOrientation oldValue = _SeparatorOrientation;
_SeparatorOrientation = value;
OnSeparatorOrientationChanged(value, oldValue);
}
}
}
protected virtual void OnSeparatorOrientationChanged(eDesignMarkerOrientation newValue, eDesignMarkerOrientation oldValue)
{
this.OnAppearanceChanged();
}
private Color _SeparatorColor = Color.Empty;
/// <summary>
/// Gets or sets the separator color.
/// </summary>
[Category("Appearance"), Description("Indicates separator color.")]
public Color SeparatorColor
{
get { return _SeparatorColor; }
set
{
_SeparatorColor = value;
this.Refresh();
}
}
/// <summary>
/// Gets whether property should be serialized.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeSeparatorColor()
{
return !_SeparatorColor.IsEmpty;
}
/// <summary>
/// Resets property to its default value.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetSeparatorColor()
{
this.SeparatorColor = Color.Empty;
}
private Color _ShadeColor = Color.Empty;
/// <summary>
/// Gets or sets the separator shade color.
/// </summary>
[Category("Appearance"), Description("Indicates separator shade color.")]
public Color ShadeColor
{
get { return _ShadeColor; }
set
{
_ShadeColor = value;
this.Refresh();
}
}
/// <summary>
/// Gets whether property should be serialized.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeShadeColor()
{
return !_ShadeColor.IsEmpty;
}
/// <summary>
/// Resets property to its default value.
/// </summary>
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetShadeColor()
{
this.ShadeColor = Color.Empty;
}
#endregion
}
}