517 lines
19 KiB
C#
517 lines
19 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.Drawing.Drawing2D;
|
|
using System.ComponentModel;
|
|
using DevComponents.DotNetBar.Rendering;
|
|
|
|
namespace DevComponents.DotNetBar
|
|
{
|
|
public class DualButton : BaseItem
|
|
{
|
|
#region Constructor
|
|
/// <summary>
|
|
/// Initializes a new instance of the DualButton class.
|
|
/// </summary>
|
|
public DualButton()
|
|
{
|
|
RecreatePaths(_ButtonSize);
|
|
}
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
if (_TopPartPath != null)
|
|
{
|
|
_TopPartPath.Dispose();
|
|
_TopPartPath = null;
|
|
}
|
|
if (_BottomPartPath != null)
|
|
{
|
|
_BottomPartPath.Dispose();
|
|
_BottomPartPath = null;
|
|
}
|
|
|
|
base.Dispose(disposing);
|
|
}
|
|
#endregion
|
|
|
|
#region Implementation
|
|
public override BaseItem Copy()
|
|
{
|
|
DualButton button = new DualButton();
|
|
CopyToItem(button);
|
|
return button;
|
|
}
|
|
protected override void CopyToItem(BaseItem objCopy)
|
|
{
|
|
DualButton button = (DualButton)objCopy;
|
|
button.ButtonSize = _ButtonSize;
|
|
button.Text2 = _Text2;
|
|
base.CopyToItem(objCopy);
|
|
}
|
|
private Size _ButtonSize = new Size(38, 24);
|
|
public Size ButtonSize
|
|
{
|
|
get { return _ButtonSize; }
|
|
set
|
|
{
|
|
if (value.IsEmpty)
|
|
throw new ArgumentException("Empty size is not valid size");
|
|
if (value.Width < 1 || value.Width < 1)
|
|
throw new ArgumentException("Width or Height cannot be less than 1");
|
|
if (value != _ButtonSize)
|
|
{
|
|
Size oldValue = _ButtonSize;
|
|
_ButtonSize = value;
|
|
OnButtonSizeChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
private void RecreatePaths(Size buttonSize)
|
|
{
|
|
if (_TopPartPath != null) _TopPartPath.Dispose();
|
|
if (_BottomPartPath != null) _BottomPartPath.Dispose();
|
|
_TopPartPath = new GraphicsPath();
|
|
_TopPartPath.AddLines(new PointF[] { new PointF(0, buttonSize.Height - 3), new PointF(0, 0), new PointF(buttonSize.Width - 2, 0) });
|
|
_TopPartPath.CloseAllFigures();
|
|
|
|
_BottomPartPath = new GraphicsPath();
|
|
_BottomPartPath.AddLines(new PointF[] { new PointF(2, buttonSize.Height - 1), new PointF(buttonSize.Width - 1, buttonSize.Height - 1), new PointF(buttonSize.Width - 1, 2) });
|
|
_BottomPartPath.CloseAllFigures();
|
|
}
|
|
/// <summary>
|
|
/// Called when ButtonSize property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnButtonSizeChanged(Size oldValue, Size newValue)
|
|
{
|
|
RecreatePaths(newValue);
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("ButtonSize"));
|
|
}
|
|
private GraphicsPath _TopPartPath = null, _BottomPartPath = null;
|
|
|
|
public override void RecalcSize()
|
|
{
|
|
m_Rect.Size = _ButtonSize;
|
|
base.RecalcSize();
|
|
}
|
|
|
|
public override void Paint(ItemPaintArgs p)
|
|
{
|
|
Graphics g = p.Graphics;
|
|
Matrix oldMatrix = g.Transform;
|
|
g.TranslateTransform(m_Rect.X, m_Rect.Y, MatrixOrder.Append);
|
|
LinearGradientColorTable border = null, back = null, back2 = null;
|
|
Color textColor = Color.Empty;
|
|
|
|
|
|
|
|
if (_TopPartPath != null)
|
|
{
|
|
Office2007ButtonItemStateColorTable table = GetOffice2007StateColorTable(p, eDualButtonPart.Up);
|
|
if (table != null)
|
|
{
|
|
if (table.Background != null)
|
|
back = table.Background;
|
|
else
|
|
{
|
|
back = table.TopBackground;
|
|
back2 = table.BottomBackground;
|
|
}
|
|
border = table.OuterBorder;
|
|
textColor = table.Text;
|
|
}
|
|
DrawBackground(g, _TopPartPath, border, back, back2);
|
|
//g.FillPath(_LeftMouseButtonDown == eDualButtonPart.Up ? Brushes.Blue : (_MouseOverPart == eDualButtonPart.Up ? Brushes.Yellow : Brushes.Red), _TopPartPath);
|
|
Rectangle textBounds = Rectangle.Round(_TopPartPath.GetBounds());
|
|
textBounds.Offset(0, -1);
|
|
textBounds.Width = textBounds.Width / 2;
|
|
TextDrawing.DrawString(g, Text, _Font ?? p.Font, textColor, textBounds, eTextFormat.HorizontalCenter | eTextFormat.Top);
|
|
}
|
|
if (_BottomPartPath != null)
|
|
{
|
|
Office2007ButtonItemStateColorTable table = GetOffice2007StateColorTable(p, eDualButtonPart.Down);
|
|
back2 = null;
|
|
if (table != null)
|
|
{
|
|
if (table.Background != null)
|
|
back = table.Background;
|
|
else
|
|
{
|
|
back = table.TopBackground;
|
|
back2 = table.BottomBackground;
|
|
}
|
|
border = table.OuterBorder;
|
|
textColor = table.Text;
|
|
}
|
|
DrawBackground(g, _BottomPartPath, border, back, back2);
|
|
//g.FillPath(_LeftMouseButtonDown == eDualButtonPart.Down ? Brushes.Blue : (_MouseOverPart == eDualButtonPart.Down ? Brushes.Yellow : Brushes.Green), _BottomPartPath);
|
|
Rectangle textBounds = Rectangle.Round(_BottomPartPath.GetBounds());
|
|
textBounds.Offset(textBounds.Width / 2, 1);
|
|
textBounds.Width = textBounds.Width / 2;
|
|
TextDrawing.DrawString(g, Text2, _Font ?? p.Font, textColor, textBounds, eTextFormat.HorizontalCenter | eTextFormat.Bottom);
|
|
}
|
|
g.Transform = oldMatrix;
|
|
|
|
}
|
|
|
|
private Office2007ButtonItemStateColorTable GetOffice2007StateColorTable(ItemPaintArgs p, eDualButtonPart part)
|
|
{
|
|
if (BarFunctions.IsOffice2007Style(EffectiveStyle))
|
|
{
|
|
if (p.Renderer is Office2007Renderer)
|
|
{
|
|
Office2007ColorTable ct = ((Office2007Renderer)p.Renderer).ColorTable;
|
|
Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
|
|
if (!this.Enabled)
|
|
return buttonColorTable.Disabled;
|
|
else if (_LeftMouseButtonDown == part)
|
|
return buttonColorTable.Pressed;
|
|
else if (_MouseOverPart == part)
|
|
return buttonColorTable.MouseOver;
|
|
else if (this.IsSelected == part)
|
|
return buttonColorTable.Checked;
|
|
else
|
|
return buttonColorTable.Default;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private void DrawBackground(Graphics g, GraphicsPath path, LinearGradientColorTable border, LinearGradientColorTable back, LinearGradientColorTable back2)
|
|
{
|
|
if (back != null && !back.IsEmpty)
|
|
{
|
|
if (back2 != null && !back2.IsEmpty)
|
|
{
|
|
using (LinearGradientBrush brush = new LinearGradientBrush(path.GetBounds(), back.Start, back2.End, 90))
|
|
{
|
|
ColorBlend cb = new ColorBlend(4);
|
|
cb.Colors = new Color[] { back.Start, back.End, back2.Start, back2.End };
|
|
cb.Positions = new float[] { 0f, .5f, .5f, 1f };
|
|
brush.InterpolationColors = cb;
|
|
g.FillPath(brush, path);
|
|
}
|
|
}
|
|
else
|
|
DisplayHelp.FillPath(g, path, back);
|
|
}
|
|
if (border != null && !border.IsEmpty)
|
|
{
|
|
using (Brush brush = DisplayHelp.CreateBrush(Rectangle.Round(path.GetBounds()), border))
|
|
{
|
|
using (Pen pen = new Pen(brush, 1))
|
|
g.DrawPath(pen, path);
|
|
}
|
|
//DisplayHelp.DrawGradientPathBorder(g, path, border, 1);
|
|
}
|
|
}
|
|
|
|
public override void InternalMouseDown(System.Windows.Forms.MouseEventArgs objArg)
|
|
{
|
|
if (objArg.Button == System.Windows.Forms.MouseButtons.Left)
|
|
{
|
|
this.LeftMouseButtonDown = HitTest(objArg.X, objArg.Y);
|
|
}
|
|
base.InternalMouseDown(objArg);
|
|
}
|
|
|
|
public override void InternalMouseUp(System.Windows.Forms.MouseEventArgs objArg)
|
|
{
|
|
if (objArg.Button == System.Windows.Forms.MouseButtons.Left)
|
|
{
|
|
if (LeftMouseButtonDown != eDualButtonPart.None && MouseOverPart == LeftMouseButtonDown)
|
|
{
|
|
if (LeftMouseButtonDown == eDualButtonPart.Up)
|
|
ExecuteCommand();
|
|
else
|
|
ExecuteCommand2();
|
|
}
|
|
LeftMouseButtonDown = eDualButtonPart.None;
|
|
}
|
|
base.InternalMouseUp(objArg);
|
|
}
|
|
|
|
public override void InternalMouseMove(System.Windows.Forms.MouseEventArgs objArg)
|
|
{
|
|
this.MouseOverPart = HitTest(objArg.X, objArg.Y);
|
|
//if (objArg.Button == System.Windows.Forms.MouseButtons.Left && LeftMouseButtonDownPart == eDualButtonPart.None && _MouseOverPart != eDualButtonPart.None)
|
|
// LeftMouseButtonDownPart = _MouseOverPart;
|
|
if (_LeftMouseButtonDown != eDualButtonPart.None && _MouseOverPart != _LeftMouseButtonDown)
|
|
LeftMouseButtonDown = eDualButtonPart.None;
|
|
base.InternalMouseMove(objArg);
|
|
}
|
|
|
|
public eDualButtonPart HitTest(Point clientPoint)
|
|
{
|
|
return HitTest(clientPoint.X, clientPoint.Y);
|
|
}
|
|
public eDualButtonPart HitTest(int x, int y)
|
|
{
|
|
Point p = new Point(x - m_Rect.X, y - m_Rect.Y);
|
|
if (_TopPartPath.IsVisible(p))
|
|
return eDualButtonPart.Up;
|
|
else if (_BottomPartPath.IsVisible(p))
|
|
return eDualButtonPart.Down;
|
|
|
|
return eDualButtonPart.None;
|
|
}
|
|
|
|
public override void InternalMouseLeave()
|
|
{
|
|
this.MouseOverPart = eDualButtonPart.None;
|
|
LeftMouseButtonDown = eDualButtonPart.None;
|
|
base.InternalMouseLeave();
|
|
}
|
|
|
|
private string _Text2 = string.Empty;
|
|
/// <summary>
|
|
/// Gets or sets the second button part text.
|
|
/// </summary>
|
|
[DefaultValue(""), Category("Appearance"), Description("Indicates second button part text."), Localizable(true)]
|
|
public string Text2
|
|
{
|
|
get { return _Text2; }
|
|
set
|
|
{
|
|
if (value == null) value = string.Empty;
|
|
if (value != _Text2)
|
|
{
|
|
string oldValue = _Text2;
|
|
_Text2 = value;
|
|
OnText2Changed(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when Text2 property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnText2Changed(string oldValue, string newValue)
|
|
{
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("Text2"));
|
|
this.Refresh();
|
|
}
|
|
|
|
private eDualButtonPart _MouseOverPart;
|
|
public eDualButtonPart MouseOverPart
|
|
{
|
|
get { return _MouseOverPart; }
|
|
private set
|
|
{
|
|
if (value != _MouseOverPart)
|
|
{
|
|
eDualButtonPart oldValue = _MouseOverPart;
|
|
_MouseOverPart = value;
|
|
OnMouseOverPartChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when MouseOverPart property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnMouseOverPartChanged(eDualButtonPart oldValue, eDualButtonPart newValue)
|
|
{
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("MouseOverPart"));
|
|
this.Refresh();
|
|
}
|
|
|
|
private eDualButtonPart _LeftMouseButtonDown = eDualButtonPart.None;
|
|
public eDualButtonPart LeftMouseButtonDown
|
|
{
|
|
get { return _LeftMouseButtonDown; }
|
|
private set
|
|
{
|
|
if (value != _LeftMouseButtonDown)
|
|
{
|
|
eDualButtonPart oldValue = _LeftMouseButtonDown;
|
|
_LeftMouseButtonDown = value;
|
|
OnLeftMouseButtonDownChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when LeftMouseButtonDownPart property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnLeftMouseButtonDownChanged(eDualButtonPart oldValue, eDualButtonPart newValue)
|
|
{
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("LeftMouseButtonDownPart"));
|
|
this.Refresh();
|
|
}
|
|
|
|
protected virtual void ExecuteCommand2()
|
|
{
|
|
if (_Command2 == null) return;
|
|
CommandManager.ExecuteCommand(new ExtraCommandSource(_Command2, _Command2Parameter));
|
|
}
|
|
|
|
internal void ExecuteCommand2Internal()
|
|
{
|
|
ExecuteCommand2();
|
|
}
|
|
|
|
private ICommand _Command2 = null;
|
|
/// <summary>
|
|
/// Gets or sets the command assigned to the item. Default value is null.
|
|
/// <remarks>Note that for ButtonItem instances if this property is set to null and command was assigned previously, Enabled property will be set to false automatically to disable the item.</remarks>
|
|
/// </summary>
|
|
[DefaultValue(null), Category("Commands"), Description("Indicates the command assigned to the item.")]
|
|
public virtual ICommand Command2
|
|
{
|
|
get
|
|
{
|
|
return _Command2;
|
|
}
|
|
set
|
|
{
|
|
bool changed = false;
|
|
if (_Command2 != value)
|
|
changed = true;
|
|
|
|
if (_Command2 != null)
|
|
CommandManager.UnRegisterCommandSource(this, _Command2);
|
|
_Command2 = value;
|
|
if (value != null)
|
|
CommandManager.RegisterCommand(this, value);
|
|
if (changed)
|
|
OnCommand2Changed();
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when Command property value changes.
|
|
/// </summary>
|
|
protected virtual void OnCommand2Changed()
|
|
{
|
|
}
|
|
|
|
private object _Command2Parameter = null;
|
|
/// <summary>
|
|
/// Gets or sets user defined data value that can be passed to the command when it is executed.
|
|
/// </summary>
|
|
[Browsable(true), DefaultValue(null), Category("Commands"), Description("Indicates user defined data value that can be passed to the command when it is executed."), System.ComponentModel.TypeConverter(typeof(System.ComponentModel.StringConverter)), System.ComponentModel.Localizable(true)]
|
|
public virtual object Command2Parameter
|
|
{
|
|
get
|
|
{
|
|
return _Command2Parameter;
|
|
}
|
|
set
|
|
{
|
|
_Command2Parameter = value;
|
|
}
|
|
}
|
|
|
|
private eDualButtonPart _IsSelected = eDualButtonPart.None;
|
|
/// <summary>
|
|
/// Gets or sets the selected part of button.
|
|
/// </summary>
|
|
[DefaultValue(eDualButtonPart.None), Category("Behavior"), Description("Indicates selected part of button.")]
|
|
public eDualButtonPart IsSelected
|
|
{
|
|
get { return _IsSelected; }
|
|
set
|
|
{
|
|
if (value != _IsSelected)
|
|
{
|
|
eDualButtonPart oldValue = _IsSelected;
|
|
_IsSelected = value;
|
|
OnIsSelectedChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when IsSelected property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnIsSelectedChanged(eDualButtonPart oldValue, eDualButtonPart newValue)
|
|
{
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("IsSelected"));
|
|
|
|
}
|
|
|
|
private Font _Font = null;
|
|
/// <summary>
|
|
/// Gets or sets the text font.
|
|
/// </summary>
|
|
[DefaultValue(null), Category("Appearance"), Description("Gets or sets the text font.")]
|
|
public Font Font
|
|
{
|
|
get { return _Font; }
|
|
set
|
|
{
|
|
if (value != _Font)
|
|
{
|
|
Font oldValue = _Font;
|
|
_Font = value;
|
|
OnFontChanged(oldValue, value);
|
|
}
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Called when Font property has changed.
|
|
/// </summary>
|
|
/// <param name="oldValue">Old property value</param>
|
|
/// <param name="newValue">New property value</param>
|
|
protected virtual void OnFontChanged(Font oldValue, Font newValue)
|
|
{
|
|
//OnPropertyChanged(new PropertyChangedEventArgs("Font"));
|
|
|
|
}
|
|
#endregion
|
|
|
|
#region ExtraCommandSource
|
|
public class ExtraCommandSource : ICommandSource
|
|
{
|
|
public ExtraCommandSource(ICommand command, object commandParam)
|
|
{
|
|
_Command = command;
|
|
_CommandParameter = commandParam;
|
|
}
|
|
|
|
#region ICommandSource Members
|
|
private ICommand _Command;
|
|
public ICommand Command
|
|
{
|
|
get
|
|
{
|
|
return _Command;
|
|
}
|
|
set
|
|
{
|
|
_Command = value;
|
|
}
|
|
}
|
|
private object _CommandParameter = null;
|
|
public object CommandParameter
|
|
{
|
|
get
|
|
{
|
|
return _CommandParameter;
|
|
}
|
|
set
|
|
{
|
|
_CommandParameter = value;
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
#endregion
|
|
}
|
|
}
|
|
|
|
public enum eDualButtonPart
|
|
{
|
|
None,
|
|
Up,
|
|
Down
|
|
}
|
|
}
|