using System.Collections.Generic; using System.Linq; using System.Xml.Linq; namespace CADRuntime { /// /// A subclass of Dictionary, that writes changes back to a settings xml file. /// public class SettingsDictionary : IDictionary { private readonly IDictionary _dict; private readonly string _settingsPath; private XDocument _settings; private string nameVariable = "StringVariable"; public SettingsDictionary(string settingsPath) { _settingsPath = settingsPath; _settings = XDocument.Load(_settingsPath); _dict = _settings.Root.Descendants(nameVariable).ToDictionary( v => v.Attribute("name").Value, v => v.Attribute("value").Value); } private void SetVariable(string name, string value) { var variable = _settings.Root.Descendants(nameVariable).Where(x => x.Attribute("name").Value == name).FirstOrDefault(); if (variable != null) { variable.Attribute("value").Value = value.ToString(); } else { _settings.Root.Descendants("Variables").First().Add( new XElement(nameVariable, new XAttribute("name", name), new XAttribute("value", value))); } _settings.Save(_settingsPath); } private void RemoveVariable(string name) { var variable = _settings.Root.Descendants(nameVariable).Where(x => x.Attribute("name").Value == name).FirstOrDefault(); if (variable != null) { variable.Remove(); _settings.Save(_settingsPath); } } private void ClearVariables() { var variables = _settings.Root.Descendants(nameVariable); foreach (var variable in variables) { variable.Remove(); } _settings.Save(_settingsPath); } public void Add(string key, string value) { _dict.Add(key, value); SetVariable(key, value); } public bool ContainsKey(string key) { return _dict.ContainsKey(key); } public ICollection Keys { get { return _dict.Keys; } } public bool Remove(string key) { RemoveVariable(key); return _dict.Remove(key); } public bool TryGetValue(string key, out string value) { return _dict.TryGetValue(key, out value); } public ICollection Values { get { return _dict.Values; } } public string this[string key] { get { return _dict[key]; } set { _dict[key] = value; SetVariable(key, value); } } public void Add(KeyValuePair item) { _dict.Add(item); SetVariable(item.Key, item.Value); } public void Clear() { ClearVariables(); _dict.Clear(); } public bool Contains(KeyValuePair item) { return _dict.Contains(item); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { _dict.CopyTo(array, arrayIndex); } public int Count { get { return _dict.Count; } } public bool IsReadOnly { get { return false; } } public bool Remove(KeyValuePair item) { RemoveVariable(item.Key); return _dict.Remove(item); } public IEnumerator> GetEnumerator() { return _dict.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return _dict.GetEnumerator(); } } }