New test.
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ProgressBar.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-2006 Novell, Inc.
21 //
22 // Authors:
23 //              Jordi Mas i Hernandez   jordi@ximian.com
24 //              Peter Dennis Bartok     pbartok@novell.com
25 //
26 //
27
28
29 using System.Drawing;
30 using System.ComponentModel;
31 using System.Drawing.Imaging;
32 using System.Drawing.Drawing2D;
33
34 namespace System.Windows.Forms
35 {
36         [DefaultProperty ("Value")]
37         public sealed class ProgressBar : Control
38         {
39                 #region Local Variables
40                 private int maximum;
41                 private int minimum;
42                 internal int step;
43                 internal int val;
44                 internal Rectangle client_area = new Rectangle ();
45 #if NET_2_0
46                 internal ProgressBarStyle style;
47 #endif          
48                 #endregion      // Local Variables
49
50                 #region events
51                 [Browsable (false)]
52                 [EditorBrowsable (EditorBrowsableState.Never)]          
53                 public new event EventHandler BackColorChanged {
54                         add { base.BackColorChanged += value; }
55                         remove { base.BackColorChanged -= value; }
56                 }
57                 
58                 [Browsable (false)]
59                 [EditorBrowsable (EditorBrowsableState.Never)]
60                 public new event EventHandler BackgroundImageChanged {
61                         add { base.BackgroundImageChanged += value; }
62                         remove { base.BackgroundImageChanged -= value; }
63                 }
64                 
65                 [Browsable (false)]
66                 [EditorBrowsable (EditorBrowsableState.Never)]
67                 public new event EventHandler CausesValidationChanged {
68                         add { base.CausesValidationChanged += value; }
69                         remove { base.CausesValidationChanged -= value; }
70                 }
71                 
72                 [Browsable (false)]
73                 [EditorBrowsable (EditorBrowsableState.Never)]
74                 public new event EventHandler DoubleClick {
75                         add { base.DoubleClick += value; }
76                         remove { base.DoubleClick -= value; }
77                 }
78                 
79                 [Browsable (false)]
80                 [EditorBrowsable (EditorBrowsableState.Never)]
81                 public new event EventHandler Enter {
82                         add { base.Enter += value; }
83                         remove { base.Enter -= value; }
84                 }
85                 
86                 [Browsable (false)]
87                 [EditorBrowsable (EditorBrowsableState.Never)]
88                 public new event EventHandler FontChanged {
89                         add { base.FontChanged += value; }
90                         remove { base.FontChanged -= value; }
91                 }
92                 
93                 [Browsable (false)]
94                 [EditorBrowsable (EditorBrowsableState.Never)]
95                 public new event EventHandler ForeColorChanged {
96                         add { base.ForeColorChanged += value; }
97                         remove { base.ForeColorChanged -= value; }
98                 }
99                 
100                 [Browsable (false)]
101                 [EditorBrowsable (EditorBrowsableState.Never)]
102                 public new event EventHandler ImeModeChanged {
103                         add { base.ImeModeChanged += value; }
104                         remove { base.ImeModeChanged -= value; }
105                 }
106                 
107                 [Browsable (false)]
108                 [EditorBrowsable (EditorBrowsableState.Never)]
109                 public new event KeyEventHandler KeyDown {
110                         add { base.KeyDown += value; }
111                         remove { base.KeyDown -= value; }
112                 }
113                 
114                 [Browsable (false)]
115                 [EditorBrowsable (EditorBrowsableState.Never)]
116                 public new event KeyPressEventHandler KeyPress {
117                         add { base.KeyPress += value; }
118                         remove { base.KeyPress -= value; }
119                 }
120                 
121                 [Browsable (false)]
122                 [EditorBrowsable (EditorBrowsableState.Never)]
123                 public new event KeyEventHandler KeyUp {
124                         add { base.KeyUp += value; }
125                         remove { base.KeyUp -= value; }
126                 }
127                 
128                 [Browsable (false)]
129                 [EditorBrowsable (EditorBrowsableState.Never)]
130                 public new event EventHandler Leave {
131                         add { base.Leave += value; }
132                         remove { base.Leave -= value; }
133                 }
134                 
135                 [Browsable (false)]
136                 [EditorBrowsable (EditorBrowsableState.Never)]
137                 public new event PaintEventHandler Paint {
138                         add { base.Paint += value; }
139                         remove { base.Paint -= value; }
140                 }
141                 
142                 [Browsable (false)]
143                 [EditorBrowsable (EditorBrowsableState.Never)]
144                 public new event EventHandler RightToLeftChanged {
145                         add { base.RightToLeftChanged += value; }
146                         remove { base.RightToLeftChanged -= value; }
147                 }
148                 
149                 [Browsable (false)]
150                 [EditorBrowsable (EditorBrowsableState.Never)]
151                 public new event EventHandler TabStopChanged {
152                         add { base.TabStopChanged += value; }
153                         remove { base.TabStopChanged -= value; }
154                 }
155                 
156                 [Browsable (false)]
157                 [EditorBrowsable (EditorBrowsableState.Never)]
158                 public new event EventHandler TextChanged {
159                         add { base.TextChanged += value; }
160                         remove { base.TextChanged -= value; }
161                 }
162                 #endregion Events
163
164                 #region Public Constructors
165                 public ProgressBar()
166                 {
167                         maximum = 100;
168                         minimum = 0;
169                         step = 10;
170                         val = 0;
171
172                         base.Resize += new EventHandler (OnResizeTB);
173
174                         SetStyle (ControlStyles.UserPaint | 
175                                 ControlStyles.Selectable | 
176                                 ControlStyles.ResizeRedraw | 
177                                 ControlStyles.Opaque, false);
178                 }
179                 #endregion      // Public Constructors
180
181                 #region Public Instance Properties
182
183                 [Browsable (false)]
184                 [EditorBrowsable (EditorBrowsableState.Never)]
185                 public override bool AllowDrop
186                 {
187                         get { return base.AllowDrop; }
188                         set {
189                                 base.AllowDrop = value;
190                         }
191                 }
192
193                 // Setting this property in MS .Net 1.1 does not have any visual effect and it
194                 // does not fire a BackColorChanged event
195                 [Browsable (false)]
196                 [EditorBrowsable (EditorBrowsableState.Never)]
197                 public override Color BackColor
198                 {
199                         get { return base.BackColor; }
200                         set { base.BackColor = value; }
201                 }
202
203                 // Setting this property in MS .Net 1.1 does not have any visual effect and it
204                 // does not fire a BackgroundImageChanged event
205                 [Browsable (false)]
206                 [EditorBrowsable (EditorBrowsableState.Never)]
207                 public override Image BackgroundImage
208                 {
209                         get { return base.BackgroundImage; }
210                         set { base.BackgroundImage = value; }
211                 }
212
213                 [Browsable (false)]
214                 [EditorBrowsable (EditorBrowsableState.Never)]
215                 public new bool CausesValidation
216                 {
217                         get { return base.CausesValidation; }
218                         set { base.CausesValidation = value; }
219                 }
220
221                 protected override CreateParams CreateParams
222                 {
223                         get { return base.CreateParams; }
224                 }
225
226                 protected override ImeMode DefaultImeMode
227                 {
228                         get { return base.DefaultImeMode; }
229                 }
230
231                 protected override Size DefaultSize
232                 {
233                         get { return ThemeEngine.Current.ProgressBarDefaultSize; }
234                 }
235
236                 // Setting this property in MS .Net 1.1 does not have any visual effect and it
237                 // does not fire a FontChanged event
238                 [Browsable (false)]
239                 [EditorBrowsable (EditorBrowsableState.Never)]
240                 public override Font Font
241                 {
242                         get { return base.Font; }
243                         set { base.Font = value; }
244                 }
245
246                 // Setting this property in MS .Net 1.1 does not have any visual effect and it
247                 // does not fire a FontChanged event
248                 [Browsable (false)]
249                 [EditorBrowsable (EditorBrowsableState.Never)]
250                 public override Color ForeColor
251                 {
252                         get { return base.ForeColor; }
253                         set { base.ForeColor = value; }
254                 }
255
256                 [Browsable (false)]
257                 [EditorBrowsable (EditorBrowsableState.Never)]
258                 public new ImeMode ImeMode
259                 {
260                         get { return base.ImeMode; }
261                         set { base.ImeMode = value; }
262                 }
263
264                 [RefreshProperties(RefreshProperties.Repaint)]
265                 [DefaultValue (100)]
266                 public int Maximum
267                 {
268                         get {
269                                 return maximum;
270                         }
271                         set {
272                                 if (value < 0)
273                                         throw new ArgumentException(
274                                                 string.Format("Value '{0}' must be greater than or equal to 0.", value ));
275
276                                 maximum = value;
277                                 Refresh ();
278                         }
279                 }
280
281                 [RefreshProperties(RefreshProperties.Repaint)]
282                 [DefaultValue (0)]
283                 public int Minimum {
284                         get {
285                                 return minimum;
286                         }
287                         set {
288                                 if (value < 0)
289                                         throw new ArgumentException(
290                                                 string.Format("Value '{0}' must be greater than or equal to 0.", value ));
291
292                                 minimum = value;
293                                 Refresh ();
294                         }
295                 }
296
297                 [Browsable (false)]
298                 [EditorBrowsable (EditorBrowsableState.Never)]
299                 public override RightToLeft RightToLeft
300                 {
301                         get { return base.RightToLeft; }
302                         set { base.RightToLeft = value; }
303                 }
304
305                 [DefaultValue (10)]
306                 public int Step
307                 {
308                         get { return step; }
309                         set {
310                                 step = value;
311                                 Refresh ();
312                         }
313                 }
314
315 #if NET_2_0
316                 [MonoTODO("Implement")]
317                 public ProgressBarStyle Style {
318                         get {
319                                 return style;
320                         }
321
322                         set {
323                                 style = value;
324                         }
325                 }
326 #endif
327
328                 [Browsable (false)]
329                 [EditorBrowsable (EditorBrowsableState.Never)]
330                 public new bool TabStop
331                 {
332                         get { return base.TabStop; }
333                         set { base.TabStop = value; }
334                 }
335
336                 [Browsable (false)]
337                 [EditorBrowsable (EditorBrowsableState.Never)]
338                 [Bindable(false)]
339                 public override string Text
340                 {
341                         get { return base.Text; }
342                         set { base.Text = value; }
343                 }
344
345                 [Bindable(true)]
346                 [DefaultValue (0)]
347                 public int Value
348                 {
349                         get {
350                                 return val;
351                         }
352                         set {
353                                 if (value < Minimum || value > Maximum)
354                                         throw new ArgumentException(
355                                                 string.Format("'{0}' is not a valid value for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'", value));
356
357                                 val = value;
358                                 Refresh ();
359                         }
360                 }
361
362
363                 #endregion      // Protected Instance Properties
364
365                 #region Public Instance Methods
366                 
367                 protected override void CreateHandle ()
368                 {
369                         base.CreateHandle ();
370                 }
371
372                 public void Increment (int value)
373                 {
374                         int newValue = Value + value;
375
376                         if (newValue < Minimum)
377                                 newValue = Minimum;
378
379                         if (newValue > Maximum)
380                                 newValue = Maximum;
381
382                         Value = newValue;
383                         Refresh ();
384                 }
385
386                 protected override void OnHandleCreated (EventArgs e)
387                 {
388                         base.OnHandleCreated (e);
389
390                         UpdateAreas ();
391                 }
392
393                 public void PerformStep ()
394                 {
395                         if (Value >= Maximum)
396                                 return;
397
398                         Value = Maximum < Value + Step ? Maximum : Value + Step;
399                         Refresh ();     // FIXME - calculate delta and only expose that
400                 }
401
402                 public override string ToString()
403                 {
404                         return string.Format ("{0}, Minimum: {1}, Maximum: {2}, Value: {3}",
405                                 GetType().FullName.ToString (),
406                                 Maximum.ToString (),
407                                 Minimum.ToString (),
408                                 Value.ToString () );
409                 }
410
411                 #endregion      // Public Instance Methods
412
413                 #region Private Instance Methods
414                 private void UpdateAreas ()
415                 {
416                         client_area.X = client_area.Y = 2;
417                         client_area.Width = Width - 4;
418                         client_area.Height = Height - 4;
419                 }
420
421                 private void OnResizeTB (Object o, EventArgs e)
422                 {
423                         if (Width <= 0 || Height <= 0)
424                                 return;
425
426                         UpdateAreas ();
427                         Invalidate();   // Invalidate the full surface, blocks will not match
428                 }
429
430                 internal override void OnPaintInternal (PaintEventArgs pevent)
431                 {
432                         ThemeEngine.Current.DrawProgressBar (pevent.Graphics, pevent.ClipRectangle, this);
433                 }               
434                 
435                 #endregion
436         }
437 }