1 // Permission is hereby granted, free of charge, to any person obtaining
2 // a copy of this software and associated documentation files (the
3 // "Software"), to deal in the Software without restriction, including
4 // without limitation the rights to use, copy, modify, merge, publish,
5 // distribute, sublicense, and/or sell copies of the Software, and to
6 // permit persons to whom the Software is furnished to do so, subject to
7 // the following conditions:
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
12 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
13 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
14 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
15 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
16 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
17 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
18 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 // Copyright (c) 2004 Novell, Inc.
23 // Dennis Hayes dennish@raytek.com
24 // Peter Bartok pbartok@novell.com
29 // $Log: CheckBox.cs,v $
30 // Revision 1.4 2004/08/31 18:48:31 pbartok
31 // - Finished (famous last words)
33 // Revision 1.3 2004/08/30 20:42:26 pbartok
34 // - Implemented CheckBox drawing code
36 // Revision 1.2 2004/08/30 15:44:20 pbartok
37 // - Updated to fix broken build. Not complete yet.
39 // Revision 1.1 2004/07/09 05:21:25 pbartok
49 namespace System.Windows.Forms {
50 public class CheckBox : ButtonBase {
51 private Appearance appearance;
52 private bool auto_check;
53 private ContentAlignment check_alignment;
54 private ContentAlignment text_alignment;
55 private CheckState check_state;
56 private bool three_state;
57 private int checkmark_size=13; // Keep it configurable for accessability
60 #region Public Constructors
62 appearance = Appearance.Normal;
64 check_alignment = ContentAlignment.MiddleLeft;
66 SizeChanged+=new System.EventHandler(RedrawEvent);
67 TextChanged+=new System.EventHandler(RedrawEvent);
69 #endregion // Public Constructors
71 #region Public Instance Properties
72 public Appearance Appearance {
78 if (value != appearance) {
80 if (AppearanceChanged != null) {
81 AppearanceChanged(this, EventArgs.Empty);
89 public bool AutoCheck {
99 public ContentAlignment CheckAlign {
101 return check_alignment;
105 if (value != check_alignment) {
106 check_alignment = value;
114 public bool Checked {
116 if (check_state != CheckState.Unchecked) {
123 if (value && (check_state != CheckState.Checked)) {
124 check_state = CheckState.Checked;
127 OnCheckedChanged(EventArgs.Empty);
128 } else if (!value && (check_state != CheckState.Unchecked)) {
129 check_state = CheckState.Unchecked;
132 OnCheckedChanged(EventArgs.Empty);
137 public CheckState CheckState {
143 if (value != check_state) {
144 bool was_checked = (check_state != CheckState.Unchecked);
148 if (was_checked != (check_state != CheckState.Unchecked)) {
149 OnCheckedChanged(EventArgs.Empty);
152 OnCheckStateChanged(EventArgs.Empty);
159 public override ContentAlignment TextAlign {
161 return text_alignment;
165 if (value != text_alignment) {
166 text_alignment = value;
174 public bool ThreeState {
183 #endregion // Public Instance Properties
185 #region Protected Instance Properties
186 protected override CreateParams CreateParams {
188 return base.CreateParams;
192 protected override Size DefaultSize {
194 return new Size(104, 24);
197 #endregion // Protected Instance Properties
199 #region Public Instance Methods
200 public override string ToString() {
201 return base.ToString() + ", CheckState: " + (int)check_state;
203 #endregion // Public Instance Methods
205 #region Protected Instance Methods
206 protected override AccessibleObject CreateAccessibilityInstance() {
207 return base.CreateAccessibilityInstance ();
210 protected virtual void OnAppearanceChanged(EventArgs e) {
211 if (AppearanceChanged != null) {
212 AppearanceChanged(this, e);
216 protected virtual void OnCheckedChanged(EventArgs e) {
217 if (CheckedChanged != null) {
218 CheckedChanged(this, e);
222 protected virtual void OnCheckStateChanged(EventArgs e) {
223 if (CheckStateChanged != null) {
224 CheckStateChanged(this, e);
228 protected override void OnClick(EventArgs e) {
230 switch(check_state) {
231 case CheckState.Unchecked: {
233 CheckState = CheckState.Indeterminate;
235 CheckState = CheckState.Checked;
240 case CheckState.Indeterminate: {
241 CheckState = CheckState.Checked;
245 case CheckState.Checked: {
246 CheckState = CheckState.Unchecked;
253 protected override void OnHandleCreated(EventArgs e) {
254 base.OnHandleCreated (e);
257 protected override void OnMouseUp(MouseEventArgs e) {
261 protected override bool ProcessMnemonic(char charCode) {
262 return base.ProcessMnemonic (charCode);
264 #endregion // Protected Instance Methods
267 public event EventHandler AppearanceChanged;
268 public event EventHandler CheckedChanged;
269 public event EventHandler CheckStateChanged;
272 #region Internal drawing code
273 internal override bool CheckRedraw() {
\r
274 this.needs_redraw = true;
\r
279 internal override void Redraw() {
\r
280 StringFormat text_format;
281 Rectangle client_rectangle;
282 Rectangle text_rectangle;
283 Rectangle checkbox_rectangle;
286 client_rectangle = ClientRectangle;
287 text_rectangle = client_rectangle;
288 checkbox_rectangle = new Rectangle(text_rectangle.X, text_rectangle.Y, checkmark_size, checkmark_size);
290 text_format = new StringFormat();
291 text_format.Alignment=StringAlignment.Near;
292 text_format.LineAlignment=StringAlignment.Center;
294 /* Calculate the position of text and checkbox rectangle */
295 if (appearance!=Appearance.Button) {
296 switch(check_alignment) {
297 case ContentAlignment.BottomCenter: {
298 if (client_rectangle.Height<checkmark_size*2) {
299 ClientSize=new Size(client_rectangle.Width, checkmark_size*2);
300 client_rectangle = ClientRectangle;
302 checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
303 checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
304 text_rectangle.X=client_rectangle.X;
305 text_rectangle.Width=client_rectangle.Width;
309 case ContentAlignment.BottomLeft: {
310 checkbox_rectangle.X=client_rectangle.Left;
311 checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
312 text_rectangle.X=client_rectangle.X+checkmark_size;
313 text_rectangle.Width=client_rectangle.Width-checkmark_size;
317 case ContentAlignment.BottomRight: {
318 checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
319 checkbox_rectangle.Y=client_rectangle.Bottom-checkmark_size;
320 text_rectangle.X=client_rectangle.X;
321 text_rectangle.Width=client_rectangle.Width-checkmark_size;
325 case ContentAlignment.MiddleCenter: {
326 checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
327 checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
328 text_rectangle.X=client_rectangle.X;
329 text_rectangle.Width=client_rectangle.Width;
334 case ContentAlignment.MiddleLeft: {
335 checkbox_rectangle.X=client_rectangle.Left;
336 checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
337 text_rectangle.X=client_rectangle.X+checkmark_size;
338 text_rectangle.Width=client_rectangle.Width-checkmark_size;
342 case ContentAlignment.MiddleRight: {
343 checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
344 checkbox_rectangle.Y=(client_rectangle.Bottom-client_rectangle.Top)/2-checkmark_size/2;
345 text_rectangle.X=client_rectangle.X;
346 text_rectangle.Width=client_rectangle.Width-checkmark_size;
350 case ContentAlignment.TopCenter: {
351 if (client_rectangle.Height<checkmark_size*2) {
352 ClientSize=new Size(client_rectangle.Width, checkmark_size*2);
353 client_rectangle = ClientRectangle;
355 checkbox_rectangle.X=(client_rectangle.Right-client_rectangle.Left)/2-checkmark_size/2;
356 checkbox_rectangle.Y=client_rectangle.Top;
357 text_rectangle.X=client_rectangle.X;
358 text_rectangle.Y=checkmark_size;
359 text_rectangle.Width=client_rectangle.Width;
360 text_rectangle.Height=client_rectangle.Height-checkmark_size;
364 case ContentAlignment.TopLeft: {
365 checkbox_rectangle.X=client_rectangle.Left;
366 checkbox_rectangle.Y=client_rectangle.Top;
367 text_rectangle.X=client_rectangle.X+checkmark_size;
368 text_rectangle.Width=client_rectangle.Width-checkmark_size;
372 case ContentAlignment.TopRight: {
373 checkbox_rectangle.X=client_rectangle.Right-checkmark_size;
374 checkbox_rectangle.Y=client_rectangle.Top;
375 text_rectangle.X=client_rectangle.X;
376 text_rectangle.Width=client_rectangle.Width-checkmark_size;
381 text_rectangle.X=client_rectangle.X;
382 text_rectangle.Width=client_rectangle.Width;
385 /* Set the horizontal alignment of our text */
386 switch(text_alignment) {
387 case ContentAlignment.BottomLeft:
388 case ContentAlignment.MiddleLeft:
389 case ContentAlignment.TopLeft: {
390 text_format.Alignment=StringAlignment.Near;
394 case ContentAlignment.BottomCenter:
395 case ContentAlignment.MiddleCenter:
396 case ContentAlignment.TopCenter: {
397 text_format.Alignment=StringAlignment.Center;
401 case ContentAlignment.BottomRight:
402 case ContentAlignment.MiddleRight:
403 case ContentAlignment.TopRight: {
404 text_format.Alignment=StringAlignment.Far;
409 /* Set the vertical alignment of our text */
410 switch(text_alignment) {
411 case ContentAlignment.TopLeft:
412 case ContentAlignment.TopCenter:
413 case ContentAlignment.TopRight: {
414 text_format.LineAlignment=StringAlignment.Near;
418 case ContentAlignment.BottomLeft:
419 case ContentAlignment.BottomCenter:
420 case ContentAlignment.BottomRight: {
421 text_format.LineAlignment=StringAlignment.Far;
425 case ContentAlignment.MiddleLeft:
426 case ContentAlignment.MiddleCenter:
427 case ContentAlignment.MiddleRight: {
428 text_format.LineAlignment=StringAlignment.Center;
433 ButtonState state = ButtonState.Normal;
434 if (FlatStyle == FlatStyle.Flat) {
435 state |= ButtonState.Flat;
439 state |= ButtonState.Checked;
442 if (ThreeState && (CheckState == CheckState.Indeterminate)) {
443 state |= ButtonState.Checked;
444 state |= ButtonState.Pushed;
449 sb=new SolidBrush(BackColor);
450 this.DeviceContext.FillRectangle(sb, ClientRectangle);
453 if (appearance!=Appearance.Button) {
454 ControlPaint.DrawCheckBox(this.DeviceContext, checkbox_rectangle, state);
456 ControlPaint.DrawButton(this.DeviceContext, text_rectangle, state);
459 /* Place the text; to be compatible with Windows place it after the checkbox has been drawn */
460 sb=new SolidBrush(ForeColor);
461 this.DeviceContext.DrawString(Text, Font, sb, text_rectangle, text_format);
465 ControlPaint.DrawFocusRectangle(this.DeviceContext, text_rectangle);
469 private void RedrawEvent(object sender, System.EventArgs e) {
473 #endregion // Internal drawing code