source: branches/eraser6/Eraser/SettingsPanel.cs @ 307

Revision 307, 7.4 KB checked in by lowjoel, 6 years ago (diff)

Added the UI and the API for language plugins.

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.Manager.Plugin;
11using Microsoft.Win32;
12
13namespace Eraser
14{
15    public partial class SettingsPanel : Eraser.BasePanel
16    {
17        public SettingsPanel()
18        {
19            InitializeComponent();
20            Dock = DockStyle.None;
21
22            //For new plugins, register the callback.
23            Host.Instance.PluginLoad += new Host.OnPluginLoadEventHandler(OnNewPluginLoaded);
24
25            //Load the values
26            LoadPluginDependantValues();
27            LoadSettings();
28        }
29
30        private void OnNewPluginLoaded(PluginInstance instance)
31        {
32            ListViewItem item = pluginsManager.Items.Add(instance.Plugin.Name);
33            item.SubItems.Add(instance.Plugin.Author);
34            item.SubItems.Add(instance.Assembly.GetName().Version.ToString());
35            item.SubItems.Add(instance.Path);
36            item.Tag = instance;
37        }
38
39        private void LoadPluginDependantValues()
40        {
41            //Load the list of plugins
42            Host instance = Host.Instance;
43            List<PluginInstance>.Enumerator i = instance.Plugins.GetEnumerator();
44            while (i.MoveNext())
45                OnNewPluginLoaded(i.Current);
46
47            //Refresh the list of languages
48            Dictionary<Guid, Language> languages = LanguageManager.GetAll();
49            foreach (Language lang in languages.Values)
50                uiLanguage.Items.Add(lang);
51
52            //Refresh the list of erasure methods
53            Dictionary<Guid, ErasureMethod> methods = ErasureMethodManager.GetAll();
54            foreach (ErasureMethod method in methods.Values)
55            {
56                eraseFilesMethod.Items.Add(method);
57                if (method is UnusedSpaceErasureMethod)
58                    eraseUnusedMethod.Items.Add(method);
59            }
60
61            //Refresh the list of PRNGs
62            Dictionary<Guid, PRNG> prngs = PRNGManager.GetAll();
63            foreach (PRNG prng in prngs.Values)
64                erasePRNG.Items.Add(prng);
65        }
66
67        private void LoadSettings()
68        {
69            foreach (Object lang in uiLanguage.Items)
70                if (((Language)lang).GUID == ManagerLibrary.Instance.Settings.UILanguage)
71                {
72                    uiLanguage.SelectedItem = lang;
73                    break;
74                }
75
76            foreach (Object method in eraseFilesMethod.Items)
77                if (((ErasureMethod)method).GUID == ManagerLibrary.Instance.Settings.DefaultFileErasureMethod)
78                {
79                    eraseFilesMethod.SelectedItem = method;
80                    break;
81                }
82             
83            foreach (Object method in eraseUnusedMethod.Items)
84                if (((ErasureMethod)method).GUID == ManagerLibrary.Instance.Settings.DefaultUnusedSpaceErasureMethod)
85                {
86                    eraseUnusedMethod.SelectedItem = method;
87                    break;
88                }
89
90            foreach (Object prng in erasePRNG.Items)
91                if (((PRNG)prng).GUID == ManagerLibrary.Instance.Settings.ActivePRNG)
92                {
93                    erasePRNG.SelectedItem = prng;
94                    break;
95                }
96
97            lockedAllow.Checked =
98                ManagerLibrary.Instance.Settings.EraseLockedFilesOnRestart;
99            lockedConfirm.Checked =
100                ManagerLibrary.Instance.Settings.ConfirmEraseOnRestart;
101            schedulerMissedImmediate.Checked =
102                ManagerLibrary.Instance.Settings.ExecuteMissedTasksImmediately;
103            schedulerMissedIgnore.Checked =
104                !ManagerLibrary.Instance.Settings.ExecuteMissedTasksImmediately;
105            plausibleDeniability.Checked =
106                ManagerLibrary.Instance.Settings.PlausibleDeniability;
107
108            //Select an intelligent default if the settings are invalid.
109            string defaults = string.Empty;
110            if (uiLanguage.SelectedIndex == -1)
111            {
112                defaults += "\tUser interface language\n";
113            }
114            if (eraseFilesMethod.SelectedIndex == -1)
115            {
116                if (eraseFilesMethod.Items.Count > 0)
117                {
118                    eraseFilesMethod.SelectedIndex = 0;
119                    ManagerLibrary.Instance.Settings.DefaultFileErasureMethod =
120                        ((ErasureMethod)eraseFilesMethod.SelectedItem).GUID;
121                }
122                defaults += "\tDefault file erasure method\n";
123            }
124            if (eraseUnusedMethod.SelectedIndex == -1)
125            {
126                if (eraseUnusedMethod.Items.Count > 0)
127                {
128                    eraseUnusedMethod.SelectedIndex = 0;
129                    ManagerLibrary.Instance.Settings.DefaultUnusedSpaceErasureMethod =
130                        ((ErasureMethod)eraseUnusedMethod.SelectedItem).GUID;
131                }
132                defaults += "\tDefault unused space erasure method\n";
133            }
134            if (erasePRNG.SelectedIndex == -1)
135            {
136                if (erasePRNG.Items.Count > 0)
137                {
138                    erasePRNG.SelectedIndex = 0;
139                    ManagerLibrary.Instance.Settings.ActivePRNG =
140                        ((PRNG)erasePRNG.SelectedItem).GUID;
141                }
142                defaults += "\tRandomness data source\n";
143            }
144
145            //Remind the user.
146            if (defaults.Length != 0)
147            {
148                MessageBox.Show(string.Format("The following settings held invalid values:\n\n" +
149                    "{0}\nThese settings have now been set to naive defaults.\n\n" +
150                    "Please check that the new settings suit your required level of security.",
151                    defaults), "Eraser", MessageBoxButtons.OK, MessageBoxIcon.Warning);
152                saveSettings_Click(null, null);
153            }
154        }
155
156        private void lockedAllow_CheckedChanged(object sender, EventArgs e)
157        {
158            lockedConfirm.Enabled = lockedAllow.Checked;
159        }
160
161        private void pluginsMenu_Opening(object sender, CancelEventArgs e)
162        {
163            if (pluginsManager.SelectedItems.Count == 1)
164            {
165                PluginInstance instance = (PluginInstance)pluginsManager.SelectedItems[0].Tag;
166                e.Cancel = !instance.Plugin.Configurable;
167            }
168            else
169                e.Cancel = true;
170        }
171
172        private void settingsToolStripMenuItem_Click(object sender, EventArgs e)
173        {
174            if (pluginsManager.SelectedItems.Count != 1)
175                return;
176           
177            PluginInstance instance = (PluginInstance)pluginsManager.SelectedItems[0].Tag;
178            instance.Plugin.DisplaySettings(this);
179        }
180
181        private void saveSettings_Click(object sender, EventArgs e)
182        {
183            //Error checks first.
184            errorProvider.Clear();
185            if (uiLanguage.SelectedIndex == -1)
186            {
187                errorProvider.SetError(uiLanguage, "An invalid language was selected.");
188                return;
189            }
190            else if (eraseFilesMethod.SelectedIndex == -1)
191            {
192                errorProvider.SetError(eraseFilesMethod, "An invalid file erasure method " +
193                    "was selected.");
194                return;
195            }
196            else if (eraseUnusedMethod.SelectedIndex == -1)
197            {
198                errorProvider.SetError(eraseUnusedMethod, "An invalid unused disk space " +
199                    "erasure method was selected.");
200                return;
201            }
202            else if (erasePRNG.SelectedIndex == -1)
203            {
204                errorProvider.SetError(erasePRNG, "An invalid randomness data " +
205                    "source was selected.");
206                return;
207            }
208
209            ManagerLibrary.Instance.Settings.UILanguage =
210                ((Language)uiLanguage.SelectedItem).GUID;
211            ManagerLibrary.Instance.Settings.DefaultFileErasureMethod =
212                ((ErasureMethod)eraseFilesMethod.SelectedItem).GUID;
213            ManagerLibrary.Instance.Settings.DefaultUnusedSpaceErasureMethod =
214                ((ErasureMethod)eraseUnusedMethod.SelectedItem).GUID;
215
216            PRNG newPRNG = (PRNG)erasePRNG.SelectedItem;
217            if (newPRNG.GUID != ManagerLibrary.Instance.Settings.ActivePRNG)
218            {
219                MessageBox.Show("The new randomness data source will only be used when " +
220                    "the next task is run.\nCurrently running tasks will use the old source.",
221                    "Eraser", MessageBoxButtons.OK, MessageBoxIcon.Information);
222                ManagerLibrary.Instance.Settings.ActivePRNG = newPRNG.GUID;
223            }
224            ManagerLibrary.Instance.Settings.EraseLockedFilesOnRestart =
225                lockedAllow.Checked;
226            ManagerLibrary.Instance.Settings.ConfirmEraseOnRestart =
227                lockedConfirm.Checked;
228            ManagerLibrary.Instance.Settings.ExecuteMissedTasksImmediately =
229                schedulerMissedImmediate.Checked;
230            ManagerLibrary.Instance.Settings.PlausibleDeniability =
231                plausibleDeniability.Checked;
232        }
233    }
234}
235
Note: See TracBrowser for help on using the repository browser.