* Control.cs: ControlCollection.Count must be public. Fixed build of
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CheckBox.cs
index 51fd6af77465edceaab38c1ac5585a1069bc8e84..3246b3af5a77665919576209888e3589df539f1f 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
 //
-//
-// $Log: CheckBox.cs,v $
-// Revision 1.7  2004/09/28 18:44:25  pbartok
-// - Streamlined Theme interfaces:
-//   * Each DrawXXX method for a control now is passed the object for the
-//     control to be drawn in order to allow accessing any state the theme
-//     might require
-//
-//   * ControlPaint methods for the theme now have a CP prefix to avoid
-//     name clashes with the Draw methods for controls
-//
-//   * Every control now retrieves it's DefaultSize from the current theme
-//
-// Revision 1.6  2004/09/01 20:01:24  pbartok
-// - Added missing default
-// - Added missing region mark
-//
-// Revision 1.5  2004/09/01 01:55:58  pbartok
-// - Fixed to match the removal of the needs_redraw concept
-//
-// Revision 1.4  2004/08/31 18:48:31  pbartok
-// - Finished (famous last words)
-//
-// Revision 1.3  2004/08/30 20:42:26  pbartok
-// - Implemented CheckBox drawing code
-//
-// Revision 1.2  2004/08/30 15:44:20  pbartok
-// - Updated to fix broken build. Not complete yet.
-//
-// Revision 1.1  2004/07/09 05:21:25  pbartok
-// - Initial check-in
-//
-//
 
 // COMPLETE
 
 using System;
+using System.ComponentModel;
 using System.Drawing;
+using System.Runtime.InteropServices;
 
 namespace System.Windows.Forms {
+       [DefaultProperty("Checked")]
+       [DefaultEvent("CheckedChanged")]
        public class CheckBox : ButtonBase {
                #region Local Variables
                internal Appearance             appearance;
                internal bool                   auto_check;
                internal ContentAlignment       check_alignment;
-               internal ContentAlignment       text_alignment;
                internal CheckState             check_state;
                internal bool                   three_state;
                #endregion      // Local Variables
 
+               #region CheckBoxAccessibleObject Subclass
+               [ComVisible(true)]
+               public class CheckBoxAccessibleObject : ButtonBaseAccessibleObject {
+                       #region CheckBoxAccessibleObject Local Variables
+                       private 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
+               }
+               #endregion      // CheckBoxAccessibleObject Sub-class
 
                #region Public Constructors
                public CheckBox() {
@@ -80,10 +100,23 @@ 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) {
+                       ThemeEngine.Current.DrawCheckBox (pe.Graphics, this.ClientRectangle, this);
+               }
+
+               internal override void HaveDoubleClick() {
+                       if (DoubleClick != null) DoubleClick(this, EventArgs.Empty);
+               }
+               #endregion      // Internal Methods
+
                #region Public Instance Properties
+               [DefaultValue(Appearance.Normal)]
+               [Localizable(true)]
                public Appearance Appearance {
                        get {
                                return appearance;
@@ -91,15 +124,14 @@ namespace System.Windows.Forms {
 
                        set {
                                if (value != appearance) {
-                                       value = appearance;
-                                       if (AppearanceChanged != null) {
-                                               AppearanceChanged(this, EventArgs.Empty);
-                                       }
+                                       appearance = value;
+                                       OnAppearanceChanged (EventArgs.Empty);
                                        Redraw();
                                }
                        }
                }
 
+               [DefaultValue(true)]
                public bool AutoCheck {
                        get {
                                return auto_check;
@@ -110,6 +142,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Bindable(true)]
+               [Localizable(true)]
+               [DefaultValue(ContentAlignment.MiddleLeft)]
                public ContentAlignment CheckAlign {
                        get {
                                return check_alignment;
@@ -124,6 +159,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Bindable(true)]
+               [RefreshProperties(RefreshProperties.All)]
+               [DefaultValue(false)]
                public bool Checked {
                        get {
                                if (check_state != CheckState.Unchecked) {
@@ -145,6 +183,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue(CheckState.Unchecked)]
+               [RefreshProperties(RefreshProperties.All)]
+               [Bindable(true)]
                public CheckState CheckState {
                        get {
                                return check_state;
@@ -166,6 +207,8 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue(ContentAlignment.MiddleLeft)]
+               [Localizable(true)]
                public override ContentAlignment TextAlign {
                        get {
                                return text_alignment;
@@ -180,6 +223,7 @@ namespace System.Windows.Forms {
                }
 
 
+               [DefaultValue(false)]
                public bool ThreeState {
                        get {
                                return three_state;
@@ -213,25 +257,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) {
@@ -257,32 +306,57 @@ 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);
+               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); }
+               }
                #endregion      // Events
 
-               #region Internal drawing code
-               internal override void Redraw() {\r
-                       ThemeEngine.Current.DrawCheckBox(this.DeviceContext, this.ClientRectangle, this);
-                       Refresh();
-               }\r
-               #endregion      // Internal drawing code
+               #region Events
+               // 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
        }
 }