Files
2017-06-05 15:49:35 -07:00

138 lines
4.5 KiB
C#

using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Xml;
using System.Xml.Linq;
namespace Xunit.Runner.Wpf.Persistence
{
internal sealed class Settings
{
private const string SettingsFileName = "settings.xml";
private const string RecentAssembliesElementName = "recent_assemblies";
private const string RecentAssemblyElementName = "recent_assembly";
private const string SettingsElementName = "settings";
private const string VersionAttributeName = "version";
private const string AutoReloadAssembliesElementName = "auto_reload_assemblies";
private const int MaxRecentAssemblies = 10;
private static readonly Version s_latestVersion = new Version(1, 0, 0, 0);
private List<string> recentAssemblies;
private bool autoReloadAssemblies;
private Settings()
{
recentAssemblies = new List<string>();
autoReloadAssemblies = true;
}
public void AddRecentAssembly(string filePath)
{
for (int i = recentAssemblies.Count - 1; i >= 0; i--)
{
if (StringComparer.OrdinalIgnoreCase.Equals(recentAssemblies[i], filePath))
{
recentAssemblies.RemoveAt(i);
}
}
recentAssemblies.Insert(0, filePath);
if (recentAssemblies.Count > MaxRecentAssemblies)
{
recentAssemblies.RemoveRange(MaxRecentAssemblies - 1, recentAssemblies.Count - MaxRecentAssemblies);
}
}
public void ToggleAutoReloadAssemblies()
{
autoReloadAssemblies = !autoReloadAssemblies;
}
public bool GetAutoReloadAssemblies() => autoReloadAssemblies;
public ImmutableArray<string> GetRecentAssemblies()
{
return this.recentAssemblies.ToImmutableArray();
}
public void Save()
{
using (var xmlFile = Storage.CreateXmlFile(SettingsFileName))
{
var xml = new XElement(SettingsElementName, new XAttribute(VersionAttributeName, s_latestVersion));
if (this.recentAssemblies.Count > 0)
{
var recentAssembliesElement = new XElement(RecentAssembliesElementName);
foreach (var recentAssembly in this.recentAssemblies)
{
recentAssembliesElement.Add(new XElement(RecentAssemblyElementName, recentAssembly));
}
xml.Add(recentAssembliesElement);
}
xml.Add(new XElement(AutoReloadAssembliesElementName, autoReloadAssemblies));
xml.Save(xmlFile);
}
}
public static Settings Load()
{
using (var xmlFile = Storage.OpenXmlFile(SettingsFileName))
{
var settings = new Settings();
if (xmlFile == null || xmlFile.EOF)
{
return settings;
}
try
{
xmlFile.MoveToContent();
}
catch (XmlException)
{
return settings;
}
var xml = XElement.Load(xmlFile);
var recentAssembliesElement = xml.Element(RecentAssembliesElementName);
if (recentAssembliesElement != null)
{
var recentAssemblyElements = recentAssembliesElement.Elements(RecentAssemblyElementName);
foreach (var recentAssemblyElement in recentAssemblyElements)
{
var filePath = (string)recentAssemblyElement;
settings.AddRecentAssembly(filePath);
}
}
var autoReloadAssembliesElement = xml.Element(AutoReloadAssembliesElementName);
if (autoReloadAssembliesElement != null)
{
if (!bool.TryParse(autoReloadAssembliesElement.Value, out var autoReloadAssemblies))
{
autoReloadAssemblies = true;
}
settings.autoReloadAssemblies = autoReloadAssemblies;
}
else
{
settings.autoReloadAssemblies = true;
}
return settings;
}
}
}
}