/// <summary> /// Initializes a new instance of the <see cref="ActionProgressForm"/> class. /// </summary> /// <param name="callback">The background worker callback.</param> /// <param name="levelCount">The action level count.</param> /// <param name="caption">The form caption.</param> public ActionProgressForm(DoBackgroundWorkDelegate callback, int levelCount, string caption) { if (levelCount <= 0) { throw new Exception(); } _backgroundWorkerCallback = callback; InitializeComponent(); // update table layout panel properties tableLayoutPanel1.AutoSize = true; tableLayoutPanel1.AutoSizeMode = AutoSizeMode.GrowAndShrink; tableLayoutPanel1.RowCount = 2 * levelCount + 2; tableLayoutPanel1.ColumnCount = 1; // create action progress bars ProgressBar[] progressBars = new ProgressBar[levelCount]; Label[] labels = new Label[levelCount]; for (int i = 0; i < levelCount; i++) { Label label = new Label(); labels[i] = label; label.BackColor = Color.White; label.Dock = DockStyle.Fill; label.TextAlign = ContentAlignment.BottomCenter; tableLayoutPanel1.Controls.Add(label, 0, 2 * i); ProgressBar progressBar = new ProgressBar(); progressBars[i] = progressBar; progressBar.Width = 500; progressBar.Height = 30; progressBar.Maximum = 0; progressBar.Maximum = progressBar.Width; tableLayoutPanel1.Controls.Add(progressBar, 0, 2 * i + 1); } // create textbox for logging TextBox logText = new TextBox(); _logText = logText; logText.Multiline = true; logText.Width = 500; logText.Height = 150; logText.ScrollBars = ScrollBars.Vertical; logText.ReadOnly = true; tableLayoutPanel1.Controls.Add(logText, 0, 2 * levelCount); // create the button for canceling an action Button buttonCancel = new Button(); _cancelButton = buttonCancel; buttonCancel.Width = 100; buttonCancel.Height = 30; buttonCancel.Text = "Cancel"; buttonCancel.Margin = new Padding(200, 10, 200, 10); buttonCancel.Click += new EventHandler(cancelButton_Click); tableLayoutPanel1.Controls.Add(buttonCancel, 0, 2 * levelCount + 1); this.AutoSize = true; this.AutoSizeMode = AutoSizeMode.GrowAndShrink; this.Text = caption; _progressHandler = new ActionProgressHandler(progressBars, labels, logText); _progressController = new ActionProgressController(_progressHandler); _progressBars = progressBars; _labels = labels; }
/// <summary> /// Called when action step is changed. /// </summary> /// <param name="actionProgressController">The action progress controller.</param> /// <param name="actionStep">The action step.</param> /// <param name="canCancel">Indicates that action can be canceled.</param> /// <returns> /// <b>False</b> if action is canceled; otherwise <b>true</b>. /// </returns> public bool OnActionStep( ActionProgressController actionProgressController, double actionStep, bool canCancel) { if (canCancel && _cancelRequested) { return(false); } // action description string actionDescription = actionProgressController.ActionDescription; // action level int actionLevel = actionProgressController.ActionLevel; // is this first step of action bool firstStepOfAction = actionStep == 0; // if action level has progress bar if (actionLevel < _progressBars.Length) { // show progress value ProgressBar progressBar = _progressBars[actionLevel]; double progress = 0; if (actionProgressController.StepCount > 0) { progress = actionStep / actionProgressController.StepCount; InvokeSetProgressBarValue(progressBar, progress); } // get current step precentage description string percentageDescription; if (actionProgressController.StepCount > 0) { percentageDescription = string.Format(CultureInfo.InvariantCulture, "{0:f1}%", progress * 100); } else { percentageDescription = "0%"; } // get current label description string labelDescription; if (actionDescription != null) { labelDescription = string.Format("{0}... ({1})", actionDescription, percentageDescription); } else { labelDescription = percentageDescription; } InvokeSetLabelText(_labels[actionLevel], labelDescription); if (firstStepOfAction) { for (int i = actionLevel + 1; i < _progressBars.Length; i++) { InvokeSetProgressBarValue(_progressBars[i], 0.0); InvokeSetLabelText(_labels[i], string.Empty); } } } // add action description to Log TextBox string logMessage = actionDescription; if (logMessage != null) { // if action is first step if (firstStepOfAction) { logMessage = string.Format("{0}...", logMessage); } // if action is finished else if (actionProgressController.IsFinished) { logMessage = string.Format(" Finished ({0}).", logMessage); } else { logMessage = ""; } // if log message is created if (logMessage != "") { string prevMessage = null; if (!_actionLevelToMessage.TryGetValue(actionLevel, out prevMessage)) { prevMessage = null; } // if log message is changed if (prevMessage != logMessage) { _actionLevelToMessage[actionLevel] = logMessage; logMessage = logMessage.PadLeft(logMessage.Length + actionLevel * 4, ' '); if (_logTextBox.InvokeRequired) { _logTextBox.Invoke(new AddLogMessageDelegate(AddLogMessage), logMessage); } else { AddLogMessage(logMessage); } } } } return(true); }