2005-01-31 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / CheckBox.cs
index 63d6e581d32764140b55617de204caa39d93beb4..5d7691b535660ef0406db6de496d96bc0038d7ed 100644 (file)
 //     Dennis Hayes    dennish@raytek.com
 //     Peter Bartok    pbartok@novell.com
 //
-//
-// $Revision: 1.2 $
-// $Modtime: $
-// $Log: CheckBox.cs,v $
-// 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
-//
-//
 
-// NOT COMPLETE
+// COMPLETE
 
 using System;
+using System.ComponentModel;
 using System.Drawing;
 
 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;
+               #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 Public Constructors
                public CheckBox() {
                        appearance = Appearance.Normal;
                        auto_check = true;
                        check_alignment = ContentAlignment.MiddleLeft;
+                       text_alignment = ContentAlignment.MiddleLeft;
                }
                #endregion      // Public Constructors
 
+               #region Internal Methods
+               internal override void Draw (PaintEventArgs pe) {
+                       if (redraw) {
+                               ThemeEngine.Current.DrawCheckBox (this.DeviceContext, this.ClientRectangle, this);
+                               redraw = false;
+                       }
+               }
+
+               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;
@@ -65,14 +75,16 @@ namespace System.Windows.Forms {
 
                        set {
                                if (value != appearance) {
-                                       value = appearance;
+                                       appearance = value;
                                        if (AppearanceChanged != null) {
                                                AppearanceChanged(this, EventArgs.Empty);
                                        }
+                                       Redraw();
                                }
                        }
                }
 
+               [DefaultValue(true)]
                public bool AutoCheck {
                        get {
                                return auto_check;
@@ -83,6 +95,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Bindable(true)]
+               [Localizable(true)]
+               [DefaultValue(ContentAlignment.MiddleLeft)]
                public ContentAlignment CheckAlign {
                        get {
                                return check_alignment;
@@ -97,6 +112,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [Bindable(true)]
+               [RefreshProperties(RefreshProperties.All)]
+               [DefaultValue(false)]
                public bool Checked {
                        get {
                                if (check_state != CheckState.Unchecked) {
@@ -118,6 +136,9 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue(CheckState.Unchecked)]
+               [RefreshProperties(RefreshProperties.All)]
+               [Bindable(true)]
                public CheckState CheckState {
                        get {
                                return check_state;
@@ -139,6 +160,8 @@ namespace System.Windows.Forms {
                        }
                }
 
+               [DefaultValue(ContentAlignment.MiddleLeft)]
+               [Localizable(true)]
                public override ContentAlignment TextAlign {
                        get {
                                return text_alignment;
@@ -153,6 +176,7 @@ namespace System.Windows.Forms {
                }
 
 
+               [DefaultValue(false)]
                public bool ThreeState {
                        get {
                                return three_state;
@@ -180,13 +204,7 @@ namespace System.Windows.Forms {
 
                #region Public Instance Methods
                public override string ToString() {
-                       if (CheckState == CheckState.Unchecked) {
-                               return "CheckBox (unchecked)";
-                       } else if (CheckState == CheckState.Checked) {
-                               return "CheckBox (checked)";
-                       } else {
-                               return "CheckBox (state indeterminate)";
-                       }
+                       return base.ToString() + ", CheckState: " + (int)check_state;
                }
                #endregion      // Public Instance Methods
 
@@ -202,510 +220,65 @@ namespace System.Windows.Forms {
                }
 
                protected virtual void OnCheckedChanged(EventArgs e) {
-Console.WriteLine("Checked changed");
                        if (CheckedChanged != null) {
                                CheckedChanged(this, e);
                        }
                }
 
                protected virtual void OnCheckStateChanged(EventArgs e) {
-Console.WriteLine("CheckState changed");
                        if (CheckStateChanged != null) {
                                CheckStateChanged(this, e);
                        }
                }
 
                protected override void OnClick(EventArgs e) {
-Console.WriteLine("Got click");
-                       base.OnClick (e);
-               }
-
-               protected override void OnHandleCreated(EventArgs e) {
-                       base.OnHandleCreated (e);
-               }
-
-               protected override void OnMouseUp(MouseEventArgs e) {
-                       base.OnMouseUp (e);
-               }
-
-               protected override bool ProcessMnemonic(char charCode) {
-                       return base.ProcessMnemonic (charCode);
-               }
-
-               #endregion      // Protected Instance Methods
-
-               #region Events
-               public event EventHandler       AppearanceChanged;
-               public event EventHandler       CheckedChanged;
-               public event EventHandler       CheckStateChanged;
-               #endregion      // Events
-       }
-}
-#if not
-       public class CheckBox : ButtonBase {
-
-               // private fields
-               Appearance                      appearance;
-               bool                                    autoCheck;
-               ContentAlignment        checkAlign;
-               bool                                    _checked;
-               CheckState                      checkState;
-               bool                                    threeState;
-               ContentAlignment        textAlign;
-               Rectangle                       textRect;
-               Rectangle                       checkRect;
-               StringFormat            textFormat;
-               int                                     checkMarkSize=13;               // Keep it configurable for accessability
-               Graphics                                canvasDC;
-               Bitmap                          canvasBmp;
-               
-               // --- Constructor ---
-               public CheckBox() : base() 
-               {
-
-                       appearance = Appearance.Normal;
-                       autoCheck = true;
-                       checkAlign = ContentAlignment.MiddleLeft;
-                       _checked = false;
-                       checkState = CheckState.Unchecked;
-                       threeState = false;
-
-                       canvasBmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
-                       canvasDC = Graphics.FromImage(canvasBmp);
-
-                       /* Set defaults for drawing text... */
-                       textAlign = ContentAlignment.MiddleLeft;
-                       textFormat = new StringFormat();
-                       textFormat.Alignment=StringAlignment.Near;
-                       textFormat.LineAlignment=StringAlignment.Center;
-                       textRect = ClientRectangle;
-                       textRect.X+=checkMarkSize;
-                       textRect.Width-=checkMarkSize;
-
-                       /* ... and for drawing our checkbox */
-                       checkRect.X=ClientRectangle.Left;
-                       checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
-                       checkRect.Width=checkMarkSize;
-                       checkRect.Height=checkMarkSize;
-
-                       SizeChanged+=new System.EventHandler(CheckboxSizeChanged);
-                       GotFocus+=new System.EventHandler(CheckboxUpdate);
-                       LostFocus+=new System.EventHandler(CheckboxUpdate);
-                       TextChanged+=new System.EventHandler(CheckboxUpdate);
-
-                       SubClassWndProc_ = true;
-                       SetStyle (ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
-                       callWinControlProcMask &= ~(CallWinControlProcMask.MOUSE_MESSAGES | CallWinControlProcMask.KEYBOARD_MESSAGES);
-               }
-               
-               // --- CheckBox Properties ---
-       
-               public CheckState CheckState {
-                       get { return checkState; }
-                       set { 
-                               if( checkState != value) {
-
-                                       checkState = value; 
-                                       bool oldChecked = _checked;
-
-                                       if( checkState == CheckState.Unchecked) {
-                                               _checked = false;
-                                       }
-                                       else {
-                                               _checked = true;
-                                       }
-
-                                       if( oldChecked != _checked) { 
-                                               OnCheckedChanged(new EventArgs());
-                                       }
-
-                                       OnCheckStateChanged(new EventArgs());
-                               }
-                       }
-               }
-               
-               [MonoTODO]
-               protected override CreateParams CreateParams {
-                       get {
-                               CreateParams createParams = base.CreateParams;
-       
-                               createParams.ClassName = "BUTTON";
-
-                               createParams.Style = (int) (
-                                       (int)WindowStyles.WS_CHILD | 
-                                       (int)WindowStyles.WS_VISIBLE | 
-                                       (int)ButtonStyles.BS_CHECKBOX |
-                                       (int)ButtonStyles.BS_NOTIFY |
-                                       (int)WindowStyles.WS_CLIPSIBLINGS |
-                                       (int)WindowStyles.WS_CLIPCHILDREN |
-                                       (int)WindowStyles.WS_TABSTOP |
-                                       (int)SS_Static_Control_Types.SS_LEFT );
-
-                               if (autoCheck) {
-                                       createParams.Style |= (int)ButtonStyles.BS_AUTOCHECKBOX;
-                               }
-
-                               /* We need this, we draw ourselves */
-                               createParams.Style |= (int) ButtonStyles.BS_OWNERDRAW;
-
-                               return createParams;
-                       }
-               }
-               
-               [MonoTODO]
-               protected override Size DefaultSize {
-                       get { return new Size(100,checkMarkSize); }
-               }
-               
-               [MonoTODO]
-               public override ContentAlignment TextAlign {
-                       get {
-                               return textAlign;
-                       }
-                       set {
-                               textAlign = value;
-                               UpdateCheckbox();
-                       }
-               }
-               
-               public bool ThreeState {
-                       get {
-                               return threeState;
-                       }
-
-                       set {
-                               threeState = value;
-                       }
-               }       
-               
-               // --- CheckBox methods ---
-
-               protected override AccessibleObject CreateAccessibilityInstance() 
-               {
-                       throw new NotImplementedException ();
-               }
-               
-               
-               // [event methods]
-               [MonoTODO]
-               protected virtual void OnAppearanceChanged(EventArgs e) 
-               {
-                       if (AppearanceChanged != null) {
-                               AppearanceChanged(this, e);
-                       }
-               }
-               
-               [MonoTODO]
-               protected virtual void OnCheckedChanged(EventArgs e) 
-               {
-                       //FIXME:
-                       if(CheckedChanged != null) {
-                               CheckedChanged( this, e);
-                       }
-               }
-               
-               [MonoTODO]
-               protected virtual void OnCheckStateChanged(EventArgs e) 
-               {
-                       //FIXME:
-                       if(CheckStateChanged != null) {
-                               CheckStateChanged( this, e);
-                       }
-               }
-               
-               [MonoTODO]
-               protected override void OnClick(EventArgs e) 
-               {
-                       CheckState = (CheckState)Win32.SendMessage(Handle, (int)ButtonMessages.BM_GETCHECK, 0, 0);
-                       base.OnClick(e);
-               }
-               
-               [MonoTODO]
-               protected override void OnHandleCreated(EventArgs e) 
-               {
-                       //FIXME:
-                       base.OnHandleCreated(e);
-                       Win32.SendMessage(Handle, (int)ButtonMessages.BM_SETCHECK, (int)checkState, 0);
-               }
-               
-//             protected override void OnMouseDown (MouseEventArgs e) 
-//             {
-//                     base.OnMouseDown (e);
-//             }
-               
-               [MonoTODO]
-               protected override void OnMouseUp(MouseEventArgs mevent) 
-               {
-                       if (ThreeState) {
-                               switch (CheckState) {
+                       if (auto_check) {
+                               switch(check_state) {
                                        case CheckState.Unchecked: {
-                                               CheckState = CheckState.Checked;
+                                               if (three_state) {
+                                                       CheckState = CheckState.Indeterminate;
+                                               } else {
+                                                       CheckState = CheckState.Checked;
+                                               }
                                                break;
                                        }
 
                                        case CheckState.Indeterminate: {
-                                               CheckState = CheckState.Unchecked;
+                                               CheckState = CheckState.Checked;
                                                break;
                                        }
 
                                        case CheckState.Checked: {
-                                               CheckState = CheckState.Indeterminate;
-                                               break;
-                                       }
-                               }
-                       } else {
-                               Checked = Checked ? false : true;
-                       }
-                       CheckboxRedraw();
-                       Invalidate();
-                       base.OnMouseUp(mevent);
-               }
-               // end of [event methods]
-               
-               
-               [MonoTODO]
-               protected override bool ProcessMnemonic(char charCode) 
-               {
-                       //FIXME:
-                       return base.ProcessMnemonic(charCode);
-               }
-               
-               [MonoTODO]
-               //FIXME: do a better tostring
-               public override string ToString() 
-               {
-                       if (Checked) {
-                               return "CheckBox" + " Checked";
-                       } else {
-                               return "CheckBox" +  " Unchecked";
-                       }
-               }
-               
-               internal override void ButtonPaint (PaintEventArgs e) 
-               {
-                       if (canvasBmp!=null) {
-                               e.Graphics.DrawImage(canvasBmp, e.ClipRectangle, e.ClipRectangle, GraphicsUnit.Pixel);
-                       }
-               }
-               
-               /// --- CheckBox events ---
-               public event EventHandler AppearanceChanged;
-               public event EventHandler CheckedChanged;
-               public event EventHandler CheckStateChanged;
-               
-               /// --- public class CheckBox.CheckBoxAccessibleObject : AccessibleObject ---
-               /// the class is only used for .NET framework
-               /// 
-               public class CheckBoxAccessibleObject : AccessibleObject {
-               }
-
-               private void UpdateCheckbox() {
-                       /* Calculate the position of text and checkbox rectangle */
-                       if (appearance!=Appearance.Button) {
-                               switch(checkAlign) {
-                                       case ContentAlignment.BottomCenter: {
-                                               if (ClientRectangle.Height<checkMarkSize*2) {
-                                                       ClientSize=new Size(ClientRectangle.Width, checkMarkSize*2);
-                                               }
-                                               checkRect.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkMarkSize/2;
-                                               checkRect.Y=ClientRectangle.Bottom-checkMarkSize;
-                                               textRect.X=ClientRectangle.X;
-                                               textRect.Width=ClientRectangle.Width;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.BottomLeft: {
-                                               checkRect.X=ClientRectangle.Left;
-                                               checkRect.Y=ClientRectangle.Bottom-checkMarkSize;
-                                               textRect.X=ClientRectangle.X+checkMarkSize;
-                                               textRect.Width=ClientRectangle.Width-checkMarkSize;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.BottomRight: {
-                                               checkRect.X=ClientRectangle.Right-checkMarkSize;
-                                               checkRect.Y=ClientRectangle.Bottom-checkMarkSize;
-                                               textRect.X=ClientRectangle.X;
-                                               textRect.Width=ClientRectangle.Width-checkMarkSize;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.MiddleCenter: {
-                                               checkRect.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkMarkSize/2;
-                                               checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
-                                               textRect.X=ClientRectangle.X;
-                                               textRect.Width=ClientRectangle.Width;
-                                               break;
-                                       }
-
-                                       default:
-                                       case ContentAlignment.MiddleLeft: {
-                                               checkRect.X=ClientRectangle.Left;
-                                               checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
-                                               textRect.X=ClientRectangle.X+checkMarkSize;
-                                               textRect.Width=ClientRectangle.Width-checkMarkSize;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.MiddleRight: {
-                                               checkRect.X=ClientRectangle.Right-checkMarkSize;
-                                               checkRect.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkMarkSize/2;
-                                               textRect.X=ClientRectangle.X;
-                                               textRect.Width=ClientRectangle.Width-checkMarkSize;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopCenter: {
-                                               if (ClientRectangle.Height<checkMarkSize*2) {
-                                                       ClientSize=new Size(ClientRectangle.Width, checkMarkSize*2);
-                                               }
-                                               checkRect.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkMarkSize/2;
-                                               checkRect.Y=ClientRectangle.Top;
-                                               textRect.X=ClientRectangle.X;
-                                               textRect.Y=checkMarkSize;
-                                               textRect.Width=ClientRectangle.Width;
-                                               textRect.Height=ClientRectangle.Height-checkMarkSize;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopLeft: {
-                                               checkRect.X=ClientRectangle.Left;
-                                               checkRect.Y=ClientRectangle.Top;
-                                               textRect.X=ClientRectangle.X+checkMarkSize;
-                                               textRect.Width=ClientRectangle.Width-checkMarkSize;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopRight: {
-                                               checkRect.X=ClientRectangle.Right-checkMarkSize;
-                                               checkRect.Y=ClientRectangle.Top;
-                                               textRect.X=ClientRectangle.X;
-                                               textRect.Width=ClientRectangle.Width-checkMarkSize;
+                                               CheckState = CheckState.Unchecked;
                                                break;
                                        }
                                }
-                       } else {
-                               textRect.X=ClientRectangle.X;
-                               textRect.Width=ClientRectangle.Width;
-                       }
-
-                       /* Set the horizontal alignment of our text */
-                       switch(textAlign) {
-                               case ContentAlignment.BottomLeft:
-                               case ContentAlignment.MiddleLeft:
-                               case ContentAlignment.TopLeft: {
-                                       textFormat.Alignment=StringAlignment.Near;
-                                       break;
-                               }
-
-                               case ContentAlignment.BottomCenter:
-                               case ContentAlignment.MiddleCenter:
-                               case ContentAlignment.TopCenter: {
-                                       textFormat.Alignment=StringAlignment.Center;
-                                       break;
-                               }
-
-                               case ContentAlignment.BottomRight:
-                               case ContentAlignment.MiddleRight:
-                               case ContentAlignment.TopRight: {
-                                       textFormat.Alignment=StringAlignment.Far;
-                                       break;
-                               }
-                       }
-
-                       /* Set the vertical alignment of our text */
-                       switch(textAlign) {
-                               case ContentAlignment.TopLeft: 
-                               case ContentAlignment.TopCenter: 
-                               case ContentAlignment.TopRight: {
-                                       textFormat.LineAlignment=StringAlignment.Near;
-                                       break;
-                               }
-
-                               case ContentAlignment.BottomLeft:
-                               case ContentAlignment.BottomCenter:
-                               case ContentAlignment.BottomRight: {
-                                       textFormat.LineAlignment=StringAlignment.Far;
-                                       break;
-                               }
-
-                               case ContentAlignment.MiddleLeft:
-                               case ContentAlignment.MiddleCenter:
-                               case ContentAlignment.MiddleRight: {
-                                       textFormat.LineAlignment=StringAlignment.Center;
-                                       break;
-                               }
                        }
-                       CheckboxRedraw();
-                       Invalidate();
                }
 
-               private void CheckboxRedraw() {
-                       SolidBrush      sb;
-
-                       /* Build the image representing the control */
-
-                       if (canvasDC!=null) {
-                               canvasDC.Dispose();
-                       }
-                       if (canvasBmp!=null) {
-                               canvasBmp.Dispose();
-                       }
-
-                       if (ClientRectangle.Width<1 || ClientRectangle.Height<1) {
-                               return;
-                       }
-                       canvasBmp = new Bitmap(ClientRectangle.Width, ClientRectangle.Height);
-                       canvasDC = Graphics.FromImage(canvasBmp);
-
-                       sb=new SolidBrush(BackColor);
-                       canvasDC.FillRectangle(sb, ClientRectangle);
-                       sb.Dispose();
-
-                       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;
-                       }
-
-                       if (appearance!=Appearance.Button) {
-                               ControlPaint.DrawCheckBox(canvasDC, checkRect, state);
-                       } else {
-                               ControlPaint.DrawButton(canvasDC, textRect, state);
-                       }
-
-                       /* Place the text; to be compatible with Windows place it after the checkbox has been drawn */
-                       sb=new SolidBrush(base.foreColor);
-                       canvasDC.DrawString(Text, Font, sb, textRect, textFormat);
-                       sb.Dispose();
-
-                       if (Focused) {
-                               ControlPaint.DrawFocusRectangle(canvasDC, textRect);
-                       }
+               protected override void OnHandleCreated(EventArgs e) {
+                       base.OnHandleCreated (e);
                }
 
-               private void CheckboxUpdate(object sender, System.EventArgs e) {
-                       /* Force recalculation of text & checkbox rectangles */
-                       UpdateCheckbox();
+               protected override void OnMouseUp(MouseEventArgs e) {
+                       base.OnMouseUp (e);
                }
 
-               private void CheckboxSizeChanged(object sender, System.EventArgs e)
-               {
-                       /* Force recalculation of text & checkbox rectangles */
-                       textRect.Y=ClientRectangle.Y;
-                       textRect.Height=ClientRectangle.Height;
-                       UpdateCheckbox();
+               protected override bool ProcessMnemonic(char charCode) {
+                       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 Events
+               [Browsable(false)]
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public event EventHandler DoubleClick;
+               #endregion      // Events
+       }
 }
-#endif