2007-01-03 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CheckedListBox.cs
index 2085096dda45e953251b84560a115e0758f59dc0..246b539264bc1e9f4b7f751bd4c09de7c06590e7 100644 (file)
@@ -52,6 +52,8 @@ namespace System.Windows.Forms
                }
 
                #region events
+               static object ItemCheckEvent = new object ();
+
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
                public new event EventHandler Click {
@@ -94,7 +96,10 @@ namespace System.Windows.Forms
                        remove { base.ValueMemberChanged -= value; }
                }
 
-               public event ItemCheckEventHandler ItemCheck;
+               public event ItemCheckEventHandler ItemCheck {
+                       add { Events.AddHandler (ItemCheckEvent, value); }
+                       remove { Events.RemoveHandler (ItemCheckEvent, value); }
+               }
                #endregion Events
 
                #region Public Properties
@@ -162,8 +167,11 @@ namespace System.Windows.Forms
                public override SelectionMode SelectionMode {
                        get { return base.SelectionMode; }
                        set {
+                               if (!Enum.IsDefined (typeof (SelectionMode), value))
+                                       throw new InvalidEnumArgumentException ("value", (int) value, typeof (SelectionMode));
+
                                if (value == SelectionMode.MultiSimple || value == SelectionMode.MultiExtended)
-                                       throw new InvalidEnumArgumentException ("Multi selection modes not supported");
+                                       throw new ArgumentException ("Multi selection not supported on CheckedListBox");
 
                                base.SelectionMode = value;
                        }
@@ -252,8 +260,9 @@ namespace System.Windows.Forms
 
                protected virtual void OnItemCheck (ItemCheckEventArgs ice)
                {
-                       if (ItemCheck != null)
-                               ItemCheck (this, ice);
+                       ItemCheckEventHandler eh = (ItemCheckEventHandler)(Events [ItemCheckEvent]);
+                       if (eh != null)
+                               eh (this, ice);
                }
 
                protected override void OnKeyPress (KeyPressEventArgs e)
@@ -308,7 +317,7 @@ namespace System.Windows.Forms
 
                        UpdateCollections ();
 
-                       InvalidateItem (index);
+                       InvalidateCheckbox (index);
                }
 
                protected override void WmReflectCommand (ref Message m)
@@ -329,10 +338,12 @@ namespace System.Windows.Forms
 
                internal override void OnItemClick (int index)
                {                       
-                       if (GetItemChecked (index))
-                               SetItemCheckState (index, CheckState.Unchecked);
-                       else if (CheckOnClick || last_clicked_index == index)
-                               SetItemCheckState (index, CheckState.Checked);
+                       if (CheckOnClick || last_clicked_index == index) {
+                               if (GetItemChecked (index))
+                                       SetItemCheckState (index, CheckState.Unchecked);
+                               else
+                                       SetItemCheckState (index, CheckState.Checked);
+                       }
                        
                        last_clicked_index = index;
                        base.OnItemClick (index);
@@ -344,6 +355,16 @@ namespace System.Windows.Forms
                        UpdateCollections ();
                }
 
+               private void InvalidateCheckbox (int index)
+               {
+                       Rectangle area = GetItemDisplayRectangle (index, TopIndex);
+                       area.X += 2;
+                       area.Y += (area.Height - 11) / 2;
+                       area.Width = 11;
+                       area.Height = 11;
+                       Invalidate (area);
+               }
+
                private void UpdateCollections ()
                {
                        CheckedItems.Refresh ();
@@ -352,7 +373,7 @@ namespace System.Windows.Forms
 
                #endregion Private Methods
 
-               public class ObjectCollection : ListBox.ObjectCollection
+               public new class ObjectCollection : ListBox.ObjectCollection
                {               
                        private CheckedListBox owner;
 
@@ -372,9 +393,9 @@ namespace System.Windows.Forms
                                if (check != CheckState.Unchecked)
                                        owner.check_states [item] = check;
                                if (check == CheckState.Checked)
-                                       owner.OnItemCheck (new ItemCheckEventArgs (Count, check, CheckState.Unchecked));
+                                       owner.OnItemCheck (new ItemCheckEventArgs (Count-1, check, CheckState.Unchecked));
                                owner.UpdateCollections ();
-                               return Count;
+                               return Count - 1;
                        }
                }