Xamarin-4959: Fix copy of clipboard data after app exits
[mono.git] / mcs / class / Managed.Windows.Forms / System.Windows.Forms / ProgressBar.cs
index 0fa380b92eb7b9c0bae43e65747c57b1d23625cf..a7f5cfc993b19288ce9ab3222420971c2a024523 100644 (file)
 // 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-2005 Novell, Inc.
+// Copyright (C) 2004-2006 Novell, Inc.
 //
 // Authors:
 //             Jordi Mas i Hernandez   jordi@ximian.com
+//             Peter Dennis Bartok     pbartok@novell.com
 //
 //
 
-
 using System.Drawing;
 using System.ComponentModel;
 using System.Drawing.Imaging;
 using System.Drawing.Drawing2D;
+using System.Runtime.InteropServices;
 
 namespace System.Windows.Forms
 {
        [DefaultProperty ("Value")]
-       public sealed class ProgressBar : Control
+       [DefaultBindingProperty ("Value")]
+       [ClassInterface (ClassInterfaceType.AutoDispatch)]
+       [ComVisible (true)]
+       public class ProgressBar : Control
        {
                #region Local Variables
                private int maximum;
                private int minimum;
                internal int step;
-               internal int val;               
+               internal int val;
+               internal DateTime start = DateTime.Now;
                internal Rectangle client_area = new Rectangle ();
+               internal ProgressBarStyle style;
+               Timer marquee_timer;
+               bool right_to_left_layout;
+               private static readonly Color defaultForeColor = SystemColors.Highlight;
                #endregion      // Local Variables
 
                #region events
-               [Browsable (false)]
-               [EditorBrowsable (EditorBrowsableState.Never)]          
-               public new event EventHandler BackColorChanged;
+               static object RightToLeftLayoutChangedEvent = new object ();
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler BackgroundImageChanged;
+               public new event EventHandler BackgroundImageChanged {
+                       add { base.BackgroundImageChanged += value; }
+                       remove { base.BackgroundImageChanged -= value; }
+               }
                
-               [Browsable (false)]
-               [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler CausesValidationChanged;
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public new event EventHandler BackgroundImageLayoutChanged {
+                       add     { base.BackgroundImageLayoutChanged += value; }
+                       remove { base.BackgroundImageLayoutChanged -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler DoubleClick;
+               public new event EventHandler CausesValidationChanged {
+                       add { base.CausesValidationChanged += value; }
+                       remove { base.CausesValidationChanged -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler Enter;
+               public new event EventHandler DoubleClick {
+                       add { base.DoubleClick += value; }
+                       remove { base.DoubleClick -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler FontChanged;
+               public new event EventHandler Enter {
+                       add { base.Enter += value; }
+                       remove { base.Enter -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler ForeColorChanged;
+               public new event EventHandler FontChanged {
+                       add { base.FontChanged += value; }
+                       remove { base.FontChanged -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler ImeModeChanged;
+               public new event EventHandler ImeModeChanged {
+                       add { base.ImeModeChanged += value; }
+                       remove { base.ImeModeChanged -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event KeyEventHandler KeyDown;
+               public new event KeyEventHandler KeyDown {
+                       add { base.KeyDown += value; }
+                       remove { base.KeyDown -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event KeyPressEventHandler KeyPress;
+               public new event KeyPressEventHandler KeyPress {
+                       add { base.KeyPress += value; }
+                       remove { base.KeyPress -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event KeyEventHandler KeyUp;
+               public new event KeyEventHandler KeyUp {
+                       add { base.KeyUp += value; }
+                       remove { base.KeyUp -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler Leave;
+               public new event EventHandler Leave {
+                       add { base.Leave += value; }
+                       remove { base.Leave -= value; }
+               }
                
-               [Browsable (false)]
-               [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event PaintEventHandler Paint;
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               [Browsable(false)]
+               public new event MouseEventHandler MouseDoubleClick {
+                       add { base.MouseDoubleClick += value; }
+                       remove { base.MouseDoubleClick -= value; }
+               }
+               
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public new event EventHandler PaddingChanged {
+                       add { base.PaddingChanged += value; }
+                       remove { base.PaddingChanged -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler RightToLeftChanged;
+               public new event PaintEventHandler Paint {
+                       add { base.Paint += value; }
+                       remove { base.Paint -= value; }
+               }
+               
+               public event EventHandler RightToLeftLayoutChanged {
+                       add { Events.AddHandler (RightToLeftLayoutChangedEvent, value); }
+                       remove { Events.RemoveHandler (RightToLeftLayoutChangedEvent, value); }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler TabStopChanged;
+               public new event EventHandler TabStopChanged {
+                       add { base.TabStopChanged += value; }
+                       remove { base.TabStopChanged -= value; }
+               }
                
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public new event EventHandler TextChanged;
+               public new event EventHandler TextChanged {
+                       add { base.TextChanged += value; }
+                       remove { base.TextChanged -= value; }
+               }
                #endregion Events
 
                #region Public Constructors
@@ -117,13 +181,18 @@ namespace System.Windows.Forms
                        step = 10;
                        val = 0;
 
-                       base.Paint += new PaintEventHandler (OnPaintPB);
                        base.Resize += new EventHandler (OnResizeTB);
 
                        SetStyle (ControlStyles.UserPaint | 
                                ControlStyles.Selectable | 
                                ControlStyles.ResizeRedraw | 
-                               ControlStyles.Opaque, false);
+                               ControlStyles.Opaque |
+                               ControlStyles.UseTextForAccessibility
+                               , false);
+
+                       force_double_buffer = true;
+                       
+                       ForeColor = defaultForeColor;
                }
                #endregion      // Public Constructors
 
@@ -139,16 +208,6 @@ namespace System.Windows.Forms
                        }
                }
 
-               // Setting this property in MS .Net 1.1 does not have any visual effect and it
-               // does not fire a BackColorChanged event
-               [Browsable (false)]
-               [EditorBrowsable (EditorBrowsableState.Never)]
-               public override Color BackColor
-               {
-                       get { return base.BackColor; }
-                       set { base.BackColor = value; }
-               }
-
                // Setting this property in MS .Net 1.1 does not have any visual effect and it
                // does not fire a BackgroundImageChanged event
                [Browsable (false)]
@@ -159,19 +218,19 @@ namespace System.Windows.Forms
                        set { base.BackgroundImage = value; }
                }
 
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public override ImageLayout BackgroundImageLayout {
+                               get     { return base.BackgroundImageLayout; }
+                               set { base.BackgroundImageLayout = value; }
+               }
+
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
                public new bool CausesValidation
                {
                        get { return base.CausesValidation; }
-                       set {
-                               if (base.CausesValidation == value)
-                                       return;
-
-                               base.CausesValidation = value;
-                               if (CausesValidationChanged != null)
-                                       CausesValidationChanged (this, new EventArgs ());
-                       }
+                       set { base.CausesValidation = value; }
                }
 
                protected override CreateParams CreateParams
@@ -189,24 +248,20 @@ namespace System.Windows.Forms
                        get { return ThemeEngine.Current.ProgressBarDefaultSize; }
                }
 
-               // Setting this property in MS .Net 1.1 does not have any visual effect and it
-               // does not fire a FontChanged event
-               [Browsable (false)]
-               [EditorBrowsable (EditorBrowsableState.Never)]
-               public override Font Font
-               {
-                       get { return base.Font; }
-                       set { base.Font = value; }
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               protected override bool DoubleBuffered {
+                               get { return base.DoubleBuffered; }
+                               set { base.DoubleBuffered = value; }
                }
 
                // Setting this property in MS .Net 1.1 does not have any visual effect and it
                // does not fire a FontChanged event
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
-               public override Color ForeColor
+               public override Font Font
                {
-                       get { return base.ForeColor; }
-                       set { base.ForeColor = value; }
+                       get { return base.Font; }
+                       set { base.Font = value; }
                }
 
                [Browsable (false)]
@@ -214,15 +269,7 @@ namespace System.Windows.Forms
                public new ImeMode ImeMode
                {
                        get { return base.ImeMode; }
-                       set
-                       {
-                               if (value == base.ImeMode)
-                                       return;
-
-                               base.ImeMode = value;
-                               if (ImeModeChanged != null)
-                                       ImeModeChanged (this, EventArgs.Empty);
-                       }
+                       set { base.ImeMode = value; }
                }
 
                [RefreshProperties(RefreshProperties.Repaint)]
@@ -234,10 +281,12 @@ namespace System.Windows.Forms
                        }
                        set {
                                if (value < 0)
-                                       throw new ArgumentException(
+                                       throw new ArgumentOutOfRangeException ("Maximum", 
                                                string.Format("Value '{0}' must be greater than or equal to 0.", value ));
 
                                maximum = value;
+                               minimum = Math.Min (minimum, maximum);
+                               val = Math.Min (val, maximum);
                                Refresh ();
                        }
                }
@@ -250,29 +299,35 @@ namespace System.Windows.Forms
                        }
                        set {
                                if (value < 0)
-                                       throw new ArgumentException(
+                                       throw new ArgumentOutOfRangeException ("Minimum", 
                                                string.Format("Value '{0}' must be greater than or equal to 0.", value ));
 
                                minimum = value;
+                               maximum = Math.Max (maximum, minimum);
+                               val = Math.Max (val, minimum);
                                Refresh ();
                        }
                }
 
-               [Browsable (false)]
-               [EditorBrowsable (EditorBrowsableState.Never)]
-               public override RightToLeft RightToLeft
-               {
-                       get { return base.RightToLeft; }
-                       set {
-                               if (base.RightToLeft == value)
-                                       return;
-
-                               base.RightToLeft = value;
-
-                               if (RightToLeftChanged != null)
-                                       RightToLeftChanged (this, EventArgs.Empty);
-
-                       }
+               [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
+               [Browsable(false)]
+               [EditorBrowsable(EditorBrowsableState.Never)]
+               public new Padding Padding {
+                       get { return base.Padding; }
+                       set { base.Padding = value; }
+               }
+                       
+               [Localizable(true)]
+               [DefaultValue(false)]
+               [MonoTODO ("RTL is not supported")]
+               public virtual bool RightToLeftLayout {
+                               get { return right_to_left_layout;}
+                               set     { 
+                                       if (right_to_left_layout != value) {
+                                               right_to_left_layout = value;
+                                               OnRightToLeftLayoutChanged (EventArgs.Empty);
+                                       }
+                               }               
                }
 
                [DefaultValue (10)]
@@ -285,21 +340,61 @@ namespace System.Windows.Forms
                        }
                }
 
+               [Browsable (true)]
+               [DefaultValue (ProgressBarStyle.Blocks)]
+               [EditorBrowsable (EditorBrowsableState.Always)]
+               public ProgressBarStyle Style {
+                       get {
+                               return style;
+                       }
+
+                       set {
+                               if (value != ProgressBarStyle.Blocks && value != ProgressBarStyle.Continuous
+                                               && value != ProgressBarStyle.Marquee)
+                                       throw new InvalidEnumArgumentException ("value", unchecked((int)value), typeof (ProgressBarStyle));
+                               if (style != value) {
+                                       style = value;
+
+                                       if (style == ProgressBarStyle.Marquee) {
+                                               if (marquee_timer == null) {
+                                                       marquee_timer = new Timer ();
+                                                       marquee_timer.Interval = 10;
+                                                       marquee_timer.Tick += new EventHandler (marquee_timer_Tick);
+                                               }
+                                               marquee_timer.Start ();
+                                       } else {
+                                               if (marquee_timer != null) {
+                                                       marquee_timer.Stop ();
+                                               }
+                                               Refresh ();
+                                       }
+                               }
+                       }
+               }
+
+               void marquee_timer_Tick (object sender, EventArgs e)
+               {
+                       Invalidate ();
+               }
+               
+               int marquee_animation_speed = 100;
+               [DefaultValue (100)]
+               public int MarqueeAnimationSpeed {
+                       get {
+                               return marquee_animation_speed;
+                       }
+
+                       set {
+                               marquee_animation_speed = value;
+                       }
+               }
+
                [Browsable (false)]
                [EditorBrowsable (EditorBrowsableState.Never)]
                public new bool TabStop
                {
                        get { return base.TabStop; }
-                       set {
-                               if (base.TabStop == value)
-                                       return;
-
-                               base.TabStop = value;
-
-                               if (TabStopChanged != null)
-                                       TabStopChanged (this, EventArgs.Empty);
-
-                       }
+                       set { base.TabStop = value; }
                }
 
                [Browsable (false)]
@@ -308,16 +403,7 @@ namespace System.Windows.Forms
                public override string Text
                {
                        get { return base.Text; }
-                       set
-                       {
-                               if (value == base.Text)
-                                       return;
-
-                               if (TextChanged != null)
-                                       TextChanged (this, EventArgs.Empty);
-
-                               Refresh ();
-                       }
+                       set { base.Text = value; }
                }
 
                [Bindable(true)]
@@ -329,9 +415,7 @@ namespace System.Windows.Forms
                        }
                        set {
                                if (value < Minimum || value > Maximum)
-                                       throw new ArgumentException(
-                                               string.Format("'{0}' is not a valid value for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'", value));
-
+                                       throw new ArgumentOutOfRangeException ("Value", string.Format("'{0}' is not a valid value for 'Value'. 'Value' should be between 'Minimum' and 'Maximum'", value));
                                val = value;
                                Refresh ();
                        }
@@ -349,6 +433,9 @@ namespace System.Windows.Forms
 
                public void Increment (int value)
                {
+                       if (Style == ProgressBarStyle.Marquee)
+                               throw new InvalidOperationException ("Increment should not be called if the style is Marquee.");
+
                        int newValue = Value + value;
 
                        if (newValue < Minimum)
@@ -368,27 +455,56 @@ namespace System.Windows.Forms
                        UpdateAreas ();
                }
 
+               protected override void OnBackColorChanged (EventArgs e)
+               {
+                       base.OnBackColorChanged (e);
+               }
+                       
+               protected override void OnForeColorChanged (EventArgs e)
+               {
+                       base.OnForeColorChanged (e);
+               }
+                       
+               protected override void OnHandleDestroyed (EventArgs e)
+               {
+                       base.OnHandleDestroyed (e);
+               }
+                       
+               [EditorBrowsable(EditorBrowsableState.Advanced)]
+               protected virtual void OnRightToLeftLayoutChanged(EventArgs e)
+               {
+                       EventHandler eh = (EventHandler) Events [RightToLeftLayoutChangedEvent];
+                       if (eh != null)
+                               eh (this, e);
+               }
+                       
                public void PerformStep ()
                {
-                       if (Value >= Maximum)
-                               return;
+                       if (Style == ProgressBarStyle.Marquee)
+                               throw new InvalidOperationException ("PerformStep should not be called if the style is Marquee.");
 
-                       Value = Value + Step;
-                       Refresh ();
+                       Increment (Step);
+               }
+
+               [EditorBrowsable (EditorBrowsableState.Never)]
+               public override void ResetForeColor ()
+               {
+                       ForeColor = defaultForeColor;
                }
 
                public override string ToString()
                {
                        return string.Format ("{0}, Minimum: {1}, Maximum: {2}, Value: {3}",
-                               GetType().FullName.ToString (),
-                               Maximum.ToString (),
+                               GetType().FullName,
                                Minimum.ToString (),
+                               Maximum.ToString (),
                                Value.ToString () );
                }
 
                #endregion      // Public Instance Methods
 
                #region Private Instance Methods
+
                private void UpdateAreas ()
                {
                        client_area.X = client_area.Y = 2;
@@ -397,18 +513,19 @@ namespace System.Windows.Forms
                }
 
                private void OnResizeTB (Object o, EventArgs e)
-               {
-                       if (Width <= 0 || Height <= 0)
-                               return;
+               {
+                       if (Width <= 0 || Height <= 0)
+                               return;
 
                        UpdateAreas ();
-               }
+                       Invalidate();   // Invalidate the full surface, blocks will not match
+               }
 
-               private void OnPaintPB (Object o, PaintEventArgs pevent)
+               internal override void OnPaintInternal (PaintEventArgs pevent)
                {
-                        ThemeEngine.Current.DrawProgressBar (pevent.Graphics, pevent.ClipRectangle, this);
-               }               
-               
+                       ThemeEngine.Current.DrawProgressBar (pevent.Graphics, pevent.ClipRectangle, this);
+               }
+
                #endregion
        }
 }