2007-03-12 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / NumericUpDown.cs
index 5e380761adf05574acad6833bd6e32626896d06f..c2b5bb3d0fc26e7e0c39ed39abda2c31f5251e30 100644 (file)
 //     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;
@@ -39,6 +38,11 @@ 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;
@@ -57,9 +61,11 @@ namespace System.Windows.Forms {
                        decimal_places = 0;
                        hexadecimal = false;
                        increment = 1M;
-                       maximum = 100.0M;
+                       maximum = 100M;
                        minimum = 0.0M;
                        thousands_separator = false;
+
+                       Text = "0";
                }
                #endregion      // Public Constructors
 
@@ -150,9 +156,7 @@ namespace System.Windows.Forms {
 
                        set {
                                decimal_places = value;
-                               if (!UserEdit) {
-                                       UpdateEditText();
-                               }
+                               UpdateEditText();
                        }
                }
 
@@ -164,9 +168,7 @@ namespace System.Windows.Forms {
 
                        set {
                                hexadecimal = value;
-                               if (!UserEdit) {
-                                       UpdateEditText();
-                               }
+                               UpdateEditText();
                        }
                }
 
@@ -241,16 +243,15 @@ namespace System.Windows.Forms {
 
                        set {
                                thousands_separator = value;
-
-                               if (!UserEdit) {
-                                       UpdateEditText();
-                               }
+                               UpdateEditText();
                        }
                }
 
                [Bindable(true)]
                public decimal Value {
                        get {
+                               if (UserEdit)
+                                       ParseEditText();
                                return dvalue;
                        }
 
@@ -289,7 +290,7 @@ namespace System.Windows.Forms {
                }
 
                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() {
@@ -315,38 +316,42 @@ namespace System.Windows.Forms {
                                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) {
@@ -385,7 +390,7 @@ namespace System.Windows.Forms {
                                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
@@ -451,14 +456,30 @@ namespace System.Windows.Forms {
                        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
        }
 }