Fix bug #395
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / StatusBarPanel.cs
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:
8 //
9 // The above copyright notice and this permission notice shall be
10 // included in all copies or substantial portions of the Software.
11 //
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.
19 //
20 // Copyright (c) 2004-2005 Novell, Inc.
21 //
22 // Authors:
23 //      Jackson Harper (jackson@ximian.com)
24
25 // COMPLETE
26
27 using System;
28 using System.Drawing;
29 using System.ComponentModel;
30 using System.ComponentModel.Design;
31 using System.Runtime.InteropServices;
32
33 namespace System.Windows.Forms {
34         [ToolboxItem (false)]
35         [DefaultProperty("Text")]
36         [DesignTimeVisible(false)]
37         public class StatusBarPanel : Component, ISupportInitialize {
38                 #region Local Variables
39                 private StatusBar parent;
40
41                 private bool initializing;
42                 private string text = String.Empty;
43                 private string tool_tip_text = String.Empty;
44
45                 private Icon icon;
46                 private HorizontalAlignment alignment = HorizontalAlignment.Left;
47                 private StatusBarPanelAutoSize auto_size = StatusBarPanelAutoSize.None;
48                 private StatusBarPanelBorderStyle border_style = StatusBarPanelBorderStyle.Sunken;
49                 private StatusBarPanelStyle style = StatusBarPanelStyle.Text;
50                 private int width = 100;
51                 private int min_width = 10;
52                 internal int X;
53                 
54                 private string name;
55                 private object tag;
56                 #endregion      // Local Variables
57
58                 #region UIA Framework Events
59                 static object UIATextChangedEvent = new object ();
60
61                 internal event EventHandler UIATextChanged {
62                         add { Events.AddHandler (UIATextChangedEvent, value); }
63                         remove { Events.RemoveHandler (UIATextChangedEvent, value); }
64                 }
65
66                 internal void OnUIATextChanged (EventArgs e)
67                 {
68                         EventHandler eh = (EventHandler) Events [UIATextChangedEvent];
69                         if (eh != null)
70                                 eh (this, e);
71                 }
72                 #endregion
73
74                 #region Constructors
75                 public StatusBarPanel ()
76                 {
77                 }
78                 #endregion      // Constructors
79
80                 [DefaultValue(HorizontalAlignment.Left)]
81                 [Localizable(true)]
82                 public HorizontalAlignment Alignment {
83                         get { return alignment; }
84                         set { 
85                                 alignment = value; 
86                                 InvalidateContents ();
87                         }
88                 }
89
90                 [RefreshProperties (RefreshProperties.All)]
91                 [DefaultValue(StatusBarPanelAutoSize.None)]
92                 public StatusBarPanelAutoSize AutoSize {
93                         get { return auto_size; }
94                         set { 
95                                 auto_size = value; 
96                                 Invalidate ();
97                         }
98                 }
99
100                 [DefaultValue(StatusBarPanelBorderStyle.Sunken)]
101                 [DispId(-504)]
102                 public StatusBarPanelBorderStyle BorderStyle {
103                         get { return border_style; }
104                         set { 
105                                 border_style = value; 
106                                 Invalidate ();
107                         }
108                 }
109
110                 [DefaultValue(null)]
111                 [Localizable(true)]
112                 public Icon Icon {
113                         get { return icon; }
114                         set { 
115                                 icon = value; 
116                                 InvalidateContents ();
117                         }
118                 }
119
120                 [DefaultValue(10)]
121                 [Localizable(true)]
122                 [RefreshProperties(RefreshProperties.All)]
123                 public int MinWidth {
124                         get {
125                         /*
126                                 MSDN says that when AutoSize = None then MinWidth is automatically
127                                 set to Width, but neither v1.1 nor v2.0 behave that way.
128                         */
129                                 return min_width;
130                         }
131                         set {
132                                 if (value < 0)
133                                         throw new ArgumentOutOfRangeException ("value");
134
135                                 min_width = value;
136                                 if (min_width > width)
137                                         width = min_width;
138                                 
139                                 Invalidate ();
140                         }
141                 }
142
143                 [Localizable (true)]
144                 public string Name {
145                         get {
146                                 if (name == null)
147                                         return string.Empty;
148                                 return name;
149                         }
150                         set {
151                                 name = value;
152                         }
153                 }
154                 
155                 [DefaultValue(100)]
156                 [Localizable(true)]
157                 public int Width {
158                         get { return width; }
159                         set {
160                                 if (value < 0)
161                                         throw new ArgumentException ("value");
162
163                                 if (initializing)
164                                         width = value;
165                                 else
166                                         SetWidth(value);
167                                 
168                                 Invalidate ();
169                         }
170                 }
171                 
172                 [DefaultValue(StatusBarPanelStyle.Text)]
173                 public StatusBarPanelStyle Style {
174                         get { return style; }
175                         set { 
176                                 style = value; 
177                                 Invalidate ();
178                         }
179                 }
180
181                 [TypeConverter (typeof (StringConverter))]
182                 [Localizable (false)]
183                 [Bindable (true)]
184                 [DefaultValue (null)]
185                 public object Tag {
186                         get {
187                                 return tag;
188                         }
189                         set {
190                                 tag = value;
191                         }
192                 }
193
194                 [DefaultValue("")]
195                 [Localizable(true)]
196                 public string Text {
197                         get { return text; }
198                         set { 
199                                 text = value; 
200                                 InvalidateContents ();
201
202                                 // UIA Framework Event: Text Changed
203                                 OnUIATextChanged (EventArgs.Empty);
204                         }
205                 }
206
207                 [DefaultValue("")]
208                 [Localizable(true)]
209                 public string ToolTipText {
210                         get { return tool_tip_text; }
211                         set { tool_tip_text = value; }
212                 }
213
214                 [Browsable(false)]
215                 public StatusBar Parent {
216                         get { return parent; }
217                 }
218
219                 private void Invalidate ()
220                 {
221                         if (parent == null)
222                                 return;
223                         parent.UpdatePanel (this);
224                 }
225
226                 private void InvalidateContents ()
227                 {
228                         if (parent == null)
229                                 return;
230                         parent.UpdatePanelContents (this);
231                 }
232
233                 internal void SetParent (StatusBar parent)
234                 {
235                         this.parent = parent;
236                 }
237
238                 internal void SetWidth (int width)
239                 {
240                         this.width = width;
241                         if (min_width > this.width)
242                                 this.width = min_width;
243                 }
244
245                 public override string ToString ()
246                 {
247                         return "StatusBarPanel: {" + Text +"}";
248                 }
249
250                 protected override void Dispose (bool disposing)
251                 {
252                 }
253
254                 public void BeginInit ()
255                 {
256                         initializing = true;
257                 }
258
259                 public void EndInit ()
260                 {
261                         if (!initializing)
262                                 return;
263                         
264                         if (min_width > width)
265                                 width = min_width;
266                         
267                         initializing = false;
268                 }
269         }
270 }
271
272