source: branches/eraser6/Eraser/TaskDataSelectionForm.cs @ 283

Revision 283, 6.5 KB checked in by lowjoel, 7 years ago (diff)

Make cluster tips erasure optional when running unused space erasures.

Line 
1using System;
2using System.Collections.Generic;
3using System.ComponentModel;
4using System.Data;
5using System.Drawing;
6using System.Text;
7using System.Windows.Forms;
8
9using Eraser.Manager;
10using Eraser.Util;
11using System.IO;
12
13namespace Eraser
14{
15    public partial class TaskDataSelectionForm : Form
16    {
17        private class DriveItem
18        {
19            public override string ToString()
20            {
21                return Label;
22            }
23
24            public string Drive;
25            public string Label;
26            public Icon Icon;
27        }
28
29        public TaskDataSelectionForm()
30        {
31            //Create the UI
32            InitializeComponent();
33            file.Checked = true;
34
35            //Populate the drives list
36            string[] drives = Environment.GetLogicalDrives();
37            foreach (string drive in drives)
38            {
39                DriveType driveType = new DriveInfo(drive).DriveType;
40                if (driveType != DriveType.Unknown &&
41                    driveType != DriveType.NoRootDirectory &&
42                    driveType != DriveType.CDRom &&
43                    driveType != DriveType.Network)
44                {
45                    DriveItem item = new DriveItem();
46                    item.Drive = drive.Substring(0, drive.Length - 1);
47                    item.Label = Eraser.Util.File.GetFileDescription(item.Drive);
48                    item.Icon = Eraser.Util.File.GetFileIcon(item.Drive);
49                    unusedDisk.Items.Add(item);
50                }
51            }
52
53            if (unusedDisk.Items.Count != 0)
54                unusedDisk.SelectedIndex = 0;
55
56            //And the methods list
57            Dictionary<Guid, ErasureMethod> methods = ErasureMethodManager.GetAll();
58            this.method.Items.Add(ErasureMethodManager.Default);
59            foreach (ErasureMethod method in methods.Values)
60                this.method.Items.Add(method);
61            if (this.method.Items.Count != 0)
62                this.method.SelectedIndex = 0;
63        }
64
65        /// <summary>
66        /// Retrieves the settings on the property page as the Eraser Manager API equivalent.
67        /// </summary>
68        /// <returns>An Eraser.Manager.Task.Data or Eraser.Manager.Task.UnusedSpace object
69        /// or any of its inherited classes, depending on the task selected</returns>
70        public Task.ErasureTarget Target
71        {
72            get
73            {
74                Task.ErasureTarget result = null;
75                if (file.Checked)
76                {
77                    Manager.Task.File fileTask = new Task.File();
78                    result = fileTask;
79
80                    fileTask.Path = filePath.Text;
81                }
82                else if (folder.Checked)
83                {
84                    Manager.Task.Folder folderTask = new Task.Folder();
85                    result = folderTask;
86
87                    folderTask.Path = folderPath.Text;
88                    folderTask.IncludeMask = folderInclude.Text;
89                    folderTask.ExcludeMask = folderExclude.Text;
90                    folderTask.DeleteIfEmpty = folderDelete.Checked;
91                }
92                else
93                {
94                    Task.UnusedSpace unusedSpaceTask = new Task.UnusedSpace();
95                    result = unusedSpaceTask;
96
97                    unusedSpaceTask.Drive = ((DriveItem)unusedDisk.SelectedItem).Drive;
98                    unusedSpaceTask.EraseClusterTips = unusedClusterTips.Checked;
99                }
100
101                result.Method = (ErasureMethod)this.method.SelectedItem;
102                return result;
103            }
104            set
105            {
106                //Set the erasure method.
107                foreach (object item in method.Items)
108                    if (item == value.Method)
109                        method.SelectedItem = item;
110
111                //Then the data to be erased.
112                if (value is Task.File)
113                {
114                    file.Checked = true;
115                    filePath.Text = ((Task.File)value).Path;
116                }
117                else if (value is Task.Folder)
118                {
119                    folder.Checked = true;
120                    Manager.Task.Folder folderTask = (Task.Folder)value;
121
122                    folderPath.Text = folderTask.Path;
123                    folderInclude.Text = folderTask.IncludeMask;
124                    folderExclude.Text = folderTask.ExcludeMask;
125                    folderDelete.Checked = folderTask.DeleteIfEmpty;
126                }
127                else if (value is Task.UnusedSpace)
128                {
129                    unused.Checked = true;
130                    Task.UnusedSpace unusedSpaceTask = new Task.UnusedSpace();
131                    foreach (object item in unusedDisk.Items)
132                        if (((DriveItem)item).Drive == ((Task.UnusedSpace)value).Drive)
133                            unusedDisk.SelectedItem = item;
134                    unusedClusterTips.Checked = unusedSpaceTask.EraseClusterTips;
135                }
136                else
137                    throw new NotImplementedException("Unknown erasure target.");
138            }
139        }
140
141        private void method_SelectedIndexChanged(object sender, EventArgs e)
142        {
143            if (!(method.SelectedItem is UnusedSpaceErasureMethod) &&
144                method.SelectedItem != ErasureMethodManager.Default)
145            {
146                if (unused.Checked)
147                {
148                    file.Checked = true;
149                    errorProvider.SetError(unused, "The erasure method selected does " +
150                        "not support unused disk space erasures.");
151                }
152                unused.Enabled = false;
153            }
154            else if (!unused.Enabled)
155            {
156                unused.Enabled = true;
157                errorProvider.Clear();
158            }
159        }
160
161        private void data_CheckedChanged(object sender, EventArgs e)
162        {
163            filePath.Enabled = fileBrowse.Enabled = file.Checked;
164            folderPath.Enabled = folderBrowse.Enabled = folderIncludeLbl.Enabled =
165                folderInclude.Enabled = folderExcludeLbl.Enabled = folderExclude.Enabled =
166                folderDelete.Enabled = folder.Checked;
167            unusedDisk.Enabled = unusedClusterTips.Enabled = unused.Checked;
168            errorProvider.Clear();
169        }
170
171        private void fileBrowse_Click(object sender, EventArgs e)
172        {
173            fileDialog.FileName = filePath.Text;
174            if (fileDialog.ShowDialog() == DialogResult.OK)
175                filePath.Text = fileDialog.FileName;
176        }
177
178        private void folderBrowse_Click(object sender, EventArgs e)
179        {
180            folderDialog.SelectedPath = folderPath.Text;
181            if (folderDialog.ShowDialog() == DialogResult.OK)
182                folderPath.Text = folderDialog.SelectedPath;
183        }
184
185        private void unusedDisk_DrawItem(object sender, DrawItemEventArgs e)
186        {
187            if (e.Index == -1)
188                return;
189
190            Graphics g = e.Graphics;
191            DriveItem item = (DriveItem)unusedDisk.Items[e.Index];
192            Color textColour = e.ForeColor;
193            PointF textPos = e.Bounds.Location;
194            textPos.X += item.Icon.Width + 4;
195            textPos.Y += 2;
196
197            //Set the text colour and background colour if the control is disabled
198            if ((e.State & DrawItemState.Disabled) == 0)
199                e.DrawBackground();
200            else
201            {
202                g.FillRectangle(new SolidBrush(SystemColors.ButtonFace), e.Bounds);
203                textColour = SystemColors.GrayText;
204            }
205
206            g.DrawIcon(item.Icon, e.Bounds.X + 2, e.Bounds.Y);
207            g.DrawString(item.Label, e.Font, new SolidBrush(textColour), textPos);
208            if ((e.State & DrawItemState.Focus) != 0)
209                e.DrawFocusRectangle();
210        }
211
212        private void ok_Click(object sender, EventArgs e)
213        {
214            if (file.Checked && filePath.Text.Length == 0)
215                errorProvider.SetError(filePath, "Invalid file path");
216            else if (folder.Checked && folderPath.Text.Length == 0)
217                errorProvider.SetError(folderPath, "Invalid folder path");
218            else
219            {
220                errorProvider.Clear();
221                DialogResult = DialogResult.OK;
222                Close();
223            }
224        }
225    }
226}
Note: See TracBrowser for help on using the repository browser.