source: branches/eraser6/pluginsRewrite/Eraser/ProgressForm.cs @ 2485

Revision 2485, 6.1 KB checked in by lowjoel, 3 years ago (diff)

Replace the UIText property with ToString?(). Fix the resulting compile errors, too.

  • 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.Plugins;
31using Eraser.Plugins.ExtensionPoints;
32using Eraser.Util;
33using System.Globalization;
34
35namespace Eraser
36{
37    public partial class ProgressForm : Form
38    {
39        private Task task;
40        private DateTime lastUpdate;
41
42        public ProgressForm(Task task)
43        {
44            InitializeComponent();
45            Theming.ApplyTheme(this);
46            this.task = task;
47            this.lastUpdate = DateTime.Now;
48            this.ActiveControl = hide;
49
50            //Register the event handlers
51            jobTitle.Text = task.ToString();
52            task.ProgressChanged += task_ProgressChanged;
53            task.TaskFinished += task_TaskFinished;
54
55            //Set the current progress
56            if (task.Progress.CurrentStep != null)
57                UpdateProgress(task.Progress.CurrentStep.Progress,
58                    new ProgressChangedEventArgs(task.Progress.CurrentStep.Progress, null));
59        }
60
61        private void ProgressForm_FormClosed(object sender, FormClosedEventArgs e)
62        {
63            task.ProgressChanged -= task_ProgressChanged;
64            task.TaskFinished -= task_TaskFinished;
65        }
66
67        private void task_ProgressChanged(object sender, ProgressChangedEventArgs e)
68        {
69            if (IsDisposed || !IsHandleCreated)
70                return;
71            if (InvokeRequired)
72            {
73                //Don't update too often - we can slow down the code.
74                if (DateTime.Now - lastUpdate < new TimeSpan(0, 0, 0, 0, 300))
75                    return;
76
77                lastUpdate = DateTime.Now;
78                Invoke((EventHandler<ProgressChangedEventArgs>)task_ProgressChanged, sender, e);
79                return;
80            }
81
82            IErasureTarget target = sender as IErasureTarget;
83            if (target == null)
84                return;
85
86            UpdateProgress(target.Progress, e);
87        }
88
89        private void task_TaskFinished(object sender, EventArgs e)
90        {
91            if (IsDisposed || !IsHandleCreated)
92                return;
93            if (InvokeRequired)
94            {
95                Invoke((EventHandler)task_TaskFinished, sender, e);
96                return;
97            }
98
99            //Update the UI. Set everything to 100%
100            Task task = (Task)sender;
101            timeLeft.Text = item.Text = pass.Text = string.Empty;
102            overallProgressLbl.Text = S._("Total: {0,2:#0.00%}", 1.0);
103            overallProgress.Value = overallProgress.Maximum;
104            itemProgressLbl.Text = "100%";
105            itemProgress.Style = ProgressBarStyle.Continuous;
106            itemProgress.Value = itemProgress.Maximum;
107
108            //Inform the user on the status of the task.
109            LogLevel highestLevel = task.Log.Last().Highest;
110            switch (highestLevel)
111            {
112                case LogLevel.Warning:
113                    status.Text = S._("Completed with warnings");
114                    break;
115                case LogLevel.Error:
116                    status.Text = S._("Completed with errors");
117                    break;
118                case LogLevel.Fatal:
119                    status.Text = S._("Not completed");
120                    break;
121                default:
122                    status.Text = S._("Completed");
123                    break;
124            }
125
126            //Change the Stop button to be a Close button and the Hide button
127            //to be disabled
128            hide.Enabled = false;
129            stop.Text = S._("Close");
130        }
131
132        private void hide_Click(object sender, EventArgs e)
133        {
134            Close();
135        }
136
137        private void stop_Click(object sender, EventArgs e)
138        {
139            if (task.Executing)
140                task.Cancel();
141            Close();
142        }
143
144        private void UpdateProgress(ProgressManagerBase targetProgress, ProgressChangedEventArgs e)
145        {
146            TaskProgressChangedEventArgs e2 = (TaskProgressChangedEventArgs)e.UserState;
147            {
148                SteppedProgressManager targetProgressStepped =
149                    targetProgress as SteppedProgressManager;
150                if (targetProgressStepped != null && targetProgressStepped.CurrentStep != null)
151                    status.Text = targetProgressStepped.CurrentStep.Name;
152                else
153                    status.Text = S._("Erasing...");
154            }
155
156            if (e2 != null)
157            {
158                item.Text = WrapItemName(e2.ItemName);
159                pass.Text = e2.ItemTotalPasses != 0 ?
160                    S._("{0} out of {1}", e2.ItemPass, e2.ItemTotalPasses) :
161                    e2.ItemPass.ToString(CultureInfo.CurrentCulture);
162            }
163
164            if (targetProgress.TimeLeft >= TimeSpan.Zero)
165                timeLeft.Text = S._("About {0} left", RoundToSeconds(targetProgress.TimeLeft));
166            else
167                timeLeft.Text = S._("Unknown");
168
169            if (!targetProgress.ProgressIndeterminate)
170            {
171                itemProgress.Style = ProgressBarStyle.Continuous;
172                itemProgress.Value = (int)(targetProgress.Progress * 1000);
173                itemProgressLbl.Text = targetProgress.Progress.ToString("#0%",
174                    CultureInfo.CurrentCulture);
175            }
176            else
177            {
178                itemProgress.Style = ProgressBarStyle.Marquee;
179                itemProgressLbl.Text = string.Empty;
180            }
181
182            if (!task.Progress.ProgressIndeterminate)
183            {
184                overallProgress.Style = ProgressBarStyle.Continuous;
185                overallProgress.Value = (int)(task.Progress.Progress * 1000);
186                overallProgressLbl.Text = S._("Total: {0,2:#0.00%}", task.Progress.Progress);
187            }
188            else
189            {
190                overallProgress.Style = ProgressBarStyle.Marquee;
191                overallProgressLbl.Text = S._("Total: Unknown");
192            }
193        }
194
195        private string WrapItemName(string itemName)
196        {
197            StringBuilder result = new StringBuilder(itemName.Length);
198            using (Graphics g = item.CreateGraphics())
199            {
200                //Split the long file name into lines which fit into the width of the label
201                while (itemName.Length > 0)
202                {
203                    int chars = 0;
204                    int lines = 0;
205                    g.MeasureString(itemName, item.Font, new SizeF(item.Width - 2, 15),
206                        StringFormat.GenericDefault, out chars, out lines);
207
208                    result.AppendLine(itemName.Substring(0, chars));
209                    itemName = itemName.Remove(0, chars);
210                }
211            }
212
213            return result.ToString();
214        }
215
216        private static TimeSpan RoundToSeconds(TimeSpan span)
217        {
218            return new TimeSpan(span.Ticks - span.Ticks % TimeSpan.TicksPerSecond);
219        }
220    }
221}
Note: See TracBrowser for help on using the repository browser.