using System;
using System.Text;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using DevComponents.DotNetBar.Controls;
namespace DevComponents.DotNetBar
{
///
/// Represents the Check-box item. Use a CheckBox to give the user an option, such as true/false or yes/no.
///
[ToolboxItem(false), DesignTimeVisible(false), DefaultEvent("Click"), Designer("DevComponents.DotNetBar.Design.CheckBoxItemDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
public class CheckBoxItem : BaseItem
{
#region Private Variables
private bool m_Checked = false;
private eCheckBoxStyle m_CheckBoxStyle = eCheckBoxStyle.CheckBox;
private Size m_CheckSignSize = new Size(13, 13);
private eCheckBoxPosition m_CheckBoxPosition = eCheckBoxPosition.Left;
private int m_CheckTextSpacing = 6;
private int m_VerticalPadding = 3;
private bool m_MouseDown = false;
private bool m_MouseOver = false;
private bool m_TextVisible = true;
private Color m_TextColor = Color.Empty;
private bool m_ThreeState = false;
private CheckState m_CheckState = CheckState.Unchecked;
#endregion
#region Events
///
/// Occurs before Checked property is changed and allows you to cancel the change.
///
public event CheckBoxChangeEventHandler CheckedChanging;
///
/// Occurs after Checked property is changed. Action cannot be cancelled.
///
public event CheckBoxChangeEventHandler CheckedChanged;
///
/// Occurs when CheckState property has changed.
///
public event EventHandler CheckStateChanged;
///
/// Occurs when CheckedBindable property has changed.
///
public event EventHandler CheckedBindableChanged;
#endregion
#region Constructor, Copy
///
/// Creates new instance of CheckBoxItem.
///
public CheckBoxItem():this("","") {}
///
/// Creates new instance of CheckBoxItem and assigns the name to it.
///
/// Item name.
public CheckBoxItem(string sItemName):this(sItemName,"") {}
///
/// Creates new instance of CheckBoxItem and assigns the name and text to it.
///
/// Item name.
/// item text.
public CheckBoxItem(string sItemName, string ItemText)
: base(sItemName, ItemText)
{
}
///
/// Returns copy of the item.
///
public override BaseItem Copy()
{
CheckBoxItem objCopy = new CheckBoxItem(m_Name);
this.CopyToItem(objCopy);
return objCopy;
}
///
/// Copies the CheckBoxItem specific properties to new instance of the item.
///
/// New CheckBoxItem instance.
internal void InternalCopyToItem(CheckBoxItem copy)
{
CopyToItem(copy);
}
///
/// Copies the CheckBoxItem specific properties to new instance of the item.
///
/// New CheckBoxItem instance.
protected override void CopyToItem(BaseItem copy)
{
CheckBoxItem objCopy = copy as CheckBoxItem;
if (objCopy != null)
{
objCopy.CheckBoxPosition = this.CheckBoxPosition;
objCopy.CheckBoxStyle = this.CheckBoxStyle;
objCopy.Checked = this.Checked;
objCopy.CheckState = this.CheckState;
objCopy.TextColor = this.TextColor;
objCopy.TextVisible = this.TextVisible;
objCopy.ThreeState = this.ThreeState;
objCopy.EnableMarkup = this.EnableMarkup;
objCopy.CheckBoxImageChecked = this.CheckBoxImageChecked;
objCopy.CheckBoxImageIndeterminate = this.CheckBoxImageIndeterminate;
objCopy.CheckBoxImageUnChecked = this.CheckBoxImageUnChecked;
base.CopyToItem(objCopy);
}
}
#endregion
#region Internal Implementation
private bool _AutoCheck = true;
///
/// Gets or set whether the Checked values and the item appearance are automatically changed when the Check-Box is clicked. Default value is true.
///
[DefaultValue(true), Category("Behavior"), Description("Indicates whether the Checked values and the item appearance are automatically changed when the Check-Box is clicked.")]
public bool AutoCheck
{
get { return _AutoCheck; }
set
{
if (value != _AutoCheck)
{
bool oldValue = _AutoCheck;
_AutoCheck = value;
OnAutoCheckChanged(oldValue, value);
}
}
}
private void OnAutoCheckChanged(bool oldValue, bool newValue)
{
//OnPropertyChanged(new PropertyChangedEventArgs("AutoCheck"));
}
public override void Paint(ItemPaintArgs p)
{
Rendering.BaseRenderer renderer = p.Renderer;
if (renderer != null)
{
CheckBoxItemRenderEventArgs e = new CheckBoxItemRenderEventArgs(p.Graphics, this, p.Colors, p.Font, p.RightToLeft);
e.ItemPaintArgs = p;
renderer.DrawCheckBoxItem(e);
}
else
{
Rendering.CheckBoxItemPainter painter = PainterFactory.CreateCheckBoxItemPainter(this);
if (painter != null)
{
CheckBoxItemRenderEventArgs e = new CheckBoxItemRenderEventArgs(p.Graphics, this, p.Colors, p.Font, p.RightToLeft);
e.ItemPaintArgs = p;
painter.Paint(e);
}
}
this.DrawInsertMarker(p.Graphics);
}
internal int CheckTextSpacing
{
get { return m_CheckTextSpacing; }
}
internal int VerticalPadding
{
get { return m_VerticalPadding; }
set { m_VerticalPadding = value; }
}
///
/// Gets or sets the size of the check or radio sign. Default value is 13x13. Minimum value is 6x6.
///
[Category("Appearance"), Description("Indicates size of the check or radio sign. Default value is 13x13.")]
public Size CheckSignSize
{
get { return m_CheckSignSize; }
set
{
if (value.Width < 6) value.Width = 6;
if (value.Height < 6) value.Height = 6;
m_CheckSignSize = value; this.NeedRecalcSize = true; this.Refresh();
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeCheckSignSize()
{
return m_CheckSignSize.Width != 13 || m_CheckSignSize.Height != 13;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetCheckSignSize()
{
this.CheckSignSize = new Size(13, 13);
}
internal Size GetCheckSignSize()
{
Size checkSignSize = m_CheckSignSize;
if (_CheckBoxImageChecked != null || _CheckBoxImageIndeterminate != null || _CheckBoxImageUnChecked != null)
{
checkSignSize = Size.Empty;
if (_CheckBoxImageChecked != null)
checkSignSize = new Size(Math.Max(checkSignSize.Width, _CheckBoxImageChecked.Width),
Math.Max(checkSignSize.Height, _CheckBoxImageChecked.Height));
if (_CheckBoxImageIndeterminate != null)
checkSignSize = new Size(Math.Max(checkSignSize.Width, _CheckBoxImageIndeterminate.Width),
Math.Max(checkSignSize.Height, _CheckBoxImageIndeterminate.Height));
if (_CheckBoxImageUnChecked != null)
checkSignSize = new Size(Math.Max(checkSignSize.Width, _CheckBoxImageUnChecked.Width),
Math.Max(checkSignSize.Height, _CheckBoxImageUnChecked.Height));
return Dpi.ImageSize(checkSignSize);
}
return Dpi.Size(checkSignSize);
}
private bool _IsTextMultiLine = false;
internal bool IsTextMultiLine
{
get { return _IsTextMultiLine; }
}
private Size _TextSize = Size.Empty;
internal Size TextSize
{
get
{
return _TextSize;
}
}
public override void RecalcSize()
{
Control objCtrl = this.ContainerControl as Control;
if (objCtrl == null || objCtrl.Disposing || objCtrl.IsDisposed)
return;
int verticalPadding = Dpi.Height(m_VerticalPadding);
int checkTextSpacing = Dpi.Width(m_CheckTextSpacing);
Graphics g = BarFunctions.CreateGraphics(objCtrl);
if (g == null) return;
Size checkSignSize = GetCheckSignSize();
if (m_TextVisible)
{
try
{
Size textSize = Size.Empty;
_IsTextMultiLine = false;
if (objCtrl is CheckBoxX && !((CheckBoxX) objCtrl).AutoSize)
{
textSize = ButtonItemLayout.MeasureItemText(this, g,
m_Rect.Width - checkSignSize.Width - CheckTextSpacing, objCtrl.Font, eTextFormat.Default,
objCtrl.RightToLeft == RightToLeft.Yes);
Size singleLine = TextDrawing.MeasureString(g,"Abc", objCtrl.Font);
_IsTextMultiLine = (textSize.Height > singleLine.Height);
}
else
textSize = ButtonItemLayout.MeasureItemText(this, g, 0, objCtrl.Font, eTextFormat.Default,
objCtrl.RightToLeft == RightToLeft.Yes);
textSize.Width += 1;
_TextSize = textSize;
if (m_CheckBoxPosition == eCheckBoxPosition.Left || m_CheckBoxPosition == eCheckBoxPosition.Right)
{
m_Rect = new Rectangle(m_Rect.X, m_Rect.Y,
textSize.Width + checkTextSpacing + checkSignSize.Width,
Math.Max(checkSignSize.Height, textSize.Height) + verticalPadding * 2);
}
else
{
m_Rect = new Rectangle(m_Rect.X, m_Rect.Y,
Math.Max(textSize.Width, checkSignSize.Width) + verticalPadding * 2,
textSize.Height + checkTextSpacing + checkSignSize.Height);
}
}
finally
{
g.Dispose();
}
}
else
{
Size s = checkSignSize;
s.Width += verticalPadding * 2;
s.Height += verticalPadding * 2;
m_Rect = new Rectangle(m_Rect.Location, s);
}
base.RecalcSize();
}
///
/// Gets or sets the text associated with this item.
///
[Browsable(true), Editor("DevComponents.DotNetBar.Design.TextMarkupUIEditor, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf", typeof(System.Drawing.Design.UITypeEditor)), Category("Appearance"), Description("The text contained in the item."), Localizable(true), DefaultValue("")]
public override string Text
{
get
{
return base.Text;
}
set
{
base.Text = value;
}
}
#region Markup Implementation
///
/// Gets whether item supports text markup. Default is false.
///
protected override bool IsMarkupSupported
{
get { return _EnableMarkup; }
}
private bool _EnableMarkup = true;
///
/// Gets or sets whether text-markup support is enabled for items Text property. Default value is true.
/// Set this property to false to display HTML or other markup in the item instead of it being parsed as text-markup.
///
[DefaultValue(true), Category("Appearance"), Description("Indicates whether text-markup support is enabled for items Text property.")]
public bool EnableMarkup
{
get { return _EnableMarkup; }
set
{
if (_EnableMarkup != value)
{
_EnableMarkup = value;
NeedRecalcSize = true;
OnTextChanged();
}
}
}
#endregion
///
/// Gets or sets whether text assigned to the check box is visible. Default value is true.
///
[Browsable(true), DefaultValue(true), Category("Appearance"), Description("Indicates whether text assigned to the check box is visible.")]
public bool TextVisible
{
get { return m_TextVisible; }
set
{
m_TextVisible = value;
this.NeedRecalcSize = true;
OnAppearanceChanged();
}
}
///
/// Gets or sets the text color. Default value is Color.Empty which indicates that default color is used.
///
[Browsable(true), Category("Appearance"), Description("Indicates text color.")]
public Color TextColor
{
get { return m_TextColor; }
set
{
m_TextColor = value;
OnAppearanceChanged();
}
}
[EditorBrowsable(EditorBrowsableState.Never)]
public bool ShouldSerializeTextColor()
{
return !m_TextColor.IsEmpty;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public void ResetTextColor()
{
this.TextColor = Color.Empty;
}
///
/// Gets or sets the appearance style of the item. Default value is CheckBox. Item can also assume the style of radio-button.
///
[Browsable(true), DefaultValue(eCheckBoxStyle.CheckBox), Category("Appearance"), Description("Indicates appearance style of the item. Default value is CheckBox. Item can also assume the style of radio-button.")]
public eCheckBoxStyle CheckBoxStyle
{
get { return m_CheckBoxStyle; }
set
{
m_CheckBoxStyle = value;
OnAppearanceChanged();
}
}
///
/// Gets or sets the check box position relative to the text. Default value is Left.
///
[Browsable(true), DefaultValue(eCheckBoxPosition.Left), Category("Appearance"), Description("Indicates the check box position relative to the text.")]
public eCheckBoxPosition CheckBoxPosition
{
get { return m_CheckBoxPosition; }
set
{
m_CheckBoxPosition = value;
this.NeedRecalcSize = true;
OnAppearanceChanged();
}
}
public override void InternalMouseEnter()
{
base.InternalMouseEnter();
if (!this.DesignMode && _AutoCheck)
{
m_MouseOver = true;
if (this.GetEnabled())
this.Refresh();
}
}
public override void InternalMouseLeave()
{
base.InternalMouseLeave();
if (!this.DesignMode)
{
m_MouseOver = false;
m_MouseDown = false;
if (this.GetEnabled())
this.Refresh();
}
}
public override void InternalMouseDown(MouseEventArgs objArg)
{
base.InternalMouseDown(objArg);
if (objArg.Button == MouseButtons.Left && !this.DesignMode && _AutoCheck)
{
m_MouseDown = true;
if (this.GetEnabled())
this.Refresh();
}
}
public override void InternalMouseUp(MouseEventArgs objArg)
{
base.InternalMouseUp(objArg);
if (m_MouseDown && !this.DesignMode)
{
m_MouseDown = false;
if (this.GetEnabled())
this.Refresh();
}
}
///
/// Gets whether mouse is over the item.
///
[Browsable(false)]
public bool IsMouseOver
{
get { return m_MouseOver; }
internal set { m_MouseOver = value; }
}
///
/// Gets whether left mouse button is pressed on the item.
///
[Browsable(false)]
public bool IsMouseDown
{
get { return m_MouseDown; }
internal set { m_MouseDown = value; }
}
///
/// Gets or set a value indicating whether the button is in the checked state.
///
[Browsable(true), RefreshProperties(RefreshProperties.All), Category("Appearance"), Description("Indicates whether item is checked or not."), DefaultValue(false), Bindable(false)]
public virtual bool Checked
{
get
{
return m_Checked;
}
set
{
if (m_Checked != value)
{
if (m_ThreeState && value && m_CheckState != CheckState.Unchecked) return;
SetChecked(value, eEventSource.Code);
}
}
}
///
/// Gets or set a value indicating whether the button is in the checked state.
///
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), RefreshProperties(RefreshProperties.All), Category("Appearance"), Description("Indicates whether item is checked or not."), DefaultValue(false), Bindable(true)]
public virtual bool CheckedBindable
{
get
{
return this.Checked;
}
set
{
this.Checked = value;
}
}
///
/// Raises the click event and provide the information about the source of the event.
///
///
public override void RaiseClick(eEventSource source)
{
if (_AutoCheck && CanRaiseClick && !(this.CheckBoxStyle == eCheckBoxStyle.RadioButton && this.Checked))
{
if (this.ThreeState)
{
if (this.CheckState == CheckState.Unchecked)
SetChecked(CheckState.Checked, source);
else if (this.CheckState == CheckState.Checked)
SetChecked(CheckState.Indeterminate, source);
else if (this.CheckState == CheckState.Indeterminate)
SetChecked(CheckState.Unchecked, source);
}
else
SetChecked(!this.Checked, source);
ExecuteCommand();
}
base.RaiseClick(source);
}
///
/// Sets the Checked property of the item, raises appropriate events and provides the information about the source of the change.
///
/// New value for Checked property
/// Source of the change.
public virtual void SetChecked(bool newValue, eEventSource source)
{
// Allow user to cancel the checking
if (m_CheckBoxStyle == eCheckBoxStyle.RadioButton && newValue && this.Parent != null)
{
CheckBoxItem b = null;
foreach (BaseItem item in this.Parent.SubItems)
{
if (item == this)
continue;
b = item as CheckBoxItem;
if (b != null && b.Checked && b.CheckBoxStyle == eCheckBoxStyle.RadioButton)
{
break;
}
}
CheckBoxChangeEventArgs e = new CheckBoxChangeEventArgs(b, this, source);
InvokeCheckedChanging(e);
if (e.Cancel)
return;
}
else
{
CheckBoxChangeEventArgs e = new CheckBoxChangeEventArgs(null, this, source);
InvokeCheckedChanging(e);
if (e.Cancel)
return;
}
m_Checked = newValue;
if (m_Checked && m_CheckState == CheckState.Unchecked || !m_Checked && m_CheckState != CheckState.Unchecked)
{
m_CheckState = m_Checked ? CheckState.Checked : CheckState.Unchecked;
}
if (this.Command != null)
this.Command.Checked = m_Checked;
this.OnCheckedChanged(source);
OnCheckedBindableChanged(EventArgs.Empty);
if (ShouldSyncProperties)
BarFunctions.SyncProperty(this, "Checked");
if (this.Displayed)
this.Refresh();
}
///
/// Called when Command property value changes.
///
protected override void OnCommandChanged()
{
Command command = this.Command;
if (command != null && command.Checked != this.Checked)
{
SetChecked(command.Checked, eEventSource.Code);
}
base.OnCommandChanged();
}
///
/// Sets the Checked property of the item, raises appropriate events and provides the information about the source of the change.
///
/// New value for Checked property
/// Source of the change.
public virtual void SetChecked(CheckState newValue, eEventSource source)
{
CheckBoxChangeEventArgs e = new CheckBoxChangeEventArgs(null, this, source);
InvokeCheckedChanging(e);
if (e.Cancel)
return;
m_CheckState = newValue;
m_Checked = (newValue != CheckState.Unchecked);
if (this.Command != null)
this.Command.Checked = m_Checked;
this.OnCheckedChanged(source);
OnCheckStateChanged(EventArgs.Empty);
if (ShouldSyncProperties)
BarFunctions.SyncProperty(this, "CheckState");
if (this.Displayed)
this.Refresh();
}
///
/// Raises CheckState changed event.
///
/// Event arguments.
protected virtual void OnCheckStateChanged(EventArgs eventArgs)
{
if (CheckStateChanged != null)
CheckStateChanged(this, eventArgs);
}
///
/// Raises CheckedBindableChanged changed event.
///
/// Event arguments.
protected virtual void OnCheckedBindableChanged(EventArgs eventArgs)
{
if (CheckedBindableChanged != null)
CheckedBindableChanged(this, eventArgs);
}
///
/// Called after Checked property has changed.
///
protected virtual void OnCheckedChanged(eEventSource source)
{
CheckBoxItem previous = null;
if (m_CheckBoxStyle == eCheckBoxStyle.RadioButton && m_Checked && this.Parent != null)
{
BaseItem[] items = new BaseItem[this.Parent.SubItems.Count];
this.Parent.SubItems.CopyTo(items, 0);
foreach (BaseItem item in items)
{
if (item == this)
continue;
CheckBoxItem b = item as CheckBoxItem;
if (b != null && b.Checked && b.CheckBoxStyle == eCheckBoxStyle.RadioButton)
{
b.Checked = false;
previous = b;
}
}
}
InvokeCheckedChanged(new CheckBoxChangeEventArgs(previous, this, source));
}
///
/// Raises the CheckedChanging event.
///
protected virtual void InvokeCheckedChanging(CheckBoxChangeEventArgs e)
{
if (CheckedChanging != null)
CheckedChanging(this, e);
}
///
/// Raises the CheckedChanged event.
///
protected virtual void InvokeCheckedChanged(CheckBoxChangeEventArgs e)
{
if (CheckedChanged != null)
CheckedChanged(this, e);
}
///
/// Gets or sets a value indicating whether the CheckBox will allow three check states rather than two. If the ThreeState property is set to true
/// CheckState property should be used instead of Checked property to set the extended state of the control.
///
[Browsable(true), Category("Behavior"), DefaultValue(false), Description("Indicates whether the CheckBox will allow three check states rather than two.")]
public bool ThreeState
{
get { return m_ThreeState; }
set { m_ThreeState = value; }
}
///
/// Specifies the state of a control, such as a check box, that can be checked, unchecked, or set to an indeterminate state.
///
[Browsable(true), Category("Behavior"), DefaultValue(CheckState.Unchecked), RefreshProperties(RefreshProperties.All), Description("Specifies the state of a control, such as a check box, that can be checked, unchecked, or set to an indeterminate state"), Bindable(true)]
public CheckState CheckState
{
get { return m_CheckState; }
set
{
if (value != m_CheckState)
SetChecked(value, eEventSource.Code);
}
}
private Image _CheckBoxImageChecked = null;
///
/// Gets or sets the custom image that is displayed instead default check box representation when check box is checked.
///
[DefaultValue(null), Category("CheckBox Images"), Description("Indicates custom image that is displayed instead default check box representation when check box is checked")]
public Image CheckBoxImageChecked
{
get { return _CheckBoxImageChecked; }
set
{
_CheckBoxImageChecked = value;
OnCheckBoxImageChanged();
}
}
private Image _CheckBoxImageUnChecked = null;
///
/// Gets or sets the custom image that is displayed instead default check box representation when check box is unchecked.
///
[DefaultValue(null), Category("CheckBox Images"), Description("Indicates custom image that is displayed instead default check box representation when check box is unchecked")]
public Image CheckBoxImageUnChecked
{
get { return _CheckBoxImageUnChecked; }
set
{
_CheckBoxImageUnChecked = value;
OnCheckBoxImageChanged();
}
}
private Image _CheckBoxImageIndeterminate = null;
///
/// Gets or sets the custom image that is displayed instead default check box representation when check box is in indeterminate state.
///
[DefaultValue(null), Category("CheckBox Images"), Description("Indicates custom image that is displayed instead default check box representation when check box is in indeterminate state")]
public Image CheckBoxImageIndeterminate
{
get { return _CheckBoxImageIndeterminate; }
set
{
_CheckBoxImageIndeterminate = value;
OnCheckBoxImageChanged();
}
}
private void OnCheckBoxImageChanged()
{
NeedRecalcSize = true;
Refresh();
}
#endregion
}
///
/// Delegate for OptionGroupChanging event.
///
public delegate void CheckBoxChangeEventHandler(object sender, CheckBoxChangeEventArgs e);
#region CheckBoxChangeEventArgs
///
/// Represents event arguments for OptionGroupChanging event.
///
public class CheckBoxChangeEventArgs : EventArgs
{
///
/// Set to true to cancel the checking on NewChecked button.
///
public bool Cancel = false;
///
/// Check-box that will become checked if operation is not cancelled.
///
public readonly CheckBoxItem NewChecked;
///
/// Check-box that is currently checked and which will be unchecked if operation is not cancelled. This property will have only valid values for eCheckBoxStyle.RadioButton style CheckBoxItems.
///
public readonly CheckBoxItem OldChecked;
///
/// Indicates the action that has caused the event.
///
public readonly eEventSource EventSource = eEventSource.Code;
///
/// Default constructor.
///
public CheckBoxChangeEventArgs(CheckBoxItem oldchecked, CheckBoxItem newchecked, eEventSource eventSource)
{
NewChecked = newchecked;
OldChecked = oldchecked;
EventSource = eventSource;
}
}
#endregion
}