Changeset 9933 for stable/HeuristicLab.MainForm.WindowsForms
- Timestamp:
- 09/03/13 15:55:36 (11 years ago)
- Location:
- stable
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
stable
- Property svn:mergeinfo changed
/trunk/sources merged: 9849,9851,9865,9867-9868,9893-9896,9900-9901,9905,9907
- Property svn:mergeinfo changed
-
stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.cs
r9456 r9933 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 ContentView parentView; 26 internal sealed partial class ProgressView : UserControl { 27 private const int defaultControlHeight = 88; 28 private const int collapsedControlHeight = 55; 32 29 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; } 30 private readonly Control control; 31 public Control Control { 32 get { return control; } 41 33 } 42 34 43 public ProgressView() { 44 InitializeComponent(); 45 } 46 public ProgressView(IProgress progress) 47 : this() { 48 Content = progress; 49 } 50 public ProgressView(ContentView parentView) 51 : this() { 52 if (parentView == null) throw new ArgumentNullException("parentView", "The parent view is null."); 53 this.parentView = parentView; 54 } 55 public ProgressView(ContentView parentView, IProgress progress) 56 : this(parentView) { 57 Content = progress; 35 private readonly IProgress content; 36 public IProgress Content { 37 get { return content; } 58 38 } 59 39 60 protected override void RegisterContentEvents() { 61 Content.StatusChanged += new EventHandler(progress_StatusChanged); 62 Content.ProgressValueChanged += new EventHandler(progress_ProgressValueChanged); 63 Content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged); 64 Content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged); 65 base.RegisterContentEvents(); 40 public ProgressView(Control control, IProgress content) 41 : base() { 42 if (control == null) throw new ArgumentNullException("control", "The control is null."); 43 if (content == null) throw new ArgumentNullException("content", "The passed progress is null."); 44 InitializeComponent(); 45 46 this.control = control; 47 this.content = content; 48 if (content.ProgressState == ProgressState.Started) 49 ShowProgress(); 50 RegisterContentEvents(); 66 51 } 67 52 68 protected override void DeregisterContentEvents() { 69 base.DeregisterContentEvents(); 70 Content.StatusChanged -= new EventHandler(progress_StatusChanged); 71 Content.ProgressValueChanged -= new EventHandler(progress_ProgressValueChanged); 72 Content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged); 73 Content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged); 53 /// <summary> 54 /// Clean up any resources being used. 55 /// </summary> 56 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 57 protected override void Dispose(bool disposing) { 58 DeregisterContentEvents(); 59 HideProgress(); 60 61 if (disposing && (components != null)) { 62 components.Dispose(); 63 } 64 base.Dispose(disposing); 74 65 } 75 66 76 protected override void OnContentChanged() { 77 base.OnContentChanged(); 78 if (Content == null) { 79 HideProgress(); 80 } else { 81 if (Content.ProgressState == ProgressState.Started) 82 ShowProgress(); 83 } 67 private void RegisterContentEvents() { 68 content.StatusChanged += new EventHandler(progress_StatusChanged); 69 content.ProgressValueChanged += new EventHandler(progress_ProgressValueChanged); 70 content.ProgressStateChanged += new EventHandler(Content_ProgressStateChanged); 71 content.CanBeCanceledChanged += new EventHandler(Content_CanBeCanceledChanged); 84 72 } 85 86 protected override void SetEnabledStateOfControls() {87 base.SetEnabledStateOfControls();88 c ancelButton.Visible = Content != null && Content.CanBeCanceled;89 c ancelButton.Enabled = Content != null && Content.CanBeCanceled && !ReadOnly;73 private void DeregisterContentEvents() { 74 content.StatusChanged -= new EventHandler(progress_StatusChanged); 75 content.ProgressValueChanged -= new EventHandler(progress_ProgressValueChanged); 76 content.ProgressStateChanged -= new EventHandler(Content_ProgressStateChanged); 77 content.CanBeCanceledChanged -= new EventHandler(Content_CanBeCanceledChanged); 90 78 } 91 79 92 80 private void ShowProgress() { 93 if (InvokeRequired) Invoke((Action)ShowProgress); 94 else { 95 if (parentView != null) { 96 this.Left = (parentView.ClientRectangle.Width / 2) - (this.Width / 2); 97 this.Top = (parentView.ClientRectangle.Height / 2) - (this.Height / 2); 98 this.Anchor = AnchorStyles.None; 81 if (Control.InvokeRequired) { 82 Control.Invoke((Action)ShowProgress); 83 return; 84 } 85 int height = Content.CanBeCanceled ? Height : collapsedControlHeight; 99 86 100 LockBackground(); 87 Left = (Control.ClientRectangle.Width / 2) - (Width / 2); 88 Top = (Control.ClientRectangle.Height / 2) - (height / 2); 89 Anchor = AnchorStyles.None; 101 90 102 if (!parentView.Controls.Contains(this)) 103 parentView.Controls.Add(this); 91 control.Enabled = false; 92 Parent = Control.Parent; 93 BringToFront(); 104 94 105 BringToFront(); 106 } 107 UpdateProgressValue(); 108 UpdateProgressStatus(); 109 Visible = true; 110 } 95 UpdateProgressValue(); 96 UpdateProgressStatus(); 97 UpdateCancelButton(); 98 Visible = true; 111 99 } 112 100 … … 114 102 if (InvokeRequired) Invoke((Action)HideProgress); 115 103 else { 116 if (parentView != null) { 117 if (parentView.Controls.Contains(this)) 118 parentView.Controls.Remove(this); 119 120 UnlockBackground(); 121 } 104 control.Enabled = true; 105 Parent = null; 122 106 Visible = false; 123 107 } … … 133 117 134 118 private void Content_ProgressStateChanged(object sender, EventArgs e) { 135 if (Content.ProgressState == ProgressState.Finished 136 || Content.ProgressState == ProgressState.Canceled) 137 HideProgress(); 138 if (Content.ProgressState == ProgressState.Started) 139 ShowProgress(); 119 switch (content.ProgressState) { 120 case ProgressState.Finished: HideProgress(); break; 121 case ProgressState.Canceled: HideProgress(); break; 122 case ProgressState.Started: ShowProgress(); break; 123 default: throw new NotSupportedException("The progress state " + content.ProgressState + " is not supported by the ProgressView."); 124 } 140 125 } 141 126 142 127 private void Content_CanBeCanceledChanged(object sender, EventArgs e) { 143 SetEnabledStateOfControls();128 UpdateCancelButton(); 144 129 } 145 130 146 private void LockBackground() { 147 if (InvokeRequired) { 148 Invoke((Action)LockBackground); 149 } else { 150 parentView.Locked = true; 151 parentView.ReadOnly = true; 152 Locked = false; 153 ReadOnly = false; 154 } 155 } 131 private void UpdateCancelButton() { 132 cancelButton.Visible = content != null && content.CanBeCanceled; 133 cancelButton.Enabled = content != null && content.CanBeCanceled; 156 134 157 private void UnlockBackground() { 158 if (InvokeRequired) Invoke((Action)UnlockBackground); 159 else { 160 parentView.Locked = false; 161 parentView.ReadOnly = false; 162 Locked = true; 163 ReadOnly = true; 135 if (content != null && content.CanBeCanceled) { 136 Height = defaultControlHeight; 137 } else if (content != null && !content.CanBeCanceled) { 138 Height = collapsedControlHeight; 164 139 } 165 140 } … … 168 143 if (InvokeRequired) Invoke((Action)UpdateProgressValue); 169 144 else { 170 if ( Content != null) {171 double progressValue = Content.ProgressValue;145 if (content != null) { 146 double progressValue = content.ProgressValue; 172 147 if (progressValue <= 0.0 || progressValue > 1.0) { 173 if (progressBar.Style != ProgressBarStyle.Marquee) 174 progressBar.Style = ProgressBarStyle.Marquee; 148 progressBar.Style = ProgressBarStyle.Marquee; 175 149 } else { 176 if (progressBar.Style != ProgressBarStyle.Blocks) 177 progressBar.Style = ProgressBarStyle.Blocks; 150 progressBar.Style = ProgressBarStyle.Blocks; 178 151 progressBar.Value = (int)Math.Round(progressBar.Minimum + progressValue * (progressBar.Maximum - progressBar.Minimum)); 179 152 } … … 184 157 private void UpdateProgressStatus() { 185 158 if (InvokeRequired) Invoke((Action)UpdateProgressStatus); 186 else if ( Content != null)187 statusLabel.Text = Content.Status;159 else if (content != null) 160 statusLabel.Text = content.Status; 188 161 } 189 162 190 163 private void cancelButton_Click(object sender, EventArgs e) { 191 if (Content != null) { 192 try { 193 Content.Cancel(CancelTimeoutMs); 194 ReadOnly = true; 195 cancelButtonTimer.Interval = CancelTimeoutMs; 196 cancelButtonTimer.Start(); 197 } catch (NotSupportedException nse) { 198 PluginInfrastructure.ErrorHandling.ShowErrorDialog(nse); 199 } 200 } 201 } 202 203 private void cancelButtonTimer_Tick(object sender, EventArgs e) { 204 cancelButtonTimer.Stop(); 205 if (Visible) ReadOnly = false; 164 content.Cancel(); 206 165 } 207 166 } -
stable/HeuristicLab.MainForm.WindowsForms/3.3/Controls/ProgressView.designer.cs
r9456 r9933 27 27 private System.ComponentModel.IContainer components = null; 28 28 29 /// <summary> 30 /// Clean up any resources being used. 31 /// </summary> 32 /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> 33 protected override void Dispose(bool disposing) { 34 if (disposing && (components != null)) { 35 components.Dispose(); 36 } 37 base.Dispose(disposing); 38 } 39 29 40 30 #region Component Designer generated code 41 31 … … 45 35 /// </summary> 46 36 private void InitializeComponent() { 47 this.components = new System.ComponentModel.Container();48 37 this.progressBar = new System.Windows.Forms.ProgressBar(); 49 38 this.statusLabel = new System.Windows.Forms.Label(); 50 39 this.cancelButton = new System.Windows.Forms.Button(); 51 40 this.panel = new System.Windows.Forms.Panel(); 52 this.cancelButtonTimer = new System.Windows.Forms.Timer(this.components);53 41 this.panel.SuspendLayout(); 54 42 this.SuspendLayout(); … … 56 44 // progressBar 57 45 // 58 this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 59 46 this.progressBar.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 47 | System.Windows.Forms.AnchorStyles.Right))); 60 48 this.progressBar.Location = new System.Drawing.Point(3, 3); 61 49 this.progressBar.Name = "progressBar"; … … 66 54 // statusLabel 67 55 // 68 this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 69 56 this.statusLabel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 57 | System.Windows.Forms.AnchorStyles.Right))); 70 58 this.statusLabel.Location = new System.Drawing.Point(3, 33); 71 59 this.statusLabel.Name = "statusLabel"; … … 86 74 // panel 87 75 // 88 this.panel.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) 89 | System.Windows.Forms.AnchorStyles.Right))); 76 this.panel.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) 77 | System.Windows.Forms.AnchorStyles.Left) 78 | System.Windows.Forms.AnchorStyles.Right))); 90 79 this.panel.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle; 91 80 this.panel.Controls.Add(this.progressBar); … … 96 85 this.panel.Size = new System.Drawing.Size(360, 88); 97 86 this.panel.TabIndex = 3; 98 //99 // cancelButtonTimer100 //101 this.cancelButtonTimer.Tick += new System.EventHandler(this.cancelButtonTimer_Tick);102 87 // 103 88 // ProgressView … … 118 103 private System.Windows.Forms.Button cancelButton; 119 104 private System.Windows.Forms.Panel panel; 120 private System.Windows.Forms.Timer cancelButtonTimer;121 105 } 122 106 } -
stable/HeuristicLab.MainForm.WindowsForms/3.3/MainForms/MainForm.cs
r9931 r9933 345 345 #endregion 346 346 347 #region progress views 348 private readonly Dictionary<IContent, IProgress> contentProgressLookup = new Dictionary<IContent, IProgress>(); 349 private readonly Dictionary<Control, IProgress> viewProgressLookup = new Dictionary<Control, IProgress>(); 350 private readonly List<ProgressView> progressViews = new List<ProgressView>(); 351 352 /// <summary> 353 /// Adds a <see cref="ProgressView"/> to the <see cref="ContentView"/>s showing the specified content. 354 /// </summary> 355 public IProgress AddOperationProgressToContent(IContent content, string progressMessage, bool addToObjectGraphObjects = true) { 356 if (InvokeRequired) { 357 IProgress result = (IProgress)Invoke((Func<IContent, string, bool, IProgress>)AddOperationProgressToContent, content, progressMessage, addToObjectGraphObjects); 358 return result; 359 } 360 if (contentProgressLookup.ContainsKey(content)) 361 throw new ArgumentException("A progress is already registered for the specified content.", "content"); 362 363 var contentViews = views.Keys.OfType<ContentView>(); 364 if (!contentViews.Any(v => v.Content == content)) 365 throw new ArgumentException("The content is not displayed in a top-level view", "content"); 366 367 if (addToObjectGraphObjects) { 368 var containedObjects = content.GetObjectGraphObjects(); 369 contentViews = contentViews.Where(v => containedObjects.Contains(v.Content)); 370 } else 371 contentViews = contentViews.Where(v => v.Content == content); 372 373 var progress = new Progress(progressMessage, ProgressState.Started); 374 foreach (var contentView in contentViews) { 375 progressViews.Add(new ProgressView(contentView, progress)); 376 } 377 378 contentProgressLookup[content] = progress; 379 return progress; 380 } 381 382 /// <summary> 383 /// Adds a <see cref="ProgressView"/> to the specified view. 384 /// </summary> 385 public IProgress AddOperationProgressToView(Control control, string progressMessage) { 386 var progress = new Progress(progressMessage, ProgressState.Started); 387 AddOperationProgressToView(control, progress); 388 return progress; 389 } 390 391 public void AddOperationProgressToView(Control control, IProgress progress) { 392 if (InvokeRequired) { 393 Invoke((Action<Control, IProgress>)AddOperationProgressToView, control, progress); 394 return; 395 } 396 if (control == null) throw new ArgumentNullException("control", "The view must not be null."); 397 if (progress == null) throw new ArgumentNullException("progress", "The progress must not be null."); 398 399 IProgress oldProgress; 400 if (viewProgressLookup.TryGetValue(control, out oldProgress)) { 401 foreach (var progressView in progressViews.Where(v => v.Content == oldProgress).ToList()) { 402 progressView.Dispose(); 403 progressViews.Remove(progressView); 404 } 405 viewProgressLookup.Remove(control); 406 } 407 408 progressViews.Add(new ProgressView(control, progress)); 409 viewProgressLookup[control] = progress; 410 } 411 412 /// <summary> 413 /// Removes an existing <see cref="ProgressView"/> from the <see cref="ContentView"/>s showing the specified content. 414 /// </summary> 415 public void RemoveOperationProgressFromContent(IContent content, bool finishProgress = true) { 416 if (InvokeRequired) { 417 Invoke((Action<IContent, bool>)RemoveOperationProgressFromContent, content, finishProgress); 418 return; 419 } 420 421 IProgress progress; 422 if (!contentProgressLookup.TryGetValue(content, out progress)) 423 throw new ArgumentException("No progress is registered for the specified content.", "content"); 424 425 if (finishProgress) progress.Finish(); 426 foreach (var progressView in progressViews.Where(v => v.Content == progress).ToList()) { 427 progressView.Dispose(); 428 progressViews.Remove(progressView); 429 } 430 contentProgressLookup.Remove(content); 431 432 } 433 434 /// <summary> 435 /// Removes an existing <see cref="ProgressView"/> from the specified view. 436 /// </summary> 437 public void RemoveOperationProgressFromView(Control control, bool finishProgress = true) { 438 IProgress progress; 439 if (!viewProgressLookup.TryGetValue(control, out progress)) 440 throw new ArgumentException("No progress is registered for the specified control.", "control"); 441 442 if (finishProgress) progress.Finish(); 443 foreach (var progressView in progressViews.Where(v => v.Content == progress).ToList()) { 444 progressView.Dispose(); 445 progressViews.Remove(progressView); 446 } 447 viewProgressLookup.Remove(control); 448 } 449 #endregion 450 347 451 #region create menu and toolbar 348 452 private void CreateGUI() {
Note: See TracChangeset
for help on using the changeset viewer.