1334 lines
36 KiB
C#

using System;
using System.ComponentModel;
using System.Drawing;
using System.Media;
using System.Windows.Forms;
using DevComponents.DotNetBar;
using System.Globalization;
namespace DevComponents.Editors
{
/// <summary>
/// Standalone Calculator control.
/// </summary>
[ToolboxBitmap(typeof(DotNetBarManager), "Calculator.ico"), DefaultEvent("ValueChanged"), DefaultProperty("Value"), ToolboxItem(true), Designer("DevComponents.DotNetBar.Design.CalculatorDesigner, DevComponents.DotNetBar.Design, Version=14.1.0.37, Culture=neutral, PublicKeyToken=90f470f34c89ccaf")]
public partial class Calculator : Control
{
#region Events
#region ButtonClick
/// <summary>
/// Occurs when a calc button has been clicked
/// </summary>
[Description("Occurs when a calc button has been clicked.")]
public event EventHandler<ButtonClickEventArgs> ButtonClick;
#endregion
#region ValueChanged
/// <summary>
/// Occurs when the calculator value has changed
/// </summary>
[Description("Occurs when the calculator value has changed.")]
public event EventHandler<ValueChangedEventArgs> ValueChanged;
#endregion
public event EventHandler CalculatorDisplayChanged;
/// <summary>
/// Raises CalculatorDisplayChanged event.
/// </summary>
/// <param name="e">Provides event arguments.</param>
protected virtual void OnCalculatorDisplayChanged(EventArgs e)
{
EventHandler handler = CalculatorDisplayChanged;
if (handler != null)
handler(this, e);
}
#endregion
#region Private variables
private string _StringValue = null;
private double _Value;
private double _LValue;
private double _MemValue;
private Operators _Operator;
private Operators _LastOp;
private bool _IsIntValue;
private bool _ShowMemKeys;
private DecimalKeyVisibility _DecimalKeyVisibility;
private Timer _KeyTimer;
private string _NumberDecimalSeparator;
#endregion
public Calculator()
{
InitializeComponent();
_ShowMemKeys = true;
_DecimalKeyVisibility = DecimalKeyVisibility.Auto;
this.SetStyle(DisplayHelp.DoubleBufferFlag | ControlStyles.AllPaintingInWmPaint | ControlStyles.Opaque, true);
labelValue.BackColor = Color.White;
pnlCalc.BackColor = Color.White;
pnlPad.BackColor = Color.White;
_NumberDecimalSeparator = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
BtnDecimal.Text = _NumberDecimalSeparator;
}
#region Public properties
#region DisplayValue
[Browsable(false)]
public double DisplayValue
{
get
{
if (string.IsNullOrEmpty(_StringValue) == true)
return (_Value);
return (double.Parse(_StringValue));
}
}
#endregion
#region UpdateDisplay
private void UpdateDisplay()
{
labelValue.Text = DisplaySValue;
}
#endregion
#region DisplaySValue
[Browsable(false)]
public string DisplaySValue
{
get
{
if (string.IsNullOrEmpty(_StringValue) == false)
return (_StringValue);
return (_Value.ToString());
}
}
#endregion
#region IsIntValue
/// <summary>
/// Indicates whether calculator displays only Integer values.
/// </summary>
[DefaultValue(false), Category("Behavior"), Description("Indicates whether calculator displays only Integer values.")]
public bool IsIntValue
{
get { return (_IsIntValue); }
set
{
if (_IsIntValue != value)
{
_IsIntValue = value;
UpdateLayout();
}
}
}
#endregion
#region ShowMemKeys
/// <summary>
/// Gets or sets whether memory keys are visible. Default value is true.
/// </summary>
[DefaultValue(true), Category("Appearance"), Description("Indicates whether memory keys are visible.")]
public bool ShowMemKeys
{
get { return (_ShowMemKeys); }
set
{
if (_ShowMemKeys != value)
{
_ShowMemKeys = value;
if (_ShowMemKeys == true)
{
pnlCalc.Height += (pnlMem.Height - 1);
pnlPad.Location = new Point(1, pnlMem.Bottom);
}
else
{
pnlCalc.Height -= (pnlMem.Height - 1);
if(_DisplayVisible)
pnlPad.Location = new Point(1, labelValue.Bottom);
else
pnlPad.Location = new Point(1, labelValue.Top);
}
InvalidateAutoSize();
//Size = pnlCalc.Size;
}
}
}
#endregion
#region DecimalKeyVisibility
/// <summary>
/// Gets or sets visibility of the decimal calculator key.
/// </summary>
[DefaultValue(DecimalKeyVisibility.Auto), Category("Appearance"), Description("Indicates visibility of the decimal calculator key.")]
public DecimalKeyVisibility DecimalKeyVisibility
{
get { return (_DecimalKeyVisibility); }
set
{
if (_DecimalKeyVisibility != value)
{
_DecimalKeyVisibility = value;
UpdateLayout();
}
}
}
#endregion
#region SValue
[DefaultValue(null), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public string StringValue
{
get { return (_StringValue); }
set
{
_StringValue = value;
OnValueChanged();
}
}
#endregion
#region Value
[DefaultValue(0d), Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public double Value
{
get { return (_Value); }
set
{
_Value = value;
OnValueChanged();
}
}
#endregion
#endregion
#region Keyboard Support
internal void ProcessKeyPress(KeyPressEventArgs e)
{
ButtonX btn = null;
switch (e.KeyChar)
{
case '0': btn = OnDigitSelect(BtnDigit0); break;
case '1': btn = OnDigitSelect(BtnDigit1); break;
case '2': btn = OnDigitSelect(BtnDigit2); break;
case '3': btn = OnDigitSelect(BtnDigit3); break;
case '4': btn = OnDigitSelect(BtnDigit4); break;
case '5': btn = OnDigitSelect(BtnDigit5); break;
case '6': btn = OnDigitSelect(BtnDigit6); break;
case '7': btn = OnDigitSelect(BtnDigit7); break;
case '8': btn = OnDigitSelect(BtnDigit8); break;
case '9': btn = OnDigitSelect(BtnDigit9); break;
case '+': btn = OnOperatorSelect(BtnAdd, Operators.Add); break;
case '-': btn = OnOperatorSelect(BtnSubtract, Operators.Subtract); break;
case '*': btn = OnOperatorSelect(BtnMultiply, Operators.Multiply); break;
case '/': btn = OnOperatorSelect(BtnDivide, Operators.Divide); break;
case '%': btn = OnPercentSelect(); break;
case 'r': btn = OnReciprocalSelect(); break;
case '@': btn = OnSqrtSelect(); break;
case 'n': btn = OnNegateSelect(); break;
case 'c': btn = OnClearSelect(); break;
case 'e': btn = OnClearEntrySelect(); break;
case '=': btn = OnEqualsSelect(); break;
case '\b': btn = OnBackSelect(); break;
case '\r':
btn = ((ModifierKeys & Keys.Control) == Keys.Control)
? OnMemStoreSelect() : OnEqualsSelect();
break;
case (char)18: btn = OnMemRestoreSelect(); break;
case (char)16: btn = OnMemAddSelect(); break;
case (char)17: btn = OnMemSubtractSelect(); break;
case (char)12: btn = OnMemClearSelect(); break;
}
if (btn == null && e.KeyChar.ToString() == _NumberDecimalSeparator)
btn = OnDecimalSelect();
if (btn != null)
{
FlashKey(btn);
e.Handled = true;
}
}
protected override void OnKeyPress(KeyPressEventArgs e)
{
base.OnKeyPress(e);
if (e.Handled == false)
{
ProcessKeyPress(e);
}
}
#endregion
#region Button Support
#region BtnDigitClick
private void BtnDigitClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnDigitSelect((ButtonX)sender);
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnDigitSelect(ButtonX btn)
{
AddDigit(btn);
OnValueChanged();
return (btn);
}
#region AddDigit
private void AddDigit(object sender)
{
ButtonX btn = sender as ButtonX;
if (btn != null)
{
char c = btn.Name[8];
if (_StringValue == null || _LastOp == Operators.Set)
{
_StringValue = "";
if (_LastOp == Operators.Calc || _LastOp == Operators.Set)
SetOperator(Operators.None);
}
_StringValue += c;
UpdateDisplay();
OnCalculatorDisplayChanged(EventArgs.Empty);
}
}
#endregion
#endregion
#region BtnDecimalClick
private void BtnDecimalClick(object sender, EventArgs e)
{
if (OnButtonClick(BtnDecimal) == false)
OnDecimalSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnDecimalSelect()
{
if (_IsIntValue == false)
{
if (_StringValue == null || _LastOp == Operators.Set)
{
_StringValue = "0" + _NumberDecimalSeparator;
if (_LastOp == Operators.Calc || _LastOp == Operators.Set)
SetOperator(Operators.None);
}
else if (_StringValue.Contains(_NumberDecimalSeparator) == false)
{
_StringValue += _NumberDecimalSeparator;
}
}
OnValueChanged();
return (BtnDecimal);
}
#endregion
#region BtnBackClick
private void BtnBackClick(object sender, EventArgs e)
{
if (OnButtonClick(BtnBack) == false)
OnBackSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnBackSelect()
{
if (string.IsNullOrEmpty(_StringValue) == false)
{
_StringValue = _StringValue.Substring(0, _StringValue.Length - 1);
if (_StringValue.Length == 0 ||
(_StringValue.Length == 1 && _StringValue[0] == '-'))
{
_StringValue = "0";
}
}
else
{
SystemSounds.Beep.Play();
}
OnValueChanged();
return (BtnBack);
}
#endregion
#region BtnAddClick
private void BtnAddClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnOperatorSelect(BtnAdd, Operators.Add);
if (_FocusButtonsOnMouseDown)
Focus();
}
#endregion
#region BtnSubtractClick
private void BtnSubtractClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnOperatorSelect(BtnSubtract, Operators.Subtract);
if (_FocusButtonsOnMouseDown)
Focus();
}
#endregion
#region BtnMultiplyClick
private void BtnMultiplyClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnOperatorSelect(BtnMultiply, Operators.Multiply);
if (_FocusButtonsOnMouseDown)
Focus();
}
#endregion
#region BtnDivideClick
private void BtnDivideClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnOperatorSelect(BtnDivide, Operators.Divide);
if (_FocusButtonsOnMouseDown)
Focus();
}
#endregion
#region BtnNegateClick
private void BtnNegateClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnNegateSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnNegateSelect()
{
if (string.IsNullOrEmpty(_StringValue) == false)
{
_StringValue = '-' + _StringValue;
_StringValue = _StringValue.Replace("--", "");
}
else
{
_Value = -_Value;
}
OnValueChanged();
return (BtnNegate);
}
#endregion
#region BtnSqrtClick
private void BtnSqrtClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnSqrtSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnSqrtSelect()
{
if (string.IsNullOrEmpty(_StringValue) == false)
{
double d = double.Parse(_StringValue);
if (d > 0)
{
d = Math.Sqrt(d);
if (IsIntValue == true)
d = Math.Round(d);
_StringValue = d.ToString();
}
else
SystemSounds.Beep.Play();
}
else
{
if (_Value > 0)
_Value = Math.Sqrt(_Value);
else
SystemSounds.Beep.Play();
}
_LastOp = Operators.Set;
OnValueChanged();
return (BtnSqrt);
}
#endregion
#region BtnReciprocalClick
private void BtnReciprocalClick(object sender, EventArgs e)
{
if (OnButtonClick(BtnReciprocal) == false)
OnReciprocalSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnReciprocalSelect()
{
if (string.IsNullOrEmpty(_StringValue) == false)
{
double d = double.Parse(_StringValue);
if (d != 0)
{
d = 1 / d;
if (IsIntValue == true)
d = Math.Round(d);
_StringValue = d.ToString();
}
else
{
SystemSounds.Beep.Play();
}
}
else
{
if (_Value != 0)
_Value = 1 / _Value;
else
SystemSounds.Beep.Play();
}
_LastOp = Operators.Set;
OnValueChanged();
return (BtnReciprocal);
}
#endregion
#region BtnPercentClick
private void BtnPercentClick(object sender, EventArgs e)
{
if (OnButtonClick(BtnPercent) == false)
OnPercentSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnPercentSelect()
{
if (string.IsNullOrEmpty(_StringValue) == false)
{
double d = double.Parse(_StringValue);
d = (_Value * d) / 100;
if (IsIntValue == true)
d = Math.Round(d);
_StringValue = d.ToString();
}
else
{
_Value = 0;
}
OnValueChanged();
return (BtnPercent);
}
#endregion
#region BtnEqualsClick
private void BtnEqualsClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnEqualsSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnEqualsSelect()
{
UpdateTotal();
_LastOp = Operators.Calc;
lbxOperator.Text = "";
OnValueChanged();
return (BtnEquals);
}
#endregion
#region BtnClearEntryClick
private void BtnClearEntryClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnClearEntrySelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnClearEntrySelect()
{
if (string.IsNullOrEmpty(_StringValue) == false)
_StringValue = "0";
else
_Value = 0;
OnValueChanged();
return (BtnClearEntry);
}
#endregion
#region BtnClearClick
private void BtnClearClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnClearSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnClearSelect()
{
_Value = 0;
_LValue = 0;
_StringValue = null;
SetOperator(Operators.None);
OnValueChanged();
return (BtnClear);
}
#endregion
#region BtnMemStoreClick
private void BtnMemStoreClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnMemStoreSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnMemStoreSelect()
{
StoreToMem(DisplayValue);
return (BtnMemStore);
}
#endregion
#region BtnMemRestoreClick
private void BtnMemRestoreClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnMemRestoreSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnMemRestoreSelect()
{
_StringValue = _MemValue.ToString();
OnValueChanged();
return (BtnMemRestore);
}
#endregion
#region BtnMemClearClick
private void BtnMemClearClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnMemClearSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnMemClearSelect()
{
StoreToMem(0);
return (BtnMemClear);
}
#endregion
#region BtnMemAddClick
private void BtnMemAddClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnMemAddSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnMemAddSelect()
{
StoreToMem(_MemValue + DisplayValue);
return (BtnMemAdd);
}
#endregion
#region BtnMemSubtractClick
private void BtnMemSubtractClick(object sender, EventArgs e)
{
if (OnButtonClick(sender) == false)
OnMemSubtractSelect();
if (_FocusButtonsOnMouseDown)
Focus();
}
private ButtonX OnMemSubtractSelect()
{
StoreToMem(_MemValue - DisplayValue);
return (BtnMemSubtract);
}
#endregion
#region StoreToMem
private void StoreToMem(double value)
{
_MemValue = value;
lbxMemory.Text = (value == 0) ? "" : "M";
}
#endregion
#endregion
#region SetOperator
private void SetOperator(Operators op)
{
_Operator = op;
_LastOp = op;
lbxOperator.Text = ((char)op).ToString();
}
#endregion
#region OnOperatorSelect
private ButtonX OnOperatorSelect(ButtonX btn, Operators op)
{
if (string.IsNullOrEmpty(_StringValue) == false)
UpdateTotal();
SetOperator(op);
OnValueChanged();
return (btn);
}
#endregion
#region UpdateTotal
private void UpdateTotal()
{
if (string.IsNullOrEmpty(_StringValue) == false)
_LValue = double.Parse(_StringValue);
switch (_Operator)
{
case Operators.None:
_Value = _LValue;
break;
case Operators.Add:
_Value += _LValue;
break;
case Operators.Subtract:
_Value -= _LValue;
break;
case Operators.Multiply:
_Value *= _LValue;
break;
case Operators.Divide:
if (_LValue > 0)
_Value /= _LValue;
else
SystemSounds.Beep.Play();
break;
}
_StringValue = null;
OnValueChanged();
}
#endregion
#region UpdateLayout
private void UpdateLayout()
{
bool showDecimal;
switch (_DecimalKeyVisibility)
{
case DecimalKeyVisibility.Always:
showDecimal = true;
break;
case DecimalKeyVisibility.Auto:
showDecimal = (IsIntValue == false);
break;
default:
showDecimal = false;
break;
}
if (showDecimal == true)
{
BtnDecimal.Visible = true;
BtnDigit0.Width = BtnDigit2.Bounds.Right - BtnDigit0.Bounds.X;
}
else
{
BtnDecimal.Visible = false;
BtnDigit0.Width = BtnDecimal.Bounds.Right - BtnDigit0.Bounds.X;
}
InvalidateAutoSize();
}
#endregion
#region OnButtonClick
private bool OnButtonClick(object button)
{
if (ButtonClick != null)
{
ButtonClickEventArgs e =
new ButtonClickEventArgs(button);
ButtonClick(this, e);
return (e.Cancel);
}
return (false);
}
#endregion
#region OnValueChanged
public void OnValueChanged()
{
if (ValueChanged != null)
{
ValueChanged(this,
new ValueChangedEventArgs(DisplaySValue, DisplayValue));
}
UpdateDisplay();
OnCalculatorDisplayChanged(EventArgs.Empty);
}
#endregion
#region OnVisibleChanged
protected override void OnVisibleChanged(EventArgs e)
{
if (Visible == true)
{
_StringValue = null;
_LValue = 0;
StoreToMem(0);
SetOperator(Operators.Set);
OnValueChanged();
}
base.OnVisibleChanged(e);
}
#endregion
#region FlashKey
public void FlashKey(ButtonX keyButton)
{
if (_KeyTimer == null)
{
_KeyTimer = new Timer();
_KeyTimer.Interval = 125;
_KeyTimer.Tick += KeyTimerTick;
}
ButtonX btn = _KeyTimer.Tag as ButtonX;
if (btn != null)
{
_KeyTimer.Stop();
DoKeyTimerUp(btn);
}
DoKeyTimerDown(keyButton);
_KeyTimer.Tag = keyButton;
_KeyTimer.Start();
}
#region DoKeyTimerDown
private void DoKeyTimerDown(ButtonX btn)
{
MouseEventArgs args = new MouseEventArgs(
MouseButtons.Left, 1, btn.Location.X, btn.Location.Y, 0);
btn.InternalItem.InternalMouseDown(args);
}
#endregion
#region DoKeyTimerUp
private void DoKeyTimerUp(ButtonX btn)
{
MouseEventArgs args = new MouseEventArgs(
MouseButtons.Left, 1, btn.Location.X, btn.Location.Y, 0);
btn.InternalItem.InternalMouseUp(args);
}
#endregion
#region KeyTimerTick
void KeyTimerTick(object sender, EventArgs e)
{
ButtonX btn = _KeyTimer.Tag as ButtonX;
if (btn != null)
DoKeyTimerUp(btn);
_KeyTimer.Stop();
}
#endregion
#endregion
#region Auto-Sizing
protected override void OnPaint(PaintEventArgs e)
{
using(SolidBrush brush=new SolidBrush(this.BackColor))
e.Graphics.FillRectangle(brush, this.ClientRectangle);
base.OnPaint(e);
}
private Size _PreferredSize = Size.Empty;
/// <summary>
/// Invalidates control auto-size and resizes the control if AutoSize is set to true.
/// </summary>
public void InvalidateAutoSize()
{
_PreferredSize = Size.Empty;
AdjustSize();
}
/// <summary>
/// Gets or sets a value indicating whether the control is automatically resized to display its entire contents. You can set MaximumSize.Width property to set the maximum width used by the control.
/// </summary>
[Browsable(true), DefaultValue(false), EditorBrowsable(EditorBrowsableState.Always), DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
public override bool AutoSize
{
get
{
return base.AutoSize;
}
set
{
if (this.AutoSize != value)
{
base.AutoSize = value;
AdjustSize();
}
}
}
private void AdjustSize()
{
if (this.AutoSize)
{
this.Size = base.PreferredSize;
}
}
private bool _FocusButtonsOnMouseDown = true;
internal bool FocusButtonsOnMouseDown
{
get { return _FocusButtonsOnMouseDown; }
set
{
if (value != _FocusButtonsOnMouseDown)
{
bool oldValue = _FocusButtonsOnMouseDown;
_FocusButtonsOnMouseDown = value;
OnFocusButtonsOnMouseDownChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when FocusButtonsOnMouseDown property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnFocusButtonsOnMouseDownChanged(bool oldValue, bool newValue)
{
this.BtnBack.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit8.FocusOnLeftMouseButtonDown = newValue;
this.BtnReciprocal.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit5.FocusOnLeftMouseButtonDown = newValue;
this.BtnSqrt.FocusOnLeftMouseButtonDown = newValue;
this.BtnDivide.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit9.FocusOnLeftMouseButtonDown = newValue;
this.BtnClearEntry.FocusOnLeftMouseButtonDown = newValue;
this.BtnDecimal.FocusOnLeftMouseButtonDown = newValue;
this.BtnAdd.FocusOnLeftMouseButtonDown = newValue;
this.BtnEquals.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit4.FocusOnLeftMouseButtonDown = newValue;
this.BtnSubtract.FocusOnLeftMouseButtonDown = newValue;
this.BtnMultiply.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit6.FocusOnLeftMouseButtonDown = newValue;
this.BtnClear.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit1.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit2.FocusOnLeftMouseButtonDown = newValue;
this.BtnNegate.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit0.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit3.FocusOnLeftMouseButtonDown = newValue;
this.BtnPercent.FocusOnLeftMouseButtonDown = newValue;
this.BtnDigit7.FocusOnLeftMouseButtonDown = newValue;
this.BtnMemStore.FocusOnLeftMouseButtonDown = newValue;
this.BtnMemRestore.FocusOnLeftMouseButtonDown = newValue;
this.BtnMemAdd.FocusOnLeftMouseButtonDown = newValue;
this.BtnMemClear.FocusOnLeftMouseButtonDown = newValue;
this.BtnMemSubtract.FocusOnLeftMouseButtonDown = newValue;
}
protected override void OnFontChanged(EventArgs e)
{
InvalidateAutoSize();
BtnMemAdd.Font = new Font(this.Font.FontFamily, BtnMemAdd.Font.SizeInPoints);
BtnMemClear.Font = new Font(this.Font.FontFamily, BtnMemClear.Font.SizeInPoints);
BtnMemRestore.Font = new Font(this.Font.FontFamily, BtnMemRestore.Font.SizeInPoints);
BtnMemStore.Font = new Font(this.Font.FontFamily, BtnMemStore.Font.SizeInPoints);
BtnMemSubtract.Font = new Font(this.Font.FontFamily, BtnMemSubtract.Font.SizeInPoints);
BtnDigit0.Font = new Font(this.Font.FontFamily, BtnDigit0.Font.SizeInPoints);
BtnDigit1.Font = new Font(this.Font.FontFamily, BtnDigit1.Font.SizeInPoints);
BtnDigit2.Font = new Font(this.Font.FontFamily, BtnDigit2.Font.SizeInPoints);
BtnDigit3.Font = new Font(this.Font.FontFamily, BtnDigit3.Font.SizeInPoints);
BtnDigit4.Font = new Font(this.Font.FontFamily, BtnDigit4.Font.SizeInPoints);
BtnDigit5.Font = new Font(this.Font.FontFamily, BtnDigit5.Font.SizeInPoints);
BtnDigit6.Font = new Font(this.Font.FontFamily, BtnDigit6.Font.SizeInPoints);
BtnDigit7.Font = new Font(this.Font.FontFamily, BtnDigit7.Font.SizeInPoints);
BtnDigit8.Font = new Font(this.Font.FontFamily, BtnDigit8.Font.SizeInPoints);
BtnDigit9.Font = new Font(this.Font.FontFamily, BtnDigit9.Font.SizeInPoints);
labelValue.Font = new Font(this.Font.FontFamily, labelValue.Font.SizeInPoints);
base.OnFontChanged(e);
}
public override Size GetPreferredSize(Size proposedSize)
{
if (!_PreferredSize.IsEmpty) return _PreferredSize;
if (!BarFunctions.IsHandleValid(this))
return base.GetPreferredSize(proposedSize);
_PreferredSize = pnlCalc.Size;
return _PreferredSize;
}
protected override void SetBoundsCore(int x, int y, int width, int height, BoundsSpecified specified)
{
if (this.AutoSize)
{
Size preferredSize = base.PreferredSize;
width = preferredSize.Width;
height = preferredSize.Height;
}
base.SetBoundsCore(x, y, width, height, specified);
}
protected override void OnHandleCreated(EventArgs e)
{
if (this.AutoSize)
this.AdjustSize();
base.OnHandleCreated(e);
}
#endregion
#region DisplayVisible
private bool _DisplayVisible = true;
/// <summary>
/// Gets or sets whether calculator display is visible. Default value is true.
/// </summary>
[DefaultValue(true), Category("Appearance"), Description("Indicates whether calculator display is visible.")]
public bool DisplayVisible
{
get { return _DisplayVisible; }
set
{
if (value != _DisplayVisible)
{
bool oldValue = _DisplayVisible;
_DisplayVisible = value;
OnDisplayVisibleChanged(oldValue, value);
}
}
}
/// <summary>
/// Called when DisplayVisible property has changed.
/// </summary>
/// <param name="oldValue">Old property value</param>
/// <param name="newValue">New property value</param>
protected virtual void OnDisplayVisibleChanged(bool oldValue, bool newValue)
{
labelValue.Visible = newValue;
if (newValue)
{
pnlPad.Top += labelValue.Height;
pnlMem.Top += labelValue.Height;
pnlCalc.Height += labelValue.Height;
}
else
{
pnlPad.Top -= labelValue.Height;
pnlMem.Top -= labelValue.Height;
pnlCalc.Height -= labelValue.Height;
}
_PreferredSize = Size.Empty;
AdjustSize();
}
#endregion
}
#region Enums
public enum Operators
{
None = ' ',
Calc = '=',
Set = '\t',
Add = '+',
Subtract = '-',
Multiply = '*',
Divide = '/',
}
public enum DecimalKeyVisibility
{
Auto,
Always,
Never
}
#endregion
#region ButtonClickEventArgs
/// <summary>
/// ButtonClickEventArgs
/// </summary>
public class ButtonClickEventArgs : CancelEventArgs
{
#region Private variables
private object _Button;
#endregion
///<summary>
/// ButtonClickEventArgs
///</summary>
public ButtonClickEventArgs(object button)
{
_Button = button;
}
#region Public properties
/// <summary>
/// Gets the calc button that was clicked
/// </summary>
public object Button
{
get { return (_Button); }
}
#endregion
}
#endregion
#region ValueChangedEventArgs
/// <summary>
/// ValueChangedEventArgs
/// </summary>
public class ValueChangedEventArgs : EventArgs
{
#region Private variables
private double _Value;
private string _SValue;
#endregion
///<summary>
/// ValueChangedEventArgs
///</summary>
///<param name="svalue"></param>
///<param name="value"></param>
public ValueChangedEventArgs(string svalue, double value)
{
_Value = value;
_SValue = svalue;
}
#region Public properties
/// <summary>
/// Gets the input string value
/// </summary>
public string SValue
{
get { return (_SValue); }
}
/// <summary>
/// Gets or sets calculator value
/// </summary>
public double Value
{
get { return (_Value); }
set { _Value = value; }
}
#endregion
}
#endregion
}