// 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.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")]
+#if NET_2_0
+ [ComVisible (true)]
+ [ClassInterface (ClassInterfaceType.AutoDispatch)]
+ [DefaultBindingProperty ("CheckState")]
+ [ToolboxItem ("System.Windows.Forms.Design.AutoSizeToolboxItem," + Consts.AssemblySystem_Design)]
+#endif
public class CheckBox : ButtonBase {
#region Local Variables
- 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
+ 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 new CheckBox owner;
+ #endregion // CheckBoxAccessibleObject Local Variables
+
+ #region CheckBoxAccessibleObject Constructors
+ public CheckBoxAccessibleObject(Control owner) : base(owner) {
+ this.owner = (CheckBox)owner;
+ }
+ #endregion // CheckBoxAccessibleObject Constructors
+
+ #region CheckBoxAccessibleObject Properties
+ public override string DefaultAction {
+ get {
+ return "Select";
+ }
+ }
+
+ public override AccessibleRole Role {
+ get {
+ return AccessibleRole.CheckButton;
+ }
+ }
+
+ public override AccessibleStates State {
+ get {
+ AccessibleStates retval;
+
+ retval = AccessibleStates.Default;
+
+ if (owner.check_state == CheckState.Checked) {
+ retval |= AccessibleStates.Checked;
+ }
+
+ if (owner.Focused) {
+ retval |= AccessibleStates.Focused;
+ }
+
+ if (owner.CanFocus) {
+ retval |= AccessibleStates.Focusable;
+ }
+
+ return retval;
+ }
+ }
+ #endregion // CheckBoxAccessibleObject Properties
+
+#if NET_2_0
+ #region CheckBoxAccessibleObject Methods
+ public override void DoDefaultAction ()
+ {
+ owner.Checked = !owner.Checked;
+ }
+ #endregion // CheckBoxAccessibleObject Methods
+#endif
+ }
+ #endregion // CheckBoxAccessibleObject Sub-class
#region Public Constructors
public CheckBox() {
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;
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;
}
}
+ [Bindable(true)]
+ [Localizable(true)]
+ [DefaultValue(ContentAlignment.MiddleLeft)]
public ContentAlignment CheckAlign {
get {
return check_alignment;
}
}
+ [Bindable(true)]
+ [RefreshProperties(RefreshProperties.All)]
+ [DefaultValue(false)]
+#if NET_2_0
+ [SettingsBindable (true)]
+#endif
public bool Checked {
get {
if (check_state != CheckState.Unchecked) {
}
}
+ [DefaultValue(CheckState.Unchecked)]
+ [RefreshProperties(RefreshProperties.All)]
+ [Bindable(true)]
public CheckState CheckState {
get {
return check_state;
}
}
+ [DefaultValue(ContentAlignment.MiddleLeft)]
+ [Localizable(true)]
public override ContentAlignment TextAlign {
get {
return text_alignment;
}
+ [DefaultValue(false)]
public bool ThreeState {
get {
return three_state;
#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) {
}
}
}
+
+ base.OnClick (e);
}
protected override void OnHandleCreated(EventArgs e) {
base.OnHandleCreated (e);
}
- protected override void OnMouseUp(MouseEventArgs e) {
- base.OnMouseUp (e);
+#if NET_2_0
+ protected override void OnKeyDown (KeyEventArgs kevent)
+ {
+ base.OnKeyDown (kevent);
}
+#endif
- protected override bool ProcessMnemonic(char charCode) {
- return base.ProcessMnemonic (charCode);
+ protected override void OnMouseUp(MouseEventArgs mevent) {
+ base.OnMouseUp (mevent);
}
- #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;
- }
-
- 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;
+ protected override bool ProcessMnemonic(char charCode) {
+ if (IsMnemonic(charCode, Text) == true) {
+ Select();
+ OnClick(EventArgs.Empty);
+ return true;
}
- if (ThreeState && (CheckState == CheckState.Indeterminate)) {
- state |= ButtonState.Checked;
- state |= ButtonState.Pushed;
- }
-
- // Start drawing
+ return base.ProcessMnemonic(charCode);
+ }
+ #endregion // Protected Instance Methods
- sb=new SolidBrush(BackColor);
- this.DeviceContext.FillRectangle(sb, ClientRectangle);
- sb.Dispose();
+ #region Events
+ static object AppearanceChangedEvent = new object ();
+ static object CheckedChangedEvent = new object ();
+ static object CheckStateChangedEvent = new object ();
- 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); }
+ }
+
+#if NET_2_0
+ [Browsable (false)]
+ [EditorBrowsable (EditorBrowsableState.Never)]
+ public new event MouseEventHandler MouseDoubleClick {
+ add { base.MouseDoubleClick += value; }
+ remove { base.MouseDoubleClick -= value; }
+ }
+#endif
+ #endregion // Events
- 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
}
}