コード例 #1
0
        /// <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;
        }
コード例 #2
0
            /// <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);
            }