* InternalWindowManager.cs: ToolTipShow: Don't show tooltip if the form
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CheckBox.cs
index d444f7dacbe93f8a60a4ace7099e6e6060118f43..587d4b8f3bbfbe2dbdb5ef8e9f346a745e711521 100644 (file)
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-// Copyright (c) 2004 Novell, Inc.
+// Copyright (c) 2004-2005 Novell, Inc.
 //
 // Authors:
 //     Dennis Hayes    dennish@raytek.com
 //     Peter Bartok    pbartok@novell.com
 //
 
-// COMPLETE
-
 using System;
 using System.ComponentModel;
 using System.Drawing;
+using System.Runtime.InteropServices;
 
 namespace System.Windows.Forms {
        [DefaultProperty("Checked")]
        [DefaultEvent("CheckedChanged")]
+#if NET_2_0
+       [ComVisible (true)]
+       [ClassInterface (ClassInterfaceType.AutoDispatch)]
+       [DefaultBindingProperty ("CheckState")]
+       [ToolboxItem ("System.Windows.Forms.Design.AutoSizeToolboxItem," + Consts.AssemblySystem_Design)]
+#endif
        public class CheckBox : ButtonBase {
                #region Local Variables
                internal Appearance             appearance;
@@ -42,6 +47,65 @@ namespace System.Windows.Forms {
                internal bool                   three_state;
                #endregion      // Local Variables
 
+               #region CheckBoxAccessibleObject Subclass
+               [ComVisible(true)]
+               public class CheckBoxAccessibleObject : ButtonBaseAccessibleObject {
+                       #region CheckBoxAccessibleObject Local Variables
+                       private new CheckBox owner;
+                       #endregion      // CheckBoxAccessibleObject Local Variables
+
+                       #region CheckBoxAccessibleObject Constructors
+                       public CheckBoxAccessibleObject(Control owner) : base(owner) {
+                               this.owner = (CheckBox)owner;
+                       }
+                       #endregion      // CheckBoxAccessibleObject Constructors
+
+                       #region CheckBoxAccessibleObject Properties
+                       public override string DefaultAction {
+                               get {
+                                       return "Select";
+                               }
+                       }
+
+                       public override AccessibleRole Role {
+                               get {
+                                       return AccessibleRole.CheckButton;
+                               }
+                       }
+
+                       public override AccessibleStates State {
+                               get {
+                                       AccessibleStates        retval;
+
+                                       retval = AccessibleStates.Default;
+
+                                       if (owner.check_state == CheckState.Checked) {
+                                               retval |= AccessibleStates.Checked;
+                                       }
+
+                                       if (owner.Focused) {
+                                               retval |= AccessibleStates.Focused;
+                                       }
+
+                                       if (owner.CanFocus) {
+                                               retval |= AccessibleStates.Focusable;
+                                       }
+
+                                       return retval;
+                               }
+                       }
+                       #endregion      // CheckBoxAccessibleObject Properties
+
+#if NET_2_0
+                       #region CheckBoxAccessibleObject Methods
+                       public override void DoDefaultAction ()
+                       {
+                               owner.Checked = !owner.Checked;
+                       }
+                       #endregion      // CheckBoxAccessibleObject Methods
+#endif
+               }
+               #endregion      // CheckBoxAccessibleObject Sub-class
 
                #region Public Constructors
                public CheckBox() {
@@ -49,15 +113,13 @@ namespace System.Windows.Forms {
                        auto_check = true;
                        check_alignment = ContentAlignment.MiddleLeft;
                        text_alignment = ContentAlignment.MiddleLeft;
+                       SetStyle(ControlStyles.StandardDoubleClick, false);
                }
                #endregion      // Public Constructors
 
                #region Internal Methods
                internal override void Draw (PaintEventArgs pe) {
-                       if (redraw) {
-                               ThemeEngine.Current.DrawCheckBox (this.DeviceContext, this.ClientRectangle, this);
-                               redraw = false;
-                       }
+                       ThemeEngine.Current.DrawCheckBox (pe.Graphics, this.ClientRectangle, this);
                }
 
                internal override void HaveDoubleClick() {
@@ -76,9 +138,7 @@ namespace System.Windows.Forms {
                        set {
                                if (value != appearance) {
                                        appearance = value;
-                                       if (AppearanceChanged != null) {
-                                               AppearanceChanged(this, EventArgs.Empty);
-                                       }
+                                       OnAppearanceChanged (EventArgs.Empty);
                                        Redraw();
                                }
                        }
@@ -115,6 +175,9 @@ namespace System.Windows.Forms {
                [Bindable(true)]
                [RefreshProperties(RefreshProperties.All)]
                [DefaultValue(false)]
+#if NET_2_0
+               [SettingsBindable (true)]
+#endif
                public bool Checked {
                        get {
                                if (check_state != CheckState.Unchecked) {
@@ -210,25 +273,30 @@ namespace System.Windows.Forms {
 
                #region Protected Instance Methods
                protected override AccessibleObject CreateAccessibilityInstance() {
-                       return base.CreateAccessibilityInstance ();
+                       AccessibleObject        ao;
+
+                       ao = base.CreateAccessibilityInstance ();
+                       ao.role = AccessibleRole.CheckButton;
+
+                       return ao;
                }
 
                protected virtual void OnAppearanceChanged(EventArgs e) {
-                       if (AppearanceChanged != null) {
-                               AppearanceChanged(this, e);
-                       }
+                       EventHandler eh = (EventHandler)(Events [AppearanceChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnCheckedChanged(EventArgs e) {
-                       if (CheckedChanged != null) {
-                               CheckedChanged(this, e);
-                       }
+                       EventHandler eh = (EventHandler)(Events [CheckedChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected virtual void OnCheckStateChanged(EventArgs e) {
-                       if (CheckStateChanged != null) {
-                               CheckStateChanged(this, e);
-                       }
+                       EventHandler eh = (EventHandler)(Events [CheckStateChangedEvent]);
+                       if (eh != null)
+                               eh (this, e);
                }
 
                protected override void OnClick(EventArgs e) {
@@ -254,29 +322,73 @@ namespace System.Windows.Forms {
                                        }
                                }
                        }
+                       
+                       base.OnClick (e);
                }
 
                protected override void OnHandleCreated(EventArgs e) {
                        base.OnHandleCreated (e);
                }
 
-               protected override void OnMouseUp(MouseEventArgs e) {
-                       base.OnMouseUp (e);
+#if NET_2_0
+               protected override void OnKeyDown (KeyEventArgs kevent)
+               {
+                       base.OnKeyDown (kevent);
+               }
+#endif
+
+               protected override void OnMouseUp(MouseEventArgs mevent) {
+                       base.OnMouseUp (mevent);
                }
 
                protected override bool ProcessMnemonic(char charCode) {
-                       return base.ProcessMnemonic (charCode);
+                       if (IsMnemonic(charCode, Text) == true) {
+                               Select();
+                               OnClick(EventArgs.Empty);
+                               return true;
+                       }
+                       
+                       return base.ProcessMnemonic(charCode);
                }
                #endregion      // Protected Instance Methods
 
                #region Events
-               public event EventHandler       AppearanceChanged;
-               public event EventHandler       CheckedChanged;
-               public event EventHandler       CheckStateChanged;
+               static object AppearanceChangedEvent = new object ();
+               static object CheckedChangedEvent = new object ();
+               static object CheckStateChangedEvent = new object ();
+
+               public event EventHandler AppearanceChanged {
+                       add { Events.AddHandler (AppearanceChangedEvent, value); }
+                       remove { Events.RemoveHandler (AppearanceChangedEvent, value); }
+               }
+
+               public event EventHandler CheckedChanged {
+                       add { Events.AddHandler (CheckedChangedEvent, value); }
+                       remove { Events.RemoveHandler (CheckedChangedEvent, value); }
+               }
+
+               public event EventHandler CheckStateChanged {
+                       add { Events.AddHandler (CheckStateChangedEvent, value); }
+                       remove { Events.RemoveHandler (CheckStateChangedEvent, value); }
+               }
+               
+#if NET_2_0
+               [Browsable (false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public new event MouseEventHandler MouseDoubleClick {
+                       add { base.MouseDoubleClick += value; }
+                       remove { base.MouseDoubleClick -= value; }
+               }
+#endif
                #endregion      // Events
 
                #region Events
-               public event EventHandler DoubleClick;
+               // XXX have a look at this and determine if it
+               // manipulates base.DoubleClick, and see if
+               // HaveDoubleClick can just call OnDoubleClick.
+               [Browsable(false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public new event EventHandler DoubleClick;
                #endregion      // Events
        }
 }