- Timestamp:
- 08/21/13 23:08:47 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/sources/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs
r9868 r9893 21 21 22 22 using System; 23 using System.ComponentModel;24 23 using System.Windows.Forms; 25 24 26 25 namespace HeuristicLab.MainForm.WindowsForms { 27 [View("ProgressView")] 28 [Content(typeof(IProgress), true)] 29 public partial class ProgressView : AsynchronousContentView { 30 private const int DefaultCancelTimeoutMs = 3000; 31 private readonly IView view; 32 33 [Category("Custom"), Description("The time that the process is allowed to exit.")] 34 [DefaultValue(DefaultCancelTimeoutMs)] 35 public int CancelTimeoutMs { get; set; } 36 private bool ShouldSerializeCancelTimeoutMs() { return CancelTimeoutMs != DefaultCancelTimeoutMs; } 37 38 public new IProgress Content { 39 get { return (IProgress)base.Content; } 40 set { base.Content = value; } 26 public sealed partial class ProgressView : UserControl { 27 private readonly Control control; 28 public Control Control { 29 get { return control; } 41 30 } 42 31 43 private Control Control { 44 get { return (Control)view; } 32 private readonly IProgress content; 33 public IProgress Content { 34 get { return content; } 45 35 } 46 36 47 public bool DisposeOnFinish { get; set; } 37 public ProgressView(Control control, IProgress content) 38 : base() { 39 if (control == null) throw new ArgumentNullException("control", "The control is null."); 40 if (content == null) throw new ArgumentNullException("content", "The passed progress is null."); 41 InitializeComponent(); 48 42 49 public ProgressView() { 50 InitializeComponent(); 43 this.control = control; 44 this.content = content; 45 if (content.ProgressState == ProgressState.Started) 46 ShowProgress(); 47 RegisterContentEvents(); 51 48 } 52 49 53 p ublic ProgressView(IView view)54 : this() {55 if (view == null) throw new ArgumentNullException("view", "The view is null.");56 if (!(view is Control)) throw new ArgumentException("The view is not a control.", "view");57 this.view = view;50 private void RegisterContentEvents() { 51 content.StatusChanged += new EventHandler(progress_StatusChanged); 52 content.ProgressValueChanged += new EventHandler(progress_ProgressValueChanged); 53 content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged); 54 content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged); 58 55 } 59 public ProgressView(IView view, IProgress progress) 60 : this(view) { 61 Content = progress; 62 } 63 64 public static ProgressView Attach(IView view, IProgress progress, bool disposeOnFinish = false) { 65 return new ProgressView(view, progress) { 66 DisposeOnFinish = disposeOnFinish 67 }; 68 } 69 70 protected override void RegisterContentEvents() { 71 Content.StatusChanged += new EventHandler(progress_StatusChanged); 72 Content.ProgressValueChanged += new EventHandler(progress_ProgressValueChanged); 73 Content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged); 74 Content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged); 75 base.RegisterContentEvents(); 76 } 77 78 protected override void DeregisterContentEvents() { 79 base.DeregisterContentEvents(); 80 Content.StatusChanged -= new EventHandler(progress_StatusChanged); 81 Content.ProgressValueChanged -= new EventHandler(progress_ProgressValueChanged); 82 Content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged); 83 Content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged); 84 } 85 86 protected override void OnContentChanged() { 87 base.OnContentChanged(); 88 if (Content == null) { 89 HideProgress(); 90 } else { 91 if (Content.ProgressState == ProgressState.Started) 92 ShowProgress(); 93 } 94 } 95 96 protected override void SetEnabledStateOfControls() { 97 base.SetEnabledStateOfControls(); 98 cancelButton.Visible = Content != null && Content.CanBeCanceled; 99 cancelButton.Enabled = Content != null && Content.CanBeCanceled && !ReadOnly; 56 private void DeregisterContentEvents() { 57 content.StatusChanged -= new EventHandler(progress_StatusChanged); 58 content.ProgressValueChanged -= new EventHandler(progress_ProgressValueChanged); 59 content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged); 60 content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged); 100 61 } 101 62 102 63 private void ShowProgress() { 103 if (InvokeRequired) Invoke((Action)ShowProgress); 104 else { 105 if (view != null) { 106 Left = (Control.ClientRectangle.Width / 2) - (Width / 2); 107 Top = (Control.ClientRectangle.Height / 2) - (Height / 2); 108 Anchor = AnchorStyles.None; 64 if (Control.InvokeRequired) { 65 Control.Invoke((Action)ShowProgress); 66 return; 67 } 68 Left = (Control.ClientRectangle.Width / 2) - (Width / 2); 69 Top = (Control.ClientRectangle.Height / 2) - (Height / 2); 70 Anchor = AnchorStyles.None; 109 71 110 LockBackground();111 112 113 } 114 115 116 Visible = true;117 }72 control.Enabled = false; 73 Parent = Control.Parent; 74 BringToFront(); 75 76 UpdateProgressValue(); 77 UpdateProgressStatus(); 78 UpdateCancelButton(); 79 Visible = true; 118 80 } 119 81 … … 121 83 if (InvokeRequired) Invoke((Action)HideProgress); 122 84 else { 123 if (view != null) { 124 Parent = null; 125 UnlockBackground(); 126 } 85 control.Enabled = true; 86 Parent = null; 127 87 Visible = false; 128 88 } … … 138 98 139 99 private void Content_ProgressStateChanged(object sender, EventArgs e) { 140 switch (Content.ProgressState) { 141 case ProgressState.Finished: 142 HideProgress(); 143 if (DisposeOnFinish) { 144 Content = null; 145 Dispose(); 146 } 147 break; 100 switch (content.ProgressState) { 101 case ProgressState.Finished: HideProgress(); break; 148 102 case ProgressState.Canceled: HideProgress(); break; 149 103 case ProgressState.Started: ShowProgress(); break; 104 default: throw new NotSupportedException("The progress state " + content.ProgressState + " is not supported by the ProgressView."); 150 105 } 151 106 } 152 107 153 108 private void Content_CanBeCanceledChanged(object sender, EventArgs e) { 154 SetEnabledStateOfControls();109 UpdateCancelButton(); 155 110 } 156 111 157 private void LockBackground() { 158 if (InvokeRequired) Invoke((Action)LockBackground); 159 else { 160 view.Enabled = false; 161 } 162 } 163 164 private void UnlockBackground() { 165 if (InvokeRequired) Invoke((Action)UnlockBackground); 166 else { 167 view.Enabled = true; 168 } 112 private void UpdateCancelButton() { 113 cancelButton.Visible = content != null && content.CanBeCanceled; 114 cancelButton.Enabled = content != null && content.CanBeCanceled; 169 115 } 170 116 … … 172 118 if (InvokeRequired) Invoke((Action)UpdateProgressValue); 173 119 else { 174 if ( Content != null) {175 double progressValue = Content.ProgressValue;120 if (content != null) { 121 double progressValue = content.ProgressValue; 176 122 if (progressValue <= 0.0 || progressValue > 1.0) { 177 if (progressBar.Style != ProgressBarStyle.Marquee) 178 progressBar.Style = ProgressBarStyle.Marquee; 123 progressBar.Style = ProgressBarStyle.Marquee; 179 124 } else { 180 if (progressBar.Style != ProgressBarStyle.Blocks) 181 progressBar.Style = ProgressBarStyle.Blocks; 125 progressBar.Style = ProgressBarStyle.Blocks; 182 126 progressBar.Value = (int)Math.Round(progressBar.Minimum + progressValue * (progressBar.Maximum - progressBar.Minimum)); 183 127 } … … 188 132 private void UpdateProgressStatus() { 189 133 if (InvokeRequired) Invoke((Action)UpdateProgressStatus); 190 else if ( Content != null)191 statusLabel.Text = Content.Status;134 else if (content != null) 135 statusLabel.Text = content.Status; 192 136 } 193 137 194 138 private void cancelButton_Click(object sender, EventArgs e) { 195 if (Content != null) { 196 try { 197 Content.Cancel(CancelTimeoutMs); 198 ReadOnly = true; 199 cancelButtonTimer.Interval = CancelTimeoutMs; 200 cancelButtonTimer.Start(); 201 } catch (NotSupportedException nse) { 202 PluginInfrastructure.ErrorHandling.ShowErrorDialog(nse); 203 } 204 } 205 } 206 207 private void cancelButtonTimer_Tick(object sender, EventArgs e) { 208 cancelButtonTimer.Stop(); 209 if (Visible) ReadOnly = false; 139 content.Cancel(); 210 140 } 211 141 }
Note: See TracChangeset
for help on using the changeset viewer.