2007-03-12 Jonathan Pobst <monkey@jpobst.com>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CheckedListBox.cs
index 4d834a1c3919e5238f5d7a07e2af86b4bb2d147e..980049595d2e5912903de9edc1759c228ed775d4 100644 (file)
 //
 //
 
-// COMPLETE
-
 using System;
 using System.Drawing;
 using System.Collections;
 using System.ComponentModel;
 using System.Reflection;
+using System.Runtime.InteropServices;
 
 namespace System.Windows.Forms
 {
-
+#if NET_2_0
+       [ClassInterface (ClassInterfaceType.AutoDispatch)]
+       [ComVisible (true)]
+#endif
        public class CheckedListBox : ListBox
        {
                private CheckedIndexCollection checked_indices;
@@ -52,8 +54,15 @@ namespace System.Windows.Forms
                }
 
                #region events
+               static object ItemCheckEvent = new object ();
+
+#if NET_2_0
+               [Browsable (true)]
+               [EditorBrowsable (EditorBrowsableState.Always)]
+#else
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
+#endif
                public new event EventHandler Click {
                        add { base.Click += value; }
                        remove { base.Click -= value; }
@@ -94,7 +103,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 +174,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 +267,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 +324,7 @@ namespace System.Windows.Forms
 
                        UpdateCollections ();
 
-                       InvalidateItem (index);
+                       InvalidateCheckbox (index);
                }
 
                protected override void WmReflectCommand (ref Message m)
@@ -329,10 +345,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 +362,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 +380,7 @@ namespace System.Windows.Forms
 
                #endregion Private Methods
 
-               public class ObjectCollection : ListBox.ObjectCollection
+               public new class ObjectCollection : ListBox.ObjectCollection
                {               
                        private CheckedListBox owner;
 
@@ -372,8 +400,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));
-                               return Count;
+                                       owner.OnItemCheck (new ItemCheckEventArgs (Count-1, check, CheckState.Unchecked));
+                               owner.UpdateCollections ();
+                               return Count - 1;
                        }
                }
 
@@ -597,15 +626,10 @@ namespace System.Windows.Forms
                        #endregion Private Methods
                }
 #if NET_2_0
-
+               [DefaultValue (false)]
                public bool UseCompatibleTextRendering {
-                       get {
-                               return use_compatible_text_rendering;
-                       }
-
-                       set {
-                               use_compatible_text_rendering = value;
-                       }
+                       get { return use_compatible_text_rendering; }
+                       set { use_compatible_text_rendering = value; }
                }
 #endif