- Finished (famous last words)
authorPeter Dennis Bartok <pbartok@mono-cvs.ximian.com>
Tue, 31 Aug 2004 18:48:31 +0000 (18:48 -0000)
committerPeter Dennis Bartok <pbartok@mono-cvs.ximian.com>
Tue, 31 Aug 2004 18:48:31 +0000 (18:48 -0000)
svn path=/trunk/mcs/; revision=33117

mcs/class/Managed.Windows.Forms/System.Windows.Forms/CheckBox.cs

index 4e2df24f3fda4c9437c76c97783166bec48c5c64..262505b327690723c1f68edb802ed166c8736af6 100644 (file)
 //     Peter Bartok    pbartok@novell.com
 //
 //
-// $Revision: 1.3 $
+// $Revision: 1.4 $
 // $Modtime: $
 // $Log: CheckBox.cs,v $
+// 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
 //
@@ -38,7 +41,7 @@
 //
 //
 
-// NOT COMPLETE
+// COMPLETE
 
 using System;
 using System.Drawing;
@@ -59,6 +62,9 @@ namespace System.Windows.Forms {
                        appearance = Appearance.Normal;
                        auto_check = true;
                        check_alignment = ContentAlignment.MiddleLeft;
+
+                       SizeChanged+=new System.EventHandler(RedrawEvent);
+                       TextChanged+=new System.EventHandler(RedrawEvent);
                }
                #endregion      // Public Constructors
 
@@ -74,6 +80,8 @@ namespace System.Windows.Forms {
                                        if (AppearanceChanged != null) {
                                                AppearanceChanged(this, EventArgs.Empty);
                                        }
+                                       CheckRedraw();
+                                       Refresh();
                                }
                        }
                }
@@ -98,6 +106,7 @@ namespace System.Windows.Forms {
                                        check_alignment = value;
 
                                        CheckRedraw();
+                                       Refresh();
                                }
                        }
                }
@@ -114,10 +123,12 @@ namespace System.Windows.Forms {
                                if (value && (check_state != CheckState.Checked)) {
                                        check_state = CheckState.Checked;
                                        CheckRedraw();
+                                       Refresh();
                                        OnCheckedChanged(EventArgs.Empty);
                                } else if (!value && (check_state != CheckState.Unchecked)) {
                                        check_state = CheckState.Unchecked;
                                        CheckRedraw();
+                                       Refresh();
                                        OnCheckedChanged(EventArgs.Empty);
                                }
                        }
@@ -140,6 +151,7 @@ namespace System.Windows.Forms {
 
                                        OnCheckStateChanged(EventArgs.Empty);
                                        CheckRedraw();
+                                       Refresh();
                                }
                        }
                }
@@ -153,6 +165,7 @@ namespace System.Windows.Forms {
                                if (value != text_alignment) {
                                        text_alignment = value;
                                        CheckRedraw();
+                                       Refresh();
                                }
                        }
                }
@@ -185,13 +198,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
 
@@ -207,21 +214,18 @@ 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 event");
                        if (auto_check) {
                                switch(check_state) {
                                        case CheckState.Unchecked: {
@@ -243,9 +247,7 @@ Console.WriteLine("Got click event");
                                                break;
                                        }
                                }
-                               CheckRedraw();
                        }
-                       base.OnClick (e);
                }
 
                protected override void OnHandleCreated(EventArgs e) {
@@ -269,7 +271,9 @@ Console.WriteLine("Got click event");
 
                #region Internal drawing code
                internal override bool CheckRedraw() {\r
-                       return base.CheckRedraw ();\r
+                       this.needs_redraw = true;\r
+\r
+                       return true;\r
                }\r
 \r
                internal override void Redraw() {\r
@@ -278,7 +282,7 @@ Console.WriteLine("Got click event");
                        Rectangle               text_rectangle;
                        Rectangle               checkbox_rectangle;
                        SolidBrush              sb;
-Console.WriteLine("REDRAWING");
+
                        client_rectangle = ClientRectangle;
                        text_rectangle = client_rectangle;
                        checkbox_rectangle = new Rectangle(text_rectangle.X, text_rectangle.Y, checkmark_size, checkmark_size);
@@ -461,441 +465,11 @@ Console.WriteLine("REDRAWING");
                                ControlPaint.DrawFocusRectangle(this.DeviceContext, text_rectangle);
                        }
                }\r
-               #endregion      // Internal drawing code
-       }
-}
-#if not
-       public class CheckBox : ButtonBase {
-
-               // private fields
-               Appearance                      appearance;
-               bool                                    autoCheck;
-               ContentAlignment        checkAlign;
-               bool                                    _checked;
-               CheckState                      checkState;
-               bool                                    threeState;
-               ContentAlignment        textAlign;
-               Rectangle                       text_rectangle;
-               Rectangle                       checkbox_rectangle;
-               StringFormat            textFormat;
-               int                                     checkmark_size=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;
-                       text_rectangle = ClientRectangle;
-                       text_rectangle.X+=checkmark_size;
-                       text_rectangle.Width-=checkmark_size;
-
-                       /* ... and for drawing our checkbox */
-                       checkbox_rectangle.X=ClientRectangle.Left;
-                       checkbox_rectangle.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkmark_size/2;
-                       checkbox_rectangle.Width=checkmark_size;
-                       checkbox_rectangle.Height=checkmark_size;
-
-                       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]
-               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) {
-                                       case CheckState.Unchecked: {
-                                               CheckState = CheckState.Checked;
-                                               break;
-                                       }
-
-                                       case CheckState.Indeterminate: {
-                                               CheckState = CheckState.Unchecked;
-                                               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<checkmark_size*2) {
-                                                       ClientSize=new Size(ClientRectangle.Width, checkmark_size*2);
-                                               }
-                                               checkbox_rectangle.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkmark_size/2;
-                                               checkbox_rectangle.Y=ClientRectangle.Bottom-checkmark_size;
-                                               text_rectangle.X=ClientRectangle.X;
-                                               text_rectangle.Width=ClientRectangle.Width;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.BottomLeft: {
-                                               checkbox_rectangle.X=ClientRectangle.Left;
-                                               checkbox_rectangle.Y=ClientRectangle.Bottom-checkmark_size;
-                                               text_rectangle.X=ClientRectangle.X+checkmark_size;
-                                               text_rectangle.Width=ClientRectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.BottomRight: {
-                                               checkbox_rectangle.X=ClientRectangle.Right-checkmark_size;
-                                               checkbox_rectangle.Y=ClientRectangle.Bottom-checkmark_size;
-                                               text_rectangle.X=ClientRectangle.X;
-                                               text_rectangle.Width=ClientRectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.MiddleCenter: {
-                                               checkbox_rectangle.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkmark_size/2;
-                                               checkbox_rectangle.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkmark_size/2;
-                                               text_rectangle.X=ClientRectangle.X;
-                                               text_rectangle.Width=ClientRectangle.Width;
-                                               break;
-                                       }
-
-                                       default:
-                                       case ContentAlignment.MiddleLeft: {
-                                               checkbox_rectangle.X=ClientRectangle.Left;
-                                               checkbox_rectangle.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkmark_size/2;
-                                               text_rectangle.X=ClientRectangle.X+checkmark_size;
-                                               text_rectangle.Width=ClientRectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.MiddleRight: {
-                                               checkbox_rectangle.X=ClientRectangle.Right-checkmark_size;
-                                               checkbox_rectangle.Y=(ClientRectangle.Bottom-ClientRectangle.Top)/2-checkmark_size/2;
-                                               text_rectangle.X=ClientRectangle.X;
-                                               text_rectangle.Width=ClientRectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopCenter: {
-                                               if (ClientRectangle.Height<checkmark_size*2) {
-                                                       ClientSize=new Size(ClientRectangle.Width, checkmark_size*2);
-                                               }
-                                               checkbox_rectangle.X=(ClientRectangle.Right-ClientRectangle.Left)/2-checkmark_size/2;
-                                               checkbox_rectangle.Y=ClientRectangle.Top;
-                                               text_rectangle.X=ClientRectangle.X;
-                                               text_rectangle.Y=checkmark_size;
-                                               text_rectangle.Width=ClientRectangle.Width;
-                                               text_rectangle.Height=ClientRectangle.Height-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopLeft: {
-                                               checkbox_rectangle.X=ClientRectangle.Left;
-                                               checkbox_rectangle.Y=ClientRectangle.Top;
-                                               text_rectangle.X=ClientRectangle.X+checkmark_size;
-                                               text_rectangle.Width=ClientRectangle.Width-checkmark_size;
-                                               break;
-                                       }
-
-                                       case ContentAlignment.TopRight: {
-                                               checkbox_rectangle.X=ClientRectangle.Right-checkmark_size;
-                                               checkbox_rectangle.Y=ClientRectangle.Top;
-                                               text_rectangle.X=ClientRectangle.X;
-                                               text_rectangle.Width=ClientRectangle.Width-checkmark_size;
-                                               break;
-                                       }
-                               }
-                       } else {
-                               text_rectangle.X=ClientRectangle.X;
-                               text_rectangle.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 RedrawEvent(object sender, System.EventArgs e) {
+                       CheckRedraw();
                }
-
-               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, checkbox_rectangle, state);
-                       } else {
-                               ControlPaint.DrawButton(canvasDC, text_rectangle, 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, text_rectangle, textFormat);
-                       sb.Dispose();
-
-                       if (Focused) {
-                               ControlPaint.DrawFocusRectangle(canvasDC, text_rectangle);
-                       }
-               }
-
-               private void CheckboxUpdate(object sender, System.EventArgs e) {
-                       /* Force recalculation of text & checkbox rectangles */
-                       UpdateCheckbox();
-               }
-
-               private void CheckboxSizeChanged(object sender, System.EventArgs e)
-               {
-                       /* Force recalculation of text & checkbox rectangles */
-                       text_rectangle.Y=ClientRectangle.Y;
-                       text_rectangle.Height=ClientRectangle.Height;
-                       UpdateCheckbox();
-               }
+               #endregion      // Internal drawing code
        }
-
-
 }
-#endif