498 lines
16 KiB
C#
498 lines
16 KiB
C#
#if FRAMEWORK20
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.ComponentModel;
|
|
using DevComponents.DotNetBar.Rendering;
|
|
using DevComponents.DotNetBar;
|
|
|
|
namespace DevComponents.Editors
|
|
{
|
|
/// <summary>
|
|
/// Represents the up down button which allows change of the value in currently focused input control.
|
|
/// </summary>
|
|
public class VisualUpDownButton : VisualButtonBase
|
|
{
|
|
#region Private Variables
|
|
private bool _MouseOverButtonUp = false;
|
|
private bool _MouseOverButtonDown = false;
|
|
private bool _MouseDownButtonUp = false;
|
|
private bool _MouseDownButtonDown = false;
|
|
private Rectangle _DownButtonRectangle = Rectangle.Empty;
|
|
private Rectangle _UpButtonRectangle = Rectangle.Empty;
|
|
#endregion
|
|
|
|
#region Events
|
|
/// <summary>
|
|
/// Occurs when Up part of the button has been clicked.
|
|
/// </summary>
|
|
public event EventHandler UpClick;
|
|
/// <summary>
|
|
/// Occurs when Down part of the button has been clicked.
|
|
/// </summary>
|
|
public event EventHandler DownClick;
|
|
#endregion
|
|
|
|
#region Constructor
|
|
/// <summary>
|
|
/// Initializes a new instance of the VisualUpDownButton class.
|
|
/// </summary>
|
|
public VisualUpDownButton()
|
|
{
|
|
this.Focusable = false;
|
|
this.ClickAutoRepeat = true;
|
|
}
|
|
#endregion
|
|
|
|
#region Internal Implementation
|
|
public override void PerformLayout(PaintInfo pi)
|
|
{
|
|
int height = pi.AvailableSize.Height;
|
|
if (height % 2 != 0)
|
|
height++;
|
|
Size size = new Size(Dpi.Width(_ButtonWidth), height);
|
|
|
|
if (_UpImage != null && _DownImage != null)
|
|
size.Width = Math.Max(Dpi.Width(_UpImage.Width), Dpi.Width(_DownImage.Width));
|
|
|
|
this.Size = size;
|
|
this.CalculatedSize = size;
|
|
base.PerformLayout(pi);
|
|
}
|
|
|
|
protected override void OnPaint(PaintInfo p)
|
|
{
|
|
Graphics g = p.Graphics;
|
|
Rectangle r = this.RenderBounds;
|
|
if (r.Width <= 0 || r.Height <= 0)
|
|
return;
|
|
|
|
Rectangle buttonRect = new Rectangle(r.X, r.Y, r.Width, r.Height / 2);
|
|
if (_UpImage != null)
|
|
g.DrawImage(_UpImage, buttonRect.Location);
|
|
else
|
|
{
|
|
Office2007ButtonItemStateColorTable ct = GetOffice2007StateColorTableButtonUp(p);
|
|
PaintButtonBackground(p, ct, buttonRect);
|
|
using (SolidBrush brush = new SolidBrush(ct.Text))
|
|
p.Graphics.FillPolygon(brush, Office2007ButtonItemPainter.GetExpandPolygon(buttonRect, ePopupSide.Top));
|
|
}
|
|
_UpButtonRectangle = buttonRect;
|
|
|
|
|
|
buttonRect = new Rectangle(r.X, buttonRect.Bottom, r.Width, r.Height - buttonRect.Height);
|
|
if (_DownImage != null)
|
|
g.DrawImage(_DownImage, buttonRect.Location);
|
|
else
|
|
{
|
|
Office2007ButtonItemStateColorTable ct = GetOffice2007StateColorTableButtonDown(p);
|
|
PaintButtonBackground(p, ct, buttonRect);
|
|
using (SolidBrush brush = new SolidBrush(ct.Text))
|
|
p.Graphics.FillPolygon(brush, Office2007ButtonItemPainter.GetExpandPolygon(buttonRect, ePopupSide.Bottom));
|
|
}
|
|
_DownButtonRectangle = buttonRect;
|
|
|
|
base.OnPaint(p);
|
|
}
|
|
|
|
protected override void OnMouseMove(System.Windows.Forms.MouseEventArgs e)
|
|
{
|
|
if (this.GetIsEnabled())
|
|
{
|
|
if (_DownButtonRectangle.Contains(e.X, e.Y))
|
|
{
|
|
this.MouseOverButtonDown = true;
|
|
this.MouseOverButtonUp = false;
|
|
}
|
|
else if (_UpButtonRectangle.Contains(e.X, e.Y))
|
|
{
|
|
this.MouseOverButtonUp = true;
|
|
this.MouseOverButtonDown = false;
|
|
}
|
|
else
|
|
{
|
|
this.MouseOverButtonUp = false;
|
|
this.MouseOverButtonDown = false;
|
|
}
|
|
}
|
|
base.OnMouseMove(e);
|
|
}
|
|
|
|
protected override void OnMouseDown(System.Windows.Forms.MouseEventArgs e)
|
|
{
|
|
if (e.Button == System.Windows.Forms.MouseButtons.Left && this.GetIsEnabled())
|
|
{
|
|
if (this.MouseOverButtonUp)
|
|
this.MouseDownButtonUp = true;
|
|
else if (this.MouseOverButtonDown)
|
|
this.MouseDownButtonDown = true;
|
|
|
|
ExecuteClickAction();
|
|
}
|
|
base.OnMouseDown(e);
|
|
}
|
|
|
|
private void ExecuteClickAction()
|
|
{
|
|
if (this.MouseOverButtonUp)
|
|
{
|
|
if (_AutoChange != eUpDownButtonAutoChange.None || _AutoChangeItem != null)
|
|
UpClickFocusedInputValue();
|
|
OnUpClick(new EventArgs());
|
|
}
|
|
else if (this.MouseOverButtonDown)
|
|
{
|
|
if (_AutoChange != eUpDownButtonAutoChange.None || _AutoChangeItem != null)
|
|
DownClickFocusedInputValue();
|
|
OnDownClick(new EventArgs());
|
|
}
|
|
}
|
|
|
|
protected override void OnClickAutoRepeat()
|
|
{
|
|
ExecuteClickAction();
|
|
base.OnClickAutoRepeat();
|
|
}
|
|
|
|
protected override void OnMouseUp(System.Windows.Forms.MouseEventArgs e)
|
|
{
|
|
this.MouseDownButtonDown = false;
|
|
this.MouseDownButtonUp = false;
|
|
base.OnMouseUp(e);
|
|
}
|
|
|
|
protected override void OnMouseLeave()
|
|
{
|
|
this.MouseOverButtonDown = false;
|
|
this.MouseOverButtonUp = false;
|
|
base.OnMouseLeave();
|
|
}
|
|
|
|
private void DownClickFocusedInputValue()
|
|
{
|
|
VisualItem focusedItem = GetAutoChangeItem();
|
|
if (focusedItem == null) return;
|
|
|
|
VisualInputGroup parent = null;
|
|
if (focusedItem.Parent is VisualInputGroup && !((VisualInputGroup)this.Parent).IsUserInput)
|
|
{
|
|
parent = (VisualInputGroup)this.Parent;
|
|
parent.IsUserInput = true;
|
|
}
|
|
|
|
if (focusedItem is VisualNumericInput)
|
|
((VisualNumericInput)focusedItem).DecreaseValue();
|
|
else if (focusedItem is VisualListInput)
|
|
((VisualListInput)focusedItem).SelectNext();
|
|
|
|
if (parent != null)
|
|
parent.IsUserInput = false;
|
|
}
|
|
|
|
private void UpClickFocusedInputValue()
|
|
{
|
|
VisualItem focusedItem = GetAutoChangeItem();
|
|
if (focusedItem == null) return;
|
|
|
|
VisualInputGroup parent=null;
|
|
if (focusedItem.Parent is VisualInputGroup && !((VisualInputGroup)this.Parent).IsUserInput)
|
|
{
|
|
parent = (VisualInputGroup)this.Parent;
|
|
parent.IsUserInput = true;
|
|
}
|
|
|
|
if (focusedItem is VisualNumericInput)
|
|
((VisualNumericInput)focusedItem).IncreaseValue();
|
|
else if (focusedItem is VisualListInput)
|
|
((VisualListInput)focusedItem).SelectPrevious();
|
|
|
|
if (parent != null)
|
|
parent.IsUserInput = false;
|
|
}
|
|
|
|
private VisualItem GetAutoChangeItem()
|
|
{
|
|
if (_AutoChangeItem != null) return _AutoChangeItem;
|
|
|
|
if (_AutoChange == eUpDownButtonAutoChange.None || this.Parent == null || !(this.Parent is VisualGroup))
|
|
return null;
|
|
VisualGroup group = this.Parent as VisualGroup;
|
|
if (_AutoChange == eUpDownButtonAutoChange.FocusedItem)
|
|
{
|
|
if (group.FocusedItem is VisualInputGroup)
|
|
{
|
|
VisualInputGroup g = group.FocusedItem as VisualInputGroup;
|
|
while (g.FocusedItem is VisualInputGroup)
|
|
g = g.FocusedItem as VisualInputGroup;
|
|
return g.FocusedItem;
|
|
}
|
|
if (!(group.FocusedItem is VisualInputBase))
|
|
{
|
|
foreach (VisualItem item in group.Items)
|
|
{
|
|
if (item is VisualInputBase && item.Enabled && item.Visible && item.Focusable)
|
|
return item;
|
|
}
|
|
}
|
|
|
|
return group.FocusedItem;
|
|
}
|
|
int start = group.Items.IndexOf(this);
|
|
for (int i = start; i >= 0; i--)
|
|
{
|
|
VisualItem item = group.Items[i];
|
|
if (item is VisualInputBase && item.Visible)
|
|
return item;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Raises the UpClick event.
|
|
/// </summary>
|
|
/// <param name="e">Provides event data.</param>
|
|
protected virtual void OnUpClick(EventArgs e)
|
|
{
|
|
if (UpClick != null)
|
|
UpClick(this, e);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Raises the DownClick event.
|
|
/// </summary>
|
|
/// <param name="e">Provides event data.</param>
|
|
protected virtual void OnDownClick(EventArgs e)
|
|
{
|
|
if (DownClick != null)
|
|
DownClick(this, e);
|
|
}
|
|
|
|
private Image _UpImage = null;
|
|
/// <summary>
|
|
/// Gets or sets the image displayed on the face of the button.
|
|
/// </summary>
|
|
[DefaultValue(null)]
|
|
public Image UpImage
|
|
{
|
|
get { return _UpImage; }
|
|
set
|
|
{
|
|
if (_UpImage != value)
|
|
{
|
|
_UpImage = value;
|
|
this.InvalidateArrange();
|
|
}
|
|
}
|
|
}
|
|
|
|
private Image _DownImage = null;
|
|
/// <summary>
|
|
/// Gets or sets the image displayed on the face of the button.
|
|
/// </summary>
|
|
[DefaultValue(null)]
|
|
public Image DownImage
|
|
{
|
|
get { return _DownImage; }
|
|
set
|
|
{
|
|
if (_DownImage != value)
|
|
{
|
|
_DownImage = value;
|
|
this.InvalidateArrange();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public bool MouseOverButtonUp
|
|
{
|
|
get { return _MouseOverButtonUp; }
|
|
set
|
|
{
|
|
if (_MouseOverButtonUp != value)
|
|
{
|
|
_MouseOverButtonUp = value;
|
|
this.InvalidateRender();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public bool MouseOverButtonDown
|
|
{
|
|
get { return _MouseOverButtonDown; }
|
|
set
|
|
{
|
|
if (_MouseOverButtonDown != value)
|
|
{
|
|
_MouseOverButtonDown = value;
|
|
this.InvalidateRender();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public bool MouseDownButtonDown
|
|
{
|
|
get { return _MouseDownButtonDown; }
|
|
set
|
|
{
|
|
if (_MouseDownButtonDown != value)
|
|
{
|
|
_MouseDownButtonDown = value;
|
|
this.InvalidateRender();
|
|
}
|
|
}
|
|
}
|
|
|
|
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
|
|
public bool MouseDownButtonUp
|
|
{
|
|
get { return _MouseDownButtonUp; }
|
|
set
|
|
{
|
|
if (_MouseDownButtonUp != value)
|
|
{
|
|
_MouseDownButtonUp = value;
|
|
this.InvalidateRender();
|
|
}
|
|
}
|
|
}
|
|
|
|
private int _ButtonWidth = 15;
|
|
/// <summary>
|
|
/// Gets or sets the default width of the buttons.
|
|
/// </summary>
|
|
[DefaultValue(15)]
|
|
public int ButtonWidth
|
|
{
|
|
get { return _ButtonWidth; }
|
|
set
|
|
{
|
|
if (_ButtonWidth != value)
|
|
{
|
|
_ButtonWidth = value;
|
|
this.InvalidateArrange();
|
|
}
|
|
}
|
|
}
|
|
|
|
private eUpDownButtonAutoChange _AutoChange = eUpDownButtonAutoChange.None;
|
|
/// <summary>
|
|
/// Gets or sets whether control automatically tries to increase/decrease the value of the item that has input focus in the same
|
|
/// parent group as the button. Default value is false.
|
|
/// </summary>
|
|
[DefaultValue(eUpDownButtonAutoChange.None)]
|
|
public eUpDownButtonAutoChange AutoChange
|
|
{
|
|
get { return _AutoChange; }
|
|
set
|
|
{
|
|
_AutoChange = value;
|
|
}
|
|
}
|
|
|
|
private VisualItem _AutoChangeItem;
|
|
/// <summary>
|
|
/// Gets or sets the item that is automatically changed when buttons are pressed.
|
|
/// </summary>
|
|
[DefaultValue(null)]
|
|
public VisualItem AutoChangeItem
|
|
{
|
|
get { return _AutoChangeItem; }
|
|
set { _AutoChangeItem = value; }
|
|
}
|
|
|
|
private bool RenderBackground(PaintInfo p)
|
|
{
|
|
if (RenderDefaultBackground) return true;
|
|
|
|
if (!p.MouseOver && !(this.MouseDownButtonUp || this.MouseDownButtonDown) && !(this.MouseOverButtonUp || this.MouseOverButtonDown) || !this.GetIsEnabled())
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
protected virtual void PaintButtonBackground(PaintInfo p, Office2007ButtonItemStateColorTable ct, Rectangle r)
|
|
{
|
|
Graphics g = p.Graphics;
|
|
if(RenderBackground(p))
|
|
Office2007ButtonItemPainter.PaintBackground(g, ct, r, RoundRectangleShapeDescriptor.RectangleShape);
|
|
}
|
|
|
|
protected Office2007ButtonItemStateColorTable GetOffice2007StateColorTableButtonUp(PaintInfo p)
|
|
{
|
|
if (GlobalManager.Renderer is Office2007Renderer)
|
|
{
|
|
Office2007ColorTable ct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
|
|
Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
|
|
if (!this.GetIsEnabled(p) || !_UpEnabled)
|
|
return buttonColorTable.Disabled;
|
|
else if (this.MouseDownButtonUp)
|
|
return buttonColorTable.Pressed;
|
|
else if (this.MouseOverButtonUp)
|
|
return buttonColorTable.MouseOver;
|
|
else
|
|
return buttonColorTable.Default;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
protected Office2007ButtonItemStateColorTable GetOffice2007StateColorTableButtonDown(PaintInfo p)
|
|
{
|
|
if (GlobalManager.Renderer is Office2007Renderer)
|
|
{
|
|
Office2007ColorTable ct = ((Office2007Renderer)GlobalManager.Renderer).ColorTable;
|
|
Office2007ButtonItemColorTable buttonColorTable = ct.ButtonItemColors[Enum.GetName(typeof(eButtonColor), eButtonColor.OrangeWithBackground)];
|
|
if (!this.GetIsEnabled(p) || !_DownEnabled)
|
|
return buttonColorTable.Disabled;
|
|
else if (this.MouseDownButtonDown)
|
|
return buttonColorTable.Pressed;
|
|
else if (this.MouseOverButtonDown)
|
|
return buttonColorTable.MouseOver;
|
|
else
|
|
return buttonColorTable.Default;
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
private bool _UpEnabled = true;
|
|
[DefaultValue(true)]
|
|
public bool UpEnabled
|
|
{
|
|
get { return _UpEnabled; }
|
|
set
|
|
{
|
|
if (_UpEnabled != value)
|
|
{
|
|
_UpEnabled = value;
|
|
this.InvalidateRender();
|
|
}
|
|
}
|
|
}
|
|
|
|
private bool _DownEnabled = true;
|
|
[DefaultValue(true)]
|
|
public bool DownEnabled
|
|
{
|
|
get { return _DownEnabled; }
|
|
set
|
|
{
|
|
if (_DownEnabled != value)
|
|
{
|
|
_DownEnabled = value;
|
|
this.InvalidateRender();
|
|
}
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
}
|
|
}
|
|
#endif
|
|
|