source: trunk/eraser6/Eraser/ProgressForm.cs @ 1808

Revision 1808, 5.7 KB checked in by lowjoel, 5 years ago (diff)

Fixed crash when the progress dialog is invoked before any steps have been declared.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1/*
2 * $Id$
3 * Copyright 2008-2010 The Eraser Project
4 * Original Author: Joel Low <lowjoel@users.sourceforge.net>
5 * Modified By:
6 *
7 * This file is part of Eraser.
8 *
9 * Eraser is free software: you can redistribute it and/or modify it under the
10 * terms of the GNU General Public License as published by the Free Software
11 * Foundation, either version 3 of the License, or (at your option) any later
12 * version.
13 *
14 * Eraser is distributed in the hope that it will be useful, but WITHOUT ANY
15 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
16 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
17 *
18 * A copy of the GNU General Public License can be found at
19 * <http://www.gnu.org/licenses/>.
20 */
21
22using System;
23using System.Collections.Generic;
24using System.Linq;
25using System.Drawing;
26using System.Text;
27using System.Windows.Forms;
28
29using Eraser.Manager;
30using Eraser.Util;
31using System.Globalization;
32
33namespace Eraser
34{
35    public partial class ProgressForm : Form
36    {
37        private Task task;
38        private DateTime lastUpdate;
39
40        public ProgressForm(Task task)
41        {
42            InitializeComponent();
43            Theming.ApplyTheme(this);
44            this.task = task;
45            this.lastUpdate = DateTime.Now;
46            this.ActiveControl = hide;
47
48            //Register the event handlers
49            jobTitle.Text = task.UIText;
50            task.ProgressChanged += task_ProgressChanged;
51            task.TaskFinished += task_TaskFinished;
52
53            //Set the current progress
54            if (task.Progress.CurrentStep != null)
55                UpdateProgress((SteppedProgressManager)task.Progress.CurrentStep.Progress,
56                    new ProgressChangedEventArgs(task.Progress.CurrentStep.Progress, null));
57        }
58
59        private void ProgressForm_FormClosed(object sender, FormClosedEventArgs e)
60        {
61            task.ProgressChanged -= task_ProgressChanged;
62            task.TaskFinished -= task_TaskFinished;
63        }
64
65        private void task_ProgressChanged(object sender, ProgressChangedEventArgs e)
66        {
67            if (IsDisposed || !IsHandleCreated)
68                return;
69            if (InvokeRequired)
70            {
71                //Don't update too often - we can slow down the code.
72                if (DateTime.Now - lastUpdate < new TimeSpan(0, 0, 0, 0, 300))
73                    return;
74
75                lastUpdate = DateTime.Now;
76                Invoke((EventHandler<ProgressChangedEventArgs>)task_ProgressChanged, sender, e);
77                return;
78            }
79
80            ErasureTarget target = sender as ErasureTarget;
81            if (target == null)
82                return;
83
84            SteppedProgressManager progress = target.Progress as SteppedProgressManager;
85            if (progress == null)
86                return;
87
88            UpdateProgress(progress, e);
89        }
90
91        private void task_TaskFinished(object sender, EventArgs e)
92        {
93            if (IsDisposed || !IsHandleCreated)
94                return;
95            if (InvokeRequired)
96            {
97                Invoke((EventHandler)task_TaskFinished, sender, e);
98                return;
99            }
100
101            //Update the UI. Set everything to 100%
102            Task task = (Task)sender;
103            timeLeft.Text = item.Text = pass.Text = string.Empty;
104            overallProgressLbl.Text = S._("Total: {0,2:#0.00%}", 1.0);
105            overallProgress.Value = overallProgress.Maximum;
106            itemProgressLbl.Text = "100%";
107            itemProgress.Style = ProgressBarStyle.Continuous;
108            itemProgress.Value = itemProgress.Maximum;
109
110            //Inform the user on the status of the task.
111            LogLevel highestLevel = task.Log.Last().Highest;
112            switch (highestLevel)
113            {
114                case LogLevel.Warning:
115                    status.Text = S._("Completed with warnings");
116                    break;
117                case LogLevel.Error:
118                    status.Text = S._("Completed with errors");
119                    break;
120                case LogLevel.Fatal:
121                    status.Text = S._("Not completed");
122                    break;
123                default:
124                    status.Text = S._("Completed");
125                    break;
126            }
127
128            //Change the Stop button to be a Close button and the Hide button
129            //to be disabled
130            hide.Enabled = false;
131            stop.Text = S._("Close");
132        }
133
134        private void hide_Click(object sender, EventArgs e)
135        {
136            Close();
137        }
138
139        private void stop_Click(object sender, EventArgs e)
140        {
141            if (task.Executing)
142                task.Cancel();
143            Close();
144        }
145
146        private void UpdateProgress(SteppedProgressManager targetProgress, ProgressChangedEventArgs e)
147        {
148            TaskProgressChangedEventArgs e2 = (TaskProgressChangedEventArgs)e.UserState;
149            if (targetProgress.CurrentStep != null)
150                status.Text = targetProgress.CurrentStep.Name;
151
152            if (e2 != null)
153            {
154                item.Text = WrapItemName(e2.ItemName);
155                pass.Text = e2.ItemTotalPasses != 0 ?
156                    S._("{0} out of {1}", e2.ItemPass, e2.ItemTotalPasses) :
157                    e2.ItemPass.ToString(CultureInfo.CurrentCulture);
158            }
159
160            if (targetProgress.TimeLeft >= TimeSpan.Zero)
161                timeLeft.Text = S._("About {0} left", RoundToSeconds(targetProgress.TimeLeft));
162            else
163                timeLeft.Text = S._("Unknown");
164
165            if (targetProgress.Progress >= 0.0f)
166            {
167                itemProgress.Style = ProgressBarStyle.Continuous;
168                itemProgress.Value = (int)(targetProgress.Progress * 1000);
169                itemProgressLbl.Text = targetProgress.Progress.ToString("#0%",
170                    CultureInfo.CurrentCulture);
171            }
172            else
173            {
174                itemProgress.Style = ProgressBarStyle.Marquee;
175                itemProgressLbl.Text = string.Empty;
176            }
177
178            overallProgress.Value = (int)(task.Progress.Progress * 1000);
179            overallProgressLbl.Text = S._("Total: {0,2:#0.00%}", task.Progress.Progress);
180        }
181
182        private string WrapItemName(string itemName)
183        {
184            StringBuilder result = new StringBuilder(itemName.Length);
185            using (Graphics g = item.CreateGraphics())
186            {
187                //Split the long file name into lines which fit into the width of the label
188                while (itemName.Length > 0)
189                {
190                    int chars = 0;
191                    int lines = 0;
192                    g.MeasureString(itemName, item.Font, new SizeF(item.Width - 2, 15),
193                        StringFormat.GenericDefault, out chars, out lines);
194
195                    result.AppendLine(itemName.Substring(0, chars));
196                    itemName = itemName.Remove(0, chars);
197                }
198            }
199
200            return result.ToString();
201        }
202
203        private static TimeSpan RoundToSeconds(TimeSpan span)
204        {
205            return new TimeSpan(span.Ticks - span.Ticks % TimeSpan.TicksPerSecond);
206        }
207    }
208}
Note: See TracBrowser for help on using the repository browser.