Thu Jan 16 19:20:00 GMT+2 2003 Joel Basson <jstrike@mweb.co.za>
[mono.git] / mcs / class / System.Windows.Forms / Gtk / CheckBox.cs
1 //              
2 //                      System.Windows.Forms.CheckBox
3 //
4 //                      Author: 
5 //                                      Joel Basson                     (jstrike@mweb.co.za)
6 //                                      Alberto Fernandez       (infjaf00@yahoo.es)
7 //
8 //
9
10 using System.Drawing;
11 using System.ComponentModel;
12
13 namespace System.Windows.Forms {
14
15         /// <summary>\r
16         /// Represents a Windows CheckBox control.\r
17         ///\r
18         /// </summary>\r
19
20         public class CheckBox: ButtonBase{
21
22                 private bool autocheck = false;
23                 private bool threeState = false;
24                 private CheckState checkState;
25
26                 public CheckBox () : base (){
27                         AutoCheck = true;
28                         Checked = false;
29                         ThreeState = false;
30                 }
31                 public Appearance Appearance{
32                         get{ 
33                                 if ( (Widget as Gtk.CheckButton).DrawIndicator)
34                                         return Appearance.Normal;
35                                 return Appearance.Button;
36                         }
37                         set{
38                                 if (!Enum.IsDefined (typeof(Appearance), value) )
39                                         throw new InvalidEnumArgumentException();
40                                 if (value != Appearance){
41                                         if (value == Appearance.Normal)
42                                                 (Widget as Gtk.CheckButton).DrawIndicator = true;
43                                         else
44                                                 (Widget as Gtk.CheckButton).DrawIndicator = false;
45                                         OnAppearanceChanged (EventArgs.Empty);                          
46                                 }
47                         }
48                 }
49                 public bool AutoCheck {
50                         get { return autocheck;  }
51                         set { autocheck = value; }
52                 }
53                 [MonoTODO]
54                 public ContentAlignment CheckAlign {
55                         get { return ContentAlignment.MiddleLeft; }
56                         set {
57                                 if (!Enum.IsDefined (typeof (ContentAlignment), value)){
58                                         throw new InvalidEnumArgumentException ("CheckAlign");
59                                 }
60                         }
61                 }
62                 public bool Checked {
63                         get { return (this.CheckState != CheckState.Unchecked); }
64                         set { this.CheckState = (value) ? CheckState.Checked : CheckState.Unchecked;}
65                 }
66                 public CheckState CheckState{
67                         get{ return checkState; }
68                         set{
69                                 if (! Enum.IsDefined ( typeof(CheckState), value) )
70                                         throw new InvalidEnumArgumentException();
71                                 checkState = value;
72                                 switch (value){
73                                         case CheckState.Indeterminate:
74                                                 (Widget as Gtk.CheckButton).Inconsistent = true;
75                                                 break;
76                                         case CheckState.Checked:
77                                                 (Widget as Gtk.CheckButton).Inconsistent = false;
78                                                 (Widget as Gtk.CheckButton).Active = true;
79                                                 break;
80                                         case CheckState.Unchecked:
81                                                 (Widget as Gtk.CheckButton).Inconsistent = false;
82                                                 (Widget as Gtk.CheckButton).Active = false;
83                                                 break;
84                                 }
85                                 
86                         }
87                 }
88                 protected override Size DefaultSize {
89                         get{ return new Size(104, 24);}
90                 }
91                 public bool ThreeState {
92                         get { return threeState; } 
93                         set { threeState = value; }
94                 }
95                 protected virtual void OnAppearanceChanged( EventArgs e){
96                         if (AppearanceChanged != null)
97                                 AppearanceChanged (this, e);
98                 }
99                 protected virtual void OnCheckedChanged( EventArgs e){
100                         if (CheckedChanged != null)
101                                 CheckedChanged (this, e);
102                 }
103                 protected virtual void OnCheckStateChanged(EventArgs e){
104                         if (CheckStateChanged != null)
105                                 CheckStateChanged (this, e);
106                 }
107                 public override string ToString(){
108                         return "System.Windows.Forms.CheckBox, CheckState: " +
109                                 (int) this.CheckState;
110                 }
111                 
112                 public event EventHandler AppearanceChanged;
113                 public event EventHandler CheckedChanged;
114                 public event EventHandler CheckStateChanged;
115                 public new event EventHandler DoubleClick;\r
116                 
117                 
118                 
119                 internal override Gtk.Widget CreateWidget () {
120                         Gtk.CheckButton cbox = new Gtk.CheckButton();
121                         cbox.Add (label.Widget);
122                         return cbox;    
123                 }
124                 internal override void ConnectEvents(){
125                         (Widget as Gtk.CheckButton).Toggled += new EventHandler (GtkToggled);
126                 }
127                 
128                 // Lock variable.
129                 private bool started = false;
130                 private void GtkToggled (object o, EventArgs e){
131                         if (started)
132                                 return;
133                         started = true;
134                         if (AutoCheck){
135                                 if (this.CheckState == CheckState.Indeterminate){
136                                         this.CheckState = CheckState.Unchecked;
137                                         OnCheckedChanged(e);
138                                         OnCheckStateChanged(e);                                 
139                                 }
140                                 else if ((this.CheckState == CheckState.Checked) && (this.ThreeState)) {
141                                         this.CheckState = CheckState.Indeterminate;
142                                         OnCheckStateChanged (e);
143                                 }
144                                 else{
145                                         this.Checked = !this.Checked;
146                                         OnCheckedChanged(e);
147                                         OnCheckStateChanged(e);
148                                 }
149                                         
150                         }
151                         else{
152                                 this.CheckState = checkState;
153                         }
154                         started = false;
155                         
156                 }               
157         }
158 }