source: branches/eraser6/6.0/Eraser.DefaultPlugins/SettingsForm.cs @ 1477

Revision 1477, 5.4 KB checked in by lowjoel, 5 years ago (diff)

Don't crash when editing a custom erasure method multiple times

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
Line 
1/*
2 * $Id$
3 * Copyright 2008-2009 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.ComponentModel;
25using System.Data;
26using System.Drawing;
27using System.Text;
28using System.Windows.Forms;
29using System.Globalization;
30
31using Eraser.Manager;
32using Eraser.Util;
33
34namespace Eraser.DefaultPlugins
35{
36    public partial class SettingsForm : Form
37    {
38        public SettingsForm()
39        {
40            InitializeComponent();
41            UXThemeApi.UpdateControlTheme(this);
42
43            //Populate the list of erasure passes, except the FL16KB.
44            foreach (ErasureMethod method in ErasureMethodManager.Items.Values)
45                if (method.Guid != new Guid("{0C2E07BF-0207-49a3-ADE8-46F9E1499C01}"))
46                    fl16MethodCmb.Items.Add(method);
47
48            //Load the settings.
49            DefaultPluginSettings settings = DefaultPlugin.Settings;
50            if (settings.FL16Method != Guid.Empty)
51                foreach (object item in fl16MethodCmb.Items)
52                    if (((ErasureMethod)item).Guid == settings.FL16Method)
53                    {
54                        fl16MethodCmb.SelectedItem = item;
55                        break;
56                    }
57
58            if (fl16MethodCmb.SelectedIndex == -1)
59            {
60                Guid defaultMethodGuid =
61                    ManagerLibrary.Settings.DefaultFileErasureMethod;
62                foreach (object item in fl16MethodCmb.Items)
63                    if (((ErasureMethod)item).Guid == defaultMethodGuid)
64                    {
65                        fl16MethodCmb.SelectedItem = item;
66                        break;
67                    } 
68            }
69
70            if (DefaultPlugin.Settings.EraseCustom != null)
71            {
72                customMethods = DefaultPlugin.Settings.EraseCustom;
73
74                //Display the whole set on the list.
75                foreach (Guid guid in customMethods.Keys)
76                    AddMethod(customMethods[guid]);
77            }
78            else
79                customMethods = new Dictionary<Guid, CustomErasureMethod>();
80        }
81
82        private void customMethod_ItemActivate(object sender, EventArgs e)
83        {
84            //Create the dialog
85            CustomMethodEditorForm editorForm = new CustomMethodEditorForm();
86            ListViewItem item = customMethod.SelectedItems[0];
87            editorForm.Method = (CustomErasureMethod)item.Tag;
88
89            if (editorForm.ShowDialog() == DialogResult.OK)
90            {
91                //Remove the old definition of the erasure method
92                CustomErasureMethod method = editorForm.Method;
93                if (removeCustomMethods.IndexOf(method.Guid) == -1)
94                    removeCustomMethods.Add(method.Guid);
95
96                //Add the new definition
97                foreach (CustomErasureMethod addMethod in addCustomMethods)
98                    if (addMethod.Guid == method.Guid)
99                    {
100                        addCustomMethods.Remove(addMethod);
101                        break;
102                    }
103
104                customMethods[method.Guid] = method;
105                addCustomMethods.Add(method);
106                item.Tag = method;
107            }
108        }
109
110        private void customMethodAdd_Click(object sender, EventArgs e)
111        {
112            CustomMethodEditorForm form = new CustomMethodEditorForm();
113            if (form.ShowDialog() == DialogResult.OK)
114            {
115                CustomErasureMethod method = form.Method;
116                customMethods.Add(method.Guid, method);
117                addCustomMethods.Add(method);
118                AddMethod(method);
119            }
120        }
121
122        private void customMethodContextMenuStrip_Opening(object sender, CancelEventArgs e)
123        {
124            e.Cancel = customMethod.SelectedIndices.Count == 0;
125        }
126
127        private void deleteMethodToolStripMenuItem_Click(object sender, EventArgs e)
128        {
129            foreach (ListViewItem item in customMethod.SelectedItems)
130            {
131                CustomErasureMethod method = (CustomErasureMethod)item.Tag;
132                if (addCustomMethods.IndexOf(method) >= 0)
133                    addCustomMethods.Remove(method);
134                else
135                    removeCustomMethods.Add(method.Guid);
136                customMethod.Items.Remove(item);
137            }
138        }
139
140        private void okBtn_Click(object sender, EventArgs e)
141        {
142            //Save the settings to the settings dictionary
143            if (fl16MethodCmb.SelectedIndex == -1)
144            {
145                errorProvider.SetError(fl16MethodCmb, S._("An invalid erasure method was selected."));
146                return;
147            }
148
149            DefaultPlugin.Settings.FL16Method = ((ErasureMethod)fl16MethodCmb.SelectedItem).Guid;
150
151            //Remove the old methods.
152            foreach (Guid guid in removeCustomMethods)
153            {
154                customMethods.Remove(guid);
155                ErasureMethodManager.Unregister(guid);
156            }
157
158            //Save the list of custom erasure methods
159            DefaultPlugin.Settings.EraseCustom = customMethods;
160
161            //Update the Erasure method manager on the methods
162            foreach (CustomErasureMethod method in addCustomMethods)
163                ErasureMethodManager.Register(new EraseCustom(method), new object[] { method });
164
165            //Close the dialog
166            DialogResult = DialogResult.OK;
167            Close();
168        }
169
170        /// <summary>
171        /// Adds the given method to the custom methods list.
172        /// </summary>
173        /// <param name="method">The method to add.</param>
174        private void AddMethod(CustomErasureMethod method)
175        {
176            ListViewItem item = customMethod.Items.Add(method.Name);
177            item.SubItems.Add(method.Passes.Length.ToString(CultureInfo.CurrentCulture));
178            item.Tag = method;
179        }
180
181        private Dictionary<Guid, CustomErasureMethod> customMethods;
182        private List<CustomErasureMethod> addCustomMethods = new List<CustomErasureMethod>();
183        private List<Guid> removeCustomMethods = new List<Guid>();
184    }
185}
Note: See TracBrowser for help on using the repository browser.