From 1ba5d5f7f0a50eb21b81bba703c8b2e53f02028b Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 4 Jun 2017 20:25:40 +0200 Subject: [PATCH 01/20] Minor fix to C# string parsing, that doesn't work (due to how string TagSpans are returned from the language service) --- src/Viasfora.Languages/Sequences/CSharpStringScanner.cs | 7 ++++--- .../StringScanners/CSharpStringScannerTests.cs | 6 ++++++ 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs b/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs index e93dbca1..40a3cb59 100644 --- a/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs +++ b/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs @@ -15,10 +15,11 @@ public CSharpStringScanner(String text) { this.isVerbatim = true; this.text.Skip(2); } else if ( first == '$' ) { + this.isInterpolated = true; if ( this.text.NChar() == '@' ) { - this.text.SkipRemainder(); + this.isVerbatim = true; + this.text.Skip(3); } else { - this.isInterpolated = true; this.text.Skip(2); } } else if ( first == '"' || first == '\'' ) { @@ -33,7 +34,7 @@ public CSharpStringScanner(String text) { return BasicCStringScanner.ParseEscapeSequence(text); } else if ( text.Char() == '{' && text.NChar() == '{' ) { text.Next(); // skip it - } else if ( text.Char() == '{' && !isInterpolated ) { + } else if ( text.Char() == '{' && !this.isInterpolated ) { StringPart part = new StringPart(); if ( ParseFormatSpecifier(ref part) ) return part; diff --git a/tests/Viasfora.Tests/StringScanners/CSharpStringScannerTests.cs b/tests/Viasfora.Tests/StringScanners/CSharpStringScannerTests.cs index 0c6f983e..9e85ba52 100644 --- a/tests/Viasfora.Tests/StringScanners/CSharpStringScannerTests.cs +++ b/tests/Viasfora.Tests/StringScanners/CSharpStringScannerTests.cs @@ -96,6 +96,12 @@ public void EscapeSequenceAfterInterpolatedBlockIsExtracted() { Assert.Equal(new StringPart(13,2), parser.Next()); Assert.Equal(null, parser.Next()); } + [Fact] + public void EscapeSequenceInVerbatimInterpolatedStringIsIgnored() { + String input = "$@\"some\\a value\""; + var parser = new CSharpStringScanner(input); + Assert.Equal(null, parser.Next()); + } // // Format Specifier Tests // From 2d0f192d42314c3784ccaa0c37a27b58741b03cc Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sat, 10 Jun 2017 18:54:36 +0200 Subject: [PATCH 02/20] Add support for figuring out the type of string (verbatim or not) from the original classification type when extracting escape sequences --- src/Viasfora.Core/Contracts/ILanguage.cs | 2 +- src/Viasfora.Core/Text/KeywordTagger.cs | 6 +++--- src/Viasfora.Languages/CBasedLanguage.cs | 2 +- src/Viasfora.Languages/CSharp.cs | 4 ++-- src/Viasfora.Languages/Cpp.cs | 2 +- src/Viasfora.Languages/Css.cs | 2 +- src/Viasfora.Languages/FSharp.cs | 2 +- src/Viasfora.Languages/LanguageInfo.cs | 2 +- src/Viasfora.Languages/PowerShell.cs | 2 +- src/Viasfora.Languages/R.cs | 2 +- src/Viasfora.Languages/Sequences/CSharpStringScanner.cs | 3 ++- src/Viasfora.Languages/USql.cs | 6 +++--- src/Viasfora.Languages/XLang.cs | 2 +- 13 files changed, 19 insertions(+), 18 deletions(-) diff --git a/src/Viasfora.Core/Contracts/ILanguage.cs b/src/Viasfora.Core/Contracts/ILanguage.cs index 7e62a8eb..e59f3853 100644 --- a/src/Viasfora.Core/Contracts/ILanguage.cs +++ b/src/Viasfora.Core/Contracts/ILanguage.cs @@ -12,7 +12,7 @@ public interface ILanguage { bool Enabled { get; set; } T GetService(); - IStringScanner NewStringScanner(String text); + IStringScanner NewStringScanner(String classificationName, String text); bool IsControlFlowKeyword(String text); bool IsVisibilityKeyword(String text); bool IsLinqKeyword(String text); diff --git a/src/Viasfora.Core/Text/KeywordTagger.cs b/src/Viasfora.Core/Text/KeywordTagger.cs index 825d0725..fc968175 100644 --- a/src/Viasfora.Core/Text/KeywordTagger.cs +++ b/src/Viasfora.Core/Text/KeywordTagger.cs @@ -71,7 +71,7 @@ where IsInterestingTag(lang, classificationType) var classificationType = tagSpan.Tag.ClassificationType; String name = classificationType.Classification.ToLower(); if ( eshe && name.Contains("string") ) { - foreach ( var escapeTag in ProcessEscapeSequences(lang, tagSpan.Span) ) { + foreach ( var escapeTag in ProcessEscapeSequences(lang, name, tagSpan.Span) ) { yield return escapeTag; } } @@ -165,11 +165,11 @@ private ITagSpan IsInterestingKeyword(ILanguage lang, SnapshotSpan c } private IEnumerable> ProcessEscapeSequences( - ILanguage lang, SnapshotSpan cs) { + ILanguage lang, String classificationName, SnapshotSpan cs) { if ( cs.IsEmpty ) yield break; String text = cs.GetText(); - var parser = lang.NewStringScanner(text); + var parser = lang.NewStringScanner(classificationName, text); if ( parser == null ) yield break; diff --git a/src/Viasfora.Languages/CBasedLanguage.cs b/src/Viasfora.Languages/CBasedLanguage.cs index a9ed3f0e..2cb6564e 100644 --- a/src/Viasfora.Languages/CBasedLanguage.cs +++ b/src/Viasfora.Languages/CBasedLanguage.cs @@ -11,7 +11,7 @@ public CBasedLanguage(IVsfSettings settings) : base(settings) { } protected override IBraceScanner NewBraceScanner() => new CBraceScanner(); - public override IStringScanner NewStringScanner(String text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new BasicCStringScanner(text); } } diff --git a/src/Viasfora.Languages/CSharp.cs b/src/Viasfora.Languages/CSharp.cs index a7409450..ee6062eb 100644 --- a/src/Viasfora.Languages/CSharp.cs +++ b/src/Viasfora.Languages/CSharp.cs @@ -32,8 +32,8 @@ protected override String[] SupportedContentTypes protected override IBraceScanner NewBraceScanner() => new CSharpBraceScanner(); - public override IStringScanner NewStringScanner(string text) - => new CSharpStringScanner(text); + public override IStringScanner NewStringScanner(String classificationName, String text) + => new CSharpStringScanner(text, classificationName); [ImportingConstructor] public CSharp(IVsfSettings settings) : base(settings) { diff --git a/src/Viasfora.Languages/Cpp.cs b/src/Viasfora.Languages/Cpp.cs index bf6d9a5e..20c17d73 100644 --- a/src/Viasfora.Languages/Cpp.cs +++ b/src/Viasfora.Languages/Cpp.cs @@ -28,7 +28,7 @@ protected override String[] SupportedContentTypes public Cpp(IVsfSettings settings) : base(settings) { } - public override IStringScanner NewStringScanner(string text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new CStringScanner(text); } } diff --git a/src/Viasfora.Languages/Css.cs b/src/Viasfora.Languages/Css.cs index bd5d1de2..6978373f 100644 --- a/src/Viasfora.Languages/Css.cs +++ b/src/Viasfora.Languages/Css.cs @@ -26,7 +26,7 @@ protected override String[] SupportedContentTypes { public Css(IVsfSettings settings) : base(settings) { } - public override IStringScanner NewStringScanner(string text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new CssStringScanner(text); protected override IBraceScanner NewBraceScanner() => new CssBraceScanner(); diff --git a/src/Viasfora.Languages/FSharp.cs b/src/Viasfora.Languages/FSharp.cs index b78b4888..a8627f28 100644 --- a/src/Viasfora.Languages/FSharp.cs +++ b/src/Viasfora.Languages/FSharp.cs @@ -34,7 +34,7 @@ public FSharp(IVsfSettings settings) : base(settings) { protected override IBraceScanner NewBraceScanner() => new FSharpBraceScanner(); - public override IStringScanner NewStringScanner(String text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new FSharpStringScanner(text); } } diff --git a/src/Viasfora.Languages/LanguageInfo.cs b/src/Viasfora.Languages/LanguageInfo.cs index a0eb79ed..bf7ad7a7 100644 --- a/src/Viasfora.Languages/LanguageInfo.cs +++ b/src/Viasfora.Languages/LanguageInfo.cs @@ -48,7 +48,7 @@ public T GetService() { protected virtual IFirstLineCommentParser NewFirstLineCommentParser() { return new GenericCommentParser(); } - public virtual IStringScanner NewStringScanner(String text) { + public virtual IStringScanner NewStringScanner(String classificationName, String text) { return null; } diff --git a/src/Viasfora.Languages/PowerShell.cs b/src/Viasfora.Languages/PowerShell.cs index 437fe24f..c672e3b3 100644 --- a/src/Viasfora.Languages/PowerShell.cs +++ b/src/Viasfora.Languages/PowerShell.cs @@ -31,7 +31,7 @@ public PowerShell(IVsfSettings settings) : base(settings) { } protected override IBraceScanner NewBraceScanner() => new PsBraceScanner(); - public override IStringScanner NewStringScanner(String text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new PsStringScanner(text); } } diff --git a/src/Viasfora.Languages/R.cs b/src/Viasfora.Languages/R.cs index e2c296fe..8b7505c0 100644 --- a/src/Viasfora.Languages/R.cs +++ b/src/Viasfora.Languages/R.cs @@ -32,7 +32,7 @@ public R(IVsfSettings settings) : base(settings) { protected override IBraceScanner NewBraceScanner() => new RBraceScanner(); - public override IStringScanner NewStringScanner(String text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new RStringScanner(text); } } diff --git a/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs b/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs index 40a3cb59..7531b0bf 100644 --- a/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs +++ b/src/Viasfora.Languages/Sequences/CSharpStringScanner.cs @@ -7,8 +7,9 @@ public class CSharpStringScanner : IStringScanner { private bool isInterpolated; private bool isVerbatim; - public CSharpStringScanner(String text) { + public CSharpStringScanner(String text, String classificationName = "string") { this.text = new StringChars(text, 0, text.Length - 1); + this.isVerbatim = classificationName == "string - verbatim"; // If this is an at-string, skip it char first = this.text.Char(); if ( first == '@' ) { diff --git a/src/Viasfora.Languages/USql.cs b/src/Viasfora.Languages/USql.cs index 90a6b01c..2ab709f5 100644 --- a/src/Viasfora.Languages/USql.cs +++ b/src/Viasfora.Languages/USql.cs @@ -30,7 +30,7 @@ protected override String[] LinqDefaults { get { return QUERY; } } - protected override string[] VisibilityDefaults { + protected override String[] VisibilityDefaults { get { return VISIBILITY; } } @@ -41,8 +41,8 @@ protected override String[] SupportedContentTypes { protected override IBraceScanner NewBraceScanner() { return new USqlBraceScanner(); } - public override IStringScanner NewStringScanner(string text) { - return new CSharpStringScanner(text); + public override IStringScanner NewStringScanner(String classificationName, String text) { + return new CSharpStringScanner(text, classificationName); } [ImportingConstructor] diff --git a/src/Viasfora.Languages/XLang.cs b/src/Viasfora.Languages/XLang.cs index e5cd1259..14f78b5e 100644 --- a/src/Viasfora.Languages/XLang.cs +++ b/src/Viasfora.Languages/XLang.cs @@ -22,7 +22,7 @@ protected override String[] SupportedContentTypes protected override IBraceScanner NewBraceScanner() => new CSharpBraceScanner(); - public override IStringScanner NewStringScanner(string text) + public override IStringScanner NewStringScanner(String classificationName, String text) => new CSharpStringScanner(text); [ImportingConstructor] From fe553bb9f20993e02a3dcc7d0efe309de80b8395 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sat, 10 Jun 2017 20:02:52 +0200 Subject: [PATCH 03/20] Refactor all settings conversions into a separate MEF object --- .../Settings/IStorageConversions.cs | 12 +++ src/Viasfora.Core/Settings/SettingsBase.cs | 57 +++++++++++++ .../Settings/StorageConversions.cs | 47 +++++++++++ src/Viasfora.Core/Settings/VsfSettings.cs | 83 ++----------------- src/Viasfora.Core/Viasfora.Core.csproj | 3 + .../Settings/RainbowSettings.cs | 1 - ...ngsTests.cs => StorageConversionsTests.cs} | 14 ++-- tests/Viasfora.Tests/Viasfora.Tests.csproj | 2 +- 8 files changed, 135 insertions(+), 84 deletions(-) create mode 100644 src/Viasfora.Core/Settings/IStorageConversions.cs create mode 100644 src/Viasfora.Core/Settings/SettingsBase.cs create mode 100644 src/Viasfora.Core/Settings/StorageConversions.cs rename tests/Viasfora.Tests/Settings/{VsfSettingsTests.cs => StorageConversionsTests.cs} (76%) diff --git a/src/Viasfora.Core/Settings/IStorageConversions.cs b/src/Viasfora.Core/Settings/IStorageConversions.cs new file mode 100644 index 00000000..33771262 --- /dev/null +++ b/src/Viasfora.Core/Settings/IStorageConversions.cs @@ -0,0 +1,12 @@ +using System; + +namespace Winterdom.Viasfora.Settings { + public interface IStorageConversions { + bool ToBoolean(String value); + int ToInt32(String value); + long ToInt64(String value); + double ToDouble(String value); + bool ToEnum(String value, out T result) where T : struct; + String ToString(object value); + } +} diff --git a/src/Viasfora.Core/Settings/SettingsBase.cs b/src/Viasfora.Core/Settings/SettingsBase.cs new file mode 100644 index 00000000..12372cad --- /dev/null +++ b/src/Viasfora.Core/Settings/SettingsBase.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Winterdom.Viasfora.Settings { + public abstract class SettingsBase { + protected ISettingsStore Store { get; private set; } + private IStorageConversions converter; + + public SettingsBase(ISettingsStore store, IStorageConversions converter) { + this.Store = store; + this.converter = converter; + } + + public bool GetBoolean(String name, bool defval) { + String val = Store.Get(name); + return String.IsNullOrEmpty(val) ? defval : Convert.ToBoolean(val); + } + + public int GetInt32(String name, int defval) { + String val = Store.Get(name); + return String.IsNullOrEmpty(val) ? defval : converter.ToInt32(val); + } + public long GetInt64(String name, long defval) { + String val = Store.Get(name); + return String.IsNullOrEmpty(val) ? defval : converter.ToInt64(val); + } + public double GetDouble(String name, double defval) { + String val = Store.Get(name); + return String.IsNullOrEmpty(val) ? defval : converter.ToDouble(val); + } + public T GetEnum(String name, T defval) where T : struct { + String val = Store.Get(name); + T actual; + if ( converter.ToEnum(val, out actual) ) { + return actual; + } + return defval; + } + + public String GetValue(String name, String defValue) { + String val = Store.Get(name); + return String.IsNullOrEmpty(val) ? defValue : val; + } + public void SetValue(String name, object value) { + if ( value != null ) { + Store.Set(name, converter.ToString(value)); + } else { + Store.Set(name, null); + } + } + + } +} diff --git a/src/Viasfora.Core/Settings/StorageConversions.cs b/src/Viasfora.Core/Settings/StorageConversions.cs new file mode 100644 index 00000000..cfc11576 --- /dev/null +++ b/src/Viasfora.Core/Settings/StorageConversions.cs @@ -0,0 +1,47 @@ +using System; +using System.ComponentModel.Composition; +using System.Globalization; + +namespace Winterdom.Viasfora.Settings { + [Export(typeof(IStorageConversions))] + public class StorageConversions : IStorageConversions { + public bool ToBoolean(String value) { + return Convert.ToBoolean(value); + } + public int ToInt32(String value) { + int result; + var styles = NumberStyles.Integer; + if ( !int.TryParse(value, styles, CultureInfo.InvariantCulture, out result) ) { + return Convert.ToInt32(value, CultureInfo.CurrentCulture); + } + return result; + } + public long ToInt64(String value) { + long result; + var styles = NumberStyles.Integer; + if ( !long.TryParse(value, styles, CultureInfo.InvariantCulture, out result) ) { + return Convert.ToInt64(value, CultureInfo.CurrentCulture); + } + return result; + } + public double ToDouble(String value) { + double result; + var styles = NumberStyles.AllowLeadingWhite + | NumberStyles.AllowTrailingWhite + | NumberStyles.AllowLeadingSign + | NumberStyles.AllowDecimalPoint + | NumberStyles.AllowThousands + | NumberStyles.AllowExponent; + if ( !double.TryParse(value, styles, CultureInfo.InvariantCulture, out result) ) { + return Convert.ToDouble(value, CultureInfo.CurrentCulture); + } + return result; + } + public bool ToEnum(String value, out T result) where T : struct { + return Enum.TryParse(value, out result); + } + public String ToString(object value) { + return value != null ? Convert.ToString(value, CultureInfo.InvariantCulture) : null; + } + } +} diff --git a/src/Viasfora.Core/Settings/VsfSettings.cs b/src/Viasfora.Core/Settings/VsfSettings.cs index 1051e543..536f3884 100644 --- a/src/Viasfora.Core/Settings/VsfSettings.cs +++ b/src/Viasfora.Core/Settings/VsfSettings.cs @@ -6,9 +6,7 @@ namespace Winterdom.Viasfora.Settings { [Export(typeof(IVsfSettings))] - public class VsfSettings : IVsfSettings { - - private ISettingsStore settings; + public class VsfSettings : SettingsBase, IVsfSettings { public event EventHandler SettingsChanged; public bool KeywordClassifierEnabled { @@ -81,85 +79,16 @@ public bool TelemetryEnabled { } [ImportingConstructor] - public VsfSettings(ISettingsStore store) { - this.settings = store; + public VsfSettings(ISettingsStore store, IStorageConversions converter) + : base(store, converter) { } public void Load() { - settings.Load(); + Store.Load(); } public void Save() { - settings.Save(); - if ( SettingsChanged != null ) { - SettingsChanged(this, EventArgs.Empty); - } - } - - public bool GetBoolean(String name, bool defval) { - String val = settings.Get(name); - return String.IsNullOrEmpty(val) ? defval : Convert.ToBoolean(val); - } - - public int GetInt32(String name, int defval) { - String val = settings.Get(name); - return String.IsNullOrEmpty(val) ? defval : ConvertToInt32(val); - } - public long GetInt64(String name, long defval) { - String val = settings.Get(name); - return String.IsNullOrEmpty(val) ? defval : ConvertToInt64(val); - } - public double GetDouble(String name, double defval) { - String val = settings.Get(name); - return String.IsNullOrEmpty(val) ? defval : ConvertToDouble(val); - } - public T GetEnum(String name, T defval) where T : struct { - String val = settings.Get(name); - T actual; - if ( Enum.TryParse(val, out actual) ) { - return actual; - } - return defval; + Store.Save(); + SettingsChanged?.Invoke(this, EventArgs.Empty); } - public String GetValue(String name, String defValue) { - String val = settings.Get(name); - return String.IsNullOrEmpty(val) ? defValue : val; - } - public void SetValue(String name, object value) { - if ( value != null ) { - settings.Set(name, Convert.ToString(value, CultureInfo.InvariantCulture)); - } else { - settings.Set(name, null); - } - } - - public static double ConvertToDouble(String val) { - double result; - var styles = NumberStyles.AllowLeadingWhite - | NumberStyles.AllowTrailingWhite - | NumberStyles.AllowLeadingSign - | NumberStyles.AllowDecimalPoint - | NumberStyles.AllowThousands - | NumberStyles.AllowExponent; - if ( !double.TryParse(val, styles, CultureInfo.InvariantCulture, out result) ) { - return Convert.ToDouble(val, CultureInfo.CurrentCulture); - } - return result; - } - public static int ConvertToInt32(String val) { - int result; - var styles = NumberStyles.Integer; - if ( !int.TryParse(val, styles, CultureInfo.InvariantCulture, out result) ) { - return Convert.ToInt32(val, CultureInfo.CurrentCulture); - } - return result; - } - public static long ConvertToInt64(String val) { - long result; - var styles = NumberStyles.Integer; - if ( !long.TryParse(val, styles, CultureInfo.InvariantCulture, out result) ) { - return Convert.ToInt64(val, CultureInfo.CurrentCulture); - } - return result; - } } } diff --git a/src/Viasfora.Core/Viasfora.Core.csproj b/src/Viasfora.Core/Viasfora.Core.csproj index 1d6b8834..e0ce41d8 100644 --- a/src/Viasfora.Core/Viasfora.Core.csproj +++ b/src/Viasfora.Core/Viasfora.Core.csproj @@ -211,7 +211,10 @@ + + + diff --git a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs index 52fc4e49..b23e7c5a 100644 --- a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs +++ b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs @@ -4,7 +4,6 @@ namespace Winterdom.Viasfora.Rainbow.Settings { [Export(typeof(IRainbowSettings))] public class RainbowSettings : IRainbowSettings { - private IVsfSettings settings; public event EventHandler SettingsChanged; diff --git a/tests/Viasfora.Tests/Settings/VsfSettingsTests.cs b/tests/Viasfora.Tests/Settings/StorageConversionsTests.cs similarity index 76% rename from tests/Viasfora.Tests/Settings/VsfSettingsTests.cs rename to tests/Viasfora.Tests/Settings/StorageConversionsTests.cs index 4319569a..2f9b2986 100644 --- a/tests/Viasfora.Tests/Settings/VsfSettingsTests.cs +++ b/tests/Viasfora.Tests/Settings/StorageConversionsTests.cs @@ -5,14 +5,15 @@ using Xunit; namespace Viasfora.Tests.Settings { - public class VsfSettingsTests { + public class StorageConversionsTests { [Fact] public void CanConvertDoubleUsingInvariantCulture() { + var converter = new StorageConversions(); var thread = Thread.CurrentThread; var originalCulture = thread.CurrentCulture; thread.CurrentCulture = new CultureInfo("es-co"); try { - var value = VsfSettings.ConvertToDouble("1.23"); + var value = converter.ToDouble("1.23"); Assert.Equal(1.23, value); } finally { thread.CurrentCulture = originalCulture; @@ -20,11 +21,12 @@ public void CanConvertDoubleUsingInvariantCulture() { } [Fact] public void CanConvertDoubleUsingCurrentCultureAsLastResort() { + var converter = new StorageConversions(); var thread = Thread.CurrentThread; var originalCulture = thread.CurrentCulture; thread.CurrentCulture = new CultureInfo("es-co"); try { - var value = VsfSettings.ConvertToDouble("987.991,23"); + var value = converter.ToDouble("987.991,23"); Assert.Equal(987991.23, value); } finally { thread.CurrentCulture = originalCulture; @@ -32,11 +34,12 @@ public void CanConvertDoubleUsingCurrentCultureAsLastResort() { } [Fact] public void CanConvertInt32UsingInvariantCulture() { + var converter = new StorageConversions(); var thread = Thread.CurrentThread; var originalCulture = thread.CurrentCulture; thread.CurrentCulture = new CultureInfo("es-co"); try { - var value = VsfSettings.ConvertToInt32("123"); + var value = converter.ToInt32("123"); Assert.Equal(123, value); } finally { thread.CurrentCulture = originalCulture; @@ -44,11 +47,12 @@ public void CanConvertInt32UsingInvariantCulture() { } [Fact] public void CanConvertInt64UsingInvariantCulture() { + var converter = new StorageConversions(); var thread = Thread.CurrentThread; var originalCulture = thread.CurrentCulture; thread.CurrentCulture = new CultureInfo("es-co"); try { - var value = VsfSettings.ConvertToInt64("123"); + var value = converter.ToInt64("123"); Assert.Equal(123, value); } finally { thread.CurrentCulture = originalCulture; diff --git a/tests/Viasfora.Tests/Viasfora.Tests.csproj b/tests/Viasfora.Tests/Viasfora.Tests.csproj index 51e1d66e..44172164 100644 --- a/tests/Viasfora.Tests/Viasfora.Tests.csproj +++ b/tests/Viasfora.Tests/Viasfora.Tests.csproj @@ -193,7 +193,7 @@ - + From 62c999e8b00c02f802cf6b350c468c5cba22489d Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sat, 10 Jun 2017 20:19:36 +0200 Subject: [PATCH 04/20] Refactor setting classes to not depend on VsfSettings --- .../Settings/RainbowSettings.cs | 46 +++++++++---------- src/Viasfora.Xml/Settings/XmlSettings.cs | 31 ++++++------- 2 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs index b23e7c5a..14a85528 100644 --- a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs +++ b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs @@ -1,54 +1,52 @@ using System; using System.ComponentModel.Composition; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Rainbow.Settings { [Export(typeof(IRainbowSettings))] - public class RainbowSettings : IRainbowSettings { - private IVsfSettings settings; - + public class RainbowSettings : SettingsBase, IRainbowSettings { public event EventHandler SettingsChanged; public int RainbowDepth { - get { return settings.GetInt32(nameof(RainbowDepth), 4); } - set { settings.SetValue(nameof(RainbowDepth), value); } + get { return GetInt32(nameof(RainbowDepth), 4); } + set { SetValue(nameof(RainbowDepth), value); } } public bool RainbowTagsEnabled { - get { return settings.GetBoolean(nameof(RainbowTagsEnabled), true); } - set { settings.SetValue(nameof(RainbowTagsEnabled), value); } + get { return GetBoolean(nameof(RainbowTagsEnabled), true); } + set { SetValue(nameof(RainbowTagsEnabled), value); } } public bool RainbowColorize { - get { return settings.GetBoolean(nameof(RainbowColorize), true); } - set { settings.SetValue(nameof(RainbowColorize), value); } + get { return GetBoolean(nameof(RainbowColorize), true); } + set { SetValue(nameof(RainbowColorize), value); } } public long RainbowCtrlTimer { - get { return settings.GetInt64(nameof(RainbowCtrlTimer), 300); } - set { settings.SetValue(nameof(RainbowCtrlTimer), value); } + get { return GetInt64(nameof(RainbowCtrlTimer), 300); } + set { SetValue(nameof(RainbowCtrlTimer), value); } } public RainbowHighlightMode RainbowHighlightMode { - get { return settings.GetEnum(nameof(RainbowHighlightMode), RainbowHighlightMode.TrackNextScope); } - set { settings.SetValue(nameof(RainbowHighlightMode), value); } + get { return GetEnum(nameof(RainbowHighlightMode), RainbowHighlightMode.TrackNextScope); } + set { SetValue(nameof(RainbowHighlightMode), value); } } public bool RainbowToolTipsEnabled { - get { return settings.GetBoolean(nameof(RainbowToolTipsEnabled), true); } - set { settings.SetValue(nameof(RainbowToolTipsEnabled), value); } + get { return GetBoolean(nameof(RainbowToolTipsEnabled), true); } + set { SetValue(nameof(RainbowToolTipsEnabled), value); } } public RainbowColoringMode RainbowColoringMode { - get { return settings.GetEnum(nameof(RainbowColoringMode), RainbowColoringMode.Unified); } - set { settings.SetValue(nameof(RainbowColoringMode), value); } + get { return GetEnum(nameof(RainbowColoringMode), RainbowColoringMode.Unified); } + set { SetValue(nameof(RainbowColoringMode), value); } } [ImportingConstructor] - public RainbowSettings(IVsfSettings settings) { - this.settings = settings; - this.settings.SettingsChanged += OnSettingsChanged; + public RainbowSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { } - public void Save() { - this.settings.Save(); + public void Load() { + this.Store.Load(); } - private void OnSettingsChanged(object sender, EventArgs e) { - SettingsChanged?.Invoke(this, e); + public void Save() { + this.Store.Save(); + SettingsChanged?.Invoke(this, EventArgs.Empty); } } } diff --git a/src/Viasfora.Xml/Settings/XmlSettings.cs b/src/Viasfora.Xml/Settings/XmlSettings.cs index 0c09c866..4c74ab0e 100644 --- a/src/Viasfora.Xml/Settings/XmlSettings.cs +++ b/src/Viasfora.Xml/Settings/XmlSettings.cs @@ -1,39 +1,36 @@ using System; using System.ComponentModel.Composition; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Xml.Settings { [Export(typeof(IXmlSettings))] - public class XmlSettings : IXmlSettings { - private IVsfSettings settings; - + public class XmlSettings : SettingsBase, IXmlSettings { public event EventHandler SettingsChanged; public bool XmlnsPrefixEnabled { - get { return settings.GetBoolean(nameof(XmlnsPrefixEnabled), true); } - set { settings.SetValue(nameof(XmlnsPrefixEnabled), value); } + get { return GetBoolean(nameof(XmlnsPrefixEnabled), true); } + set { SetValue(nameof(XmlnsPrefixEnabled), value); } } public bool XmlCloseTagEnabled { - get { return settings.GetBoolean(nameof(XmlCloseTagEnabled), true); } - set { settings.SetValue(nameof(XmlCloseTagEnabled), value); } + get { return GetBoolean(nameof(XmlCloseTagEnabled), true); } + set { SetValue(nameof(XmlCloseTagEnabled), value); } } public bool XmlMatchTagsEnabled { - get { return settings.GetBoolean(nameof(XmlMatchTagsEnabled), true); } - set { settings.SetValue(nameof(XmlMatchTagsEnabled), value); } + get { return GetBoolean(nameof(XmlMatchTagsEnabled), true); } + set { SetValue(nameof(XmlMatchTagsEnabled), value); } } [ImportingConstructor] - public XmlSettings(IVsfSettings settings) { - this.settings = settings; - this.settings.SettingsChanged += OnSettingsChanged; + public XmlSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { } - public void Save() { - this.settings.Save(); + public void Load() { + this.Store.Load(); } - private void OnSettingsChanged(object sender, EventArgs e) { - SettingsChanged?.Invoke(this, e); + public void Save() { + this.Store.Save(); + SettingsChanged?.Invoke(this, EventArgs.Empty); } - } } From 8555e0d927f69e7e2bbd40123e4ceb4a0a3b47c8 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sat, 10 Jun 2017 23:13:27 +0200 Subject: [PATCH 05/20] Refactor all handling of settings in language classes --- src/Viasfora.Core/Contracts/ILanguage.cs | 11 +--- .../Contracts/ILanguageSettings.cs | 13 +++++ src/Viasfora.Core/LanguageExtensions.cs | 19 ++++++ .../Settings/IStorageConversions.cs | 1 + src/Viasfora.Core/Settings/SettingsBase.cs | 17 ++++++ .../Settings/StorageConversions.cs | 7 +++ src/Viasfora.Core/Settings/VsfSettings.cs | 10 ---- src/Viasfora.Core/Text/KeywordTagger.cs | 2 +- src/Viasfora.Core/Viasfora.Core.csproj | 2 + src/Viasfora.Languages/CBasedLanguage.cs | 3 +- src/Viasfora.Languages/CSharp.cs | 42 ++++++++------ src/Viasfora.Languages/Cpp.cs | 35 ++++++----- src/Viasfora.Languages/Css.cs | 22 ++++--- src/Viasfora.Languages/DefaultLanguage.cs | 29 ++++++---- src/Viasfora.Languages/FSharp.cs | 40 +++++++------ src/Viasfora.Languages/JScript.cs | 31 ++++++---- src/Viasfora.Languages/Json.cs | 22 ++++--- src/Viasfora.Languages/LanguageFactory.cs | 7 ++- src/Viasfora.Languages/LanguageInfo.cs | 58 ++----------------- src/Viasfora.Languages/LanguageSettings.cs | 35 +++++++++++ src/Viasfora.Languages/PowerShell.cs | 31 ++++++---- src/Viasfora.Languages/Python.cs | 34 ++++++----- src/Viasfora.Languages/R.cs | 35 ++++++----- src/Viasfora.Languages/Sql.cs | 51 ++++++++-------- src/Viasfora.Languages/TypeScript.cs | 38 +++++++----- src/Viasfora.Languages/USql.cs | 48 +++++++-------- src/Viasfora.Languages/VB.cs | 47 ++++++++------- .../Viasfora.Languages.csproj | 1 + src/Viasfora.Languages/XLang.cs | 25 +++++--- .../Settings/RainbowSettings.cs | 11 ---- src/Viasfora.Rainbow/TextBufferBraces.cs | 2 +- src/Viasfora.Xml/Settings/XmlSettings.cs | 11 ---- src/Viasfora/Options/CSharpOptionsPage.cs | 19 +++--- src/Viasfora/Options/CppOptionsPage.cs | 15 +++-- src/Viasfora/Options/FSharpOptionsPage.cs | 19 +++--- src/Viasfora/Options/JScriptOptionsPage.cs | 15 +++-- src/Viasfora/Options/PowerShellOptionsPage.cs | 11 ++-- src/Viasfora/Options/PythonOptionsPage.cs | 15 +++-- src/Viasfora/Options/ROptionsPage.cs | 15 +++-- src/Viasfora/Options/SqlOptionsPage.cs | 19 +++--- src/Viasfora/Options/TypeScriptOptionsPage.cs | 19 +++--- src/Viasfora/Options/USqlOptionsPage.cs | 24 +++----- src/Viasfora/Options/VBOptionsPage.cs | 19 +++--- 43 files changed, 501 insertions(+), 429 deletions(-) create mode 100644 src/Viasfora.Core/Contracts/ILanguageSettings.cs create mode 100644 src/Viasfora.Core/LanguageExtensions.cs create mode 100644 src/Viasfora.Languages/LanguageSettings.cs diff --git a/src/Viasfora.Core/Contracts/ILanguage.cs b/src/Viasfora.Core/Contracts/ILanguage.cs index e59f3853..ca70a6e3 100644 --- a/src/Viasfora.Core/Contracts/ILanguage.cs +++ b/src/Viasfora.Core/Contracts/ILanguage.cs @@ -5,18 +5,11 @@ namespace Winterdom.Viasfora.Contracts { public interface ILanguage { - String[] ControlFlow { get; set; } - String[] Linq { get; set; } - String[] Visibility { get; set; } - String KeyName { get; } - bool Enabled { get; set; } - + ILanguageSettings Settings { get; } T GetService(); IStringScanner NewStringScanner(String classificationName, String text); - bool IsControlFlowKeyword(String text); - bool IsVisibilityKeyword(String text); - bool IsLinqKeyword(String text); bool MatchesContentType(IContentType contentType); bool IsKeywordClassification(IClassificationType classificationType); + Func NormalizationFunction { get; } } } diff --git a/src/Viasfora.Core/Contracts/ILanguageSettings.cs b/src/Viasfora.Core/Contracts/ILanguageSettings.cs new file mode 100644 index 00000000..0b938fe0 --- /dev/null +++ b/src/Viasfora.Core/Contracts/ILanguageSettings.cs @@ -0,0 +1,13 @@ +using System; + +namespace Winterdom.Viasfora.Contracts { + public interface ILanguageSettings { + String KeyName { get; } + String[] ControlFlow { get; set; } + String[] Linq { get; set; } + String[] Visibility { get; set; } + bool Enabled { get; set; } + void Load(); + void Save(); + } +} diff --git a/src/Viasfora.Core/LanguageExtensions.cs b/src/Viasfora.Core/LanguageExtensions.cs new file mode 100644 index 00000000..606218b5 --- /dev/null +++ b/src/Viasfora.Core/LanguageExtensions.cs @@ -0,0 +1,19 @@ +using System; +using System.Linq; +using Winterdom.Viasfora.Contracts; + +namespace Winterdom.Viasfora { + public static class LanguageExtensions { + private static StringComparer comparer = StringComparer.CurrentCultureIgnoreCase; + + public static bool IsControlFlowKeyword(this ILanguage lang, String text) { + return lang.Settings.ControlFlow.Contains(lang.NormalizationFunction(text), comparer); + } + public static bool IsVisibilityKeyword(this ILanguage lang, String text) { + return lang.Settings.Visibility.Contains(lang.NormalizationFunction(text), comparer); + } + public static bool IsLinqKeyword(this ILanguage lang, String text) { + return lang.Settings.Linq.Contains(lang.NormalizationFunction(text), comparer); + } + } +} diff --git a/src/Viasfora.Core/Settings/IStorageConversions.cs b/src/Viasfora.Core/Settings/IStorageConversions.cs index 33771262..dc41bc9f 100644 --- a/src/Viasfora.Core/Settings/IStorageConversions.cs +++ b/src/Viasfora.Core/Settings/IStorageConversions.cs @@ -7,6 +7,7 @@ public interface IStorageConversions { long ToInt64(String value); double ToDouble(String value); bool ToEnum(String value, out T result) where T : struct; + String[] ToList(String value); String ToString(object value); } } diff --git a/src/Viasfora.Core/Settings/SettingsBase.cs b/src/Viasfora.Core/Settings/SettingsBase.cs index 12372cad..97d67b30 100644 --- a/src/Viasfora.Core/Settings/SettingsBase.cs +++ b/src/Viasfora.Core/Settings/SettingsBase.cs @@ -9,6 +9,7 @@ namespace Winterdom.Viasfora.Settings { public abstract class SettingsBase { protected ISettingsStore Store { get; private set; } private IStorageConversions converter; + public event EventHandler SettingsChanged; public SettingsBase(ISettingsStore store, IStorageConversions converter) { this.Store = store; @@ -40,6 +41,14 @@ public T GetEnum(String name, T defval) where T : struct { } return defval; } + public String[] GetList(String name, String[] defaultValue) { + String value = GetValue(name, ""); + if ( String.IsNullOrEmpty(value) ) { + return defaultValue; + } + var list = converter.ToList(value); + return list.Length > 0 ? list : defaultValue; + } public String GetValue(String name, String defValue) { String val = Store.Get(name); @@ -53,5 +62,13 @@ public void SetValue(String name, object value) { } } + public void Load() { + this.Store.Load(); + } + + public void Save() { + this.Store.Save(); + SettingsChanged?.Invoke(this, EventArgs.Empty); + } } } diff --git a/src/Viasfora.Core/Settings/StorageConversions.cs b/src/Viasfora.Core/Settings/StorageConversions.cs index cfc11576..49fae563 100644 --- a/src/Viasfora.Core/Settings/StorageConversions.cs +++ b/src/Viasfora.Core/Settings/StorageConversions.cs @@ -40,7 +40,14 @@ public double ToDouble(String value) { public bool ToEnum(String value, out T result) where T : struct { return Enum.TryParse(value, out result); } + public String[] ToList(String value) { + return String.IsNullOrEmpty(value) ? new String[0] : value.AsList(); + } public String ToString(object value) { + String[] list = value as String[]; + if ( list != null ) { + return list.FromList(); + } return value != null ? Convert.ToString(value, CultureInfo.InvariantCulture) : null; } } diff --git a/src/Viasfora.Core/Settings/VsfSettings.cs b/src/Viasfora.Core/Settings/VsfSettings.cs index 536f3884..0a52f8d6 100644 --- a/src/Viasfora.Core/Settings/VsfSettings.cs +++ b/src/Viasfora.Core/Settings/VsfSettings.cs @@ -7,8 +7,6 @@ namespace Winterdom.Viasfora.Settings { [Export(typeof(IVsfSettings))] public class VsfSettings : SettingsBase, IVsfSettings { - public event EventHandler SettingsChanged; - public bool KeywordClassifierEnabled { get { return GetBoolean(nameof(KeywordClassifierEnabled), true); } set { SetValue(nameof(KeywordClassifierEnabled), value); } @@ -82,13 +80,5 @@ public bool TelemetryEnabled { public VsfSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { } - public void Load() { - Store.Load(); - } - public void Save() { - Store.Save(); - SettingsChanged?.Invoke(this, EventArgs.Empty); - } - } } diff --git a/src/Viasfora.Core/Text/KeywordTagger.cs b/src/Viasfora.Core/Text/KeywordTagger.cs index fc968175..7e4542f6 100644 --- a/src/Viasfora.Core/Text/KeywordTagger.cs +++ b/src/Viasfora.Core/Text/KeywordTagger.cs @@ -46,7 +46,7 @@ public IEnumerable> GetTags(NormalizedSnapshotSpanCollectio yield break; } ILanguage lang = GetLanguageByContentType(theBuffer.ContentType); - if ( !lang.Enabled ) { + if ( !lang.Settings.Enabled ) { yield break; } diff --git a/src/Viasfora.Core/Viasfora.Core.csproj b/src/Viasfora.Core/Viasfora.Core.csproj index e0ce41d8..b10a1979 100644 --- a/src/Viasfora.Core/Viasfora.Core.csproj +++ b/src/Viasfora.Core/Viasfora.Core.csproj @@ -154,6 +154,7 @@ + @@ -179,6 +180,7 @@ + diff --git a/src/Viasfora.Languages/CBasedLanguage.cs b/src/Viasfora.Languages/CBasedLanguage.cs index 2cb6564e..9acfe8f3 100644 --- a/src/Viasfora.Languages/CBasedLanguage.cs +++ b/src/Viasfora.Languages/CBasedLanguage.cs @@ -1,4 +1,5 @@ using System; +using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; @@ -7,8 +8,6 @@ namespace Winterdom.Viasfora.Languages { public abstract class CBasedLanguage : LanguageInfo { - public CBasedLanguage(IVsfSettings settings) : base(settings) { - } protected override IBraceScanner NewBraceScanner() => new CBraceScanner(); public override IStringScanner NewStringScanner(String classificationName, String text) diff --git a/src/Viasfora.Languages/CSharp.cs b/src/Viasfora.Languages/CSharp.cs index ee6062eb..dd40b4e0 100644 --- a/src/Viasfora.Languages/CSharp.cs +++ b/src/Viasfora.Languages/CSharp.cs @@ -4,39 +4,45 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class CSharp : CBasedLanguage { + public class CSharp : CBasedLanguage, ILanguage { public const String ContentType = "CSharp"; - static readonly String[] CS_KEYWORDS = { - "if", "else", "while", "do", "for", "foreach", + protected override String[] SupportedContentTypes + => new String[] { ContentType }; + public ILanguageSettings Settings { get; private set; } + + protected override IBraceScanner NewBraceScanner() + => new CSharpBraceScanner(); + public override IStringScanner NewStringScanner(String classificationName, String text) + => new CSharpStringScanner(text, classificationName); + + [ImportingConstructor] + public CSharp(ISettingsStore store, IStorageConversions converter) { + this.Settings = new CSharpSettings(store, converter); + } + } + + public class CSharpSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "if", "else", "while", "do", "for", "foreach", "switch", "break", "continue", "return", "goto", "throw", "yield" }; - static readonly String[] CS_LINQ_KEYWORDS = { + protected override String[] LinqDefaults => new String[] { "select", "let", "where", "join", "orderby", "group", "by", "on", "equals", "into", "from", "descending", "ascending" }; - static readonly String[] CS_VIS_KEYWORDS = { + protected override String[] VisibilityDefaults => new String[] { "public", "private", "protected", "internal" }; - protected override String[] ControlFlowDefaults => CS_KEYWORDS; - protected override String[] LinqDefaults => CS_LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => CS_VIS_KEYWORDS; - public override String KeyName => Constants.CSharp; - protected override String[] SupportedContentTypes - => new String[] { ContentType }; - - protected override IBraceScanner NewBraceScanner() - => new CSharpBraceScanner(); - public override IStringScanner NewStringScanner(String classificationName, String text) - => new CSharpStringScanner(text, classificationName); - [ImportingConstructor] - public CSharp(IVsfSettings settings) : base(settings) { + public CSharpSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.CSharp, store, converter) { } } } diff --git a/src/Viasfora.Languages/Cpp.cs b/src/Viasfora.Languages/Cpp.cs index 20c17d73..19f641a1 100644 --- a/src/Viasfora.Languages/Cpp.cs +++ b/src/Viasfora.Languages/Cpp.cs @@ -2,33 +2,42 @@ using System.ComponentModel.Composition; using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.Sequences; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class Cpp : CBasedLanguage { + class Cpp : CBasedLanguage, ILanguage { private readonly static String[] knownTypes = new String[] { "C/C++", "HLSL" }; - static readonly String[] CPP_KEYWORDS = { - "if", "else", "while", "do", "for", "each", "switch", - "break", "continue", "return", "goto", "throw" - }; - static readonly String[] CPP_VIS_KEYWORDS = { - "public", "private", "protected", "internal", "friend" - }; - protected override String[] ControlFlowDefaults => CPP_KEYWORDS; - protected override String[] LinqDefaults => EMPTY; - protected override String[] VisibilityDefaults => CPP_VIS_KEYWORDS; - public override String KeyName => Constants.Cpp; protected override String[] SupportedContentTypes => knownTypes; + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public Cpp(IVsfSettings settings) : base(settings) { + public Cpp(ISettingsStore store, IStorageConversions converter) { + this.Settings = new CppSettings(store, converter); } public override IStringScanner NewStringScanner(String classificationName, String text) => new CStringScanner(text); } + + class CppSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "if", "else", "while", "do", "for", "each", "switch", + "break", "continue", "return", "goto", "throw" + }; + + protected override String[] LinqDefaults => EMPTY; + + protected override String[] VisibilityDefaults => new String[] { + "public", "private", "protected", "internal", "friend" + }; + + public CppSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.Cpp, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/Css.cs b/src/Viasfora.Languages/Css.cs index 6978373f..5b518d29 100644 --- a/src/Viasfora.Languages/Css.cs +++ b/src/Viasfora.Languages/Css.cs @@ -4,26 +4,24 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class Css : LanguageInfo { + public class Css : LanguageInfo, ILanguage { public const String ContentType = "css"; public const String SassContentType = "SCSS"; public const String LessContentType = "LESS"; - public override String KeyName => Constants.Css; - protected override String[] SupportedContentTypes { get { return new String[] { ContentType, SassContentType, LessContentType }; } } - protected override String[] ControlFlowDefaults => EMPTY; - protected override String[] LinqDefaults => EMPTY; - protected override String[] VisibilityDefaults => EMPTY; + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public Css(IVsfSettings settings) : base(settings) { + public Css(ISettingsStore store, IStorageConversions converter) { + this.Settings = new CssSettings(store, converter); } public override IStringScanner NewStringScanner(String classificationName, String text) @@ -31,4 +29,14 @@ public override IStringScanner NewStringScanner(String classificationName, Strin protected override IBraceScanner NewBraceScanner() => new CssBraceScanner(); } + + public class CssSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => EMPTY; + protected override String[] LinqDefaults => EMPTY; + protected override String[] VisibilityDefaults => EMPTY; + + public CssSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.Css, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/DefaultLanguage.cs b/src/Viasfora.Languages/DefaultLanguage.cs index 95e5e0b6..40b7b725 100644 --- a/src/Viasfora.Languages/DefaultLanguage.cs +++ b/src/Viasfora.Languages/DefaultLanguage.cs @@ -1,21 +1,20 @@ using System; -using Winterdom.Viasfora.Languages.BraceScanners; -using Winterdom.Viasfora.Rainbow; -using Winterdom.Viasfora.Util; using System.ComponentModel.Composition; using Microsoft.VisualStudio.Utilities; +using Winterdom.Viasfora.Languages.BraceScanners; +using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; +using Winterdom.Viasfora.Contracts; namespace Winterdom.Viasfora.Languages { - public class DefaultLanguage : LanguageInfo { - protected override String[] ControlFlowDefaults => EMPTY; - protected override String[] LinqDefaults => EMPTY; - protected override String[] VisibilityDefaults => EMPTY; + public class DefaultLanguage : LanguageInfo, ILanguage { - protected override string[] SupportedContentTypes => EMPTY; - public override string KeyName => "Text"; + protected override string[] SupportedContentTypes => new String[0]; + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public DefaultLanguage(IVsfSettings settings) : base(settings) { + public DefaultLanguage(ISettingsStore store, IStorageConversions converter) { + this.Settings = new DefaultSettings(store, converter); } public override bool MatchesContentType(IContentType contentType) { @@ -24,4 +23,14 @@ public override bool MatchesContentType(IContentType contentType) { protected override IBraceScanner NewBraceScanner() => new DefaultBraceScanner(); } + + public class DefaultSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => EMPTY; + protected override String[] LinqDefaults => EMPTY; + protected override String[] VisibilityDefaults => EMPTY; + + public DefaultSettings(ISettingsStore store, IStorageConversions converter) + : base ("Text", store, converter) { + } + } } diff --git a/src/Viasfora.Languages/FSharp.cs b/src/Viasfora.Languages/FSharp.cs index a8627f28..4b0d420e 100644 --- a/src/Viasfora.Languages/FSharp.cs +++ b/src/Viasfora.Languages/FSharp.cs @@ -4,32 +4,20 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class FSharp : LanguageInfo { + public class FSharp : LanguageInfo, ILanguage { public const String ContentType = "F#"; - static readonly String[] KEYWORDS = { - "if", "then", "elif", "else", "match", "with", - "for", "do", "to", "done", "while", "rec", - "failwith", "yield" - }; - static readonly String[] LINQ_KEYWORDS = { - "query", "select", "seq" - }; - static readonly String[] VIS_KEYWORDS = { - "public", "private", "internal" - }; - protected override String[] ControlFlowDefaults => KEYWORDS; - protected override String[] LinqDefaults => LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => VIS_KEYWORDS; - public override String KeyName => Constants.FSharp; protected override String[] SupportedContentTypes => new String[] { ContentType }; + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public FSharp(IVsfSettings settings) : base(settings) { + public FSharp(ISettingsStore store, IStorageConversions converter) { + this.Settings = new FSharpSettings(store, converter); } protected override IBraceScanner NewBraceScanner() @@ -37,4 +25,22 @@ protected override IBraceScanner NewBraceScanner() public override IStringScanner NewStringScanner(String classificationName, String text) => new FSharpStringScanner(text); } + + class FSharpSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "if", "then", "elif", "else", "match", "with", + "for", "do", "to", "done", "while", "rec", + "failwith", "yield" + }; + protected override String[] LinqDefaults => new String[] { + "query", "select", "seq" + }; + protected override String[] VisibilityDefaults => new String[] { + "public", "private", "internal" + }; + + public FSharpSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.FSharp, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/JScript.cs b/src/Viasfora.Languages/JScript.cs index c1cd89a0..5e62bb87 100644 --- a/src/Viasfora.Languages/JScript.cs +++ b/src/Viasfora.Languages/JScript.cs @@ -3,31 +3,38 @@ using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class JScript : CBasedLanguage { + class JScript : CBasedLanguage, ILanguage { private readonly static String[] knownTypes = new String[] { "JScript", "JavaScript", "Node.js" }; - static readonly String[] JS_KEYWORDS = { + protected override String[] SupportedContentTypes => knownTypes; + public ILanguageSettings Settings { get; private set; } + + [ImportingConstructor] + public JScript(ISettingsStore store, IStorageConversions converter) { + this.Settings = new JScriptSettings(store, converter); + } + + protected override IBraceScanner NewBraceScanner() + => new JScriptBraceScanner(); + } + + public class JScriptSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { "if", "else", "while", "do", "for", "switch", "break", "continue", "return", "throw" }; - static readonly String[] JS_LINQ_KEYWORDS = { + protected override String[] LinqDefaults => new String[] { "in", "with" }; - protected override String[] ControlFlowDefaults => JS_KEYWORDS; - protected override String[] LinqDefaults => JS_LINQ_KEYWORDS; protected override String[] VisibilityDefaults => EMPTY; - public override String KeyName => Constants.JS; - protected override String[] SupportedContentTypes => knownTypes; - [ImportingConstructor] - public JScript(IVsfSettings settings) : base(settings) { + public JScriptSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.JS, store, converter) { } - - protected override IBraceScanner NewBraceScanner() - => new JScriptBraceScanner(); } } diff --git a/src/Viasfora.Languages/Json.cs b/src/Viasfora.Languages/Json.cs index 422ca4aa..01380b8b 100644 --- a/src/Viasfora.Languages/Json.cs +++ b/src/Viasfora.Languages/Json.cs @@ -3,25 +3,33 @@ using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class JSON : CBasedLanguage { + class JSON : CBasedLanguage, ILanguage { public const String ContentType = "JSON"; - protected override String[] ControlFlowDefaults => EMPTY; - protected override String[] LinqDefaults => EMPTY; - protected override String[] VisibilityDefaults => EMPTY; - - public override String KeyName => Constants.Json; protected override String[] SupportedContentTypes => new String[] { ContentType }; + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public JSON(IVsfSettings settings) : base(settings) { + public JSON(ISettingsStore store, IStorageConversions converter) { + this.Settings = new JsonSettings(store, converter); } protected override IBraceScanner NewBraceScanner() => new JScriptBraceScanner(); } + + public class JsonSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => EMPTY; + protected override String[] LinqDefaults => EMPTY; + protected override String[] VisibilityDefaults => EMPTY; + + public JsonSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.Json, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/LanguageFactory.cs b/src/Viasfora.Languages/LanguageFactory.cs index 989d6e75..935a6047 100644 --- a/src/Viasfora.Languages/LanguageFactory.cs +++ b/src/Viasfora.Languages/LanguageFactory.cs @@ -4,6 +4,7 @@ using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Utilities; using Winterdom.Viasfora.Contracts; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguageFactory))] @@ -13,8 +14,8 @@ public class LanguageFactory : ILanguageFactory { private ILanguage defaultLang; [ImportingConstructor] - public LanguageFactory(IVsfSettings settings) { - this.defaultLang = new DefaultLanguage(settings); + public LanguageFactory(ISettingsStore store, IStorageConversions converter) { + this.defaultLang = new DefaultLanguage(store, converter); } public ILanguage TryCreateLanguage(IContentType contentType) { @@ -34,7 +35,7 @@ public ILanguage TryCreateLanguage(ITextSnapshot snapshot) { } public ILanguage TryCreateLanguage(String key) { foreach ( ILanguage lang in Languages ) { - if ( lang.KeyName == key ) { + if ( lang.Settings.KeyName == key ) { return lang; } } diff --git a/src/Viasfora.Languages/LanguageInfo.cs b/src/Viasfora.Languages/LanguageInfo.cs index bf7ad7a7..6466e194 100644 --- a/src/Viasfora.Languages/LanguageInfo.cs +++ b/src/Viasfora.Languages/LanguageInfo.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Linq; using Microsoft.VisualStudio.Utilities; using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.CommentParsers; @@ -9,32 +7,7 @@ using Microsoft.VisualStudio.Text.Classification; namespace Winterdom.Viasfora.Languages { - public abstract class LanguageInfo : ILanguage { - private static StringComparer comparer = StringComparer.CurrentCultureIgnoreCase; - protected static readonly String[] EMPTY = { }; - public IVsfSettings Settings { get; private set; } - - public String[] ControlFlow { - get { return Get("ControlFlow", ControlFlowDefaults); } - set { Set("ControlFlow", value); } - } - public String[] Linq { - get { return Get("Linq", LinqDefaults); } - set { Set("Linq", value); } - } - public String[] Visibility { - get { return Get("Visibility", VisibilityDefaults); } - set { Set("Visibility", value); } - } - public bool Enabled { - get { return Settings.GetBoolean(KeyName + "_Enabled", true); } - set { Settings.SetValue(KeyName + "_Enabled", value); } - } - - public LanguageInfo(IVsfSettings settings) { - this.Settings = settings; - } - + public abstract class LanguageInfo { public T GetService() { if ( typeof(T) == typeof(IBraceScanner) ) { return (T)NewBraceScanner(); @@ -60,41 +33,20 @@ public virtual bool MatchesContentType(IContentType contentType) { return false; } - public bool IsControlFlowKeyword(String text) { - return ControlFlow.Contains(TextToCompare(text), comparer); - } - public bool IsVisibilityKeyword(String text) { - return Visibility.Contains(TextToCompare(text), comparer); - } - public bool IsLinqKeyword(String text) { - return Linq.Contains(TextToCompare(text), comparer); - } public virtual bool IsKeywordClassification(IClassificationType classificationType) { return CompareClassification(classificationType, "Keyword"); } - protected virtual String TextToCompare(String text) { - return text; - } + public Func NormalizationFunction { get; protected set; } protected abstract String[] SupportedContentTypes { get; } - protected abstract String[] ControlFlowDefaults { get; } - protected abstract String[] LinqDefaults { get; } - protected abstract String[] VisibilityDefaults { get; } - public abstract String KeyName { get; } - protected String[] Get(String name, String[] defaults) { - String[] values = Settings.GetValue(this.KeyName + "_" + name, null).AsList(); - if ( values == null || values.Length == 0 ) - values = defaults; - return values; - } - protected void Set(String name, IEnumerable values) { - Settings.SetValue(this.KeyName + "_" + name, values.FromList()); - } protected bool CompareClassification(IClassificationType classificationType, String name) { return classificationType.Classification.Equals(name, StringComparison.OrdinalIgnoreCase); } + public LanguageInfo() { + this.NormalizationFunction = x => x; + } } } diff --git a/src/Viasfora.Languages/LanguageSettings.cs b/src/Viasfora.Languages/LanguageSettings.cs new file mode 100644 index 00000000..016133b7 --- /dev/null +++ b/src/Viasfora.Languages/LanguageSettings.cs @@ -0,0 +1,35 @@ +using System; +using Winterdom.Viasfora.Contracts; +using Winterdom.Viasfora.Settings; + +namespace Winterdom.Viasfora.Languages { + public abstract class LanguageSettings : SettingsBase, ILanguageSettings { + protected static readonly String[] EMPTY = { }; + protected abstract String[] ControlFlowDefaults { get; } + protected abstract String[] LinqDefaults { get; } + protected abstract String[] VisibilityDefaults { get; } + + public String KeyName { get; private set; } + public String[] ControlFlow { + get { return GetList(KeyName + "_ControlFlow", ControlFlowDefaults); } + set { SetValue(KeyName + "_ControlFlow", value); } + } + public String[] Linq { + get { return GetList(KeyName + "_Linq", LinqDefaults); } + set { SetValue(KeyName + "_Linq", value); } + } + public String[] Visibility { + get { return GetList(KeyName + "_Visibility", VisibilityDefaults); } + set { SetValue(KeyName + "_Visibility", value); } + } + public bool Enabled { + get { return GetBoolean(KeyName + "_Enabled", true); } + set { SetValue(KeyName + "_Enabled", value); } + } + + public LanguageSettings(String key, ISettingsStore store, IStorageConversions converter) + : base(store, converter) { + this.KeyName = key; + } + } +} diff --git a/src/Viasfora.Languages/PowerShell.cs b/src/Viasfora.Languages/PowerShell.cs index c672e3b3..23003fd3 100644 --- a/src/Viasfora.Languages/PowerShell.cs +++ b/src/Viasfora.Languages/PowerShell.cs @@ -4,34 +4,41 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class PowerShell : LanguageInfo { + public class PowerShell : LanguageInfo, ILanguage { public const String ContentTypeVS2013 = "PowerShell.v3"; public const String ContentTypePSTools = "PowerShell"; - static readonly String[] FLOW_KEYWORDS = { - "for", "while", "foreach", "if", "else", - "elseif", "do", "break", "continue", - "exit", "return", "until", "switch" - }; - protected override String[] ControlFlowDefaults => FLOW_KEYWORDS; - protected override String[] LinqDefaults => EMPTY; - protected override String[] VisibilityDefaults => EMPTY; - - public override String KeyName => Constants.PowerShell; protected override String[] SupportedContentTypes { get { return new String[] { ContentTypePSTools, ContentTypeVS2013 }; } } + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public PowerShell(IVsfSettings settings) : base(settings) { + public PowerShell(ISettingsStore store, IStorageConversions converter) { + this.Settings = new PowershellSettings(store, converter); } protected override IBraceScanner NewBraceScanner() => new PsBraceScanner(); public override IStringScanner NewStringScanner(String classificationName, String text) => new PsStringScanner(text); } + + public class PowershellSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "for", "while", "foreach", "if", "else", + "elseif", "do", "break", "continue", + "exit", "return", "until", "switch" + }; + protected override String[] LinqDefaults => EMPTY; + protected override String[] VisibilityDefaults => EMPTY; + + public PowershellSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.PowerShell, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/Python.cs b/src/Viasfora.Languages/Python.cs index 07096f90..b70d23be 100644 --- a/src/Viasfora.Languages/Python.cs +++ b/src/Viasfora.Languages/Python.cs @@ -3,26 +3,16 @@ using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class Python : LanguageInfo { + class Python : LanguageInfo, ILanguage { public static readonly String[] knownContentTypes = new String[] { "Python", "code++.Python" }; + public ILanguageSettings Settings { get; private set; } - static readonly String[] KEYWORDS = { - "break", "continue", "if", "elif", "else", - "for", "raise", "return", "while", "yield" - }; - static readonly String[] LINQ_KEYWORDS = { - "from", "in" - }; - protected override String[] ControlFlowDefaults => KEYWORDS; - protected override String[] LinqDefaults => LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => EMPTY; - - public override String KeyName => Constants.Python; protected override String[] SupportedContentTypes => knownContentTypes; @@ -30,7 +20,23 @@ protected override IBraceScanner NewBraceScanner() => new PythonBraceScanner(); [ImportingConstructor] - public Python(IVsfSettings settings) : base(settings) { + public Python(ISettingsStore store, IStorageConversions converter) { + this.Settings = new PythonSettings(store, converter); + } + } + + class PythonSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "break", "continue", "if", "elif", "else", + "for", "raise", "return", "while", "yield" + }; + protected override String[] LinqDefaults => new String[] { + "from", "in" + }; + protected override String[] VisibilityDefaults => EMPTY; + + public PythonSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.Python, store, converter) { } } } diff --git a/src/Viasfora.Languages/R.cs b/src/Viasfora.Languages/R.cs index 8b7505c0..7ae662e8 100644 --- a/src/Viasfora.Languages/R.cs +++ b/src/Viasfora.Languages/R.cs @@ -4,29 +4,19 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class R : LanguageInfo { - static readonly String[] KEYWORDS = { - "if", "else", "for", "while", "repeat", "switch", - "return", "next", "break" - }; - static readonly String[] LINQ_KEYWORDS = { - "apply", "in" - }; - - public override string KeyName => Constants.R; + public class R : LanguageInfo, ILanguage { protected override String[] SupportedContentTypes => new String[] { ContentTypes.R }; - protected override String[] ControlFlowDefaults => KEYWORDS; - protected override String[] LinqDefaults => LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => EMPTY; - + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public R(IVsfSettings settings) : base(settings) { + public R(ISettingsStore store, IStorageConversions converter) { + this.Settings = new RSettings(store, converter); } protected override IBraceScanner NewBraceScanner() @@ -35,4 +25,19 @@ protected override IBraceScanner NewBraceScanner() public override IStringScanner NewStringScanner(String classificationName, String text) => new RStringScanner(text); } + + class RSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "if", "else", "for", "while", "repeat", "switch", + "return", "next", "break" + }; + protected override String[] LinqDefaults => new String[] { + "apply", "in" + }; + protected override String[] VisibilityDefaults => EMPTY; + + public RSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.R, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/Sql.cs b/src/Viasfora.Languages/Sql.cs index f2931009..040e5acd 100644 --- a/src/Viasfora.Languages/Sql.cs +++ b/src/Viasfora.Languages/Sql.cs @@ -3,42 +3,43 @@ using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class Sql : LanguageInfo { + class Sql : LanguageInfo, ILanguage { private readonly static String[] knownContentTypes = new String[] { "Sql Server Tools", "SQL", "StreamAnalytics" }; - - static readonly String[] KEYWORDS = { - "begin", "end", "break", "continue", "goto", "if", - "else", "then", "return", "throw", "try", "catch", - "waitfor", "while" - }; - static readonly String[] VIS_KEYWORDS = { - "public", "external" - }; - static readonly String[] LINQ_KEYWORDS = { - "select", "update", "insert", "delete", "merge" - }; - - protected override String[] ControlFlowDefaults => KEYWORDS; - protected override String[] LinqDefaults => LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => VIS_KEYWORDS; - public override String KeyName => Constants.Sql; protected override String[] SupportedContentTypes => knownContentTypes; + public ILanguageSettings Settings { get; private set; } + + [ImportingConstructor] + public Sql(ISettingsStore store, IStorageConversions converter) { + this.Settings = new SqlSettings(store, converter); + // the SQL classifier will return text spans that include + // trailing spaces (such as "IF ") + this.NormalizationFunction = text => text.Trim(); + } protected override IBraceScanner NewBraceScanner() => new SqlBraceScanner(); + } - [ImportingConstructor] - public Sql(IVsfSettings settings) : base(settings) { - } + class SqlSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "begin", "end", "break", "continue", "goto", "if", + "else", "then", "return", "throw", "try", "catch", + "waitfor", "while" + }; + protected override String[] LinqDefaults => new String[] { + "select", "update", "insert", "delete", "merge" + }; + protected override String[] VisibilityDefaults => new String[] { + "public", "external" + }; - protected override string TextToCompare(string text) { - // the SQL classifier will return text spans that include - // trailing spaces (such as "IF ") - return text.Trim(); + public SqlSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.Sql, store, converter) { } } } diff --git a/src/Viasfora.Languages/TypeScript.cs b/src/Viasfora.Languages/TypeScript.cs index f7c5bc0b..a76ad0b7 100644 --- a/src/Viasfora.Languages/TypeScript.cs +++ b/src/Viasfora.Languages/TypeScript.cs @@ -3,34 +3,40 @@ using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class TypeScript : CBasedLanguage { + class TypeScript : CBasedLanguage, ILanguage { public const String ContentType = "TypeScript"; - static readonly String[] KEYWORDS = { - "if", "else", "while", "do", "for", "switch", - "break", "continue", "return", "throw" - }; - static readonly String[] VISIBILITY = { - "export", "public", "private" - }; - static readonly String[] LINQ_KEYWORDS = { - "in", "with" - }; - protected override String[] ControlFlowDefaults => KEYWORDS; - protected override String[] LinqDefaults => LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => VISIBILITY; - public override String KeyName => Constants.TypeScript; protected override String[] SupportedContentTypes => new String[] { ContentType }; + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public TypeScript(IVsfSettings settings) : base(settings) { + public TypeScript(ISettingsStore store, IStorageConversions converter) { + this.Settings = new TypeScriptSettings(store, converter); } protected override IBraceScanner NewBraceScanner() => new JScriptBraceScanner(); } + + class TypeScriptSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "if", "else", "while", "do", "for", "switch", + "break", "continue", "return", "throw" + }; + protected override String[] LinqDefaults => new String[] { + "in", "with" + }; + protected override String[] VisibilityDefaults => new String[] { + "export", "public", "private" + }; + + public TypeScriptSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.TypeScript, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/USql.cs b/src/Viasfora.Languages/USql.cs index 2ab709f5..4445c6e9 100644 --- a/src/Viasfora.Languages/USql.cs +++ b/src/Viasfora.Languages/USql.cs @@ -4,38 +4,21 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class USql : LanguageInfo { - - static readonly String[] QUERY = { - "select", "extract", "process", "reduce", "combine", - "produce", "using", "output", "from" - }; - static readonly String[] VISIBILITY = { - "readonly" - }; - - public override String KeyName { - get { return Constants.USql; } - } - - protected override String[] ControlFlowDefaults { - get { return EMPTY; } - } - - protected override String[] LinqDefaults { - get { return QUERY; } + public class USql : LanguageInfo, ILanguage { + protected override String[] SupportedContentTypes { + get { return new String[] { "U-SQL" }; } } - protected override String[] VisibilityDefaults { - get { return VISIBILITY; } - } + public ILanguageSettings Settings { get; private set; } - protected override String[] SupportedContentTypes { - get { return new String[] { "U-SQL" }; } + [ImportingConstructor] + public USql(ISettingsStore store, IStorageConversions converter) { + this.Settings = new USqlSettings(store, converter); } protected override IBraceScanner NewBraceScanner() { @@ -44,9 +27,20 @@ protected override IBraceScanner NewBraceScanner() { public override IStringScanner NewStringScanner(String classificationName, String text) { return new CSharpStringScanner(text, classificationName); } + } - [ImportingConstructor] - public USql(IVsfSettings settings) : base(settings) { + class USqlSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => EMPTY; + protected override String[] LinqDefaults => new String[] { + "select", "extract", "process", "reduce", "combine", + "produce", "using", "output", "from" + }; + protected override String[] VisibilityDefaults => new String[] { + "readonly" + }; + + public USqlSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.USql, store, converter) { } } } diff --git a/src/Viasfora.Languages/VB.cs b/src/Viasfora.Languages/VB.cs index e2556c11..1ba0ecf0 100644 --- a/src/Viasfora.Languages/VB.cs +++ b/src/Viasfora.Languages/VB.cs @@ -4,38 +4,22 @@ using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - class VB : LanguageInfo { + class VB : LanguageInfo, ILanguage { public const String ContentType = "Basic"; public const String VBScriptContentType = "vbscript"; - static readonly String[] VB_KEYWORDS = { - "goto", "resume", "throw", "exit", "stop", - "do", "loop", "for", "next", "for each", - "with", "choose", "if", "then", "else", "select", - "case", "switch", "call", "return", "while" - }; - static readonly String[] VB_VIS_KEYWORDS = { - "friend", "public", "private", "protected" - }; - static readonly String[] VB_LINQ_KEYWORDS = { - "aggregate", "distinct", "equals", "from", "in", - "group", "join", "let", "order", "by", - "skip", "take", "where" - }; - protected override String[] ControlFlowDefaults => VB_KEYWORDS; - protected override String[] LinqDefaults => VB_LINQ_KEYWORDS; - protected override String[] VisibilityDefaults => VB_VIS_KEYWORDS; - public override String KeyName => Constants.VB; - protected override String[] SupportedContentTypes { get { return new String[] { ContentType, VBScriptContentType }; } } + public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public VB(IVsfSettings settings) : base(settings) { + public VB(ISettingsStore store, IStorageConversions converter) { + this.Settings = new VBSettings(store, converter); } protected override IBraceScanner NewBraceScanner() @@ -46,4 +30,25 @@ public override bool IsKeywordClassification(IClassificationType classificationT || CompareClassification(classificationType, "VBScript Keyword"); } } + + class VBSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => new String[] { + "goto", "resume", "throw", "exit", "stop", + "do", "loop", "for", "next", "for each", + "with", "choose", "if", "then", "else", "select", + "case", "switch", "call", "return", "while" + }; + protected override String[] LinqDefaults => new String[] { + "aggregate", "distinct", "equals", "from", "in", + "group", "join", "let", "order", "by", + "skip", "take", "where" + }; + protected override String[] VisibilityDefaults => new String[] { + "friend", "public", "private", "protected" + }; + + public VBSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.VB, store, converter) { + } + } } diff --git a/src/Viasfora.Languages/Viasfora.Languages.csproj b/src/Viasfora.Languages/Viasfora.Languages.csproj index a2264068..d31b08f0 100644 --- a/src/Viasfora.Languages/Viasfora.Languages.csproj +++ b/src/Viasfora.Languages/Viasfora.Languages.csproj @@ -164,6 +164,7 @@ + diff --git a/src/Viasfora.Languages/XLang.cs b/src/Viasfora.Languages/XLang.cs index 14f78b5e..b4c462bc 100644 --- a/src/Viasfora.Languages/XLang.cs +++ b/src/Viasfora.Languages/XLang.cs @@ -4,29 +4,36 @@ using Winterdom.Viasfora.Languages.BraceScanners; using Winterdom.Viasfora.Languages.Sequences; using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages { [Export(typeof(ILanguage))] - public class XLang : CBasedLanguage { + public class XLang : CBasedLanguage, ILanguage { public const String ContentType = ContentTypes.XLang; - protected override String[] ControlFlowDefaults => EMPTY; - protected override String[] LinqDefaults => EMPTY; - protected override String[] VisibilityDefaults => EMPTY; - - public override String KeyName => Constants.XLang; - protected override String[] SupportedContentTypes => new String[] { ContentType }; + public ILanguageSettings Settings { get; private set; } + + [ImportingConstructor] + public XLang(ISettingsStore store, IStorageConversions converter) { + this.Settings = new XLangSettings(store, converter); + } protected override IBraceScanner NewBraceScanner() => new CSharpBraceScanner(); public override IStringScanner NewStringScanner(String classificationName, String text) => new CSharpStringScanner(text); + } - [ImportingConstructor] - public XLang(IVsfSettings settings) : base(settings) { + class XLangSettings : LanguageSettings { + protected override String[] ControlFlowDefaults => EMPTY; + protected override String[] LinqDefaults => EMPTY; + protected override String[] VisibilityDefaults => EMPTY; + + public XLangSettings(ISettingsStore store, IStorageConversions converter) + : base (Constants.XLang, store, converter) { } } } diff --git a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs index 14a85528..583d5ed1 100644 --- a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs +++ b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs @@ -5,8 +5,6 @@ namespace Winterdom.Viasfora.Rainbow.Settings { [Export(typeof(IRainbowSettings))] public class RainbowSettings : SettingsBase, IRainbowSettings { - public event EventHandler SettingsChanged; - public int RainbowDepth { get { return GetInt32(nameof(RainbowDepth), 4); } set { SetValue(nameof(RainbowDepth), value); } @@ -39,14 +37,5 @@ public RainbowColoringMode RainbowColoringMode { [ImportingConstructor] public RainbowSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { } - - public void Load() { - this.Store.Load(); - } - - public void Save() { - this.Store.Save(); - SettingsChanged?.Invoke(this, EventArgs.Empty); - } } } diff --git a/src/Viasfora.Rainbow/TextBufferBraces.cs b/src/Viasfora.Rainbow/TextBufferBraces.cs index a7a12b39..ee74e7e1 100644 --- a/src/Viasfora.Rainbow/TextBufferBraces.cs +++ b/src/Viasfora.Rainbow/TextBufferBraces.cs @@ -17,7 +17,7 @@ public class TextBufferBraces : ITextBufferBraces { public String BraceChars { get; private set; } public int LastParsedPosition { get; private set; } public bool Enabled { - get { return language != null ? language.Enabled : false; } + get { return language != null ? language.Settings.Enabled : false; } } public TextBufferBraces(ITextSnapshot snapshot, ILanguage language, RainbowColoringMode coloringMode) { diff --git a/src/Viasfora.Xml/Settings/XmlSettings.cs b/src/Viasfora.Xml/Settings/XmlSettings.cs index 4c74ab0e..f3472f34 100644 --- a/src/Viasfora.Xml/Settings/XmlSettings.cs +++ b/src/Viasfora.Xml/Settings/XmlSettings.cs @@ -5,8 +5,6 @@ namespace Winterdom.Viasfora.Xml.Settings { [Export(typeof(IXmlSettings))] public class XmlSettings : SettingsBase, IXmlSettings { - public event EventHandler SettingsChanged; - public bool XmlnsPrefixEnabled { get { return GetBoolean(nameof(XmlnsPrefixEnabled), true); } set { SetValue(nameof(XmlnsPrefixEnabled), value); } @@ -23,14 +21,5 @@ public bool XmlMatchTagsEnabled { [ImportingConstructor] public XmlSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { } - - public void Load() { - this.Store.Load(); - } - - public void Save() { - this.Store.Save(); - SettingsChanged?.Invoke(this, EventArgs.Empty); - } } } diff --git a/src/Viasfora/Options/CSharpOptionsPage.cs b/src/Viasfora/Options/CSharpOptionsPage.cs index e0e55dbe..dfb09022 100644 --- a/src/Viasfora/Options/CSharpOptionsPage.cs +++ b/src/Viasfora/Options/CSharpOptionsPage.cs @@ -14,19 +14,18 @@ public class CSharpOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + VisibilityKeywords = language.Settings.Visibility.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/CppOptionsPage.cs b/src/Viasfora/Options/CppOptionsPage.cs index 857bff53..c333afa7 100644 --- a/src/Viasfora/Options/CppOptionsPage.cs +++ b/src/Viasfora/Options/CppOptionsPage.cs @@ -14,17 +14,16 @@ public class CppOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + VisibilityKeywords = language.Settings.Visibility.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/FSharpOptionsPage.cs b/src/Viasfora/Options/FSharpOptionsPage.cs index bd9a76e7..4c815cc3 100644 --- a/src/Viasfora/Options/FSharpOptionsPage.cs +++ b/src/Viasfora/Options/FSharpOptionsPage.cs @@ -14,19 +14,18 @@ public class FSharpOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + VisibilityKeywords = language.Settings.Visibility.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/JScriptOptionsPage.cs b/src/Viasfora/Options/JScriptOptionsPage.cs index 77c0b94a..5350517b 100644 --- a/src/Viasfora/Options/JScriptOptionsPage.cs +++ b/src/Viasfora/Options/JScriptOptionsPage.cs @@ -14,17 +14,16 @@ public class JScriptOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/PowerShellOptionsPage.cs b/src/Viasfora/Options/PowerShellOptionsPage.cs index a6fc8744..f1e30e1e 100644 --- a/src/Viasfora/Options/PowerShellOptionsPage.cs +++ b/src/Viasfora/Options/PowerShellOptionsPage.cs @@ -14,15 +14,14 @@ public class PowerShellOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/PythonOptionsPage.cs b/src/Viasfora/Options/PythonOptionsPage.cs index d80d0900..3c1bbc8e 100644 --- a/src/Viasfora/Options/PythonOptionsPage.cs +++ b/src/Viasfora/Options/PythonOptionsPage.cs @@ -14,17 +14,16 @@ public class PythonOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/ROptionsPage.cs b/src/Viasfora/Options/ROptionsPage.cs index 8d45c1a1..52998566 100644 --- a/src/Viasfora/Options/ROptionsPage.cs +++ b/src/Viasfora/Options/ROptionsPage.cs @@ -14,17 +14,16 @@ class ROptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/SqlOptionsPage.cs b/src/Viasfora/Options/SqlOptionsPage.cs index b582fd64..90db3e9b 100644 --- a/src/Viasfora/Options/SqlOptionsPage.cs +++ b/src/Viasfora/Options/SqlOptionsPage.cs @@ -14,19 +14,18 @@ public class SqlOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - LinqKeywords = language.Linq.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + VisibilityKeywords = language.Settings.Visibility.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/TypeScriptOptionsPage.cs b/src/Viasfora/Options/TypeScriptOptionsPage.cs index 9e32fa42..82dff0a9 100644 --- a/src/Viasfora/Options/TypeScriptOptionsPage.cs +++ b/src/Viasfora/Options/TypeScriptOptionsPage.cs @@ -14,19 +14,18 @@ public class TypeScriptOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + VisibilityKeywords = language.Settings.Visibility.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] diff --git a/src/Viasfora/Options/USqlOptionsPage.cs b/src/Viasfora/Options/USqlOptionsPage.cs index b2d92321..e950900e 100644 --- a/src/Viasfora/Options/USqlOptionsPage.cs +++ b/src/Viasfora/Options/USqlOptionsPage.cs @@ -14,32 +14,22 @@ public class USqlOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - LinqKeywords = language.Linq.ToList(); - Enabled = language.Enabled; + VisibilityKeywords = language.Settings.Visibility.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] [Description("Enabled or disables all Viasfora features for this language")] public bool Enabled { get; set; } - [LocDisplayName("Control Flow")] - [Description("Control Flow keywords to highlight")] - [Category("U-SQL")] - [Editor(Constants.STRING_COLLECTION_EDITOR, typeof(UITypeEditor))] - [TypeConverter(typeof(Design.StringListConverter))] - public List ControlFlowKeywords { get; set; } - [LocDisplayName("Visibility")] [Description("Visibility keywords to highlight")] [Category("U-SQL")] diff --git a/src/Viasfora/Options/VBOptionsPage.cs b/src/Viasfora/Options/VBOptionsPage.cs index 841056b2..765cc742 100644 --- a/src/Viasfora/Options/VBOptionsPage.cs +++ b/src/Viasfora/Options/VBOptionsPage.cs @@ -14,19 +14,18 @@ public class VBOptionsPage : DialogPage { public override void SaveSettingsToStorage() { base.SaveSettingsToStorage(); - language.ControlFlow = ControlFlowKeywords.ToArray(); - language.Linq = LinqKeywords.ToArray(); - language.Visibility = VisibilityKeywords.ToArray(); - language.Enabled = Enabled; - var settings = SettingsContext.GetSettings(); - settings.Save(); + language.Settings.ControlFlow = ControlFlowKeywords.ToArray(); + language.Settings.Linq = LinqKeywords.ToArray(); + language.Settings.Visibility = VisibilityKeywords.ToArray(); + language.Settings.Enabled = Enabled; + language.Settings.Save(); } public override void LoadSettingsFromStorage() { base.LoadSettingsFromStorage(); - ControlFlowKeywords = language.ControlFlow.ToList(); - LinqKeywords = language.Linq.ToList(); - VisibilityKeywords = language.Visibility.ToList(); - Enabled = language.Enabled; + ControlFlowKeywords = language.Settings.ControlFlow.ToList(); + LinqKeywords = language.Settings.Linq.ToList(); + VisibilityKeywords = language.Settings.Visibility.ToList(); + Enabled = language.Settings.Enabled; } [LocDisplayName("Enabled")] From 0259471e01325c5d0411adaa03c4fd3b3c069d80 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Tue, 20 Jun 2017 19:47:52 -0500 Subject: [PATCH 06/20] Further refactoring of settings to introduce ITypedSettingsStore --- src/Viasfora.Core/IVsfSettings.cs | 7 -- .../Settings/ITypedSettingsStore.cs | 14 +++ src/Viasfora.Core/Settings/SettingsBase.cs | 63 ++------------ .../Settings/TypedSettingsStore.cs | 86 +++++++++++++++++++ src/Viasfora.Core/Settings/VsfSettings.cs | 72 ++++++++-------- src/Viasfora.Core/Viasfora.Core.csproj | 2 + src/Viasfora.Languages/CSharp.cs | 8 +- src/Viasfora.Languages/Cpp.cs | 12 +-- src/Viasfora.Languages/Css.cs | 8 +- src/Viasfora.Languages/DefaultLanguage.cs | 8 +- src/Viasfora.Languages/FSharp.cs | 8 +- src/Viasfora.Languages/JScript.cs | 8 +- src/Viasfora.Languages/Json.cs | 8 +- src/Viasfora.Languages/LanguageFactory.cs | 4 +- src/Viasfora.Languages/LanguageSettings.cs | 20 ++--- src/Viasfora.Languages/PowerShell.cs | 8 +- src/Viasfora.Languages/Python.cs | 8 +- src/Viasfora.Languages/R.cs | 8 +- src/Viasfora.Languages/Sql.cs | 8 +- src/Viasfora.Languages/TypeScript.cs | 8 +- src/Viasfora.Languages/USql.cs | 8 +- src/Viasfora.Languages/VB.cs | 8 +- src/Viasfora.Languages/XLang.cs | 8 +- .../Settings/RainbowSettings.cs | 30 +++---- src/Viasfora.Xml/Settings/XmlSettings.cs | 14 +-- src/Viasfora/Design/StringListConverter.cs | 2 +- 26 files changed, 242 insertions(+), 196 deletions(-) create mode 100644 src/Viasfora.Core/Settings/ITypedSettingsStore.cs create mode 100644 src/Viasfora.Core/Settings/TypedSettingsStore.cs diff --git a/src/Viasfora.Core/IVsfSettings.cs b/src/Viasfora.Core/IVsfSettings.cs index aede25ec..40c8870c 100644 --- a/src/Viasfora.Core/IVsfSettings.cs +++ b/src/Viasfora.Core/IVsfSettings.cs @@ -25,13 +25,6 @@ public interface IVsfSettings : IUpdatableSettings { String TextObfuscationRegexes { get; set; } bool TelemetryEnabled { get; set; } - String GetValue(String name, String defaultValue); - bool GetBoolean(String name, bool defval); - int GetInt32(String name, int defval); - long GetInt64(String name, long defval); - double GetDouble(String name, double defval); - T GetEnum(String name, T defval) where T : struct; - void SetValue(String name, object value); void Load(); void Save(); } diff --git a/src/Viasfora.Core/Settings/ITypedSettingsStore.cs b/src/Viasfora.Core/Settings/ITypedSettingsStore.cs new file mode 100644 index 00000000..7457ba4f --- /dev/null +++ b/src/Viasfora.Core/Settings/ITypedSettingsStore.cs @@ -0,0 +1,14 @@ +using System; + +namespace Winterdom.Viasfora.Settings { + public interface ITypedSettingsStore : ISettingsStore, IUpdatableSettings { + String GetString(String name, String defaultValue); + bool GetBoolean(String name, bool defaultValue); + int GetInt32(String name, int defaultValue); + long GetInt64(String name, long defaultValue); + double GetDouble(String name, double defaultValue); + T GetEnum(String name, T defaultValue) where T : struct; + String[] GetList(String name, String[] defaultValue); + void SetValue(String name, object value); + } +} diff --git a/src/Viasfora.Core/Settings/SettingsBase.cs b/src/Viasfora.Core/Settings/SettingsBase.cs index 97d67b30..db29e393 100644 --- a/src/Viasfora.Core/Settings/SettingsBase.cs +++ b/src/Viasfora.Core/Settings/SettingsBase.cs @@ -1,65 +1,13 @@ using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace Winterdom.Viasfora.Settings { - public abstract class SettingsBase { - protected ISettingsStore Store { get; private set; } - private IStorageConversions converter; + public abstract class SettingsBase : IUpdatableSettings { + protected ITypedSettingsStore Store { get; private set; } public event EventHandler SettingsChanged; - public SettingsBase(ISettingsStore store, IStorageConversions converter) { + public SettingsBase(ITypedSettingsStore store) { this.Store = store; - this.converter = converter; - } - - public bool GetBoolean(String name, bool defval) { - String val = Store.Get(name); - return String.IsNullOrEmpty(val) ? defval : Convert.ToBoolean(val); - } - - public int GetInt32(String name, int defval) { - String val = Store.Get(name); - return String.IsNullOrEmpty(val) ? defval : converter.ToInt32(val); - } - public long GetInt64(String name, long defval) { - String val = Store.Get(name); - return String.IsNullOrEmpty(val) ? defval : converter.ToInt64(val); - } - public double GetDouble(String name, double defval) { - String val = Store.Get(name); - return String.IsNullOrEmpty(val) ? defval : converter.ToDouble(val); - } - public T GetEnum(String name, T defval) where T : struct { - String val = Store.Get(name); - T actual; - if ( converter.ToEnum(val, out actual) ) { - return actual; - } - return defval; - } - public String[] GetList(String name, String[] defaultValue) { - String value = GetValue(name, ""); - if ( String.IsNullOrEmpty(value) ) { - return defaultValue; - } - var list = converter.ToList(value); - return list.Length > 0 ? list : defaultValue; - } - - public String GetValue(String name, String defValue) { - String val = Store.Get(name); - return String.IsNullOrEmpty(val) ? defValue : val; - } - public void SetValue(String name, object value) { - if ( value != null ) { - Store.Set(name, converter.ToString(value)); - } else { - Store.Set(name, null); - } + this.Store.SettingsChanged += OnStoreChanged; } public void Load() { @@ -68,6 +16,9 @@ public void Load() { public void Save() { this.Store.Save(); + } + + private void OnStoreChanged(object sender, EventArgs e) { SettingsChanged?.Invoke(this, EventArgs.Empty); } } diff --git a/src/Viasfora.Core/Settings/TypedSettingsStore.cs b/src/Viasfora.Core/Settings/TypedSettingsStore.cs new file mode 100644 index 00000000..c9818104 --- /dev/null +++ b/src/Viasfora.Core/Settings/TypedSettingsStore.cs @@ -0,0 +1,86 @@ +using System; +using System.ComponentModel.Composition; + +namespace Winterdom.Viasfora.Settings { + [Export(typeof(ITypedSettingsStore))] + public class TypedSettingsStore : ITypedSettingsStore { + private ISettingsStore store; + private IStorageConversions converter; + + public event EventHandler SettingsChanged; + + [ImportingConstructor] + public TypedSettingsStore(ISettingsStore store, IStorageConversions converter) { + this.store = store; + this.converter = converter; + } + + public String Get(String name) { + return this.store.Get(name); + } + + public bool GetBoolean(String name, bool defaultValue) { + String val = this.store.Get(name); + return String.IsNullOrEmpty(val) ? defaultValue : this.converter.ToBoolean(val); + } + + public double GetDouble(String name, double defaultValue) { + String val = this.store.Get(name); + return String.IsNullOrEmpty(val) ? defaultValue : this.converter.ToDouble(val); + } + + public T GetEnum(String name, T defaultValue) where T : struct { + String val = this.store.Get(name); + T actual; + if ( this.converter.ToEnum(val, out actual) ) { + return actual; + } + return defaultValue; + } + + public int GetInt32(String name, int defaultValue) { + String val = this.store.Get(name); + return String.IsNullOrEmpty(val) ? defaultValue : this.converter.ToInt32(val); + } + + public long GetInt64(string name, long defaultValue) { + String val = this.store.Get(name); + return String.IsNullOrEmpty(val) ? defaultValue : this.converter.ToInt64(val); + } + + public string[] GetList(string name, string[] defaultValue) { + String value = GetString(name, ""); + if ( String.IsNullOrEmpty(value) ) { + return defaultValue; + } + var list = this.converter.ToList(value); + return list.Length > 0 ? list : defaultValue; + } + + public String GetString(String name, String defValue) { + String val = this.store.Get(name); + return String.IsNullOrEmpty(val) ? defValue : val; + } + + public void SetValue(String name, object value) { + if ( value != null ) { + this.store.Set(name, converter.ToString(value)); + } else { + this.store.Set(name, null); + } + } + + public void Set(string name, string value) { + this.store.Set(name, value); + } + + public void Load() { + this.store.Load(); + } + + public void Save() { + this.store.Save(); + SettingsChanged?.Invoke(this, EventArgs.Empty); + } + } +} diff --git a/src/Viasfora.Core/Settings/VsfSettings.cs b/src/Viasfora.Core/Settings/VsfSettings.cs index 0a52f8d6..7ba1fd47 100644 --- a/src/Viasfora.Core/Settings/VsfSettings.cs +++ b/src/Viasfora.Core/Settings/VsfSettings.cs @@ -8,77 +8,77 @@ namespace Winterdom.Viasfora.Settings { [Export(typeof(IVsfSettings))] public class VsfSettings : SettingsBase, IVsfSettings { public bool KeywordClassifierEnabled { - get { return GetBoolean(nameof(KeywordClassifierEnabled), true); } - set { SetValue(nameof(KeywordClassifierEnabled), value); } + get { return this.Store.GetBoolean(nameof(KeywordClassifierEnabled), true); } + set { this.Store.SetValue(nameof(KeywordClassifierEnabled), value); } } public bool FlowControlUseItalics { - get { return GetBoolean(nameof(FlowControlUseItalics), false); } - set { SetValue(nameof(FlowControlUseItalics), value); } + get { return this.Store.GetBoolean(nameof(FlowControlUseItalics), false); } + set { this.Store.SetValue(nameof(FlowControlUseItalics), value); } } public bool EscapeSequencesEnabled { - get { return GetBoolean(nameof(EscapeSequencesEnabled), true); } - set { SetValue(nameof(EscapeSequencesEnabled), value); } + get { return this.Store.GetBoolean(nameof(EscapeSequencesEnabled), true); } + set { this.Store.SetValue(nameof(EscapeSequencesEnabled), value); } } public bool CurrentColumnHighlightEnabled { - get { return GetBoolean(nameof(CurrentColumnHighlightEnabled), false); } - set { SetValue(nameof(CurrentColumnHighlightEnabled), value); } + get { return this.Store.GetBoolean(nameof(CurrentColumnHighlightEnabled), false); } + set { this.Store.SetValue(nameof(CurrentColumnHighlightEnabled), value); } } public ColumnStyle CurrentColumnHighlightStyle { - get { return GetEnum(nameof(CurrentColumnHighlightStyle), ColumnStyle.FullBorder); } - set { SetValue(nameof(CurrentColumnHighlightStyle), value); } + get { return this.Store.GetEnum(nameof(CurrentColumnHighlightStyle), ColumnStyle.FullBorder); } + set { this.Store.SetValue(nameof(CurrentColumnHighlightStyle), value); } } public double HighlightLineWidth { - get { return GetDouble(nameof(HighlightLineWidth), 1.4); } - set { SetValue(nameof(HighlightLineWidth), value); } + get { return this.Store.GetDouble(nameof(HighlightLineWidth), 1.4); } + set { this.Store.SetValue(nameof(HighlightLineWidth), value); } } public bool PresentationModeEnabled { - get { return GetBoolean(nameof(PresentationModeEnabled), true); } - set { SetValue(nameof(PresentationModeEnabled), value); } + get { return this.Store.GetBoolean(nameof(PresentationModeEnabled), true); } + set { this.Store.SetValue(nameof(PresentationModeEnabled), value); } } public int PresentationModeDefaultZoom { - get { return GetInt32(nameof(PresentationModeDefaultZoom), 100); } - set { SetValue(nameof(PresentationModeDefaultZoom), value); } + get { return this.Store.GetInt32(nameof(PresentationModeDefaultZoom), 100); } + set { this.Store.SetValue(nameof(PresentationModeDefaultZoom), value); } } public int PresentationModeEnabledZoom { - get { return GetInt32(nameof(PresentationModeEnabledZoom), 150); } - set { SetValue(nameof(PresentationModeEnabledZoom), value); } + get { return this.Store.GetInt32(nameof(PresentationModeEnabledZoom), 150); } + set { this.Store.SetValue(nameof(PresentationModeEnabledZoom), value); } } public bool PresentationModeIncludeEnvFonts { - get { return GetBoolean(nameof(PresentationModeIncludeEnvFonts), false); } - set { SetValue(nameof(PresentationModeIncludeEnvFonts), value); } + get { return this.Store.GetBoolean(nameof(PresentationModeIncludeEnvFonts), false); } + set { this.Store.SetValue(nameof(PresentationModeIncludeEnvFonts), value); } } public bool ModelinesEnabled { - get { return GetBoolean(nameof(ModelinesEnabled), true); } - set { SetValue(nameof(ModelinesEnabled), value); } + get { return this.Store.GetBoolean(nameof(ModelinesEnabled), true); } + set { this.Store.SetValue(nameof(ModelinesEnabled), value); } } public int ModelinesNumLines { - get { return GetInt32(nameof(ModelinesNumLines), 5); } - set { SetValue(nameof(ModelinesNumLines), value); } + get { return this.Store.GetInt32(nameof(ModelinesNumLines), 5); } + set { this.Store.SetValue(nameof(ModelinesNumLines), value); } } public bool DeveloperMarginEnabled { - get { return GetBoolean(nameof(DeveloperMarginEnabled), true); } - set { SetValue(nameof(DeveloperMarginEnabled), value); } + get { return this.Store.GetBoolean(nameof(DeveloperMarginEnabled), true); } + set { this.Store.SetValue(nameof(DeveloperMarginEnabled), value); } } public Outlining.AutoExpandMode AutoExpandRegions { - get { return GetEnum(nameof(AutoExpandRegions), Outlining.AutoExpandMode.No); } - set { SetValue(nameof(AutoExpandRegions), value); } + get { return this.Store.GetEnum(nameof(AutoExpandRegions), Outlining.AutoExpandMode.No); } + set { this.Store.SetValue(nameof(AutoExpandRegions), value); } } public bool BoldAsItalicsEnabled { - get { return GetBoolean(nameof(BoldAsItalicsEnabled), false); } - set { SetValue(nameof(BoldAsItalicsEnabled), value); } + get { return this.Store.GetBoolean(nameof(BoldAsItalicsEnabled), false); } + set { this.Store.SetValue(nameof(BoldAsItalicsEnabled), value); } } public String TextObfuscationRegexes { - get { return GetValue(nameof(TextObfuscationRegexes), ""); } - set { SetValue(nameof(TextObfuscationRegexes), value); } + get { return this.Store.GetString(nameof(TextObfuscationRegexes), ""); } + set { this.Store.SetValue(nameof(TextObfuscationRegexes), value); } } public bool TelemetryEnabled { - get { return GetBoolean(nameof(TelemetryEnabled), true); } - set { SetValue(nameof(TelemetryEnabled), value); } + get { return this.Store.GetBoolean(nameof(TelemetryEnabled), true); } + set { this.Store.SetValue(nameof(TelemetryEnabled), value); } } [ImportingConstructor] - public VsfSettings(ISettingsStore store, IStorageConversions converter) - : base(store, converter) { + public VsfSettings(ITypedSettingsStore store) + : base(store) { } } } diff --git a/src/Viasfora.Core/Viasfora.Core.csproj b/src/Viasfora.Core/Viasfora.Core.csproj index b10a1979..52b13b31 100644 --- a/src/Viasfora.Core/Viasfora.Core.csproj +++ b/src/Viasfora.Core/Viasfora.Core.csproj @@ -214,11 +214,13 @@ + + diff --git a/src/Viasfora.Languages/CSharp.cs b/src/Viasfora.Languages/CSharp.cs index dd40b4e0..3fbfd0d4 100644 --- a/src/Viasfora.Languages/CSharp.cs +++ b/src/Viasfora.Languages/CSharp.cs @@ -21,8 +21,8 @@ public override IStringScanner NewStringScanner(String classificationName, Strin => new CSharpStringScanner(text, classificationName); [ImportingConstructor] - public CSharp(ISettingsStore store, IStorageConversions converter) { - this.Settings = new CSharpSettings(store, converter); + public CSharp(ITypedSettingsStore store) { + this.Settings = new CSharpSettings(store); } } @@ -41,8 +41,8 @@ public class CSharpSettings : LanguageSettings { "public", "private", "protected", "internal" }; - public CSharpSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.CSharp, store, converter) { + public CSharpSettings(ITypedSettingsStore store) + : base (Constants.CSharp, store) { } } } diff --git a/src/Viasfora.Languages/Cpp.cs b/src/Viasfora.Languages/Cpp.cs index 19f641a1..ce483361 100644 --- a/src/Viasfora.Languages/Cpp.cs +++ b/src/Viasfora.Languages/Cpp.cs @@ -16,8 +16,8 @@ protected override String[] SupportedContentTypes public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public Cpp(ISettingsStore store, IStorageConversions converter) { - this.Settings = new CppSettings(store, converter); + public Cpp(ITypedSettingsStore store) { + this.Settings = new CppSettings(store); } public override IStringScanner NewStringScanner(String classificationName, String text) @@ -26,8 +26,8 @@ public override IStringScanner NewStringScanner(String classificationName, Strin class CppSettings : LanguageSettings { protected override String[] ControlFlowDefaults => new String[] { - "if", "else", "while", "do", "for", "each", "switch", - "break", "continue", "return", "goto", "throw" + "if", "else", "while", "do", "for", "each", "switch", + "break", "continue", "return", "goto", "throw" }; protected override String[] LinqDefaults => EMPTY; @@ -36,8 +36,8 @@ class CppSettings : LanguageSettings { "public", "private", "protected", "internal", "friend" }; - public CppSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.Cpp, store, converter) { + public CppSettings(ITypedSettingsStore store) + : base(Constants.Cpp, store) { } } } diff --git a/src/Viasfora.Languages/Css.cs b/src/Viasfora.Languages/Css.cs index 5b518d29..4d83f1e2 100644 --- a/src/Viasfora.Languages/Css.cs +++ b/src/Viasfora.Languages/Css.cs @@ -20,8 +20,8 @@ protected override String[] SupportedContentTypes { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public Css(ISettingsStore store, IStorageConversions converter) { - this.Settings = new CssSettings(store, converter); + public Css(ITypedSettingsStore store) { + this.Settings = new CssSettings(store); } public override IStringScanner NewStringScanner(String classificationName, String text) @@ -35,8 +35,8 @@ public class CssSettings : LanguageSettings { protected override String[] LinqDefaults => EMPTY; protected override String[] VisibilityDefaults => EMPTY; - public CssSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.Css, store, converter) { + public CssSettings(ITypedSettingsStore store) + : base (Constants.Css, store) { } } } diff --git a/src/Viasfora.Languages/DefaultLanguage.cs b/src/Viasfora.Languages/DefaultLanguage.cs index 40b7b725..e04b487b 100644 --- a/src/Viasfora.Languages/DefaultLanguage.cs +++ b/src/Viasfora.Languages/DefaultLanguage.cs @@ -13,8 +13,8 @@ public class DefaultLanguage : LanguageInfo, ILanguage { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public DefaultLanguage(ISettingsStore store, IStorageConversions converter) { - this.Settings = new DefaultSettings(store, converter); + public DefaultLanguage(ITypedSettingsStore store) { + this.Settings = new DefaultSettings(store); } public override bool MatchesContentType(IContentType contentType) { @@ -29,8 +29,8 @@ public class DefaultSettings : LanguageSettings { protected override String[] LinqDefaults => EMPTY; protected override String[] VisibilityDefaults => EMPTY; - public DefaultSettings(ISettingsStore store, IStorageConversions converter) - : base ("Text", store, converter) { + public DefaultSettings(ITypedSettingsStore store) + : base ("Text", store) { } } } diff --git a/src/Viasfora.Languages/FSharp.cs b/src/Viasfora.Languages/FSharp.cs index 4b0d420e..b5985a07 100644 --- a/src/Viasfora.Languages/FSharp.cs +++ b/src/Viasfora.Languages/FSharp.cs @@ -16,8 +16,8 @@ protected override String[] SupportedContentTypes public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public FSharp(ISettingsStore store, IStorageConversions converter) { - this.Settings = new FSharpSettings(store, converter); + public FSharp(ITypedSettingsStore store) { + this.Settings = new FSharpSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -39,8 +39,8 @@ class FSharpSettings : LanguageSettings { "public", "private", "internal" }; - public FSharpSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.FSharp, store, converter) { + public FSharpSettings(ITypedSettingsStore store) + : base (Constants.FSharp, store) { } } } diff --git a/src/Viasfora.Languages/JScript.cs b/src/Viasfora.Languages/JScript.cs index 5e62bb87..4ff47cea 100644 --- a/src/Viasfora.Languages/JScript.cs +++ b/src/Viasfora.Languages/JScript.cs @@ -15,8 +15,8 @@ class JScript : CBasedLanguage, ILanguage { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public JScript(ISettingsStore store, IStorageConversions converter) { - this.Settings = new JScriptSettings(store, converter); + public JScript(ITypedSettingsStore store) { + this.Settings = new JScriptSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -33,8 +33,8 @@ public class JScriptSettings : LanguageSettings { }; protected override String[] VisibilityDefaults => EMPTY; - public JScriptSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.JS, store, converter) { + public JScriptSettings(ITypedSettingsStore store) + : base (Constants.JS, store) { } } } diff --git a/src/Viasfora.Languages/Json.cs b/src/Viasfora.Languages/Json.cs index 01380b8b..c50b0a96 100644 --- a/src/Viasfora.Languages/Json.cs +++ b/src/Viasfora.Languages/Json.cs @@ -15,8 +15,8 @@ protected override String[] SupportedContentTypes public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public JSON(ISettingsStore store, IStorageConversions converter) { - this.Settings = new JsonSettings(store, converter); + public JSON(ITypedSettingsStore store) { + this.Settings = new JsonSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -28,8 +28,8 @@ public class JsonSettings : LanguageSettings { protected override String[] LinqDefaults => EMPTY; protected override String[] VisibilityDefaults => EMPTY; - public JsonSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.Json, store, converter) { + public JsonSettings(ITypedSettingsStore store) + : base (Constants.Json, store) { } } } diff --git a/src/Viasfora.Languages/LanguageFactory.cs b/src/Viasfora.Languages/LanguageFactory.cs index 935a6047..1e5068be 100644 --- a/src/Viasfora.Languages/LanguageFactory.cs +++ b/src/Viasfora.Languages/LanguageFactory.cs @@ -14,8 +14,8 @@ public class LanguageFactory : ILanguageFactory { private ILanguage defaultLang; [ImportingConstructor] - public LanguageFactory(ISettingsStore store, IStorageConversions converter) { - this.defaultLang = new DefaultLanguage(store, converter); + public LanguageFactory(ITypedSettingsStore store) { + this.defaultLang = new DefaultLanguage(store); } public ILanguage TryCreateLanguage(IContentType contentType) { diff --git a/src/Viasfora.Languages/LanguageSettings.cs b/src/Viasfora.Languages/LanguageSettings.cs index 016133b7..cf2c010f 100644 --- a/src/Viasfora.Languages/LanguageSettings.cs +++ b/src/Viasfora.Languages/LanguageSettings.cs @@ -11,24 +11,24 @@ public abstract class LanguageSettings : SettingsBase, ILanguageSettings { public String KeyName { get; private set; } public String[] ControlFlow { - get { return GetList(KeyName + "_ControlFlow", ControlFlowDefaults); } - set { SetValue(KeyName + "_ControlFlow", value); } + get { return this.Store.GetList(KeyName + "_ControlFlow", ControlFlowDefaults); } + set { this.Store.SetValue(KeyName + "_ControlFlow", value); } } public String[] Linq { - get { return GetList(KeyName + "_Linq", LinqDefaults); } - set { SetValue(KeyName + "_Linq", value); } + get { return this.Store.GetList(KeyName + "_Linq", LinqDefaults); } + set { this.Store.SetValue(KeyName + "_Linq", value); } } public String[] Visibility { - get { return GetList(KeyName + "_Visibility", VisibilityDefaults); } - set { SetValue(KeyName + "_Visibility", value); } + get { return this.Store.GetList(KeyName + "_Visibility", VisibilityDefaults); } + set { this.Store.SetValue(KeyName + "_Visibility", value); } } public bool Enabled { - get { return GetBoolean(KeyName + "_Enabled", true); } - set { SetValue(KeyName + "_Enabled", value); } + get { return this.Store.GetBoolean(KeyName + "_Enabled", true); } + set { this.Store.SetValue(KeyName + "_Enabled", value); } } - public LanguageSettings(String key, ISettingsStore store, IStorageConversions converter) - : base(store, converter) { + public LanguageSettings(String key, ITypedSettingsStore store) + : base(store) { this.KeyName = key; } } diff --git a/src/Viasfora.Languages/PowerShell.cs b/src/Viasfora.Languages/PowerShell.cs index 23003fd3..68941e46 100644 --- a/src/Viasfora.Languages/PowerShell.cs +++ b/src/Viasfora.Languages/PowerShell.cs @@ -19,8 +19,8 @@ protected override String[] SupportedContentTypes { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public PowerShell(ISettingsStore store, IStorageConversions converter) { - this.Settings = new PowershellSettings(store, converter); + public PowerShell(ITypedSettingsStore store) { + this.Settings = new PowershellSettings(store); } protected override IBraceScanner NewBraceScanner() => new PsBraceScanner(); @@ -37,8 +37,8 @@ public class PowershellSettings : LanguageSettings { protected override String[] LinqDefaults => EMPTY; protected override String[] VisibilityDefaults => EMPTY; - public PowershellSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.PowerShell, store, converter) { + public PowershellSettings(ITypedSettingsStore store) + : base (Constants.PowerShell, store) { } } } diff --git a/src/Viasfora.Languages/Python.cs b/src/Viasfora.Languages/Python.cs index b70d23be..159e44b1 100644 --- a/src/Viasfora.Languages/Python.cs +++ b/src/Viasfora.Languages/Python.cs @@ -20,8 +20,8 @@ protected override IBraceScanner NewBraceScanner() => new PythonBraceScanner(); [ImportingConstructor] - public Python(ISettingsStore store, IStorageConversions converter) { - this.Settings = new PythonSettings(store, converter); + public Python(ITypedSettingsStore store) { + this.Settings = new PythonSettings(store); } } @@ -35,8 +35,8 @@ class PythonSettings : LanguageSettings { }; protected override String[] VisibilityDefaults => EMPTY; - public PythonSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.Python, store, converter) { + public PythonSettings(ITypedSettingsStore store) + : base (Constants.Python, store) { } } } diff --git a/src/Viasfora.Languages/R.cs b/src/Viasfora.Languages/R.cs index 7ae662e8..0b9ff8dc 100644 --- a/src/Viasfora.Languages/R.cs +++ b/src/Viasfora.Languages/R.cs @@ -15,8 +15,8 @@ protected override String[] SupportedContentTypes public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public R(ISettingsStore store, IStorageConversions converter) { - this.Settings = new RSettings(store, converter); + public R(ITypedSettingsStore store) { + this.Settings = new RSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -36,8 +36,8 @@ class RSettings : LanguageSettings { }; protected override String[] VisibilityDefaults => EMPTY; - public RSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.R, store, converter) { + public RSettings(ITypedSettingsStore store) + : base (Constants.R, store) { } } } diff --git a/src/Viasfora.Languages/Sql.cs b/src/Viasfora.Languages/Sql.cs index 040e5acd..0b4dd149 100644 --- a/src/Viasfora.Languages/Sql.cs +++ b/src/Viasfora.Languages/Sql.cs @@ -14,8 +14,8 @@ class Sql : LanguageInfo, ILanguage { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public Sql(ISettingsStore store, IStorageConversions converter) { - this.Settings = new SqlSettings(store, converter); + public Sql(ITypedSettingsStore store) { + this.Settings = new SqlSettings(store); // the SQL classifier will return text spans that include // trailing spaces (such as "IF ") this.NormalizationFunction = text => text.Trim(); @@ -38,8 +38,8 @@ class SqlSettings : LanguageSettings { "public", "external" }; - public SqlSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.Sql, store, converter) { + public SqlSettings(ITypedSettingsStore store) + : base (Constants.Sql, store) { } } } diff --git a/src/Viasfora.Languages/TypeScript.cs b/src/Viasfora.Languages/TypeScript.cs index a76ad0b7..189771d3 100644 --- a/src/Viasfora.Languages/TypeScript.cs +++ b/src/Viasfora.Languages/TypeScript.cs @@ -15,8 +15,8 @@ protected override String[] SupportedContentTypes public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public TypeScript(ISettingsStore store, IStorageConversions converter) { - this.Settings = new TypeScriptSettings(store, converter); + public TypeScript(ITypedSettingsStore store) { + this.Settings = new TypeScriptSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -35,8 +35,8 @@ class TypeScriptSettings : LanguageSettings { "export", "public", "private" }; - public TypeScriptSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.TypeScript, store, converter) { + public TypeScriptSettings(ITypedSettingsStore store) + : base (Constants.TypeScript, store) { } } } diff --git a/src/Viasfora.Languages/USql.cs b/src/Viasfora.Languages/USql.cs index 4445c6e9..56a28484 100644 --- a/src/Viasfora.Languages/USql.cs +++ b/src/Viasfora.Languages/USql.cs @@ -17,8 +17,8 @@ protected override String[] SupportedContentTypes { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public USql(ISettingsStore store, IStorageConversions converter) { - this.Settings = new USqlSettings(store, converter); + public USql(ITypedSettingsStore store) { + this.Settings = new USqlSettings(store); } protected override IBraceScanner NewBraceScanner() { @@ -39,8 +39,8 @@ class USqlSettings : LanguageSettings { "readonly" }; - public USqlSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.USql, store, converter) { + public USqlSettings(ITypedSettingsStore store) + : base (Constants.USql, store) { } } } diff --git a/src/Viasfora.Languages/VB.cs b/src/Viasfora.Languages/VB.cs index 1ba0ecf0..7c3c5e78 100644 --- a/src/Viasfora.Languages/VB.cs +++ b/src/Viasfora.Languages/VB.cs @@ -18,8 +18,8 @@ protected override String[] SupportedContentTypes { public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public VB(ISettingsStore store, IStorageConversions converter) { - this.Settings = new VBSettings(store, converter); + public VB(ITypedSettingsStore store) { + this.Settings = new VBSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -47,8 +47,8 @@ class VBSettings : LanguageSettings { "friend", "public", "private", "protected" }; - public VBSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.VB, store, converter) { + public VBSettings(ITypedSettingsStore store) + : base (Constants.VB, store) { } } } diff --git a/src/Viasfora.Languages/XLang.cs b/src/Viasfora.Languages/XLang.cs index b4c462bc..a0c02522 100644 --- a/src/Viasfora.Languages/XLang.cs +++ b/src/Viasfora.Languages/XLang.cs @@ -17,8 +17,8 @@ protected override String[] SupportedContentTypes public ILanguageSettings Settings { get; private set; } [ImportingConstructor] - public XLang(ISettingsStore store, IStorageConversions converter) { - this.Settings = new XLangSettings(store, converter); + public XLang(ITypedSettingsStore store) { + this.Settings = new XLangSettings(store); } protected override IBraceScanner NewBraceScanner() @@ -32,8 +32,8 @@ class XLangSettings : LanguageSettings { protected override String[] LinqDefaults => EMPTY; protected override String[] VisibilityDefaults => EMPTY; - public XLangSettings(ISettingsStore store, IStorageConversions converter) - : base (Constants.XLang, store, converter) { + public XLangSettings(ITypedSettingsStore store) + : base (Constants.XLang, store) { } } } diff --git a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs index 583d5ed1..8a8d8b38 100644 --- a/src/Viasfora.Rainbow/Settings/RainbowSettings.cs +++ b/src/Viasfora.Rainbow/Settings/RainbowSettings.cs @@ -6,36 +6,36 @@ namespace Winterdom.Viasfora.Rainbow.Settings { [Export(typeof(IRainbowSettings))] public class RainbowSettings : SettingsBase, IRainbowSettings { public int RainbowDepth { - get { return GetInt32(nameof(RainbowDepth), 4); } - set { SetValue(nameof(RainbowDepth), value); } + get { return this.Store.GetInt32(nameof(RainbowDepth), 4); } + set { this.Store.SetValue(nameof(RainbowDepth), value); } } public bool RainbowTagsEnabled { - get { return GetBoolean(nameof(RainbowTagsEnabled), true); } - set { SetValue(nameof(RainbowTagsEnabled), value); } + get { return this.Store.GetBoolean(nameof(RainbowTagsEnabled), true); } + set { this.Store.SetValue(nameof(RainbowTagsEnabled), value); } } public bool RainbowColorize { - get { return GetBoolean(nameof(RainbowColorize), true); } - set { SetValue(nameof(RainbowColorize), value); } + get { return this.Store.GetBoolean(nameof(RainbowColorize), true); } + set { this.Store.SetValue(nameof(RainbowColorize), value); } } public long RainbowCtrlTimer { - get { return GetInt64(nameof(RainbowCtrlTimer), 300); } - set { SetValue(nameof(RainbowCtrlTimer), value); } + get { return this.Store.GetInt64(nameof(RainbowCtrlTimer), 300); } + set { this.Store.SetValue(nameof(RainbowCtrlTimer), value); } } public RainbowHighlightMode RainbowHighlightMode { - get { return GetEnum(nameof(RainbowHighlightMode), RainbowHighlightMode.TrackNextScope); } - set { SetValue(nameof(RainbowHighlightMode), value); } + get { return this.Store.GetEnum(nameof(RainbowHighlightMode), RainbowHighlightMode.TrackNextScope); } + set { this.Store.SetValue(nameof(RainbowHighlightMode), value); } } public bool RainbowToolTipsEnabled { - get { return GetBoolean(nameof(RainbowToolTipsEnabled), true); } - set { SetValue(nameof(RainbowToolTipsEnabled), value); } + get { return this.Store.GetBoolean(nameof(RainbowToolTipsEnabled), true); } + set { this.Store.SetValue(nameof(RainbowToolTipsEnabled), value); } } public RainbowColoringMode RainbowColoringMode { - get { return GetEnum(nameof(RainbowColoringMode), RainbowColoringMode.Unified); } - set { SetValue(nameof(RainbowColoringMode), value); } + get { return this.Store.GetEnum(nameof(RainbowColoringMode), RainbowColoringMode.Unified); } + set { this.Store.SetValue(nameof(RainbowColoringMode), value); } } [ImportingConstructor] - public RainbowSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { + public RainbowSettings(ITypedSettingsStore store) : base(store) { } } } diff --git a/src/Viasfora.Xml/Settings/XmlSettings.cs b/src/Viasfora.Xml/Settings/XmlSettings.cs index f3472f34..4b3ce528 100644 --- a/src/Viasfora.Xml/Settings/XmlSettings.cs +++ b/src/Viasfora.Xml/Settings/XmlSettings.cs @@ -6,20 +6,20 @@ namespace Winterdom.Viasfora.Xml.Settings { [Export(typeof(IXmlSettings))] public class XmlSettings : SettingsBase, IXmlSettings { public bool XmlnsPrefixEnabled { - get { return GetBoolean(nameof(XmlnsPrefixEnabled), true); } - set { SetValue(nameof(XmlnsPrefixEnabled), value); } + get { return this.Store.GetBoolean(nameof(XmlnsPrefixEnabled), true); } + set { this.Store.SetValue(nameof(XmlnsPrefixEnabled), value); } } public bool XmlCloseTagEnabled { - get { return GetBoolean(nameof(XmlCloseTagEnabled), true); } - set { SetValue(nameof(XmlCloseTagEnabled), value); } + get { return this.Store.GetBoolean(nameof(XmlCloseTagEnabled), true); } + set { this.Store.SetValue(nameof(XmlCloseTagEnabled), value); } } public bool XmlMatchTagsEnabled { - get { return GetBoolean(nameof(XmlMatchTagsEnabled), true); } - set { SetValue(nameof(XmlMatchTagsEnabled), value); } + get { return this.Store.GetBoolean(nameof(XmlMatchTagsEnabled), true); } + set { this.Store.SetValue(nameof(XmlMatchTagsEnabled), value); } } [ImportingConstructor] - public XmlSettings(ISettingsStore store, IStorageConversions converter) : base(store, converter) { + public XmlSettings(ITypedSettingsStore store) : base(store) { } } } diff --git a/src/Viasfora/Design/StringListConverter.cs b/src/Viasfora/Design/StringListConverter.cs index 31335f2d..455e9274 100644 --- a/src/Viasfora/Design/StringListConverter.cs +++ b/src/Viasfora/Design/StringListConverter.cs @@ -14,7 +14,7 @@ public override bool CanConvertTo(ITypeDescriptorContext context, Type destinati return destinationType == typeof(List); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { - return ((String)value).ToList(); + return ((String)value).AsList().ToList(); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { return ((List)value).FromList(); From 65a89d6d8388d866b96ecd8687a127b839308403 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Wed, 21 Jun 2017 19:59:35 -0500 Subject: [PATCH 07/20] Implement basic export for regular + language settings --- src/Viasfora.Core/Constants.cs | 2 +- .../Contracts/ILanguageFactory.cs | 2 + src/Viasfora.Core/Guids.cs | 1 + src/Viasfora.Core/Settings/ICustomExport.cs | 8 ++ src/Viasfora.Core/Settings/ISettingsExport.cs | 10 ++ .../Settings/SettingsExporter.cs | 76 +++++++++++ src/Viasfora.Core/SettingsContext.cs | 2 +- src/Viasfora.Core/Viasfora.Core.csproj | 3 + src/Viasfora.Languages/LanguageFactory.cs | 4 + src/Viasfora.Languages/LanguageSettings.cs | 12 +- src/Viasfora/Options/GeneralOptionsPage.cs | 2 +- .../Options/MainOptionsControl.Designer.cs | 109 ++++++++++++++++ src/Viasfora/Options/MainOptionsControl.cs | 56 ++++++++ src/Viasfora/Options/MainOptionsControl.resx | 120 ++++++++++++++++++ src/Viasfora/Options/MainOptionsPage.cs | 28 ++++ src/Viasfora/Options/RainbowOptionsPage.cs | 4 +- src/Viasfora/Options/XmlOptionsPage.cs | 4 +- src/Viasfora/VSPackage.resx | 3 + src/Viasfora/Viasfora.csproj | 12 ++ src/Viasfora/VsfPackage.cs | 1 + 20 files changed, 451 insertions(+), 8 deletions(-) create mode 100644 src/Viasfora.Core/Settings/ICustomExport.cs create mode 100644 src/Viasfora.Core/Settings/ISettingsExport.cs create mode 100644 src/Viasfora.Core/Settings/SettingsExporter.cs create mode 100644 src/Viasfora/Options/MainOptionsControl.Designer.cs create mode 100644 src/Viasfora/Options/MainOptionsControl.cs create mode 100644 src/Viasfora/Options/MainOptionsControl.resx create mode 100644 src/Viasfora/Options/MainOptionsPage.cs diff --git a/src/Viasfora.Core/Constants.cs b/src/Viasfora.Core/Constants.cs index 8aaaaf03..e55405f4 100644 --- a/src/Viasfora.Core/Constants.cs +++ b/src/Viasfora.Core/Constants.cs @@ -19,7 +19,7 @@ public static class Constants { // Languages public const String Cpp = "Cpp"; public const String CSharp = "CSharp"; - public const String XLang = "XLANG/s"; + public const String XLang = "XLANGs"; public const String Css = "CSS"; public const String FSharp = "FSharp"; public const String JS = "JScript"; diff --git a/src/Viasfora.Core/Contracts/ILanguageFactory.cs b/src/Viasfora.Core/Contracts/ILanguageFactory.cs index 8a61ae52..52e81f7d 100644 --- a/src/Viasfora.Core/Contracts/ILanguageFactory.cs +++ b/src/Viasfora.Core/Contracts/ILanguageFactory.cs @@ -1,9 +1,11 @@ using System; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Utilities; +using System.Collections.Generic; namespace Winterdom.Viasfora.Contracts { public interface ILanguageFactory { + IEnumerable GetAllLanguages(); ILanguage TryCreateLanguage(IContentType contentType); ILanguage TryCreateLanguage(ITextBuffer textBuffer); ILanguage TryCreateLanguage(ITextSnapshot snapshot); diff --git a/src/Viasfora.Core/Guids.cs b/src/Viasfora.Core/Guids.cs index a3d81b0d..5596935c 100644 --- a/src/Viasfora.Core/Guids.cs +++ b/src/Viasfora.Core/Guids.cs @@ -5,6 +5,7 @@ namespace Winterdom.Viasfora { public static class Guids { public const String VSPackage = "3338742c-7926-4949-9e57-3fcbb8d0a976"; public const String GeneralOptions = "5da0604d-ba54-43dc-b874-526f43144ee2"; + public const String MainOptions = "773f9f3b-1205-4606-9dbc-b7173519e4ff"; public const String RainbowOptions = "89406e01-38f0-4db2-9f73-70da7c5a6f72"; public const String PresentationModeOptions = "e23141d9-f9fa-4780-9f07-d7cb5b6ebb17"; public const String AllLanguagesOptions = "af004378-3762-4f4c-9619-1fbcfbc77078"; diff --git a/src/Viasfora.Core/Settings/ICustomExport.cs b/src/Viasfora.Core/Settings/ICustomExport.cs new file mode 100644 index 00000000..a8e6ca1a --- /dev/null +++ b/src/Viasfora.Core/Settings/ICustomExport.cs @@ -0,0 +1,8 @@ +using System; +using System.Collections.Generic; + +namespace Winterdom.Viasfora.Settings { + public interface ICustomExport { + IDictionary Export(); + } +} diff --git a/src/Viasfora.Core/Settings/ISettingsExport.cs b/src/Viasfora.Core/Settings/ISettingsExport.cs new file mode 100644 index 00000000..f7b21be5 --- /dev/null +++ b/src/Viasfora.Core/Settings/ISettingsExport.cs @@ -0,0 +1,10 @@ +using System; + +namespace Winterdom.Viasfora.Settings { + public interface ISettingsExport { + void Export(T settingsObject) where T : class; + void Import(ISettingsStore store); + void Load(String sourcePath); + void Save(String targetPath); + } +} diff --git a/src/Viasfora.Core/Settings/SettingsExporter.cs b/src/Viasfora.Core/Settings/SettingsExporter.cs new file mode 100644 index 00000000..5c9d4a4d --- /dev/null +++ b/src/Viasfora.Core/Settings/SettingsExporter.cs @@ -0,0 +1,76 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Reflection; +using System.Xml; +using System.Xml.Linq; + +namespace Winterdom.Viasfora.Settings { + [Export(typeof(ISettingsExport))] + public class SettingsExporter : ISettingsExport { + private IDictionary settings = new Dictionary(); + private IStorageConversions converter; + + [ImportingConstructor] + public SettingsExporter(IStorageConversions converter) { + this.converter = converter; + } + + public void Load(String sourcePath) { + settings.Clear(); + XDocument doc = XDocument.Load(sourcePath); + foreach ( var element in doc.Root.Elements() ) { + settings[element.Name.LocalName] = element.Value; + } + } + + public void Save(String targetPath) { + using ( var xw = XmlWriter.Create(targetPath) ) { + xw.WriteStartElement("viasfora"); + foreach ( String key in settings.Keys ) { + String value = settings[key]; + if ( value != null ) { + xw.WriteElementString(key, settings[key]); + } + } + xw.WriteEndElement(); + } + } + + public void Export(T settingsObject) where T : class { + ICustomExport exporter = settingsObject as ICustomExport; + if ( exporter != null ) { + CustomExport(exporter); + } else { + var type = typeof(T); + var props = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); + foreach ( var prop in props ) { + var value = prop.GetValue(settingsObject); + if ( value == null ) { + this.settings[prop.Name] = null; + } else { + this.settings[prop.Name] = this.converter.ToString(value); + } + } + } + } + + public void Import(ISettingsStore store) { + foreach ( var key in this.settings.Keys ) { + store.Set(key, this.settings[key]); + } + } + + private void CustomExport(ICustomExport exporter) { + var props = exporter.Export(); + foreach ( var key in props.Keys ) { + var value = props[key]; + if ( value == null ) { + this.settings[key] = null; + } else { + this.settings[key] = this.converter.ToString(value); + } + } + } + } +} diff --git a/src/Viasfora.Core/SettingsContext.cs b/src/Viasfora.Core/SettingsContext.cs index dd8726c1..9e83bfde 100644 --- a/src/Viasfora.Core/SettingsContext.cs +++ b/src/Viasfora.Core/SettingsContext.cs @@ -9,7 +9,7 @@ public static IVsfSettings GetSettings() { var model = new SComponentModel(); return model.GetService(); } - public static T GetSpecificSettings() { + public static T GetService() { var model = new SComponentModel(); return model.GetService(); } diff --git a/src/Viasfora.Core/Viasfora.Core.csproj b/src/Viasfora.Core/Viasfora.Core.csproj index 52b13b31..9e88856a 100644 --- a/src/Viasfora.Core/Viasfora.Core.csproj +++ b/src/Viasfora.Core/Viasfora.Core.csproj @@ -209,7 +209,9 @@ + + @@ -217,6 +219,7 @@ + diff --git a/src/Viasfora.Languages/LanguageFactory.cs b/src/Viasfora.Languages/LanguageFactory.cs index 1e5068be..e1833c09 100644 --- a/src/Viasfora.Languages/LanguageFactory.cs +++ b/src/Viasfora.Languages/LanguageFactory.cs @@ -18,6 +18,10 @@ public LanguageFactory(ITypedSettingsStore store) { this.defaultLang = new DefaultLanguage(store); } + public IEnumerable GetAllLanguages() { + return this.Languages; + } + public ILanguage TryCreateLanguage(IContentType contentType) { foreach ( ILanguage lang in Languages ) { if ( lang.MatchesContentType(contentType) ) { diff --git a/src/Viasfora.Languages/LanguageSettings.cs b/src/Viasfora.Languages/LanguageSettings.cs index cf2c010f..c1d2072c 100644 --- a/src/Viasfora.Languages/LanguageSettings.cs +++ b/src/Viasfora.Languages/LanguageSettings.cs @@ -1,9 +1,10 @@ using System; +using System.Collections.Generic; using Winterdom.Viasfora.Contracts; using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Languages { - public abstract class LanguageSettings : SettingsBase, ILanguageSettings { + public abstract class LanguageSettings : SettingsBase, ILanguageSettings, ICustomExport { protected static readonly String[] EMPTY = { }; protected abstract String[] ControlFlowDefaults { get; } protected abstract String[] LinqDefaults { get; } @@ -31,5 +32,14 @@ public LanguageSettings(String key, ITypedSettingsStore store) : base(store) { this.KeyName = key; } + + public IDictionary Export() { + return new Dictionary { + { KeyName + "_ControlFlow", ControlFlow }, + { KeyName + "_Linq", Linq }, + { KeyName + "_Visibility", Visibility }, + { KeyName + "_Enabled", Enabled } + }; + } } } diff --git a/src/Viasfora/Options/GeneralOptionsPage.cs b/src/Viasfora/Options/GeneralOptionsPage.cs index 2215d711..a70154b3 100644 --- a/src/Viasfora/Options/GeneralOptionsPage.cs +++ b/src/Viasfora/Options/GeneralOptionsPage.cs @@ -13,7 +13,7 @@ public class GeneralOptionsPage : DialogPage { public override void SaveSettingsToStorage() { var settings = SettingsContext.GetSettings(); - var rainbowSettings = SettingsContext.GetSpecificSettings(); + var rainbowSettings = SettingsContext.GetService(); settings.CurrentColumnHighlightEnabled = CurrentColumnHighlightEnabled; settings.CurrentColumnHighlightStyle = CurrentColumnHighlightStyle; diff --git a/src/Viasfora/Options/MainOptionsControl.Designer.cs b/src/Viasfora/Options/MainOptionsControl.Designer.cs new file mode 100644 index 00000000..afe80b8b --- /dev/null +++ b/src/Viasfora/Options/MainOptionsControl.Designer.cs @@ -0,0 +1,109 @@ +namespace Winterdom.Viasfora.Options { + partial class MainOptionsControl { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) { + if ( disposing && (components != null) ) { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Component Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + private void InitializeComponent() { + this.groupBox1 = new System.Windows.Forms.GroupBox(); + this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); + this.importButton = new System.Windows.Forms.Button(); + this.exportButton = new System.Windows.Forms.Button(); + this.groupBox1.SuspendLayout(); + this.tableLayoutPanel1.SuspendLayout(); + this.SuspendLayout(); + // + // groupBox1 + // + this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox1.Controls.Add(this.tableLayoutPanel1); + this.groupBox1.Location = new System.Drawing.Point(4, 4); + this.groupBox1.Name = "groupBox1"; + this.groupBox1.Size = new System.Drawing.Size(766, 203); + this.groupBox1.TabIndex = 0; + this.groupBox1.TabStop = false; + this.groupBox1.Text = "Export / Import"; + // + // tableLayoutPanel1 + // + this.tableLayoutPanel1.ColumnCount = 4; + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 181F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 181F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel1.Controls.Add(this.importButton, 2, 1); + this.tableLayoutPanel1.Controls.Add(this.exportButton, 1, 1); + this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 27); + this.tableLayoutPanel1.Name = "tableLayoutPanel1"; + this.tableLayoutPanel1.RowCount = 3; + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 52F)); + this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel1.Size = new System.Drawing.Size(760, 173); + this.tableLayoutPanel1.TabIndex = 1; + // + // importButton + // + this.importButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.importButton.Location = new System.Drawing.Point(385, 25); + this.importButton.Margin = new System.Windows.Forms.Padding(5); + this.importButton.Name = "importButton"; + this.importButton.Size = new System.Drawing.Size(171, 42); + this.importButton.TabIndex = 1; + this.importButton.Text = "Import Settings"; + this.importButton.UseVisualStyleBackColor = true; + this.importButton.Click += new System.EventHandler(this.ImportButtonClick); + // + // exportButton + // + this.exportButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.exportButton.Location = new System.Drawing.Point(204, 25); + this.exportButton.Margin = new System.Windows.Forms.Padding(5); + this.exportButton.Name = "exportButton"; + this.exportButton.Size = new System.Drawing.Size(171, 42); + this.exportButton.TabIndex = 0; + this.exportButton.Text = "Export Settings"; + this.exportButton.UseVisualStyleBackColor = true; + this.exportButton.Click += new System.EventHandler(this.ExportButtonClick); + // + // MainOptionsControl + // + this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F); + this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox1); + this.Name = "MainOptionsControl"; + this.Size = new System.Drawing.Size(780, 618); + this.groupBox1.ResumeLayout(false); + this.tableLayoutPanel1.ResumeLayout(false); + this.ResumeLayout(false); + + } + + #endregion + + private System.Windows.Forms.GroupBox groupBox1; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; + private System.Windows.Forms.Button importButton; + private System.Windows.Forms.Button exportButton; + } +} diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs new file mode 100644 index 00000000..3dad7c9b --- /dev/null +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Drawing; +using System.Data; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Forms; +using Winterdom.Viasfora.Settings; +using Winterdom.Viasfora.Rainbow; +using Winterdom.Viasfora.Xml; +using Winterdom.Viasfora.Contracts; + +namespace Winterdom.Viasfora.Options { + public partial class MainOptionsControl : UserControl { + public MainOptionsControl() { + InitializeComponent(); + } + + private void ExportButtonClick(object sender, EventArgs e) { + String filename = GetFileName(); + if ( String.IsNullOrEmpty(filename) ) { + return; + } + + var exporter = SettingsContext.GetService(); + exporter.Export(SettingsContext.GetSettings()); + exporter.Export(SettingsContext.GetService()); + exporter.Export(SettingsContext.GetService()); + + var languageFactory = SettingsContext.GetService(); + foreach ( var lang in languageFactory.GetAllLanguages() ) { + exporter.Export(lang.Settings); + } + exporter.Save(filename); + MessageBox.Show(this, "Settings exported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void ImportButtonClick(object sender, EventArgs e) { + + } + + private String GetFileName() { + using ( var dialog = new SaveFileDialog() ) { + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + dialog.Filter = "XML Files (*.xml)|*.xml"; + var result = dialog.ShowDialog(this); + if ( result == DialogResult.OK ) { + return dialog.FileName; + } + return null; + } + } + } +} diff --git a/src/Viasfora/Options/MainOptionsControl.resx b/src/Viasfora/Options/MainOptionsControl.resx new file mode 100644 index 00000000..29dcb1b3 --- /dev/null +++ b/src/Viasfora/Options/MainOptionsControl.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/src/Viasfora/Options/MainOptionsPage.cs b/src/Viasfora/Options/MainOptionsPage.cs new file mode 100644 index 00000000..686fcab9 --- /dev/null +++ b/src/Viasfora/Options/MainOptionsPage.cs @@ -0,0 +1,28 @@ +using Microsoft.VisualStudio.Shell; +using System; +using System.Runtime.InteropServices; +using System.Windows.Forms; + +namespace Winterdom.Viasfora.Options { + [Guid(Guids.MainOptions)] + public class MainOptionsPage : DialogPage { + private MainOptionsControl dialog; + + protected override IWin32Window Window { + get { + return dialog; + } + } + + public MainOptionsPage() { + this.dialog = new MainOptionsControl(); + } + + public override void SaveSettingsToStorage() { + } + + public override void LoadSettingsFromStorage() { + } + + } +} diff --git a/src/Viasfora/Options/RainbowOptionsPage.cs b/src/Viasfora/Options/RainbowOptionsPage.cs index 0f6736f0..34720ea4 100644 --- a/src/Viasfora/Options/RainbowOptionsPage.cs +++ b/src/Viasfora/Options/RainbowOptionsPage.cs @@ -11,7 +11,7 @@ public class RainbowOptionsPage : DialogPage { private ClassificationList colors; public override void SaveSettingsToStorage() { - var rainbowSettings = SettingsContext.GetSpecificSettings(); + var rainbowSettings = SettingsContext.GetService(); rainbowSettings.RainbowDepth = RainbowDepth; rainbowSettings.RainbowTagsEnabled = RainbowTagsEnabled; @@ -24,7 +24,7 @@ public override void SaveSettingsToStorage() { colors.Save(); } public override void LoadSettingsFromStorage() { - var rainbowSettings = SettingsContext.GetSpecificSettings(); + var rainbowSettings = SettingsContext.GetService(); RainbowDepth = rainbowSettings.RainbowDepth; RainbowTagsEnabled = rainbowSettings.RainbowTagsEnabled; diff --git a/src/Viasfora/Options/XmlOptionsPage.cs b/src/Viasfora/Options/XmlOptionsPage.cs index a7cff2ec..cf2ef4e4 100644 --- a/src/Viasfora/Options/XmlOptionsPage.cs +++ b/src/Viasfora/Options/XmlOptionsPage.cs @@ -11,7 +11,7 @@ public class XmlOptionsPage : DialogPage { private ClassificationList colors; public override void SaveSettingsToStorage() { - var settings = SettingsContext.GetSpecificSettings(); + var settings = SettingsContext.GetService(); settings.XmlnsPrefixEnabled = XmlnsPrefixHighlightEnabled; settings.XmlCloseTagEnabled = XmlCloseTagHighlightEnabled; @@ -21,7 +21,7 @@ public override void SaveSettingsToStorage() { settings.Save(); } public override void LoadSettingsFromStorage() { - var settings = SettingsContext.GetSpecificSettings(); + var settings = SettingsContext.GetService(); XmlnsPrefixHighlightEnabled = settings.XmlnsPrefixEnabled; XmlCloseTagHighlightEnabled = settings.XmlCloseTagEnabled; XmlMatchTagsEnabled = settings.XmlMatchTagsEnabled; diff --git a/src/Viasfora/VSPackage.resx b/src/Viasfora/VSPackage.resx index 2bac7638..050dd031 100644 --- a/src/Viasfora/VSPackage.resx +++ b/src/Viasfora/VSPackage.resx @@ -132,6 +132,9 @@ General + + Export / Import + Rainbow Braces diff --git a/src/Viasfora/Viasfora.csproj b/src/Viasfora/Viasfora.csproj index 7cba5439..82ffef88 100644 --- a/src/Viasfora/Viasfora.csproj +++ b/src/Viasfora/Viasfora.csproj @@ -86,6 +86,15 @@ + + UserControl + + + MainOptionsControl.cs + + + Component + Component @@ -317,6 +326,9 @@ + + MainOptionsControl.cs + PresentationModeDialogPage.cs diff --git a/src/Viasfora/VsfPackage.cs b/src/Viasfora/VsfPackage.cs index 6cfb1f62..a457881c 100644 --- a/src/Viasfora/VsfPackage.cs +++ b/src/Viasfora/VsfPackage.cs @@ -18,6 +18,7 @@ namespace Winterdom.Viasfora { [Guid(Guids.VSPackage)] [InstalledProductRegistration("#110", "#111", productId: VsfVersion.Version, IconResourceID = 400)] [ProvideOptionPage(typeof(Options.GeneralOptionsPage), "Viasfora", "General", 200, 310, true)] + [ProvideOptionPage(typeof(Options.MainOptionsPage), "Viasfora", "Main", 200, 315, true)] [ProvideOptionPage(typeof(Options.RainbowOptionsPage), "Viasfora", "Rainbow Braces", 200, 320, true)] [ProvideOptionPage(typeof(Options.XmlOptionsPage), "Viasfora", "XML Editor", 200, 330, true)] [ProvideOptionPage(typeof(Options.PresentationModeOptionsPage), "Viasfora", "Presentation Mode", 200, 340, true)] From cfd44286ef7139d586408236bb335b1325b2bd7f Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Thu, 22 Jun 2017 19:07:31 -0500 Subject: [PATCH 08/20] Implement basic import for regular + language settings --- .../Settings/GlobalXmlSettingsStore.cs | 1 + .../Settings/TypedSettingsStore.cs | 1 + .../Options/MainOptionsControl.Designer.cs | 10 +++---- src/Viasfora/Options/MainOptionsControl.cs | 26 +++++++++++++++++-- 4 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/Viasfora.Core/Settings/GlobalXmlSettingsStore.cs b/src/Viasfora.Core/Settings/GlobalXmlSettingsStore.cs index c9f51091..081e50b2 100644 --- a/src/Viasfora.Core/Settings/GlobalXmlSettingsStore.cs +++ b/src/Viasfora.Core/Settings/GlobalXmlSettingsStore.cs @@ -6,6 +6,7 @@ using System.Xml.Linq; namespace Winterdom.Viasfora.Settings { + [PartCreationPolicy(CreationPolicy.Shared)] [Export(typeof(ISettingsStore))] public class GlobalXmlSettingsStore : ISettingsStore { const String FILE_NAME = "viasfora.xml"; diff --git a/src/Viasfora.Core/Settings/TypedSettingsStore.cs b/src/Viasfora.Core/Settings/TypedSettingsStore.cs index c9818104..9b573ec3 100644 --- a/src/Viasfora.Core/Settings/TypedSettingsStore.cs +++ b/src/Viasfora.Core/Settings/TypedSettingsStore.cs @@ -2,6 +2,7 @@ using System.ComponentModel.Composition; namespace Winterdom.Viasfora.Settings { + [PartCreationPolicy(CreationPolicy.Shared)] [Export(typeof(ITypedSettingsStore))] public class TypedSettingsStore : ITypedSettingsStore { private ISettingsStore store; diff --git a/src/Viasfora/Options/MainOptionsControl.Designer.cs b/src/Viasfora/Options/MainOptionsControl.Designer.cs index afe80b8b..4bf8c196 100644 --- a/src/Viasfora/Options/MainOptionsControl.Designer.cs +++ b/src/Viasfora/Options/MainOptionsControl.Designer.cs @@ -47,8 +47,8 @@ private void InitializeComponent() { // this.tableLayoutPanel1.ColumnCount = 4; this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 181F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 181F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); + this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); this.tableLayoutPanel1.Controls.Add(this.importButton, 2, 1); this.tableLayoutPanel1.Controls.Add(this.exportButton, 1, 1); @@ -68,7 +68,7 @@ private void InitializeComponent() { this.importButton.Location = new System.Drawing.Point(385, 25); this.importButton.Margin = new System.Windows.Forms.Padding(5); this.importButton.Name = "importButton"; - this.importButton.Size = new System.Drawing.Size(171, 42); + this.importButton.Size = new System.Drawing.Size(220, 42); this.importButton.TabIndex = 1; this.importButton.Text = "Import Settings"; this.importButton.UseVisualStyleBackColor = true; @@ -77,10 +77,10 @@ private void InitializeComponent() { // exportButton // this.exportButton.Dock = System.Windows.Forms.DockStyle.Fill; - this.exportButton.Location = new System.Drawing.Point(204, 25); + this.exportButton.Location = new System.Drawing.Point(155, 25); this.exportButton.Margin = new System.Windows.Forms.Padding(5); this.exportButton.Name = "exportButton"; - this.exportButton.Size = new System.Drawing.Size(171, 42); + this.exportButton.Size = new System.Drawing.Size(220, 42); this.exportButton.TabIndex = 0; this.exportButton.Text = "Export Settings"; this.exportButton.UseVisualStyleBackColor = true; diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs index 3dad7c9b..f6a965f8 100644 --- a/src/Viasfora/Options/MainOptionsControl.cs +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -19,7 +19,7 @@ public MainOptionsControl() { } private void ExportButtonClick(object sender, EventArgs e) { - String filename = GetFileName(); + String filename = GetExportFileName(); if ( String.IsNullOrEmpty(filename) ) { return; } @@ -38,10 +38,20 @@ private void ExportButtonClick(object sender, EventArgs e) { } private void ImportButtonClick(object sender, EventArgs e) { + String filename = GetImportFileName(); + if ( String.IsNullOrEmpty(filename) ) { + return; + } + var exporter = SettingsContext.GetService(); + exporter.Load(filename); + var store = SettingsContext.GetService(); + exporter.Import(store); + store.Save(); + MessageBox.Show(this, "Settings imported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } - private String GetFileName() { + private String GetExportFileName() { using ( var dialog = new SaveFileDialog() ) { dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); dialog.Filter = "XML Files (*.xml)|*.xml"; @@ -52,5 +62,17 @@ private String GetFileName() { return null; } } + private String GetImportFileName() { + using ( var dialog = new OpenFileDialog() ) { + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + dialog.CheckFileExists = true; + dialog.Filter = "XML Files (*.xml)|*.xml"; + var result = dialog.ShowDialog(this); + if ( result == DialogResult.OK ) { + return dialog.FileName; + } + return null; + } + } } } From c49f3a01d93898ac54bc43479689a4960bfd3af0 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Tue, 11 Jul 2017 19:14:56 -0500 Subject: [PATCH 09/20] Complete implementation of import/export and comment out color export --- .../CodeClassificationDefinitions.cs | 6 +-- .../XmlClassificationDefinitions.cs | 2 +- src/Viasfora/Options/ClassificationList.cs | 54 ++++++++++++++++++- src/Viasfora/Options/MainOptionsControl.cs | 13 +++++ 4 files changed, 67 insertions(+), 8 deletions(-) diff --git a/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs b/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs index 9734dd82..453c112c 100644 --- a/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs +++ b/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs @@ -1,15 +1,11 @@ using System; -using System.Collections.Generic; using System.ComponentModel.Composition; -using System.Linq; -using System.Text; -using System.Windows.Media; using Microsoft.VisualStudio.Text.Classification; using Microsoft.VisualStudio.Utilities; namespace Winterdom.Viasfora.Classifications { - internal static class CodeClassificationDefinitions { + public static class CodeClassificationDefinitions { [Export, Name(Constants.KEYWORD_CLASSIF_NAME)] internal static ClassificationTypeDefinition FlowControlClassificationType = null; diff --git a/src/Viasfora.Xml/Classifications/XmlClassificationDefinitions.cs b/src/Viasfora.Xml/Classifications/XmlClassificationDefinitions.cs index 4e62674c..5ebdbeca 100644 --- a/src/Viasfora.Xml/Classifications/XmlClassificationDefinitions.cs +++ b/src/Viasfora.Xml/Classifications/XmlClassificationDefinitions.cs @@ -5,7 +5,7 @@ namespace Winterdom.Viasfora.Classifications { - internal static class XmlClassificationDefinitions { + public static class XmlClassificationDefinitions { [Export, Name(XmlConstants.XML_CLOSING)] internal static ClassificationTypeDefinition XmlClosingType = null; diff --git a/src/Viasfora/Options/ClassificationList.cs b/src/Viasfora/Options/ClassificationList.cs index dc57ecb6..40a899d9 100644 --- a/src/Viasfora/Options/ClassificationList.cs +++ b/src/Viasfora/Options/ClassificationList.cs @@ -1,19 +1,27 @@ using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell.Interop; +using Microsoft.VisualStudio.Utilities; using System; using System.Collections.Generic; using System.Drawing; +using System.Reflection; +using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Options { - public class ClassificationList { + public class ClassificationList : ICustomExport { private ColorStorage storage; - public IDictionary classifications; + private IDictionary classifications; public ClassificationList(ColorStorage colorStorage) { storage = colorStorage; classifications = new Dictionary(); } + public void Load(params Type[] classificationDefinitions) { + var classificationNames = ExtractClassificationNames(classificationDefinitions); + Load(classificationNames); + } + public void Load(params String[] classificationNames) { classifications.Clear(); @@ -57,9 +65,51 @@ public Color Get(String classificationName, bool foreground) { } return default(Color); } + public void Set(String classificationName, bool foreground, Color color) { var obj = classifications[classificationName]; obj.Set(color, foreground); } + + public IDictionary Export() { + Dictionary values = new Dictionary(); + foreach ( var key in this.classifications.Keys ) { + var entry = this.classifications[key]; + var fg = entry.Get(true); + var bg = entry.Get(false); + + values[key.Replace(" ", "..")] = new String[] { + ColorTranslator.ToHtml(fg), + ColorTranslator.ToHtml(bg) + }; + } + return values; + } + + public void ExportValues(ISettingsStore store) { + } + + private String[] ExtractClassificationNames(Type[] classificationDefinitions) { + List names = new List(); + foreach ( var def in classificationDefinitions ) { + var fields = def.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); + foreach ( var field in fields ) { + var name = GetDefinitionName(field); + if ( !String.IsNullOrEmpty(name) ) { + names.Add(name); + } + } + } + return names.ToArray(); + } + + private String GetDefinitionName(FieldInfo field) { + var nameAttr = field.GetCustomAttribute(); + if ( nameAttr != null ) { + return nameAttr.Name; + } + return null; + } + } } diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs index f6a965f8..554e4954 100644 --- a/src/Viasfora/Options/MainOptionsControl.cs +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -11,6 +11,8 @@ using Winterdom.Viasfora.Rainbow; using Winterdom.Viasfora.Xml; using Winterdom.Viasfora.Contracts; +using Winterdom.Viasfora.Classifications; +using Winterdom.Viasfora.Rainbow.Classifications; namespace Winterdom.Viasfora.Options { public partial class MainOptionsControl : UserControl { @@ -74,5 +76,16 @@ private String GetImportFileName() { return null; } } + + private void ExportColors(ISettingsExport exporter) { + ClassificationList list = new ClassificationList(new ColorStorage(this.Site)); + list.Load( + typeof(CodeClassificationDefinitions), + typeof(RainbowClassifications), + typeof(XmlClassificationDefinitions) + ); + + exporter.Export(list); + } } } From 93ba4010948e645420fe5762e91707da972b7aef Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Thu, 20 Jul 2017 10:17:42 -0500 Subject: [PATCH 10/20] Add initial support for JavaScript template literals (Fixes #203) --- .../BraceScanners/JScriptBraceScanner.cs | 95 ++++++++++++++++++- .../BraceScanners/JscriptBraceScannerTests.cs | 95 +++++++++++++++++++ tests/Viasfora.Tests/Viasfora.Tests.csproj | 1 + 3 files changed, 189 insertions(+), 2 deletions(-) create mode 100644 tests/Viasfora.Tests/BraceScanners/JscriptBraceScannerTests.cs diff --git a/src/Viasfora.Languages/BraceScanners/JScriptBraceScanner.cs b/src/Viasfora.Languages/BraceScanners/JScriptBraceScanner.cs index b563803a..9c3b6318 100644 --- a/src/Viasfora.Languages/BraceScanners/JScriptBraceScanner.cs +++ b/src/Viasfora.Languages/BraceScanners/JScriptBraceScanner.cs @@ -4,13 +4,16 @@ using Winterdom.Viasfora.Util; namespace Winterdom.Viasfora.Languages.BraceScanners { - public class JScriptBraceScanner : IBraceScanner { + public class JScriptBraceScanner : IBraceScanner, IResumeControl { const int stText = 0; const int stString = 1; const int stChar = 2; const int stRegex = 3; const int stMultiLineComment = 4; + const int stIString = 5; private int status = stText; + private int nestingLevel = 0; + private bool parsingExpression = false; public String BraceList { get { return "(){}[]"; } @@ -20,7 +23,13 @@ public JScriptBraceScanner() { } public void Reset(int state) { - this.status = stText; + this.status = state & 0xFF; + this.parsingExpression = (state & 0x08000000) != 0; + this.nestingLevel = (state & 0xFF0000) >> 24; + } + + public bool CanResume(CharPos brace) { + return brace.State == stText; } public bool Extract(ITextChars tc, ref CharPos pos) { @@ -29,6 +38,11 @@ public bool Extract(ITextChars tc, ref CharPos pos) { case stString: ParseString(tc); break; case stChar: ParseCharLiteral(tc); break; case stMultiLineComment: ParseMultiLineComment(tc); break; + case stIString: + if ( ParseInterpolatedString(tc, ref pos) ) { + return true; + } + break; default: return ParseText(tc, ref pos); } @@ -58,6 +72,10 @@ private bool ParseText(ITextChars tc, ref CharPos pos) { this.status = stString; tc.Next(); this.ParseCharLiteral(tc); + } else if ( tc.Char() == '`' ) { + this.status = stIString; + tc.Next(); + return this.ParseInterpolatedString(tc, ref pos); } else if ( this.BraceList.IndexOf(tc.Char()) >= 0 ) { pos = new CharPos(tc.Char(), tc.AbsolutePosition); tc.Next(); @@ -137,5 +155,78 @@ private void ParseMultiLineComment(ITextChars tc) { } } } + + // template literal support, + // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals + private bool ParseInterpolatedString(ITextChars tc, ref CharPos pos) { + while ( !tc.EndOfLine ) { + if ( parsingExpression ) { + // inside template literal expression in ${} + if ( ParseTemplateExpressionChar(tc, ref pos) ) + return true; + } else { + // in the string part + if ( tc.Char() == '\\' ) { + // skip over escape sequences + tc.Skip(2); + } else if ( tc.Char() == '$' && tc.NChar() == '{' ) { + // opening expression + this.parsingExpression = true; + this.nestingLevel++; + tc.Next(); // skip $ + pos = new CharPos(tc.Char(), tc.AbsolutePosition, EncodedState()); + tc.Next(); // skip { + return true; + } else if ( tc.Char() == '`' ) { + // done parsing the template + this.status = stText; + tc.Next(); + break; + } else { + tc.Next(); + } + } + } + return false; + } + + private bool ParseTemplateExpressionChar(ITextChars tc, ref CharPos pos) { + if ( tc.Char() == '"' ) { + // opening string + tc.Next(); + this.ParseString(tc); + this.status = stIString; + } else if ( tc.Char() == '\'' ) { + tc.Next(); + ParseCharLiteral(tc); + this.status = stIString; + } else if ( tc.Char() == '}' ) { + // reached the end + this.nestingLevel--; + if ( nestingLevel == 0 ) { + this.parsingExpression = false; + } + pos = new CharPos(tc.Char(), tc.AbsolutePosition, EncodedState()); + tc.Next(); + return true; + } else if ( BraceList.Contains(tc.Char()) ) { + pos = new CharPos(tc.Char(), tc.AbsolutePosition, EncodedState()); + if ( tc.Char() == '{' ) + this.nestingLevel++; + tc.Next(); + return true; + } else { + tc.Next(); + } + return false; + } + + private int EncodedState() { + int encoded = status; + if ( parsingExpression ) + encoded |= 0x08000000; + encoded |= (nestingLevel & 0xFF) << 24; + return encoded; + } } } diff --git a/tests/Viasfora.Tests/BraceScanners/JscriptBraceScannerTests.cs b/tests/Viasfora.Tests/BraceScanners/JscriptBraceScannerTests.cs new file mode 100644 index 00000000..7f16aa97 --- /dev/null +++ b/tests/Viasfora.Tests/BraceScanners/JscriptBraceScannerTests.cs @@ -0,0 +1,95 @@ +using System; +using Winterdom.Viasfora.Languages.BraceScanners; +using Xunit; + +namespace Viasfora.Tests.BraceScanners { + public class JScriptBraceScannerTests : BaseScannerTests { + + [Fact] + public void CanExtractParens() { + String input = @"(x*(y+7))"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(4, chars.Count); + } + [Fact] + public void CanExtractBrackets() { + String input = @"x[y[0]]"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(4, chars.Count); + } + [Fact] + public void CanExtractBraces() { + String input = @"if ( true ) { }"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(4, chars.Count); + } + [Fact] + public void IgnoreBracesInSingleLineComment() { + String input = @" +callF(1); +// callCommented(2); +"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(2, chars.Count); + } + [Fact] + public void IgnoreBracesInMultilineComment() { + String input = @" +/* callF(1); +callCommented2(4); +*/ +"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(0, chars.Count); + } + [Fact] + public void IgnoreBracesInString() { + String input = "callF(\"some (string)\")"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(2, chars.Count); + } + [Fact] + public void IgnoreBracesInCharLiteral() { + String input = "callF(']')"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(2, chars.Count); + } + + + [Fact] + public void TemplateLiteral1() { + String input = "`${rootFolder}/vendor`"; + var extractor = new JScriptBraceScanner(); + var chars = Extract(extractor, input.Trim(), 0, 0); + Assert.Equal(2, chars.Count); + } + [Fact] + public void TemplateLiteralMultiline() { + String input = "`${a + b}\r\n ${b + c}`"; + var extractor = new JScriptBraceScanner(); + var chars = ExtractWithLines(extractor, input.Trim(), 0, 0); + Assert.Equal(4, chars.Count); + } + [Fact] + public void TemplateLiteralEscapedTick() { + String input = "`${a + b}\\`{b + c}`"; + var extractor = new JScriptBraceScanner(); + var chars = ExtractWithLines(extractor, input.Trim(), 0, 0); + Assert.Equal(2, chars.Count); + } + [Fact] + public void TemplateLiteralEscapedDollar() { + String input = "`${a + b}\\${b + c}`"; + var extractor = new JScriptBraceScanner(); + var chars = ExtractWithLines(extractor, input.Trim(), 0, 0); + Assert.Equal(2, chars.Count); + } + } +} diff --git a/tests/Viasfora.Tests/Viasfora.Tests.csproj b/tests/Viasfora.Tests/Viasfora.Tests.csproj index 44172164..b71553d6 100644 --- a/tests/Viasfora.Tests/Viasfora.Tests.csproj +++ b/tests/Viasfora.Tests/Viasfora.Tests.csproj @@ -171,6 +171,7 @@ + From c2883cc9ddec7b89bb8ef38ad3e9a85468ca3b86 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Thu, 20 Jul 2017 19:02:12 -0500 Subject: [PATCH 11/20] Add initial code to export current colors as a new theme file --- src/Viasfora/Options/ClassificationColors.cs | 56 +++++++++++++++ src/Viasfora/Options/ClassificationList.cs | 25 +++---- src/Viasfora/Options/FontStyles.cs | 14 ++++ .../Options/MainOptionsControl.Designer.cs | 68 +++++++++++++++++++ src/Viasfora/Options/MainOptionsControl.cs | 44 ++++++++---- src/Viasfora/Viasfora.csproj | 1 + 6 files changed, 182 insertions(+), 26 deletions(-) create mode 100644 src/Viasfora/Options/FontStyles.cs diff --git a/src/Viasfora/Options/ClassificationColors.cs b/src/Viasfora/Options/ClassificationColors.cs index 652e01c6..75b32b31 100644 --- a/src/Viasfora/Options/ClassificationColors.cs +++ b/src/Viasfora/Options/ClassificationColors.cs @@ -11,6 +11,28 @@ public class ClassificationColors { private bool foregroundChanged; private Color background; private bool backgroundChanged; + private FontStyles fontFlags; + private bool fontFlagsChanged; + + public Color Foreground { + get { return this.Get(true); } + set { this.Set(value, true); } + } + + public Color Background { + get { return this.Get(false); } + set { this.Set(value, false); } + } + + public FontStyles Style { + get { return this.fontFlags; } + set { + if ( this.fontFlags != value ) { + this.fontFlags = value; + this.fontFlagsChanged = true; + } + } + } public ClassificationColors(String name) { this.classificationName = name; @@ -24,10 +46,18 @@ public void Load(ColorStorage colorStorage) { this.foregroundChanged = false; if ( colors[0].bForegroundValid != 0 ) { this.foreground = MapColor(colorStorage, colors[0].crForeground); + } else { + this.foreground = Color.Transparent; } this.backgroundChanged = false; if ( colors[0].bBackgroundValid != 0 ) { this.background = MapColor(colorStorage, colors[0].crBackground); + } else { + this.background = Color.Transparent; + } + this.fontFlagsChanged = false; + if ( colors[0].bFontFlagsValid != 0 ) { + this.fontFlags = MapFontFlags(colors[0].dwFontFlags); } } @@ -53,6 +83,10 @@ public void Save(ColorStorage colorStorage) { } colors[0].bBackgroundValid = 1; } + if ( this.fontFlagsChanged ) { + colors[0].dwFontFlags = ToFontFlags(this.fontFlags); + colors[0].bFontFlagsValid = 1; + } hr = colorStorage.Storage.SetItem(classificationName, colors); ErrorHandler.ThrowOnFailure(hr); @@ -107,6 +141,10 @@ private Color FromColorIndex(ColorStorage storage, uint colorRef) { var hr = storage.Utilities.GetEncodedIndex(colorRef, index); ErrorHandler.ThrowOnFailure(hr); + // useful when the color is marked as "automatic" in VS + if ( index[0] == COLORINDEX.CI_SYSTEXT_BK || index[0] == COLORINDEX.CI_SYSTEXT_FG ) + return Color.Transparent; + uint rgb; hr = storage.Utilities.GetRGBOfIndex(index[0], out rgb); ErrorHandler.ThrowOnFailure(hr); @@ -116,6 +154,24 @@ private Color FromColorIndex(ColorStorage storage, uint colorRef) { private Color FromWin32(uint colorRef) { return ColorTranslator.FromWin32((int)colorRef); } + + private FontStyles MapFontFlags(uint dwFontFlags) { + var style = FontStyles.None; + if ( (dwFontFlags & (uint)FONTFLAGS.FF_BOLD) != 0 ) + style |= FontStyles.Bold; + if ( (dwFontFlags & (uint)FONTFLAGS.FF_STRIKETHROUGH) != 0 ) + style |= FontStyles.Strikethrough; + return style; + } + + private uint ToFontFlags(FontStyles style) { + uint dwFontFlags = 0; + if ( style.HasFlag(FontStyles.Bold) ) + dwFontFlags |= (uint)FONTFLAGS.FF_BOLD; + if ( style.HasFlag(FontStyles.Strikethrough) ) + dwFontFlags |= (uint)FONTFLAGS.FF_STRIKETHROUGH; + return dwFontFlags; + } } diff --git a/src/Viasfora/Options/ClassificationList.cs b/src/Viasfora/Options/ClassificationList.cs index 40a899d9..916ba832 100644 --- a/src/Viasfora/Options/ClassificationList.cs +++ b/src/Viasfora/Options/ClassificationList.cs @@ -1,14 +1,16 @@ using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio.Utilities; +using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Drawing; +using System.IO; using System.Reflection; using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Options { - public class ClassificationList : ICustomExport { + public class ClassificationList { private ColorStorage storage; private IDictionary classifications; @@ -71,22 +73,21 @@ public void Set(String classificationName, bool foreground, Color color) { obj.Set(color, foreground); } - public IDictionary Export() { - Dictionary values = new Dictionary(); + public void Export(String filepath) { + JObject list = new JObject(); foreach ( var key in this.classifications.Keys ) { var entry = this.classifications[key]; - var fg = entry.Get(true); - var bg = entry.Get(false); - values[key.Replace(" ", "..")] = new String[] { - ColorTranslator.ToHtml(fg), - ColorTranslator.ToHtml(bg) - }; + var item = new JObject(); + item["foreground"] = ColorTranslator.ToHtml(entry.Foreground); + if ( entry.Background != Color.Transparent ) { + item["background"] = ColorTranslator.ToHtml(entry.Background); + } + item["style"] = JToken.FromObject(entry.Style); + list[key] = item; } - return values; - } - public void ExportValues(ISettingsStore store) { + File.WriteAllText(filepath, list.ToString()); } private String[] ExtractClassificationNames(Type[] classificationDefinitions) { diff --git a/src/Viasfora/Options/FontStyles.cs b/src/Viasfora/Options/FontStyles.cs new file mode 100644 index 00000000..871f48e7 --- /dev/null +++ b/src/Viasfora/Options/FontStyles.cs @@ -0,0 +1,14 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; + +namespace Winterdom.Viasfora.Options { + [Flags] + [JsonConverter(typeof(StringEnumConverter))] + public enum FontStyles { + None = 0, + Bold = 0x01, + Strikethrough = 0x02, + Italics = 0x04 + } +} diff --git a/src/Viasfora/Options/MainOptionsControl.Designer.cs b/src/Viasfora/Options/MainOptionsControl.Designer.cs index 4bf8c196..d85244b2 100644 --- a/src/Viasfora/Options/MainOptionsControl.Designer.cs +++ b/src/Viasfora/Options/MainOptionsControl.Designer.cs @@ -27,8 +27,14 @@ private void InitializeComponent() { this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); this.importButton = new System.Windows.Forms.Button(); this.exportButton = new System.Windows.Forms.Button(); + this.groupBox2 = new System.Windows.Forms.GroupBox(); + this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); + this.loadThemeButton = new System.Windows.Forms.Button(); + this.saveCurrentThemeButton = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); this.tableLayoutPanel1.SuspendLayout(); + this.groupBox2.SuspendLayout(); + this.tableLayoutPanel2.SuspendLayout(); this.SuspendLayout(); // // groupBox1 @@ -86,15 +92,73 @@ private void InitializeComponent() { this.exportButton.UseVisualStyleBackColor = true; this.exportButton.Click += new System.EventHandler(this.ExportButtonClick); // + // groupBox2 + // + this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) + | System.Windows.Forms.AnchorStyles.Right))); + this.groupBox2.Controls.Add(this.tableLayoutPanel2); + this.groupBox2.Location = new System.Drawing.Point(7, 233); + this.groupBox2.Name = "groupBox2"; + this.groupBox2.Size = new System.Drawing.Size(763, 178); + this.groupBox2.TabIndex = 1; + this.groupBox2.TabStop = false; + this.groupBox2.Text = "Themes"; + // + // tableLayoutPanel2 + // + this.tableLayoutPanel2.ColumnCount = 4; + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); + this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); + this.tableLayoutPanel2.Controls.Add(this.loadThemeButton, 2, 1); + this.tableLayoutPanel2.Controls.Add(this.saveCurrentThemeButton, 1, 1); + this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; + this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 27); + this.tableLayoutPanel2.Name = "tableLayoutPanel2"; + this.tableLayoutPanel2.RowCount = 3; + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 52F)); + this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); + this.tableLayoutPanel2.Size = new System.Drawing.Size(757, 148); + this.tableLayoutPanel2.TabIndex = 2; + // + // loadThemeButton + // + this.loadThemeButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.loadThemeButton.Location = new System.Drawing.Point(383, 25); + this.loadThemeButton.Margin = new System.Windows.Forms.Padding(5); + this.loadThemeButton.Name = "loadThemeButton"; + this.loadThemeButton.Size = new System.Drawing.Size(220, 42); + this.loadThemeButton.TabIndex = 1; + this.loadThemeButton.Text = "Load Theme"; + this.loadThemeButton.UseVisualStyleBackColor = true; + this.loadThemeButton.Click += new System.EventHandler(this.LoadThemeButtonClick); + // + // saveCurrentThemeButton + // + this.saveCurrentThemeButton.Dock = System.Windows.Forms.DockStyle.Fill; + this.saveCurrentThemeButton.Location = new System.Drawing.Point(153, 25); + this.saveCurrentThemeButton.Margin = new System.Windows.Forms.Padding(5); + this.saveCurrentThemeButton.Name = "saveCurrentThemeButton"; + this.saveCurrentThemeButton.Size = new System.Drawing.Size(220, 42); + this.saveCurrentThemeButton.TabIndex = 0; + this.saveCurrentThemeButton.Text = "Save Theme"; + this.saveCurrentThemeButton.UseVisualStyleBackColor = true; + this.saveCurrentThemeButton.Click += new System.EventHandler(this.SaveCurrentThemeButtonClick); + // // MainOptionsControl // this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; + this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); this.Name = "MainOptionsControl"; this.Size = new System.Drawing.Size(780, 618); this.groupBox1.ResumeLayout(false); this.tableLayoutPanel1.ResumeLayout(false); + this.groupBox2.ResumeLayout(false); + this.tableLayoutPanel2.ResumeLayout(false); this.ResumeLayout(false); } @@ -105,5 +169,9 @@ private void InitializeComponent() { private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; private System.Windows.Forms.Button importButton; private System.Windows.Forms.Button exportButton; + private System.Windows.Forms.GroupBox groupBox2; + private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; + private System.Windows.Forms.Button loadThemeButton; + private System.Windows.Forms.Button saveCurrentThemeButton; } } diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs index 554e4954..0d97c97b 100644 --- a/src/Viasfora/Options/MainOptionsControl.cs +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -1,11 +1,4 @@ using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Drawing; -using System.Data; -using System.Linq; -using System.Text; -using System.Threading.Tasks; using System.Windows.Forms; using Winterdom.Viasfora.Settings; using Winterdom.Viasfora.Rainbow; @@ -16,12 +9,15 @@ namespace Winterdom.Viasfora.Options { public partial class MainOptionsControl : UserControl { + const String XML_FILTER = "XML Files (*.xml)|*.xml"; + const String THEME_FILTER = "Viasfora Theme Files (*.vsftheme)|*.vsftheme"; + public MainOptionsControl() { InitializeComponent(); } private void ExportButtonClick(object sender, EventArgs e) { - String filename = GetExportFileName(); + String filename = GetSaveAsFilename(XML_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; } @@ -40,7 +36,7 @@ private void ExportButtonClick(object sender, EventArgs e) { } private void ImportButtonClick(object sender, EventArgs e) { - String filename = GetImportFileName(); + String filename = GetOpenFilename(XML_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; } @@ -53,10 +49,10 @@ private void ImportButtonClick(object sender, EventArgs e) { MessageBox.Show(this, "Settings imported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } - private String GetExportFileName() { + private String GetSaveAsFilename(String filter) { using ( var dialog = new SaveFileDialog() ) { dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); - dialog.Filter = "XML Files (*.xml)|*.xml"; + dialog.Filter = filter; var result = dialog.ShowDialog(this); if ( result == DialogResult.OK ) { return dialog.FileName; @@ -64,11 +60,11 @@ private String GetExportFileName() { return null; } } - private String GetImportFileName() { + private String GetOpenFilename(String filter) { using ( var dialog = new OpenFileDialog() ) { dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); dialog.CheckFileExists = true; - dialog.Filter = "XML Files (*.xml)|*.xml"; + dialog.Filter = filter; var result = dialog.ShowDialog(this); if ( result == DialogResult.OK ) { return dialog.FileName; @@ -78,14 +74,34 @@ private String GetImportFileName() { } private void ExportColors(ISettingsExport exporter) { + var list = GetClassifications(); + exporter.Export(list); + } + + private ClassificationList GetClassifications() { ClassificationList list = new ClassificationList(new ColorStorage(this.Site)); list.Load( typeof(CodeClassificationDefinitions), typeof(RainbowClassifications), typeof(XmlClassificationDefinitions) ); + return list; + } + + private void SaveCurrentThemeButtonClick(object sender, EventArgs e) { + String filename = GetSaveAsFilename(THEME_FILTER); + if ( String.IsNullOrEmpty(filename) ) { + return; + } + + var classifications = GetClassifications(); + classifications.Export(filename); + + MessageBox.Show(this, "Theme saved successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private void LoadThemeButtonClick(object sender, EventArgs e) { - exporter.Export(list); } } } diff --git a/src/Viasfora/Viasfora.csproj b/src/Viasfora/Viasfora.csproj index 82ffef88..76ea4a5b 100644 --- a/src/Viasfora/Viasfora.csproj +++ b/src/Viasfora/Viasfora.csproj @@ -86,6 +86,7 @@ + UserControl From 26b73a76d23da8dccdd3e6743e929555bd0ea07d Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Tue, 25 Jul 2017 21:28:22 -0500 Subject: [PATCH 12/20] Initial implementation of theme import --- src/Viasfora/Options/ClassificationColors.cs | 67 ++++++++++++------- src/Viasfora/Options/ClassificationList.cs | 36 +++++++++- .../Options/MainOptionsControl.Designer.cs | 4 +- src/Viasfora/Options/MainOptionsControl.cs | 30 +++++++-- 4 files changed, 103 insertions(+), 34 deletions(-) diff --git a/src/Viasfora/Options/ClassificationColors.cs b/src/Viasfora/Options/ClassificationColors.cs index 75b32b31..8008a397 100644 --- a/src/Viasfora/Options/ClassificationColors.cs +++ b/src/Viasfora/Options/ClassificationColors.cs @@ -62,31 +62,12 @@ public void Load(ColorStorage colorStorage) { } public void Save(ColorStorage colorStorage) { - if ( this.backgroundChanged || this.foregroundChanged ) { + if ( this.HasChanged() ) { ColorableItemInfo[] colors = new ColorableItemInfo[1]; var hr = colorStorage.Storage.GetItem(classificationName, colors); ErrorHandler.ThrowOnFailure(hr); - if ( this.foregroundChanged ) { - if ( foreground == Color.Transparent ) { - colors[0].crForeground = colorStorage.GetAutomaticColor(); - } else { - colors[0].crForeground = (uint)ColorTranslator.ToWin32(foreground); - } - colors[0].bForegroundValid = 1; - } - if ( this.backgroundChanged ) { - if ( background == Color.Transparent ) { - colors[0].crBackground = colorStorage.GetAutomaticColor(); - } else { - colors[0].crBackground = (uint)ColorTranslator.ToWin32(background); - } - colors[0].bBackgroundValid = 1; - } - if ( this.fontFlagsChanged ) { - colors[0].dwFontFlags = ToFontFlags(this.fontFlags); - colors[0].bFontFlagsValid = 1; - } + AssignForSave(colorStorage, colors); hr = colorStorage.Storage.SetItem(classificationName, colors); ErrorHandler.ThrowOnFailure(hr); @@ -97,15 +78,46 @@ public Color Get(bool getForeground) { return getForeground ? this.foreground : this.background; } public void Set(Color color, bool isForeground) { - if ( isForeground && color != this.foreground ) { - this.foreground = color; - this.foregroundChanged = true; + if ( isForeground ) { + if ( this.foreground != color ) { + this.foreground = color; + this.foregroundChanged = true; + } } else if ( color != this.background ) { this.background = color; this.backgroundChanged = true; } } + private void AssignForSave(ColorStorage colorStorage, ColorableItemInfo[] colors) { + if ( this.foregroundChanged ) { + if ( foreground == Color.Transparent ) { + colors[0].crForeground = colorStorage.GetAutomaticColor(); + } else { + colors[0].crForeground = (uint)ColorTranslator.ToWin32(foreground); + } + colors[0].bForegroundValid = 1; + } + if ( this.backgroundChanged ) { + if ( background == Color.Transparent ) { + colors[0].crBackground = colorStorage.GetAutomaticColor(); + } else { + colors[0].crBackground = (uint)ColorTranslator.ToWin32(background); + } + colors[0].bBackgroundValid = 1; + } + if ( this.fontFlagsChanged ) { + colors[0].dwFontFlags = ToFontFlags(this.fontFlags); + colors[0].bFontFlagsValid = 1; + } + } + + private bool HasChanged() { + return this.foregroundChanged + || this.backgroundChanged + || this.fontFlagsChanged; + } + private Color MapColor(ColorStorage storage, uint colorRef) { int type; var hr = storage.Utilities.GetColorType(colorRef, out type); @@ -170,9 +182,12 @@ private uint ToFontFlags(FontStyles style) { dwFontFlags |= (uint)FONTFLAGS.FF_BOLD; if ( style.HasFlag(FontStyles.Strikethrough) ) dwFontFlags |= (uint)FONTFLAGS.FF_STRIKETHROUGH; + // sure wished the following worked + /* + if ( style.HasFlag(FontStyles.Italics) ) + dwFontFlags |= (uint)4; + */ return dwFontFlags; } } - - } diff --git a/src/Viasfora/Options/ClassificationList.cs b/src/Viasfora/Options/ClassificationList.cs index 916ba832..40ea12fb 100644 --- a/src/Viasfora/Options/ClassificationList.cs +++ b/src/Viasfora/Options/ClassificationList.cs @@ -7,7 +7,6 @@ using System.Drawing; using System.IO; using System.Reflection; -using Winterdom.Viasfora.Settings; namespace Winterdom.Viasfora.Options { public class ClassificationList { @@ -90,6 +89,41 @@ public void Export(String filepath) { File.WriteAllText(filepath, list.ToString()); } + public void Import(String filepath) { + JObject list = JObject.Parse(File.ReadAllText(filepath)); + foreach ( var obj in list.Children() ) { + var item = obj as JProperty; + if ( item == null ) + continue; + + String key = item.Name; + ClassificationColors classification; + if ( !this.classifications.TryGetValue(key, out classification) ) { + continue; // simply ignore it if it's unknown + } + JsonToClassification(item, classification); + } + this.Save(); + } + + private static void JsonToClassification(JProperty item, ClassificationColors classification) { + JObject value = item.Value as JObject; + var foreground = value["foreground"]; + if ( foreground != null ) { + classification.Foreground = ColorTranslator.FromHtml(foreground.Value()); + } + var background = value["background"]; + if ( background != null ) { + classification.Background = ColorTranslator.FromHtml(background.Value()); + } + var style = value["style"]; + if ( style != null ) { + FontStyles parsedStyle; + if ( Enum.TryParse(style.Value(), out parsedStyle) ) + classification.Style = parsedStyle; + } + } + private String[] ExtractClassificationNames(Type[] classificationDefinitions) { List names = new List(); foreach ( var def in classificationDefinitions ) { diff --git a/src/Viasfora/Options/MainOptionsControl.Designer.cs b/src/Viasfora/Options/MainOptionsControl.Designer.cs index d85244b2..143b7081 100644 --- a/src/Viasfora/Options/MainOptionsControl.Designer.cs +++ b/src/Viasfora/Options/MainOptionsControl.Designer.cs @@ -78,7 +78,7 @@ private void InitializeComponent() { this.importButton.TabIndex = 1; this.importButton.Text = "Import Settings"; this.importButton.UseVisualStyleBackColor = true; - this.importButton.Click += new System.EventHandler(this.ImportButtonClick); + this.importButton.Click += new System.EventHandler(this.ImportSettingsButtonClick); // // exportButton // @@ -90,7 +90,7 @@ private void InitializeComponent() { this.exportButton.TabIndex = 0; this.exportButton.Text = "Export Settings"; this.exportButton.UseVisualStyleBackColor = true; - this.exportButton.Click += new System.EventHandler(this.ExportButtonClick); + this.exportButton.Click += new System.EventHandler(this.ExportSettingsButtonClick); // // groupBox2 // diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs index 0d97c97b..1f3a0db6 100644 --- a/src/Viasfora/Options/MainOptionsControl.cs +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -16,7 +16,7 @@ public MainOptionsControl() { InitializeComponent(); } - private void ExportButtonClick(object sender, EventArgs e) { + private void ExportSettingsButtonClick(object sender, EventArgs e) { String filename = GetSaveAsFilename(XML_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; @@ -35,7 +35,7 @@ private void ExportButtonClick(object sender, EventArgs e) { MessageBox.Show(this, "Settings exported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } - private void ImportButtonClick(object sender, EventArgs e) { + private void ImportSettingsButtonClick(object sender, EventArgs e) { String filename = GetOpenFilename(XML_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; @@ -94,14 +94,34 @@ private void SaveCurrentThemeButtonClick(object sender, EventArgs e) { return; } - var classifications = GetClassifications(); - classifications.Export(filename); + try { + var classifications = GetClassifications(); + classifications.Export(filename); - MessageBox.Show(this, "Theme saved successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show(this, "Theme saved successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + } catch ( Exception ex ) { + var telemetry = SettingsContext.GetService(); + telemetry.WriteException("Failed to save current theme", ex); + MessageBox.Show(this, "Could not save theme: " + ex.Message, "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } private void LoadThemeButtonClick(object sender, EventArgs e) { + String filename = GetOpenFilename(THEME_FILTER); + if ( String.IsNullOrEmpty(filename) ) { + return; + } + + try { + var classifications = GetClassifications(); + classifications.Import(filename); + MessageBox.Show(this, "Theme saved successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + } catch ( Exception ex ) { + var telemetry = SettingsContext.GetService(); + telemetry.WriteException("Failed to load theme", ex); + MessageBox.Show(this, "Could not load theme: " + ex.Message, "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Error); + } } } } From 4b1dc4e9853af60be005e39e9562d466d7b7214e Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Tue, 25 Jul 2017 21:45:28 -0500 Subject: [PATCH 13/20] Breaking Change: Renamed classifications to make it more uniform --- .../CodeClassificationDefinitions.cs | 2 +- src/Viasfora.Core/Constants.cs | 14 ++++++------- .../EditorFormats/CurrentColumnFormat.cs | 1 + .../EditorFormats/FlowControlFormat.cs | 6 +++--- .../EditorFormats/LinqKeywordFormat.cs | 2 +- .../StringEscapeSequenceFormat.cs | 2 +- .../EditorFormats/VisibilityKeywordFormat.cs | 2 +- src/Viasfora.Core/Text/KeywordTagger.cs | 2 +- .../Text/KeywordTaggerProvider.cs | 2 +- .../EditorFormats/RainbowFormats.cs | 20 +++++++++---------- src/Viasfora.Rainbow/Rainbows.cs | 4 ++-- src/Viasfora.Xml/XmlConstants.cs | 4 ++-- src/Viasfora/Options/GeneralOptionsPage.cs | 6 +++--- src/Viasfora/Options/MainOptionsControl.cs | 2 +- 14 files changed, 35 insertions(+), 34 deletions(-) diff --git a/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs b/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs index 453c112c..0aa3e78d 100644 --- a/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs +++ b/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs @@ -6,7 +6,7 @@ namespace Winterdom.Viasfora.Classifications { public static class CodeClassificationDefinitions { - [Export, Name(Constants.KEYWORD_CLASSIF_NAME)] + [Export, Name(Constants.FLOW_CONTROL_CLASSIF_NAME)] internal static ClassificationTypeDefinition FlowControlClassificationType = null; [Export, Name(Constants.LINQ_CLASSIF_NAME)] diff --git a/src/Viasfora.Core/Constants.cs b/src/Viasfora.Core/Constants.cs index e55405f4..e4230137 100644 --- a/src/Viasfora.Core/Constants.cs +++ b/src/Viasfora.Core/Constants.cs @@ -2,13 +2,13 @@ namespace Winterdom.Viasfora { public static class Constants { - public const String KEYWORD_CLASSIF_NAME = "Viasfora Flow Control Keyword"; - public const String LINQ_CLASSIF_NAME = "Viasfora Query Operator"; - public const String VISIBILITY_CLASSIF_NAME = "Viasfora Visibility Keyword"; - public const String STRING_ESCAPE_CLASSIF_NAME = "Viasfora String Escape Sequence"; - public const String FORMAT_SPECIFIER_NAME = "viasfora.format.specifier"; - public const String LINE_HIGHLIGHT = "Viasfora Current Line"; - public const String COLUMN_HIGHLIGHT = "Viasfora Current Column"; + public const String FLOW_CONTROL_CLASSIF_NAME = "viasfora.keyword.flowcontrol"; + public const String LINQ_CLASSIF_NAME = "viasfora.keyword.linq"; + public const String VISIBILITY_CLASSIF_NAME = "viasfora.keyword.visibility"; + public const String STRING_ESCAPE_CLASSIF_NAME = "viasfora.string.escape_sequence"; + public const String FORMAT_SPECIFIER_NAME = "viasfora.string.format.specifier"; + public const String LINE_HIGHLIGHT = "viasfora.line.current"; + public const String COLUMN_HIGHLIGHT = "viasfora.column.current"; public const String DEV_MARGIN = "viasfora.dev.margin"; public const String OBFUSCATED_TEXT = "viasfora.text.obfuscated"; diff --git a/src/Viasfora.Core/EditorFormats/CurrentColumnFormat.cs b/src/Viasfora.Core/EditorFormats/CurrentColumnFormat.cs index f28bdc6a..27702b75 100644 --- a/src/Viasfora.Core/EditorFormats/CurrentColumnFormat.cs +++ b/src/Viasfora.Core/EditorFormats/CurrentColumnFormat.cs @@ -12,6 +12,7 @@ namespace Winterdom.Viasfora.EditorFormats { [Order(Before = Priority.Default)] sealed class CurrentColumnFormat : ClassificationFormatDefinition { public CurrentColumnFormat() { + this.DisplayName = "Viasfora Current Column"; this.ForegroundColor = Colors.LightGray; this.ForegroundOpacity = 0.3; this.BackgroundOpacity = 0.3; diff --git a/src/Viasfora.Core/EditorFormats/FlowControlFormat.cs b/src/Viasfora.Core/EditorFormats/FlowControlFormat.cs index 6c88c2d8..1df424b3 100644 --- a/src/Viasfora.Core/EditorFormats/FlowControlFormat.cs +++ b/src/Viasfora.Core/EditorFormats/FlowControlFormat.cs @@ -6,13 +6,13 @@ namespace Winterdom.Viasfora.EditorFormats { [Export(typeof(EditorFormatDefinition))] - [ClassificationType(ClassificationTypeNames = Constants.KEYWORD_CLASSIF_NAME)] - [Name(Constants.KEYWORD_CLASSIF_NAME)] + [ClassificationType(ClassificationTypeNames = Constants.FLOW_CONTROL_CLASSIF_NAME)] + [Name(Constants.FLOW_CONTROL_CLASSIF_NAME)] [UserVisible(true)] [Order(After = Priority.High)] public sealed class FlowControlFormat : ClassificationFormatDefinition { public FlowControlFormat() { - this.DisplayName = Constants.KEYWORD_CLASSIF_NAME; + this.DisplayName = "Viasfora Flow Control Keyword"; this.ForegroundColor = Colors.OrangeRed; } } diff --git a/src/Viasfora.Core/EditorFormats/LinqKeywordFormat.cs b/src/Viasfora.Core/EditorFormats/LinqKeywordFormat.cs index 061fdf0b..7768f73b 100644 --- a/src/Viasfora.Core/EditorFormats/LinqKeywordFormat.cs +++ b/src/Viasfora.Core/EditorFormats/LinqKeywordFormat.cs @@ -12,7 +12,7 @@ namespace Winterdom.Viasfora.EditorFormats { [Order(After = Priority.High)] public sealed class LinqKeywordFormat : ClassificationFormatDefinition { public LinqKeywordFormat() { - this.DisplayName = Constants.LINQ_CLASSIF_NAME; + this.DisplayName = "Viasfora Query Operator"; this.ForegroundColor = Colors.MediumSeaGreen; } } diff --git a/src/Viasfora.Core/EditorFormats/StringEscapeSequenceFormat.cs b/src/Viasfora.Core/EditorFormats/StringEscapeSequenceFormat.cs index 487919ab..a92c0195 100644 --- a/src/Viasfora.Core/EditorFormats/StringEscapeSequenceFormat.cs +++ b/src/Viasfora.Core/EditorFormats/StringEscapeSequenceFormat.cs @@ -12,7 +12,7 @@ namespace Winterdom.Viasfora.EditorFormats { [Order(After = Priority.High)] public sealed class StringEscapeSequenceFormat : ClassificationFormatDefinition { public StringEscapeSequenceFormat() { - this.DisplayName = Constants.STRING_ESCAPE_CLASSIF_NAME; + this.DisplayName = "Viasfora String Escape Sequence"; this.ForegroundColor = Colors.Magenta; } } diff --git a/src/Viasfora.Core/EditorFormats/VisibilityKeywordFormat.cs b/src/Viasfora.Core/EditorFormats/VisibilityKeywordFormat.cs index 5183d7a4..222f4fbb 100644 --- a/src/Viasfora.Core/EditorFormats/VisibilityKeywordFormat.cs +++ b/src/Viasfora.Core/EditorFormats/VisibilityKeywordFormat.cs @@ -12,7 +12,7 @@ namespace Winterdom.Viasfora.EditorFormats { [Order(After = Priority.High)] public sealed class VisibilityKeywordFormat : ClassificationFormatDefinition { public VisibilityKeywordFormat() { - this.DisplayName = Constants.VISIBILITY_CLASSIF_NAME; + this.DisplayName = "Viasfora Visibility Keyword"; this.ForegroundColor = Colors.DimGray; } } diff --git a/src/Viasfora.Core/Text/KeywordTagger.cs b/src/Viasfora.Core/Text/KeywordTagger.cs index 7e4542f6..42c69ded 100644 --- a/src/Viasfora.Core/Text/KeywordTagger.cs +++ b/src/Viasfora.Core/Text/KeywordTagger.cs @@ -31,7 +31,7 @@ internal KeywordTagger(ITextBuffer buffer, KeywordTaggerProvider provider) { this.aggregator = provider.Aggregator.CreateTagAggregator(buffer); this.langFactory = provider.LanguageFactory; - keywordClassification = provider.GetTag(Constants.KEYWORD_CLASSIF_NAME); + keywordClassification = provider.GetTag(Constants.FLOW_CONTROL_CLASSIF_NAME); linqClassification = provider.GetTag(Constants.LINQ_CLASSIF_NAME); visClassification = provider.GetTag(Constants.VISIBILITY_CLASSIF_NAME); stringEscapeClassification = provider.GetTag(Constants.STRING_ESCAPE_CLASSIF_NAME); diff --git a/src/Viasfora.Core/Text/KeywordTaggerProvider.cs b/src/Viasfora.Core/Text/KeywordTaggerProvider.cs index 1bf80a38..a6b95fb6 100644 --- a/src/Viasfora.Core/Text/KeywordTaggerProvider.cs +++ b/src/Viasfora.Core/Text/KeywordTaggerProvider.cs @@ -31,7 +31,7 @@ public ITagger CreateTagger(ITextView textView, ITextBuffer buffer) where var italicsFixer = textView.Properties.GetOrCreateSingletonProperty( () => new ItalicsFormatter(textView, map, Settings) ); - italicsFixer.AddClassification(Constants.KEYWORD_CLASSIF_NAME); + italicsFixer.AddClassification(Constants.FLOW_CONTROL_CLASSIF_NAME); return new KeywordTagger(buffer, this) as ITagger; } diff --git a/src/Viasfora.Rainbow/EditorFormats/RainbowFormats.cs b/src/Viasfora.Rainbow/EditorFormats/RainbowFormats.cs index 66ebe040..bc6503b6 100644 --- a/src/Viasfora.Rainbow/EditorFormats/RainbowFormats.cs +++ b/src/Viasfora.Rainbow/EditorFormats/RainbowFormats.cs @@ -12,7 +12,7 @@ namespace Winterdom.Viasfora.Rainbow.EditorFormats { [Order(After = Priority.High)] public sealed class Rainbow1Format : ClassificationFormatDefinition { public Rainbow1Format() { - this.DisplayName = Rainbows.Rainbow1; + this.DisplayName = "Viasfora Rainbow Brace 1"; this.ForegroundColor = Color.FromArgb(0xff, 0xff, 0x99, 0x00); } } @@ -23,7 +23,7 @@ public Rainbow1Format() { [Order(After = Priority.High)] public sealed class Rainbow2Format : ClassificationFormatDefinition { public Rainbow2Format() { - this.DisplayName = Rainbows.Rainbow2; + this.DisplayName = "Viasfora Rainbow Brace 2"; this.ForegroundColor = Colors.DeepPink; //Colors.MediumVioletRed; } } @@ -34,7 +34,7 @@ public Rainbow2Format() { [Order(After = Priority.High)] public sealed class Rainbow3Format : ClassificationFormatDefinition { public Rainbow3Format() { - this.DisplayName = Rainbows.Rainbow3; + this.DisplayName = "Viasfora Rainbow Brace 3"; this.ForegroundColor = Colors.YellowGreen; //MediumSeaGreen; } } @@ -45,7 +45,7 @@ public Rainbow3Format() { [Order(After = Priority.High)] public sealed class Rainbow4Format : ClassificationFormatDefinition { public Rainbow4Format() { - this.DisplayName = Rainbows.Rainbow4; + this.DisplayName = "Viasfora Rainbow Brace 4"; this.ForegroundColor = Colors.DarkViolet; } } @@ -56,7 +56,7 @@ public Rainbow4Format() { [Order(After = Priority.High)] public sealed class Rainbow5Format : ClassificationFormatDefinition { public Rainbow5Format() { - this.DisplayName = Rainbows.Rainbow5; + this.DisplayName = "Viasfora Rainbow Brace 5"; this.ForegroundColor = Colors.DimGray; } } @@ -67,7 +67,7 @@ public Rainbow5Format() { [Order(After = Priority.High)] public sealed class Rainbow6Format : ClassificationFormatDefinition { public Rainbow6Format() { - this.DisplayName = Rainbows.Rainbow6; + this.DisplayName = "Viasfora Rainbow Brace 6"; this.ForegroundColor = Colors.RoyalBlue; } } @@ -78,7 +78,7 @@ public Rainbow6Format() { [Order(After = Priority.High)] public sealed class Rainbow7Format : ClassificationFormatDefinition { public Rainbow7Format() { - this.DisplayName = Rainbows.Rainbow7; + this.DisplayName = "Viasfora Rainbow Brace 7"; this.ForegroundColor = Colors.Crimson; } } @@ -89,7 +89,7 @@ public Rainbow7Format() { [Order(After = Priority.High)] public sealed class Rainbow8Format : ClassificationFormatDefinition { public Rainbow8Format() { - this.DisplayName = Rainbows.Rainbow8; + this.DisplayName = "Viasfora Rainbow Brace 8"; this.ForegroundColor = Colors.DarkTurquoise; } } @@ -100,7 +100,7 @@ public Rainbow8Format() { [Order(After = Priority.High)] public sealed class Rainbow9Format : ClassificationFormatDefinition { public Rainbow9Format() { - this.DisplayName = Rainbows.Rainbow9; + this.DisplayName = "Viasfora Rainbow Brace 9"; this.ForegroundColor = Colors.Green; } } @@ -125,7 +125,7 @@ public RainbowTipHighlightFormat() { [Order(After = Priority.High)] public sealed class RainbowErrorFormat : ClassificationFormatDefinition { public RainbowErrorFormat() { - this.DisplayName = Rainbows.RainbowError; + this.DisplayName = "Viasfora Rainbow Brace Error"; this.BackgroundColor = Colors.LightCoral; this.ForegroundCustomizable = false; } diff --git a/src/Viasfora.Rainbow/Rainbows.cs b/src/Viasfora.Rainbow/Rainbows.cs index d92ee6ba..04d51ba1 100644 --- a/src/Viasfora.Rainbow/Rainbows.cs +++ b/src/Viasfora.Rainbow/Rainbows.cs @@ -3,7 +3,7 @@ namespace Winterdom.Viasfora.Rainbow { public static class Rainbows { public const int MaxDepth = 9; - public const String Rainbow = "Viasfora Rainbow Brace "; + public const String Rainbow = "viasfora.rainbow."; public const String Rainbow1 = Rainbow + "1"; public const String Rainbow2 = Rainbow + "2"; public const String Rainbow3 = Rainbow + "3"; @@ -13,7 +13,7 @@ public static class Rainbows { public const String Rainbow7 = Rainbow + "7"; public const String Rainbow8 = Rainbow + "8"; public const String Rainbow9 = Rainbow + "9"; - public const String RainbowError = Rainbow + "Error"; + public const String RainbowError = Rainbow + "error"; public const String TipHilight = "viasfora.rainbow.tip.highlight"; } diff --git a/src/Viasfora.Xml/XmlConstants.cs b/src/Viasfora.Xml/XmlConstants.cs index 0130c88f..9d0f91c5 100644 --- a/src/Viasfora.Xml/XmlConstants.cs +++ b/src/Viasfora.Xml/XmlConstants.cs @@ -9,8 +9,8 @@ public static class XmlConstants { // VS213 HTML Editor public const String CT_HTMLX = "htmlx"; - public const String XML_CLOSING = "XMLCloseTag"; - public const String XML_PREFIX = "XMLPrefix"; + public const String XML_CLOSING = "viasfora.xml.closing"; + public const String XML_PREFIX = "viasfora.xml.prefix"; public const String XML_CLOSING_PREFIX = "viasfora.xml.closing.prefix"; public const String RAZOR_CLOSING = "viasfora.razor.closing.element"; // I'd prefer "XML Delimiter" here, but no way to diff --git a/src/Viasfora/Options/GeneralOptionsPage.cs b/src/Viasfora/Options/GeneralOptionsPage.cs index a70154b3..9d14e28f 100644 --- a/src/Viasfora/Options/GeneralOptionsPage.cs +++ b/src/Viasfora/Options/GeneralOptionsPage.cs @@ -50,7 +50,7 @@ public override void LoadSettingsFromStorage() { this.colors = new ClassificationList(new ColorStorage(this.Site)); colors.Load( Constants.COLUMN_HIGHLIGHT, - Constants.KEYWORD_CLASSIF_NAME, + Constants.FLOW_CONTROL_CLASSIF_NAME, Constants.LINQ_CLASSIF_NAME, Constants.VISIBILITY_CLASSIF_NAME, Constants.STRING_ESCAPE_CLASSIF_NAME, @@ -101,8 +101,8 @@ public override void LoadSettingsFromStorage() { [Description("Foreground color used to highlight flow control keywords")] [Category("Text Editor")] public Color FlowControlForegroundColor { - get { return colors.Get(Constants.KEYWORD_CLASSIF_NAME, true); } - set { colors.Set(Constants.KEYWORD_CLASSIF_NAME, true, value); } + get { return colors.Get(Constants.FLOW_CONTROL_CLASSIF_NAME, true); } + set { colors.Set(Constants.FLOW_CONTROL_CLASSIF_NAME, true, value); } } [LocDisplayName("Query Keywords")] [Description("Foreground color used to highlight LINQ/Query keywords")] diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs index 1f3a0db6..92d1f658 100644 --- a/src/Viasfora/Options/MainOptionsControl.cs +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -116,7 +116,7 @@ private void LoadThemeButtonClick(object sender, EventArgs e) { var classifications = GetClassifications(); classifications.Import(filename); - MessageBox.Show(this, "Theme saved successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + MessageBox.Show(this, "Theme imported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch ( Exception ex ) { var telemetry = SettingsContext.GetService(); telemetry.WriteException("Failed to load theme", ex); From 26a7d68a5c3fae2afa6bdf2d9f5a6e8b32ed668d Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Wed, 26 Jul 2017 19:46:47 -0500 Subject: [PATCH 14/20] Add support for Automatic color in themes (Issue #207) --- src/Viasfora/Options/ClassificationList.cs | 24 ++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Viasfora/Options/ClassificationList.cs b/src/Viasfora/Options/ClassificationList.cs index 40ea12fb..5b5f4173 100644 --- a/src/Viasfora/Options/ClassificationList.cs +++ b/src/Viasfora/Options/ClassificationList.cs @@ -12,6 +12,7 @@ namespace Winterdom.Viasfora.Options { public class ClassificationList { private ColorStorage storage; private IDictionary classifications; + private const String AUTOMATIC_COLOR = "Automatic"; public ClassificationList(ColorStorage colorStorage) { storage = colorStorage; @@ -78,10 +79,8 @@ public void Export(String filepath) { var entry = this.classifications[key]; var item = new JObject(); - item["foreground"] = ColorTranslator.ToHtml(entry.Foreground); - if ( entry.Background != Color.Transparent ) { - item["background"] = ColorTranslator.ToHtml(entry.Background); - } + item["foreground"] = ColorToHtml(entry.Foreground); + item["background"] = ColorToHtml(entry.Background); item["style"] = JToken.FromObject(entry.Style); list[key] = item; } @@ -106,15 +105,28 @@ public void Import(String filepath) { this.Save(); } + private static String ColorToHtml(Color color) { + return color == Color.Transparent + ? AUTOMATIC_COLOR + : ColorTranslator.ToHtml(color); + } + + private static Color ColorFromHtml(String text) { + if ( text.Equals(AUTOMATIC_COLOR, StringComparison.InvariantCultureIgnoreCase) ) { + return Color.Transparent; + } + return ColorTranslator.FromHtml(text); + } + private static void JsonToClassification(JProperty item, ClassificationColors classification) { JObject value = item.Value as JObject; var foreground = value["foreground"]; if ( foreground != null ) { - classification.Foreground = ColorTranslator.FromHtml(foreground.Value()); + classification.Foreground = ColorFromHtml(foreground.Value()); } var background = value["background"]; if ( background != null ) { - classification.Background = ColorTranslator.FromHtml(background.Value()); + classification.Background = ColorFromHtml(background.Value()); } var style = value["style"]; if ( style != null ) { From aa8500b33163c5abcb8b8d3d4c3f285446e00864 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Thu, 27 Jul 2017 19:05:29 -0500 Subject: [PATCH 15/20] Adding more telemetry and error handling for settings/theme handling --- src/Viasfora/Options/MainOptionsControl.cs | 105 ++++++++++++--------- 1 file changed, 60 insertions(+), 45 deletions(-) diff --git a/src/Viasfora/Options/MainOptionsControl.cs b/src/Viasfora/Options/MainOptionsControl.cs index 92d1f658..2f23a97b 100644 --- a/src/Viasfora/Options/MainOptionsControl.cs +++ b/src/Viasfora/Options/MainOptionsControl.cs @@ -9,67 +9,57 @@ namespace Winterdom.Viasfora.Options { public partial class MainOptionsControl : UserControl { - const String XML_FILTER = "XML Files (*.xml)|*.xml"; - const String THEME_FILTER = "Viasfora Theme Files (*.vsftheme)|*.vsftheme"; + private const String XML_FILTER = "XML Files (*.xml)|*.xml"; + private const String THEME_FILTER = "Viasfora Theme Files (*.vsftheme)|*.vsftheme"; + private IVsfTelemetry telemetry; public MainOptionsControl() { InitializeComponent(); + this.telemetry = SettingsContext.GetService(); } private void ExportSettingsButtonClick(object sender, EventArgs e) { + this.telemetry.WriteEvent("ExportSettings"); String filename = GetSaveAsFilename(XML_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; } - var exporter = SettingsContext.GetService(); - exporter.Export(SettingsContext.GetSettings()); - exporter.Export(SettingsContext.GetService()); - exporter.Export(SettingsContext.GetService()); - - var languageFactory = SettingsContext.GetService(); - foreach ( var lang in languageFactory.GetAllLanguages() ) { - exporter.Export(lang.Settings); + try { + var exporter = SettingsContext.GetService(); + exporter.Export(SettingsContext.GetSettings()); + exporter.Export(SettingsContext.GetService()); + exporter.Export(SettingsContext.GetService()); + + var languageFactory = SettingsContext.GetService(); + foreach ( var lang in languageFactory.GetAllLanguages() ) { + exporter.Export(lang.Settings); + } + exporter.Save(filename); + MessageBox.Show(this, "Settings exported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + } catch ( Exception ex ) { + this.telemetry.WriteException("Failed to export settings", ex); + MessageBox.Show(this, "Could not export settings: " + ex.Message, "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Error); } - exporter.Save(filename); - MessageBox.Show(this, "Settings exported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void ImportSettingsButtonClick(object sender, EventArgs e) { + this.telemetry.WriteEvent("ImportSettings"); String filename = GetOpenFilename(XML_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; } - var exporter = SettingsContext.GetService(); - exporter.Load(filename); - var store = SettingsContext.GetService(); - exporter.Import(store); - store.Save(); - - MessageBox.Show(this, "Settings imported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); - } + try { + var exporter = SettingsContext.GetService(); + exporter.Load(filename); + var store = SettingsContext.GetService(); + exporter.Import(store); + store.Save(); - private String GetSaveAsFilename(String filter) { - using ( var dialog = new SaveFileDialog() ) { - dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); - dialog.Filter = filter; - var result = dialog.ShowDialog(this); - if ( result == DialogResult.OK ) { - return dialog.FileName; - } - return null; - } - } - private String GetOpenFilename(String filter) { - using ( var dialog = new OpenFileDialog() ) { - dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); - dialog.CheckFileExists = true; - dialog.Filter = filter; - var result = dialog.ShowDialog(this); - if ( result == DialogResult.OK ) { - return dialog.FileName; - } - return null; + MessageBox.Show(this, "Settings imported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); + } catch ( Exception ex ) { + this.telemetry.WriteException("Failed to import settings", ex); + MessageBox.Show(this, "Could not import settings: " + ex.Message, "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Error); } } @@ -89,6 +79,7 @@ private ClassificationList GetClassifications() { } private void SaveCurrentThemeButtonClick(object sender, EventArgs e) { + this.telemetry.WriteEvent("ExportTheme"); String filename = GetSaveAsFilename(THEME_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; @@ -100,13 +91,13 @@ private void SaveCurrentThemeButtonClick(object sender, EventArgs e) { MessageBox.Show(this, "Theme saved successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch ( Exception ex ) { - var telemetry = SettingsContext.GetService(); - telemetry.WriteException("Failed to save current theme", ex); + this.telemetry.WriteException("Failed to save current theme", ex); MessageBox.Show(this, "Could not save theme: " + ex.Message, "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void LoadThemeButtonClick(object sender, EventArgs e) { + this.telemetry.WriteEvent("ImportTheme"); String filename = GetOpenFilename(THEME_FILTER); if ( String.IsNullOrEmpty(filename) ) { return; @@ -118,10 +109,34 @@ private void LoadThemeButtonClick(object sender, EventArgs e) { MessageBox.Show(this, "Theme imported successfully.", "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch ( Exception ex ) { - var telemetry = SettingsContext.GetService(); - telemetry.WriteException("Failed to load theme", ex); + this.telemetry.WriteException("Failed to load theme", ex); MessageBox.Show(this, "Could not load theme: " + ex.Message, "Viasfora", MessageBoxButtons.OK, MessageBoxIcon.Error); } } + + private String GetSaveAsFilename(String filter) { + using ( var dialog = new SaveFileDialog() ) { + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + dialog.Filter = filter; + var result = dialog.ShowDialog(this); + if ( result == DialogResult.OK ) { + return dialog.FileName; + } + return null; + } + } + + private String GetOpenFilename(String filter) { + using ( var dialog = new OpenFileDialog() ) { + dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); + dialog.CheckFileExists = true; + dialog.Filter = filter; + var result = dialog.ShowDialog(this); + if ( result == DialogResult.OK ) { + return dialog.FileName; + } + return null; + } + } } } From 4983931cf203d6e61abfc56ade18721899e5446d Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 6 Aug 2017 19:25:49 -0500 Subject: [PATCH 16/20] Improving look of export/import settings --- .../Options/MainOptionsControl.Designer.cs | 122 ++++++------------ 1 file changed, 37 insertions(+), 85 deletions(-) diff --git a/src/Viasfora/Options/MainOptionsControl.Designer.cs b/src/Viasfora/Options/MainOptionsControl.Designer.cs index 143b7081..8a28fb61 100644 --- a/src/Viasfora/Options/MainOptionsControl.Designer.cs +++ b/src/Viasfora/Options/MainOptionsControl.Designer.cs @@ -24,112 +24,47 @@ protected override void Dispose(bool disposing) { /// private void InitializeComponent() { this.groupBox1 = new System.Windows.Forms.GroupBox(); - this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel(); - this.importButton = new System.Windows.Forms.Button(); - this.exportButton = new System.Windows.Forms.Button(); this.groupBox2 = new System.Windows.Forms.GroupBox(); - this.tableLayoutPanel2 = new System.Windows.Forms.TableLayoutPanel(); this.loadThemeButton = new System.Windows.Forms.Button(); this.saveCurrentThemeButton = new System.Windows.Forms.Button(); + this.exportButton = new System.Windows.Forms.Button(); + this.importButton = new System.Windows.Forms.Button(); this.groupBox1.SuspendLayout(); - this.tableLayoutPanel1.SuspendLayout(); this.groupBox2.SuspendLayout(); - this.tableLayoutPanel2.SuspendLayout(); this.SuspendLayout(); // // groupBox1 // this.groupBox1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox1.Controls.Add(this.tableLayoutPanel1); + this.groupBox1.Controls.Add(this.importButton); + this.groupBox1.Controls.Add(this.exportButton); this.groupBox1.Location = new System.Drawing.Point(4, 4); this.groupBox1.Name = "groupBox1"; - this.groupBox1.Size = new System.Drawing.Size(766, 203); + this.groupBox1.Size = new System.Drawing.Size(766, 178); this.groupBox1.TabIndex = 0; this.groupBox1.TabStop = false; this.groupBox1.Text = "Export / Import"; // - // tableLayoutPanel1 - // - this.tableLayoutPanel1.ColumnCount = 4; - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); - this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel1.Controls.Add(this.importButton, 2, 1); - this.tableLayoutPanel1.Controls.Add(this.exportButton, 1, 1); - this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel1.Location = new System.Drawing.Point(3, 27); - this.tableLayoutPanel1.Name = "tableLayoutPanel1"; - this.tableLayoutPanel1.RowCount = 3; - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 52F)); - this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel1.Size = new System.Drawing.Size(760, 173); - this.tableLayoutPanel1.TabIndex = 1; - // - // importButton - // - this.importButton.Dock = System.Windows.Forms.DockStyle.Fill; - this.importButton.Location = new System.Drawing.Point(385, 25); - this.importButton.Margin = new System.Windows.Forms.Padding(5); - this.importButton.Name = "importButton"; - this.importButton.Size = new System.Drawing.Size(220, 42); - this.importButton.TabIndex = 1; - this.importButton.Text = "Import Settings"; - this.importButton.UseVisualStyleBackColor = true; - this.importButton.Click += new System.EventHandler(this.ImportSettingsButtonClick); - // - // exportButton - // - this.exportButton.Dock = System.Windows.Forms.DockStyle.Fill; - this.exportButton.Location = new System.Drawing.Point(155, 25); - this.exportButton.Margin = new System.Windows.Forms.Padding(5); - this.exportButton.Name = "exportButton"; - this.exportButton.Size = new System.Drawing.Size(220, 42); - this.exportButton.TabIndex = 0; - this.exportButton.Text = "Export Settings"; - this.exportButton.UseVisualStyleBackColor = true; - this.exportButton.Click += new System.EventHandler(this.ExportSettingsButtonClick); - // // groupBox2 // this.groupBox2.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); - this.groupBox2.Controls.Add(this.tableLayoutPanel2); - this.groupBox2.Location = new System.Drawing.Point(7, 233); + this.groupBox2.Controls.Add(this.loadThemeButton); + this.groupBox2.Controls.Add(this.saveCurrentThemeButton); + this.groupBox2.Location = new System.Drawing.Point(7, 210); this.groupBox2.Name = "groupBox2"; this.groupBox2.Size = new System.Drawing.Size(763, 178); this.groupBox2.TabIndex = 1; this.groupBox2.TabStop = false; this.groupBox2.Text = "Themes"; // - // tableLayoutPanel2 - // - this.tableLayoutPanel2.ColumnCount = 4; - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 230F)); - this.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F)); - this.tableLayoutPanel2.Controls.Add(this.loadThemeButton, 2, 1); - this.tableLayoutPanel2.Controls.Add(this.saveCurrentThemeButton, 1, 1); - this.tableLayoutPanel2.Dock = System.Windows.Forms.DockStyle.Fill; - this.tableLayoutPanel2.Location = new System.Drawing.Point(3, 27); - this.tableLayoutPanel2.Name = "tableLayoutPanel2"; - this.tableLayoutPanel2.RowCount = 3; - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 20F)); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Absolute, 52F)); - this.tableLayoutPanel2.RowStyles.Add(new System.Windows.Forms.RowStyle()); - this.tableLayoutPanel2.Size = new System.Drawing.Size(757, 148); - this.tableLayoutPanel2.TabIndex = 2; - // // loadThemeButton // - this.loadThemeButton.Dock = System.Windows.Forms.DockStyle.Fill; - this.loadThemeButton.Location = new System.Drawing.Point(383, 25); + this.loadThemeButton.Location = new System.Drawing.Point(24, 90); this.loadThemeButton.Margin = new System.Windows.Forms.Padding(5); this.loadThemeButton.Name = "loadThemeButton"; - this.loadThemeButton.Size = new System.Drawing.Size(220, 42); + this.loadThemeButton.Size = new System.Drawing.Size(220, 48); this.loadThemeButton.TabIndex = 1; this.loadThemeButton.Text = "Load Theme"; this.loadThemeButton.UseVisualStyleBackColor = true; @@ -137,16 +72,37 @@ private void InitializeComponent() { // // saveCurrentThemeButton // - this.saveCurrentThemeButton.Dock = System.Windows.Forms.DockStyle.Fill; - this.saveCurrentThemeButton.Location = new System.Drawing.Point(153, 25); + this.saveCurrentThemeButton.Location = new System.Drawing.Point(24, 32); this.saveCurrentThemeButton.Margin = new System.Windows.Forms.Padding(5); this.saveCurrentThemeButton.Name = "saveCurrentThemeButton"; - this.saveCurrentThemeButton.Size = new System.Drawing.Size(220, 42); + this.saveCurrentThemeButton.Size = new System.Drawing.Size(220, 48); this.saveCurrentThemeButton.TabIndex = 0; this.saveCurrentThemeButton.Text = "Save Theme"; this.saveCurrentThemeButton.UseVisualStyleBackColor = true; this.saveCurrentThemeButton.Click += new System.EventHandler(this.SaveCurrentThemeButtonClick); // + // exportButton + // + this.exportButton.Location = new System.Drawing.Point(27, 32); + this.exportButton.Margin = new System.Windows.Forms.Padding(5); + this.exportButton.Name = "exportButton"; + this.exportButton.Size = new System.Drawing.Size(194, 48); + this.exportButton.TabIndex = 2; + this.exportButton.Text = "Export Settings"; + this.exportButton.UseVisualStyleBackColor = true; + this.exportButton.Click += new System.EventHandler(this.ExportSettingsButtonClick); + // + // importButton + // + this.importButton.Location = new System.Drawing.Point(27, 90); + this.importButton.Margin = new System.Windows.Forms.Padding(5); + this.importButton.Name = "importButton"; + this.importButton.Size = new System.Drawing.Size(194, 48); + this.importButton.TabIndex = 3; + this.importButton.Text = "Import Settings"; + this.importButton.UseVisualStyleBackColor = true; + this.importButton.Click += new System.EventHandler(this.ImportSettingsButtonClick); + // // MainOptionsControl // this.AutoScaleDimensions = new System.Drawing.SizeF(12F, 25F); @@ -154,11 +110,9 @@ private void InitializeComponent() { this.Controls.Add(this.groupBox2); this.Controls.Add(this.groupBox1); this.Name = "MainOptionsControl"; - this.Size = new System.Drawing.Size(780, 618); + this.Size = new System.Drawing.Size(780, 470); this.groupBox1.ResumeLayout(false); - this.tableLayoutPanel1.ResumeLayout(false); this.groupBox2.ResumeLayout(false); - this.tableLayoutPanel2.ResumeLayout(false); this.ResumeLayout(false); } @@ -166,12 +120,10 @@ private void InitializeComponent() { #endregion private System.Windows.Forms.GroupBox groupBox1; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1; - private System.Windows.Forms.Button importButton; - private System.Windows.Forms.Button exportButton; private System.Windows.Forms.GroupBox groupBox2; - private System.Windows.Forms.TableLayoutPanel tableLayoutPanel2; private System.Windows.Forms.Button loadThemeButton; private System.Windows.Forms.Button saveCurrentThemeButton; + private System.Windows.Forms.Button importButton; + private System.Windows.Forms.Button exportButton; } } From 2e01dad581785e56f01fdcf6345a0b350d16a98e Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 6 Aug 2017 19:29:38 -0500 Subject: [PATCH 17/20] Updating version to 3.6 --- src/Viasfora/source.extension.vsixmanifest | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Viasfora/source.extension.vsixmanifest b/src/Viasfora/source.extension.vsixmanifest index 8383142c..896a50e6 100644 --- a/src/Viasfora/source.extension.vsixmanifest +++ b/src/Viasfora/source.extension.vsixmanifest @@ -4,7 +4,7 @@ xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011"> Viasfora From f09e563921b7ab57bdeb10fc8b88b9b3065a4af5 Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 6 Aug 2017 19:42:40 -0500 Subject: [PATCH 18/20] Revert "Remove current line adornment (Closes #187)" This reverts commit c841f1166b9866cbf20abcdd231e032571803b6e. --- src/Viasfora.Core/IVsfSettings.cs | 1 + src/Viasfora.Core/Settings/VsfSettings.cs | 4 + .../Text/CurrentLineAdornment.cs | 153 ++++++++++++++++++ .../Text/CurrentLineAdornmentFactory.cs | 38 +++++ src/Viasfora.Core/Viasfora.Core.csproj | 2 + src/Viasfora/Options/GeneralOptionsPage.cs | 30 +++- 6 files changed, 223 insertions(+), 5 deletions(-) create mode 100644 src/Viasfora.Core/Text/CurrentLineAdornment.cs create mode 100644 src/Viasfora.Core/Text/CurrentLineAdornmentFactory.cs diff --git a/src/Viasfora.Core/IVsfSettings.cs b/src/Viasfora.Core/IVsfSettings.cs index 40c8870c..f2d96ba6 100644 --- a/src/Viasfora.Core/IVsfSettings.cs +++ b/src/Viasfora.Core/IVsfSettings.cs @@ -7,6 +7,7 @@ public interface IVsfSettings : IUpdatableSettings { bool FlowControlUseItalics { get; set; } bool EscapeSequencesEnabled { get; set; } + bool CurrentLineHighlightEnabled { get; set; } bool CurrentColumnHighlightEnabled { get; set; } ColumnStyle CurrentColumnHighlightStyle { get; set; } double HighlightLineWidth { get; set; } diff --git a/src/Viasfora.Core/Settings/VsfSettings.cs b/src/Viasfora.Core/Settings/VsfSettings.cs index 7ba1fd47..5aefb84f 100644 --- a/src/Viasfora.Core/Settings/VsfSettings.cs +++ b/src/Viasfora.Core/Settings/VsfSettings.cs @@ -19,6 +19,10 @@ public bool EscapeSequencesEnabled { get { return this.Store.GetBoolean(nameof(EscapeSequencesEnabled), true); } set { this.Store.SetValue(nameof(EscapeSequencesEnabled), value); } } + public bool CurrentLineHighlightEnabled { + get { return GetBoolean(nameof(CurrentLineHighlightEnabled), false); } + set { SetValue(nameof(CurrentLineHighlightEnabled), value); } + } public bool CurrentColumnHighlightEnabled { get { return this.Store.GetBoolean(nameof(CurrentColumnHighlightEnabled), false); } set { this.Store.SetValue(nameof(CurrentColumnHighlightEnabled), value); } diff --git a/src/Viasfora.Core/Text/CurrentLineAdornment.cs b/src/Viasfora.Core/Text/CurrentLineAdornment.cs new file mode 100644 index 00000000..b5e6e6a4 --- /dev/null +++ b/src/Viasfora.Core/Text/CurrentLineAdornment.cs @@ -0,0 +1,153 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Shapes; +using Microsoft.VisualStudio.Text; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Text.Editor; +using Microsoft.VisualStudio.Text.Formatting; + +namespace Winterdom.Viasfora.Text { + public class CurrentLineAdornment { + public const String CUR_LINE_TAG = "currentLine"; + private IAdornmentLayer layer; + private IWpfTextView view; + private IClassificationFormatMap formatMap; + private IClassificationType formatType; + private IVsfSettings settings; + private Rectangle lineRect; + + public CurrentLineAdornment( + IWpfTextView view, IClassificationFormatMap formatMap, + IClassificationType formatType, IVsfSettings settings) { + this.view = view; + this.formatMap = formatMap; + this.formatType = formatType; + this.settings = settings; + this.layer = view.GetAdornmentLayer(Constants.LINE_HIGHLIGHT); + this.lineRect = new Rectangle(); + + view.Caret.PositionChanged += OnCaretPositionChanged; + view.ViewportWidthChanged += OnViewportWidthChanged; + view.LayoutChanged += OnLayoutChanged; + view.ViewportLeftChanged += OnViewportLeftChanged; + view.Closed += OnViewClosed; + view.Options.OptionChanged += OnSettingsChanged; + + this.settings.SettingsChanged += OnSettingsChanged; + formatMap.ClassificationFormatMappingChanged += + OnClassificationFormatMappingChanged; + + CreateDrawingObjects(); + } + + void OnViewClosed(object sender, EventArgs e) { + if ( this.settings != null ) { + this.settings.SettingsChanged -= OnSettingsChanged; + this.settings = null; + } + if ( this.view != null ) { + view.Options.OptionChanged -= OnSettingsChanged; + view.Caret.PositionChanged -= OnCaretPositionChanged; + view.ViewportWidthChanged -= OnViewportWidthChanged; + view.LayoutChanged -= OnLayoutChanged; + view.ViewportLeftChanged -= OnViewportLeftChanged; + view.Closed -= OnViewClosed; + view = null; + } + if ( formatMap != null ) { + formatMap.ClassificationFormatMappingChanged -= OnClassificationFormatMappingChanged; + formatMap = null; + } + layer = null; + formatType = null; + } + void OnSettingsChanged(object sender, EventArgs e) { + CreateDrawingObjects(); + RedrawAdornments(); + } + void OnViewportLeftChanged(object sender, EventArgs e) { + RedrawAdornments(); + } + void OnViewportWidthChanged(object sender, EventArgs e) { + RedrawAdornments(); + } + void OnClassificationFormatMappingChanged(object sender, EventArgs e) { + CreateDrawingObjects(); + } + void OnCaretPositionChanged(object sender, CaretPositionChangedEventArgs e) { + ITextViewLine newLine = GetLineByPos(e.NewPosition); + ITextViewLine oldLine = GetLineByPos(e.OldPosition); + if ( newLine != oldLine ) { + layer.RemoveAdornmentsByTag(CUR_LINE_TAG); + this.CreateVisuals(newLine); + } + } + void OnLayoutChanged(object sender, TextViewLayoutChangedEventArgs e) { + SnapshotPoint caret = view.Caret.Position.BufferPosition; + foreach ( var line in e.NewOrReformattedLines ) { + if ( line.ContainsBufferPosition(caret) ) { + this.CreateVisuals(line); + break; + } + } + } + + private void CreateDrawingObjects() { + // this gets the color settings configured by the + // user in Fonts and Colors (or the default in out + // classification type). + TextFormattingRunProperties format = + formatMap.GetTextProperties(formatType); + + this.lineRect.Fill = format.BackgroundBrush; + this.lineRect.Stroke = format.ForegroundBrush; + this.lineRect.StrokeThickness = settings.HighlightLineWidth; + } + private void RedrawAdornments() { + if ( view.TextViewLines != null ) { + layer.RemoveAllAdornments(); + var caret = view.Caret.Position; + ITextViewLine line = GetLineByPos(caret); + this.CreateVisuals(line); + } + } + private ITextViewLine GetLineByPos(CaretPosition pos) { + SnapshotPoint point = pos.BufferPosition; + if ( point.Snapshot != view.TextSnapshot ) { + point = point.TranslateTo(view.TextSnapshot, PointTrackingMode.Positive); + } + return view.GetTextViewLineContainingBufferPosition(point); + } + private bool IsEnabled() { + return settings.CurrentLineHighlightEnabled + && !view.Options.GetOptionValue(ViewOptions.HighlightCurrentLineOption); + } + private void CreateVisuals(ITextViewLine line) { + if ( !IsEnabled() ) { + return; // not enabled + } + IWpfTextViewLineCollection textViewLines = view.TextViewLines; + if ( textViewLines == null ) + return; // not ready yet. + SnapshotSpan span = line.Extent; + Rect rc = new Rect( + new Point(view.ViewportLeft, line.TextTop), + new Point(Math.Max(view.ViewportRight - 2, line.TextRight), line.TextBottom) + ); + + lineRect.Width = rc.Width; + lineRect.Height = rc.Height; + + //Align the image with the top of the bounds of the text geometry + Canvas.SetLeft(lineRect, rc.Left); + Canvas.SetTop(lineRect, rc.Top); + + layer.AddAdornment( + AdornmentPositioningBehavior.TextRelative, span, + CUR_LINE_TAG, lineRect, null + ); + } + } + +} diff --git a/src/Viasfora.Core/Text/CurrentLineAdornmentFactory.cs b/src/Viasfora.Core/Text/CurrentLineAdornmentFactory.cs new file mode 100644 index 00000000..faf191f3 --- /dev/null +++ b/src/Viasfora.Core/Text/CurrentLineAdornmentFactory.cs @@ -0,0 +1,38 @@ +using System; +using System.ComponentModel.Composition; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Text.Editor; +using Microsoft.VisualStudio.Utilities; + +namespace Winterdom.Viasfora.Text { + + [Export(typeof(IWpfTextViewCreationListener))] + [ContentType(ContentTypes.Text)] + [TextViewRole(PredefinedTextViewRoles.Editable)] + internal sealed class CurrentLineAdornmentFactory : IWpfTextViewCreationListener { + [Import] + public IClassificationTypeRegistryService ClassificationRegistry = null; + [Import] + public IClassificationFormatMapService FormatMapService = null; + [Import] + public IVsfSettings Settings = null; + + [Export(typeof(AdornmentLayerDefinition))] + [Name(Constants.LINE_HIGHLIGHT)] + [Order(Before = PredefinedAdornmentLayers.Selection)] + [TextViewRole(PredefinedTextViewRoles.Document)] + public AdornmentLayerDefinition editorAdornmentLayer = null; + + public void TextViewCreated(IWpfTextView textView) { + IClassificationType classification = + ClassificationRegistry.GetClassificationType(Constants.LINE_HIGHLIGHT); + IClassificationFormatMap map = + //FormatMapService.GetClassificationFormatMap(FontsAndColorsCategories.TextEditorCategory); + FormatMapService.GetClassificationFormatMap(textView); + textView.Properties.GetOrCreateSingletonProperty( + () => { + return new CurrentLineAdornment(textView, map, classification, Settings); + }); + } + } +} diff --git a/src/Viasfora.Core/Viasfora.Core.csproj b/src/Viasfora.Core/Viasfora.Core.csproj index 9e88856a..149453e3 100644 --- a/src/Viasfora.Core/Viasfora.Core.csproj +++ b/src/Viasfora.Core/Viasfora.Core.csproj @@ -237,6 +237,8 @@ + + diff --git a/src/Viasfora/Options/GeneralOptionsPage.cs b/src/Viasfora/Options/GeneralOptionsPage.cs index 9d14e28f..18d82f54 100644 --- a/src/Viasfora/Options/GeneralOptionsPage.cs +++ b/src/Viasfora/Options/GeneralOptionsPage.cs @@ -15,6 +15,7 @@ public override void SaveSettingsToStorage() { var settings = SettingsContext.GetSettings(); var rainbowSettings = SettingsContext.GetService(); + settings.CurrentLineHighlightEnabled = CurrentLineHighlightEnabled; settings.CurrentColumnHighlightEnabled = CurrentColumnHighlightEnabled; settings.CurrentColumnHighlightStyle = CurrentColumnHighlightStyle; settings.HighlightLineWidth = HighlightLineWidth; @@ -34,6 +35,7 @@ public override void SaveSettingsToStorage() { public override void LoadSettingsFromStorage() { var settings = SettingsContext.GetSettings(); + CurrentLineHighlightEnabled = settings.CurrentLineHighlightEnabled; CurrentColumnHighlightEnabled = settings.CurrentColumnHighlightEnabled; CurrentColumnHighlightStyle = settings.CurrentColumnHighlightStyle; highlightLineWidth = settings.HighlightLineWidth; @@ -133,8 +135,6 @@ public Color StringFormatSpecsColor { set { colors.Set(Constants.FORMAT_SPECIFIER_NAME, true, value); } } - - // current column highlight private double highlightLineWidth; [LocDisplayName("Highlight Line Width")] [Description("Defines the thickness of the current line/column highlight")] @@ -149,6 +149,29 @@ public double HighlightLineWidth { } } + // current line highlight + [LocDisplayName("Line Highlight")] + [Description("Enables highlighting the current line in the text editor")] + [Category("Location Tracking")] + public bool CurrentLineHighlightEnabled { get; set; } + + [LocDisplayName("Line Highlight Foreground")] + [Description("Foreground color used to highlight the current line")] + [Category("Location Tracking")] + public Color LineHighlightForeground { + get { return colors.Get(Constants.LINE_HIGHLIGHT, true); } + set { colors.Set(Constants.LINE_HIGHLIGHT, true, value); } + } + + [LocDisplayName("Line Highlight Background")] + [Description("Background color used to highlight the current line")] + [Category("Location Tracking")] + public Color LineHighlightBackground { + get { return colors.Get(Constants.LINE_HIGHLIGHT, false); } + set { colors.Set(Constants.LINE_HIGHLIGHT, false, value); } + } + + // current column highlight [LocDisplayName("Column Highlight")] [Description("Enables highlighting the current column in the text editor")] [Category("Location Tracking")] @@ -175,9 +198,6 @@ public Color ColumnHighlightBackground { set { colors.Set(Constants.COLUMN_HIGHLIGHT, false, value); } } - - - // Modelines Configuration [LocDisplayName("Enable Modelines Support")] [Description("Enables the use of Vim-style modelines to configure the text editor")] From 5ad7c57de0941d76775e9e743aff30e35b09942e Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 6 Aug 2017 19:43:02 -0500 Subject: [PATCH 19/20] Revert "Remove editor classifications for current line highlight" This reverts commit 5b0c0d046bcf5e20cfbc4caff0ae58237c4c6184. --- .../CodeClassificationDefinitions.cs | 3 +++ .../EditorFormats/CurrentLineFormat.cs | 20 +++++++++++++++++++ src/Viasfora.Core/Viasfora.Core.csproj | 1 + 3 files changed, 24 insertions(+) create mode 100644 src/Viasfora.Core/EditorFormats/CurrentLineFormat.cs diff --git a/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs b/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs index 0aa3e78d..9cd295cc 100644 --- a/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs +++ b/src/Viasfora.Core/Classifications/CodeClassificationDefinitions.cs @@ -21,6 +21,9 @@ public static class CodeClassificationDefinitions { [Export, Name(Constants.VISIBILITY_CLASSIF_NAME)] internal static ClassificationTypeDefinition VisibilityKeywordClassificationType = null; + [Export, Name(Constants.LINE_HIGHLIGHT)] + internal static ClassificationTypeDefinition CurrentLineClassificationType = null; + [Export, Name(Constants.COLUMN_HIGHLIGHT)] internal static ClassificationTypeDefinition CurrentColumnClassificationType = null; diff --git a/src/Viasfora.Core/EditorFormats/CurrentLineFormat.cs b/src/Viasfora.Core/EditorFormats/CurrentLineFormat.cs new file mode 100644 index 00000000..145e2823 --- /dev/null +++ b/src/Viasfora.Core/EditorFormats/CurrentLineFormat.cs @@ -0,0 +1,20 @@ +using System; +using System.ComponentModel.Composition; +using System.Windows.Media; +using Microsoft.VisualStudio.Text.Classification; +using Microsoft.VisualStudio.Utilities; + +namespace Winterdom.Viasfora.EditorFormats { + [Export(typeof(EditorFormatDefinition))] + [ClassificationType(ClassificationTypeNames = Constants.LINE_HIGHLIGHT)] + [Name(Constants.LINE_HIGHLIGHT)] + [UserVisible(true)] + [Order(Before = Priority.Default)] + sealed class CurrentLineFormat : ClassificationFormatDefinition { + public CurrentLineFormat() { + this.ForegroundColor = Colors.LightGray; + this.ForegroundOpacity = 0.3; + this.BackgroundOpacity = 0.3; + } + } +} diff --git a/src/Viasfora.Core/Viasfora.Core.csproj b/src/Viasfora.Core/Viasfora.Core.csproj index 149453e3..ced9e877 100644 --- a/src/Viasfora.Core/Viasfora.Core.csproj +++ b/src/Viasfora.Core/Viasfora.Core.csproj @@ -170,6 +170,7 @@ ZoomTrackBar.cs + From 46a2a03403603b9e2c0bba70983e173a175a2c5e Mon Sep 17 00:00:00 2001 From: Tomas Restrepo Date: Sun, 6 Aug 2017 19:47:36 -0500 Subject: [PATCH 20/20] Fix issues with bringing back current line highlight --- src/Viasfora.Core/Settings/VsfSettings.cs | 4 ++-- src/Viasfora/Options/GeneralOptionsPage.cs | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Viasfora.Core/Settings/VsfSettings.cs b/src/Viasfora.Core/Settings/VsfSettings.cs index 5aefb84f..d9995151 100644 --- a/src/Viasfora.Core/Settings/VsfSettings.cs +++ b/src/Viasfora.Core/Settings/VsfSettings.cs @@ -20,8 +20,8 @@ public bool EscapeSequencesEnabled { set { this.Store.SetValue(nameof(EscapeSequencesEnabled), value); } } public bool CurrentLineHighlightEnabled { - get { return GetBoolean(nameof(CurrentLineHighlightEnabled), false); } - set { SetValue(nameof(CurrentLineHighlightEnabled), value); } + get { return this.Store.GetBoolean(nameof(CurrentLineHighlightEnabled), false); } + set { this.Store.SetValue(nameof(CurrentLineHighlightEnabled), value); } } public bool CurrentColumnHighlightEnabled { get { return this.Store.GetBoolean(nameof(CurrentColumnHighlightEnabled), false); } diff --git a/src/Viasfora/Options/GeneralOptionsPage.cs b/src/Viasfora/Options/GeneralOptionsPage.cs index 18d82f54..ae6ec778 100644 --- a/src/Viasfora/Options/GeneralOptionsPage.cs +++ b/src/Viasfora/Options/GeneralOptionsPage.cs @@ -51,6 +51,7 @@ public override void LoadSettingsFromStorage() { this.colors = new ClassificationList(new ColorStorage(this.Site)); colors.Load( + Constants.LINE_HIGHLIGHT, Constants.COLUMN_HIGHLIGHT, Constants.FLOW_CONTROL_CLASSIF_NAME, Constants.LINQ_CLASSIF_NAME,