* Control.cs: ControlCollection.Count must be public. Fixed build of
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CheckBox.cs
index 7a753813f2218af64ad2c8447b7cbe0ef4c94eab..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.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 {
-               private Appearance              appearance;
-               private bool                    auto_check;
-               private ContentAlignment        check_alignment;
-               private ContentAlignment        text_alignment;
-               private CheckState              check_state;
-               private bool                    three_state;
-               private int                     checkmark_size=13;              // Keep it configurable for accessability
+               #region Local Variables
+               internal Appearance             appearance;
+               internal bool                   auto_check;
+               internal ContentAlignment       check_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() {
                        appearance = Appearance.Normal;
                        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;
@@ -74,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;
@@ -93,6 +142,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Bindable(true)]
+               [Localizable(true)]
+               [DefaultValue(ContentAlignment.MiddleLeft)]
                public ContentAlignment CheckAlign {
                        get {
                                return check_alignment;
@@ -107,6 +159,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Bindable(true)]
+               [RefreshProperties(RefreshProperties.All)]
+               [DefaultValue(false)]
                public bool Checked {
                        get {
                                if (check_state != CheckState.Unchecked) {
@@ -128,6 +183,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue(CheckState.Unchecked)]
+               [RefreshProperties(RefreshProperties.All)]
+               [Bindable(true)]
                public CheckState CheckState {
                        get {
                                return check_state;
@@ -149,6 +207,8 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue(ContentAlignment.MiddleLeft)]
+               [Localizable(true)]
                public override ContentAlignment TextAlign {
                        get {
                                return text_alignment;
@@ -163,6 +223,7 @@ namespace System.Windows.Forms {
                }
 
 
+               [DefaultValue(false)]
                public bool ThreeState {
                        get {
                                return three_state;
@@ -196,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) {
@@ -240,219 +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;
-               #endregion      // Events
-
-               #region Internal drawing code
-               internal override void Redraw() {\r
-                       StringFormat            text_format;
-                       Rectangle               client_rectangle;
-                       Rectangle               text_rectangle;
-                       Rectangle               checkbox_rectangle;
-                       SolidBrush              sb;
-
-                       client_rectangle = ClientRectangle;
-                       text_rectangle = client_rectangle;
-                       checkbox_rectangle = new Rectangle(text_rectangle.X, text_rectangle.Y, checkmark_size, checkmark_size);
-
-                       text_format = new StringFormat();
-                       text_format.Alignment=StringAlignment.Near;
-                       text_format.LineAlignment=StringAlignment.Center;
-
-                       /* Calculate the position of text and checkbox rectangle */
-                       if (appearance!=Appearance.Button) {
-                               switch(check_alignment) {
-                                       case ContentAlignment.BottomCenter: {
-                                               if (client_rectangle.Height<checkmark_size*2) {
-                                                       ClientSize=new Size(client_rectangle.Width, checkmark_size*2);
-                                                       client_rectangle = ClientRectangle;
-                                               }
-                                               checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
-                                               checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
-                                               text_rectangle.X=client_rectangle.X;
-                                               text_rectangle.Width=client_rectangle.Width;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.BottomLeft: {
-                                               checkbox_rectangle.X=client_rectangle.Left;
-                                               checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
-                                               text_rectangle.X=client_rectangle.X+checkmark_size;
-                                               text_rectangle.Width=client_rectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.BottomRight: {
-                                               checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
-                                               checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
-                                               text_rectangle.X=client_rectangle.X;
-                                               text_rectangle.Width=client_rectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.MiddleCenter: {
-                                               checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
-                                               checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
-                                               text_rectangle.X=client_rectangle.X;
-                                               text_rectangle.Width=client_rectangle.Width;
-                                               break;
-                                       }
-
-                                       default:
-                                       case ContentAlignment.MiddleLeft: {
-                                               checkbox_rectangle.X=client_rectangle.Left;
-                                               checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
-                                               text_rectangle.X=client_rectangle.X+checkmark_size;
-                                               text_rectangle.Width=client_rectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.MiddleRight: {
-                                               checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
-                                               checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
-                                               text_rectangle.X=client_rectangle.X;
-                                               text_rectangle.Width=client_rectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopCenter: {
-                                               if (client_rectangle.Height<checkmark_size*2) {
-                                                       ClientSize=new Size(client_rectangle.Width, checkmark_size*2);
-                                                       client_rectangle = ClientRectangle;
-                                               }
-                                               checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
-                                               checkbox_rectangle.Y=client_rectangle.Top;
-                                               text_rectangle.X=client_rectangle.X;
-                                               text_rectangle.Y=checkmark_size;
-                                               text_rectangle.Width=client_rectangle.Width;
-                                               text_rectangle.Height=client_rectangle.Height-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopLeft: {
-                                               checkbox_rectangle.X=client_rectangle.Left;
-                                               checkbox_rectangle.Y=client_rectangle.Top;
-                                               text_rectangle.X=client_rectangle.X+checkmark_size;
-                                               text_rectangle.Width=client_rectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopRight: {
-                                               checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
-                                               checkbox_rectangle.Y=client_rectangle.Top;
-                                               text_rectangle.X=client_rectangle.X;
-                                               text_rectangle.Width=client_rectangle.Width-checkmark_size;
-                                               break;
-                                       }
-                               }
-                       } else {
-                               text_rectangle.X=client_rectangle.X;
-                               text_rectangle.Width=client_rectangle.Width;
-                       }
-
-                       /* Set the horizontal alignment of our text */
-                       switch(text_alignment) {
-                               case ContentAlignment.BottomLeft:
-                               case ContentAlignment.MiddleLeft:
-                               case ContentAlignment.TopLeft: {
-                                       text_format.Alignment=StringAlignment.Near;
-                                       break;
-                               }
-
-                               case ContentAlignment.BottomCenter:
-                               case ContentAlignment.MiddleCenter:
-                               case ContentAlignment.TopCenter: {
-                                       text_format.Alignment=StringAlignment.Center;
-                                       break;
-                               }
-
-                               case ContentAlignment.BottomRight:
-                               case ContentAlignment.MiddleRight:
-                               case ContentAlignment.TopRight: {
-                                       text_format.Alignment=StringAlignment.Far;
-                                       break;
-                               }
-                       }
-
-                       /* Set the vertical alignment of our text */
-                       switch(text_alignment) {
-                               case ContentAlignment.TopLeft: 
-                               case ContentAlignment.TopCenter: 
-                               case ContentAlignment.TopRight: {
-                                       text_format.LineAlignment=StringAlignment.Near;
-                                       break;
-                               }
+               static object AppearanceChangedEvent = new object ();
+               static object CheckedChangedEvent = new object ();
+               static object CheckStateChangedEvent = new object ();
 
-                               case ContentAlignment.BottomLeft:
-                               case ContentAlignment.BottomCenter:
-                               case ContentAlignment.BottomRight: {
-                                       text_format.LineAlignment=StringAlignment.Far;
-                                       break;
-                               }
-
-                               case ContentAlignment.MiddleLeft:
-                               case ContentAlignment.MiddleCenter:
-                               case ContentAlignment.MiddleRight: {
-                                       text_format.LineAlignment=StringAlignment.Center;
-                                       break;
-                               }
-                       }
-
-                       ButtonState state = ButtonState.Normal;
-                       if (FlatStyle == FlatStyle.Flat) {
-                               state |= ButtonState.Flat;
-                       }
-                       
-                       if (Checked) {
-                               state |= ButtonState.Checked;
-                       }
-                       
-                       if (ThreeState && (CheckState == CheckState.Indeterminate)) {
-                               state |= ButtonState.Checked;
-                               state |= ButtonState.Pushed;
-                       }
-
-                       // Start drawing
-
-                       sb=new SolidBrush(BackColor);
-                       this.DeviceContext.FillRectangle(sb, ClientRectangle);
-                       sb.Dispose();
-
-                       if (appearance!=Appearance.Button) {
-                               ControlPaint.DrawCheckBox(this.DeviceContext, checkbox_rectangle, state);
-                       } else {
-                               ControlPaint.DrawButton(this.DeviceContext, text_rectangle, state);
-                       }
+               public event EventHandler AppearanceChanged {
+                       add { Events.AddHandler (AppearanceChangedEvent, value); }
+                       remove { Events.RemoveHandler (AppearanceChangedEvent, value); }
+               }
 
-                       /* Place the text; to be compatible with Windows place it after the checkbox has been drawn */
-                       sb=new SolidBrush(ForeColor);
-                       this.DeviceContext.DrawString(Text, Font, sb, text_rectangle, text_format);
-                       sb.Dispose();
+               public event EventHandler CheckedChanged {
+                       add { Events.AddHandler (CheckedChangedEvent, value); }
+                       remove { Events.RemoveHandler (CheckedChangedEvent, value); }
+               }
 
-                       if (Focused) {
-                               ControlPaint.DrawFocusRectangle(this.DeviceContext, text_rectangle);
-                       }
+               public event EventHandler CheckStateChanged {
+                       add { Events.AddHandler (CheckStateChangedEvent, value); }
+                       remove { Events.RemoveHandler (CheckStateChangedEvent, value); }
+               }
+               #endregion      // Events
 
-                       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
        }
 }