// Peter Bartok <pbartok@novell.com>
//
-// COMPLETE
-
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
+using System.Globalization;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace System.Windows.Forms {
[DefaultEvent("ValueChanged")]
[DefaultProperty("Value")]
+#if NET_2_0
+ [DefaultBindingProperty ("Value")]
+ [ClassInterface (ClassInterfaceType.AutoDispatch)]
+ [ComVisible (true)]
+#endif
public class NumericUpDown : UpDownBase, ISupportInitialize {
#region Local Variables
private int suppress_validation;
decimal_places = 0;
hexadecimal = false;
increment = 1M;
- maximum = 100.0M;
+ maximum = 100M;
minimum = 0.0M;
thousands_separator = false;
+
+ Text = "0";
}
#endregion // Public Constructors
set {
decimal_places = value;
- if (!UserEdit) {
- UpdateEditText();
- }
+ UpdateEditText();
}
}
set {
hexadecimal = value;
- if (!UserEdit) {
- UpdateEditText();
- }
+ UpdateEditText();
}
}
set {
thousands_separator = value;
-
- if (!UserEdit) {
- UpdateEditText();
- }
+ UpdateEditText();
}
}
[Bindable(true)]
public decimal Value {
get {
+ if (UserEdit)
+ ParseEditText();
return dvalue;
}
}
public override string ToString() {
- return string.Format("{0}: value {1} in range [{2}, {3}]", base.ToString(), dvalue, minimum, maximum);
+ return string.Format("{0}, Minimum = {1}, Maximum = {2}", base.ToString(), minimum, maximum);
}
public override void UpButton() {
return;
}
- string acceptable = hexadecimal ? "\b-.,0123456789ABCDEF" : "\b-.,0123456789";
+ NumberFormatInfo nfi = CultureInfo.CurrentCulture.NumberFormat;
+ string pressedKey = e.KeyChar.ToString ();
- if (acceptable.IndexOf(e.KeyChar) < 0) {
- // prevent the key from reaching the text box
- e.Handled = true;
+ if ((pressedKey != nfi.NegativeSign) && (pressedKey != nfi.NumberDecimalSeparator) &&
+ (pressedKey != nfi.NumberGroupSeparator)) {
+ string acceptable = hexadecimal ? "\b0123456789abcdefABCDEF" : "\b0123456789";
+ if (acceptable.IndexOf (e.KeyChar) == -1) {
+ // FIXME: produce beep to signal that "invalid" key was pressed
+ // prevent the key from reaching the text box
+ e.Handled = true;
+ }
}
base.OnTextBoxKeyPress(source, e);
}
protected virtual void OnValueChanged(EventArgs e) {
- if (ValueChanged != null) {
- ValueChanged(this, e);
- }
+ EventHandler eh = (EventHandler)(Events [ValueChangedEvent]);
+ if (eh != null)
+ eh (this, e);
}
protected void ParseEditText() {
UserEdit = false;
try {
- string user_edit_text = Text.Replace(",", "").Trim();
+ string user_edit_text = Text;
if (!hexadecimal) {
- dvalue = decimal.Parse(user_edit_text);
+ dvalue = decimal.Parse(user_edit_text, CultureInfo.CurrentCulture);
} else {
- dvalue = 0M;
-
- for (int i=0; i < user_edit_text.Length; i++) {
- int hex_digit = Convert.ToInt32(user_edit_text.Substring(i, 1), 16);
-
- dvalue = unchecked(dvalue * 16M + (decimal)hex_digit);
- }
+#if !NET_2_0
+ dvalue = Convert.ToDecimal (Convert.ToInt32 (user_edit_text, 16));
+#else
+ dvalue = Convert.ToDecimal (Convert.ToInt32 (user_edit_text, 10));
+#endif
}
if (dvalue < minimum) {
format_string += decimal_places;
ChangingText = true;
- Text = dvalue.ToString(format_string);
+ Text = dvalue.ToString(format_string, CultureInfo.CurrentCulture);
}
else {
// Decimal.ToString doesn't know the "X" formatter, and
ParseEditText();
UpdateEditText();
}
+
+#if NET_2_0
+ protected override void OnLostFocus(EventArgs e) {
+ base.OnLostFocus(e);
+ if (this.UserEdit)
+ this.UpdateEditText();
+ }
+#endif
#endregion // Protected Instance Methods
#region Events
- public event EventHandler ValueChanged;
+ static object ValueChangedEvent = new object ();
+
+ public event EventHandler ValueChanged {
+ add { Events.AddHandler (ValueChangedEvent, value); }
+ remove { Events.RemoveHandler (ValueChangedEvent, value); }
+ }
[Browsable(false)]
[EditorBrowsable(EditorBrowsableState.Never)]
- public event EventHandler TextChanged;
+ public new event EventHandler TextChanged {
+ add { base.TextChanged += value; }
+ remove { base.TextChanged -= value; }
+ }
#endregion // Events
}
}