From 785e3901d2aef70b81b558943189858b3619664e Mon Sep 17 00:00:00 2001 From: Haacked Date: Thu, 24 Jul 2014 11:31:36 -0700 Subject: [PATCH 1/9] Add property page for encouragements --- EncouragePackage/EncouragePackage.cs | 5 +- EncouragePackage/EncouragePackage.csproj | 25 ++++++++- EncouragePackage/Encouragements.cs | 27 ++++------ EncouragePackage/Options/OptionsDialogPage.cs | 53 +++++++++++++++++++ .../Options/OptionsDialogPageControl.xaml | 24 +++++++++ .../Options/OptionsDialogPageControl.xaml.cs | 36 +++++++++++++ .../Properties/Settings.Designer.cs | 40 ++++++++++++++ EncouragePackage/Properties/Settings.settings | 22 ++++++++ EncouragePackage/app.config | 28 ++++++++++ 9 files changed, 240 insertions(+), 20 deletions(-) create mode 100644 EncouragePackage/Options/OptionsDialogPage.cs create mode 100644 EncouragePackage/Options/OptionsDialogPageControl.xaml create mode 100644 EncouragePackage/Options/OptionsDialogPageControl.xaml.cs create mode 100644 EncouragePackage/Properties/Settings.Designer.cs create mode 100644 EncouragePackage/Properties/Settings.settings create mode 100644 EncouragePackage/app.config diff --git a/EncouragePackage/EncouragePackage.cs b/EncouragePackage/EncouragePackage.cs index 87672f0..7c13d02 100644 --- a/EncouragePackage/EncouragePackage.cs +++ b/EncouragePackage/EncouragePackage.cs @@ -1,6 +1,6 @@ -using System; -using System.Diagnostics; +using System.Diagnostics; using System.Runtime.InteropServices; +using Haack.Encourage.Options; using Microsoft.VisualStudio.Shell; namespace Haack.Encourage @@ -22,6 +22,7 @@ namespace Haack.Encourage // in the Help/About dialog of Visual Studio. [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [Guid(GuidList.guidEncouragePackagePkgString)] + [ProvideOptionPageAttribute(typeof(OptionsDialogPage), "Encourage", "Encouragement List", 0, 0, supportsAutomation: true)] public sealed class EncouragePackage : Package { /// diff --git a/EncouragePackage/EncouragePackage.csproj b/EncouragePackage/EncouragePackage.csproj index 516de99..41ac057 100644 --- a/EncouragePackage/EncouragePackage.csproj +++ b/EncouragePackage/EncouragePackage.csproj @@ -71,6 +71,7 @@ + @@ -137,6 +138,17 @@ + + Component + + + OptionsDialogPageControl.xaml + + + True + True + Settings.settings + True True @@ -157,6 +169,11 @@ + + + SettingsSingleFileGenerator + Settings.Designer.cs + Designer @@ -175,6 +192,12 @@ + + + Designer + MSBuild:Compile + + true @@ -187,4 +210,4 @@ --> - + \ No newline at end of file diff --git a/EncouragePackage/Encouragements.cs b/EncouragePackage/Encouragements.cs index 1f745eb..9d3794f 100644 --- a/EncouragePackage/Encouragements.cs +++ b/EncouragePackage/Encouragements.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.ComponentModel.Composition; +using System.Linq; +using Haack.Encourage.Properties; namespace Haack.Encourage { @@ -8,28 +10,19 @@ namespace Haack.Encourage public class Encouragements : IEncouragements { static readonly Random random = new Random(); - readonly List encouragements = new List - { - "Nice Job!", - "Way to go!", - "Wow, nice change!", - "So good!", - "Bravo!", - "You rock!", - "Well done!", - "I see what you did there!", - "Genius work!", - "Thumbs up!", - "Coding win!", - "FTW!", - "Yep!", - "Nnnnailed it!" - }; + readonly List encouragements = GetSettingsFromSettings(); public string GetRandomEncouragement() { int randomIndex = random.Next(0, encouragements.Count); return encouragements[randomIndex]; } + + static List GetSettingsFromSettings() + { + return Settings.Default.Encouragements.Split( + new [] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) + .ToList(); + } } } diff --git a/EncouragePackage/Options/OptionsDialogPage.cs b/EncouragePackage/Options/OptionsDialogPage.cs new file mode 100644 index 0000000..7c5a319 --- /dev/null +++ b/EncouragePackage/Options/OptionsDialogPage.cs @@ -0,0 +1,53 @@ +using System; +using System.ComponentModel; +using System.Runtime.InteropServices; +using System.Windows; +using System.Windows.Forms; +using Haack.Encourage.Properties; +using Microsoft.VisualStudio.Shell; +using MessageBox = System.Windows.Forms.MessageBox; + +namespace Haack.Encourage.Options +{ + [ClassInterface(ClassInterfaceType.AutoDual)] + [CLSCompliant(false)] + [ComVisible(true)] + [Guid("1D9ECCF3-5D2F-4112-9B25-264596873DC9")] + public class OptionsDialogPage : UIElementDialogPage + { + OptionsDialogPageControl optionsDialogControl; + + public OptionsDialogPage() + { + } + + protected override UIElement Child + { + get + { + if (optionsDialogControl == null) + { + optionsDialogControl = new OptionsDialogPageControl(); + } + return optionsDialogControl; + } + } + + protected override void OnApply(PageApplyEventArgs args) + { + if (args.ApplyBehavior == ApplyKind.Apply) + { + try + { + Settings.Default.Encouragements = optionsDialogControl.Encouragements; + Settings.Default.Save(); + } + catch (Exception e) + { + MessageBox.Show("Could not save your encouragements" + e.Message); + } + } + base.OnApply(args); + } + } +} diff --git a/EncouragePackage/Options/OptionsDialogPageControl.xaml b/EncouragePackage/Options/OptionsDialogPageControl.xaml new file mode 100644 index 0000000..7a48e2f --- /dev/null +++ b/EncouragePackage/Options/OptionsDialogPageControl.xaml @@ -0,0 +1,24 @@ + + + + + + + + + + diff --git a/EncouragePackage/Options/OptionsDialogPageControl.xaml.cs b/EncouragePackage/Options/OptionsDialogPageControl.xaml.cs new file mode 100644 index 0000000..9cf4be6 --- /dev/null +++ b/EncouragePackage/Options/OptionsDialogPageControl.xaml.cs @@ -0,0 +1,36 @@ +using System; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Input; +using Microsoft.VisualStudio.Shell; + +namespace Haack.Encourage.Options +{ + /// + /// Interaction logic for OptionsDialogPageControl.xaml + /// + public partial class OptionsDialogPageControl : UserControl + { + public OptionsDialogPageControl() + { + InitializeComponent(); + + encouragements.AddHandler(UIElementDialogPage.DialogKeyPendingEvent, new RoutedEventHandler(OnDialogKeyPendingEvent)); + } + + void OnDialogKeyPendingEvent(object sender, RoutedEventArgs e) + { + var args = e as DialogKeyEventArgs; + if (args != null && args.Key == Key.Enter) + { + e.Handled = true; + } + } + + public string Encouragements + { + get { return encouragements.Text; } + set { encouragements.Text = value; } + } + } +} diff --git a/EncouragePackage/Properties/Settings.Designer.cs b/EncouragePackage/Properties/Settings.Designer.cs new file mode 100644 index 0000000..78d616b --- /dev/null +++ b/EncouragePackage/Properties/Settings.Designer.cs @@ -0,0 +1,40 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.34014 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace Haack.Encourage.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + + [global::System.Configuration.UserScopedSettingAttribute()] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Configuration.DefaultSettingValueAttribute("Nice Job!\r\nWay to go!\r\nWow, nice change!\r\nSo good!\r\nBravo!\r\nYou rock!\r\nWell done!" + + "\r\nI see what you did there!\r\nGenius work!\r\nThumbs up!\r\nCoding win!\r\nFTW!\r\nYep!\r\n" + + "Nnnnailed it!")] + public string Encouragements { + get { + return ((string)(this["Encouragements"])); + } + set { + this["Encouragements"] = value; + } + } + } +} diff --git a/EncouragePackage/Properties/Settings.settings b/EncouragePackage/Properties/Settings.settings new file mode 100644 index 0000000..476d633 --- /dev/null +++ b/EncouragePackage/Properties/Settings.settings @@ -0,0 +1,22 @@ + + + + + + Nice Job! +Way to go! +Wow, nice change! +So good! +Bravo! +You rock! +Well done! +I see what you did there! +Genius work! +Thumbs up! +Coding win! +FTW! +Yep! +Nnnnailed it! + + + \ No newline at end of file diff --git a/EncouragePackage/app.config b/EncouragePackage/app.config new file mode 100644 index 0000000..62ba364 --- /dev/null +++ b/EncouragePackage/app.config @@ -0,0 +1,28 @@ + + + + +
+ + + + + + Nice Job! +Way to go! +Wow, nice change! +So good! +Bravo! +You rock! +Well done! +I see what you did there! +Genius work! +Thumbs up! +Coding win! +FTW! +Yep! +Nnnnailed it! + + + + \ No newline at end of file From 9ab63e6ad71ded6866786001f9a89da8986dae30 Mon Sep 17 00:00:00 2001 From: Haacked Date: Mon, 28 Jul 2014 15:13:24 -0700 Subject: [PATCH 2/9] Fix how we save settings --- EncouragePackage/EncouragePackage.cs | 44 ++++---------- EncouragePackage/EncouragePackage.csproj | 11 ---- EncouragePackage/Encouragements.cs | 28 --------- EncouragePackage/Options/OptionsDialogPage.cs | 60 ++++++++++++++----- .../Properties/Settings.Designer.cs | 40 ------------- EncouragePackage/Properties/Settings.settings | 22 ------- EncouragePackage/app.config | 3 +- 7 files changed, 58 insertions(+), 150 deletions(-) delete mode 100644 EncouragePackage/Encouragements.cs delete mode 100644 EncouragePackage/Properties/Settings.Designer.cs delete mode 100644 EncouragePackage/Properties/Settings.settings diff --git a/EncouragePackage/EncouragePackage.cs b/EncouragePackage/EncouragePackage.cs index 7c13d02..ddf493b 100644 --- a/EncouragePackage/EncouragePackage.cs +++ b/EncouragePackage/EncouragePackage.cs @@ -1,4 +1,5 @@ -using System.Diagnostics; +using System.ComponentModel.Composition; +using System.Diagnostics; using System.Runtime.InteropServices; using Haack.Encourage.Options; using Microsoft.VisualStudio.Shell; @@ -6,14 +7,13 @@ namespace Haack.Encourage { /// - /// This is the class that implements the package exposed by this assembly. - /// - /// The minimum requirement for a class to be considered a valid package for Visual Studio - /// is to implement the IVsPackage interface and register itself with the shell. - /// This package uses the helper classes defined inside the Managed Package Framework (MPF) - /// to do it: it derives from the Package class that provides the implementation of the - /// IVsPackage interface and uses the registration attributes defined in the framework to - /// register itself and its components with the shell. + /// This is the class that implements the package exposed by this assembly. + /// The minimum requirement for a class to be considered a valid package for Visual Studio + /// is to implement the IVsPackage interface and register itself with the shell. + /// This package uses the helper classes defined inside the Managed Package Framework (MPF) + /// to do it: it derives from the Package class that provides the implementation of the + /// IVsPackage interface and uses the registration attributes defined in the framework to + /// register itself and its components with the shell. /// // This attribute tells the PkgDef creation utility (CreatePkgDef.exe) that this class is // a package. @@ -22,32 +22,8 @@ namespace Haack.Encourage // in the Help/About dialog of Visual Studio. [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [Guid(GuidList.guidEncouragePackagePkgString)] - [ProvideOptionPageAttribute(typeof(OptionsDialogPage), "Encourage", "Encouragement List", 0, 0, supportsAutomation: true)] + [ProvideOptionPage(typeof(OptionsDialogPage), "Encourage", "Encouragement List", 0, 0, supportsAutomation: true)] public sealed class EncouragePackage : Package { - /// - /// Default constructor of the package. - /// Inside this method you can place any initialization code that does not require - /// any Visual Studio service because at this point the package object is created but - /// not sited yet inside Visual Studio environment. The place to do all the other - /// initialization is the Initialize method. - /// - public EncouragePackage() - { - Debug.WriteLine("Entering constructor for: {0}", this); - } - - ///////////////////////////////////////////////////////////////////////////// - // Overridden Package Implementation - - /// - /// Initialization of the package; this method is called right after the package is sited, so this is the place - /// where you can put all the initialization code that rely on services provided by VisualStudio. - /// - protected override void Initialize() - { - Debug.WriteLine("Entering Initialize() of: {0}", this); - base.Initialize(); - } } } diff --git a/EncouragePackage/EncouragePackage.csproj b/EncouragePackage/EncouragePackage.csproj index 41ac057..16ef7db 100644 --- a/EncouragePackage/EncouragePackage.csproj +++ b/EncouragePackage/EncouragePackage.csproj @@ -130,7 +130,6 @@ - @@ -144,11 +143,6 @@ OptionsDialogPageControl.xaml - - True - True - Settings.settings - True True @@ -169,11 +163,6 @@ - - - SettingsSingleFileGenerator - Settings.Designer.cs - Designer diff --git a/EncouragePackage/Encouragements.cs b/EncouragePackage/Encouragements.cs deleted file mode 100644 index 9d3794f..0000000 --- a/EncouragePackage/Encouragements.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel.Composition; -using System.Linq; -using Haack.Encourage.Properties; - -namespace Haack.Encourage -{ - [Export(typeof(IEncouragements))] - public class Encouragements : IEncouragements - { - static readonly Random random = new Random(); - readonly List encouragements = GetSettingsFromSettings(); - - public string GetRandomEncouragement() - { - int randomIndex = random.Next(0, encouragements.Count); - return encouragements[randomIndex]; - } - - static List GetSettingsFromSettings() - { - return Settings.Default.Encouragements.Split( - new [] {Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) - .ToList(); - } - } -} diff --git a/EncouragePackage/Options/OptionsDialogPage.cs b/EncouragePackage/Options/OptionsDialogPage.cs index 7c5a319..31003aa 100644 --- a/EncouragePackage/Options/OptionsDialogPage.cs +++ b/EncouragePackage/Options/OptionsDialogPage.cs @@ -1,9 +1,9 @@ using System; -using System.ComponentModel; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Linq; using System.Runtime.InteropServices; using System.Windows; -using System.Windows.Forms; -using Haack.Encourage.Properties; using Microsoft.VisualStudio.Shell; using MessageBox = System.Windows.Forms.MessageBox; @@ -13,23 +13,40 @@ namespace Haack.Encourage.Options [CLSCompliant(false)] [ComVisible(true)] [Guid("1D9ECCF3-5D2F-4112-9B25-264596873DC9")] - public class OptionsDialogPage : UIElementDialogPage + [Export(typeof(IEncouragements))] + public class OptionsDialogPage : UIElementDialogPage, IEncouragements { + static readonly Random random = new Random(); + OptionsDialogPageControl optionsDialogControl; + const string defaultEncouragements = @"Nice Job! +Way to go! +Wow, nice change! +So good! +Bravo! +You rock! +Well done! +I see what you did there! +Genius work! +Thumbs up! +Coding win! +FTW! +Yep! +Nnnnailed it!"; - public OptionsDialogPage() - { - } + // TODO: Could we make this a notify property so when it changes, we update the encouragements list + // rather than splitting on it every time? + public string Encouragements { get; set; } protected override UIElement Child { get { - if (optionsDialogControl == null) - { - optionsDialogControl = new OptionsDialogPageControl(); - } - return optionsDialogControl; + return optionsDialogControl + ?? (optionsDialogControl = new OptionsDialogPageControl + { + Encouragements = Encouragements ?? defaultEncouragements + }); } } @@ -39,8 +56,7 @@ protected override void OnApply(PageApplyEventArgs args) { try { - Settings.Default.Encouragements = optionsDialogControl.Encouragements; - Settings.Default.Save(); + Encouragements = optionsDialogControl.Encouragements; } catch (Exception e) { @@ -49,5 +65,21 @@ protected override void OnApply(PageApplyEventArgs args) } base.OnApply(args); } + + IList EncouragementsList + { + get + { + return (Encouragements ?? defaultEncouragements).Split( + new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) + .ToList(); + } + } + + public string GetRandomEncouragement() + { + int randomIndex = random.Next(0, EncouragementsList.Count); + return EncouragementsList[randomIndex]; + } } } diff --git a/EncouragePackage/Properties/Settings.Designer.cs b/EncouragePackage/Properties/Settings.Designer.cs deleted file mode 100644 index 78d616b..0000000 --- a/EncouragePackage/Properties/Settings.Designer.cs +++ /dev/null @@ -1,40 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:4.0.30319.34014 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Haack.Encourage.Properties { - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "12.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default { - get { - return defaultInstance; - } - } - - [global::System.Configuration.UserScopedSettingAttribute()] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Configuration.DefaultSettingValueAttribute("Nice Job!\r\nWay to go!\r\nWow, nice change!\r\nSo good!\r\nBravo!\r\nYou rock!\r\nWell done!" + - "\r\nI see what you did there!\r\nGenius work!\r\nThumbs up!\r\nCoding win!\r\nFTW!\r\nYep!\r\n" + - "Nnnnailed it!")] - public string Encouragements { - get { - return ((string)(this["Encouragements"])); - } - set { - this["Encouragements"] = value; - } - } - } -} diff --git a/EncouragePackage/Properties/Settings.settings b/EncouragePackage/Properties/Settings.settings deleted file mode 100644 index 476d633..0000000 --- a/EncouragePackage/Properties/Settings.settings +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - Nice Job! -Way to go! -Wow, nice change! -So good! -Bravo! -You rock! -Well done! -I see what you did there! -Genius work! -Thumbs up! -Coding win! -FTW! -Yep! -Nnnnailed it! - - - \ No newline at end of file diff --git a/EncouragePackage/app.config b/EncouragePackage/app.config index 62ba364..3430dc5 100644 --- a/EncouragePackage/app.config +++ b/EncouragePackage/app.config @@ -8,7 +8,8 @@ - Nice Job! + +Nice Job! Way to go! Wow, nice change! So good! From dce1a7bc45bd601f133513e723604da4c617cdd0 Mon Sep 17 00:00:00 2001 From: Haacked Date: Mon, 28 Jul 2014 17:14:40 -0700 Subject: [PATCH 3/9] Handle empty list of encouragements --- EncouragePackage/EncourageSignatureHelpSource.cs | 7 +++++-- EncouragePackage/Options/OptionsDialogPage.cs | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/EncouragePackage/EncourageSignatureHelpSource.cs b/EncouragePackage/EncourageSignatureHelpSource.cs index f84808a..6fe60fe 100644 --- a/EncouragePackage/EncourageSignatureHelpSource.cs +++ b/EncouragePackage/EncourageSignatureHelpSource.cs @@ -112,8 +112,11 @@ public void AugmentSignatureHelpSession(ISignatureHelpSession session, IList EncouragementsList public string GetRandomEncouragement() { + if (!EncouragementsList.Any()) return null; + int randomIndex = random.Next(0, EncouragementsList.Count); return EncouragementsList[randomIndex]; } From 0cf522e1e16725ea4a456d6d0cc484c2d6388b8d Mon Sep 17 00:00:00 2001 From: Haacked Date: Mon, 28 Jul 2014 17:34:00 -0700 Subject: [PATCH 4/9] failed attempt to load settings --- EncouragePackage/EncouragePackage.cs | 7 +++++++ EncouragePackage/Options/OptionsDialogPage.cs | 14 +++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/EncouragePackage/EncouragePackage.cs b/EncouragePackage/EncouragePackage.cs index ddf493b..e1fa488 100644 --- a/EncouragePackage/EncouragePackage.cs +++ b/EncouragePackage/EncouragePackage.cs @@ -25,5 +25,12 @@ namespace Haack.Encourage [ProvideOptionPage(typeof(OptionsDialogPage), "Encourage", "Encouragement List", 0, 0, supportsAutomation: true)] public sealed class EncouragePackage : Package { + protected override void Initialize() + { + base.Initialize(); + + var dialog = (OptionsDialogPage)GetDialogPage(typeof(OptionsDialogPage)); // Make sure this is activated + Debug.WriteLine(dialog.Encouragements); + } } } diff --git a/EncouragePackage/Options/OptionsDialogPage.cs b/EncouragePackage/Options/OptionsDialogPage.cs index 4f1333b..aa1cd53 100644 --- a/EncouragePackage/Options/OptionsDialogPage.cs +++ b/EncouragePackage/Options/OptionsDialogPage.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.ComponentModel; using System.ComponentModel.Composition; using System.Linq; using System.Runtime.InteropServices; @@ -42,14 +43,17 @@ protected override UIElement Child { get { - return optionsDialogControl - ?? (optionsDialogControl = new OptionsDialogPageControl - { - Encouragements = Encouragements ?? defaultEncouragements - }); + return optionsDialogControl ?? (optionsDialogControl = new OptionsDialogPageControl()); } } + protected override void OnActivate(CancelEventArgs e) + { + base.OnActivate(e); + + optionsDialogControl.Encouragements = Encouragements ?? defaultEncouragements; + } + protected override void OnApply(PageApplyEventArgs args) { if (args.ApplyBehavior == ApplyKind.Apply) From 2cef5577bdebcf74781c147bd35adad73a131545 Mon Sep 17 00:00:00 2001 From: Jared Parsons Date: Tue, 29 Jul 2014 07:10:32 -0700 Subject: [PATCH 5/9] Example --- EncouragePackage/EncouragePackage.cs | 6 - EncouragePackage/EncouragePackage.csproj | 4 +- EncouragePackage/Encouragments.cs | 103 ++++++++++++++++++ EncouragePackage/IEncouragements.cs | 5 +- EncouragePackage/Options/OptionsDialogPage.cs | 56 ++-------- 5 files changed, 120 insertions(+), 54 deletions(-) create mode 100644 EncouragePackage/Encouragments.cs diff --git a/EncouragePackage/EncouragePackage.cs b/EncouragePackage/EncouragePackage.cs index e1fa488..9f438f5 100644 --- a/EncouragePackage/EncouragePackage.cs +++ b/EncouragePackage/EncouragePackage.cs @@ -25,12 +25,6 @@ namespace Haack.Encourage [ProvideOptionPage(typeof(OptionsDialogPage), "Encourage", "Encouragement List", 0, 0, supportsAutomation: true)] public sealed class EncouragePackage : Package { - protected override void Initialize() - { - base.Initialize(); - var dialog = (OptionsDialogPage)GetDialogPage(typeof(OptionsDialogPage)); // Make sure this is activated - Debug.WriteLine(dialog.Encouragements); - } } } diff --git a/EncouragePackage/EncouragePackage.csproj b/EncouragePackage/EncouragePackage.csproj index 16ef7db..c1aa5c1 100644 --- a/EncouragePackage/EncouragePackage.csproj +++ b/EncouragePackage/EncouragePackage.csproj @@ -58,6 +58,7 @@ + @@ -135,6 +136,7 @@ + @@ -199,4 +201,4 @@ --> - \ No newline at end of file + diff --git a/EncouragePackage/Encouragments.cs b/EncouragePackage/Encouragments.cs new file mode 100644 index 0000000..e216ae1 --- /dev/null +++ b/EncouragePackage/Encouragments.cs @@ -0,0 +1,103 @@ +using Microsoft.VisualStudio.Settings; +using Microsoft.VisualStudio.Shell; +using Microsoft.VisualStudio.Shell.Settings; +using System; +using System.Collections.Generic; +using System.ComponentModel.Composition; +using System.Diagnostics; + +namespace Haack.Encourage +{ + [Export(typeof(IEncouragements))] + public class Encouragements : IEncouragements + { + const string CollectionPath = "Encouragements"; + const string PropertyName = "AllEncouragements"; + + static readonly Random random = new Random(); + static readonly string[] defaultEncouragements = new[] + { + "Nice Job!", + "Way to go!", + "Wow, nice change!", + "So good!", + "Bravo!", + "You rock!", + "Well done!", + "I see what you did there!", + "Genius work!", + "Thumbs up!", + "Coding win!", + "FTW!", + "Yep!", + "Nnnnailed it!" + }; + + readonly List encouragements = new List(defaultEncouragements); + readonly WritableSettingsStore writableSettingsStore; + + public IEnumerable AllEncouragements + { + get { return encouragements; } + set + { + encouragements.Clear(); + encouragements.AddRange(value); + if (encouragements.Count == 0) + { + encouragements.AddRange(defaultEncouragements); + } + SaveSettings(); + } + } + + [ImportingConstructor] + public Encouragements(SVsServiceProvider vsServiceProvider) + { + var shellSettingsManager = new ShellSettingsManager(vsServiceProvider); + writableSettingsStore = shellSettingsManager.GetWritableSettingsStore(SettingsScope.UserSettings); + + LoadSettings(); + } + + public string GetRandomEncouragement() + { + int randomIndex = random.Next(0, encouragements.Count); + return encouragements[randomIndex]; + } + + void LoadSettings() + { + try + { + if (writableSettingsStore.PropertyExists(CollectionPath, PropertyName)) + { + string value = writableSettingsStore.GetString(CollectionPath, PropertyName); + AllEncouragements = value.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + } + } + catch (Exception ex) + { + Debug.Fail(ex.Message); + } + } + + void SaveSettings() + { + try + { + if (!writableSettingsStore.CollectionExists(CollectionPath)) + { + writableSettingsStore.CreateCollection(CollectionPath); + } + + string value = string.Join(Environment.NewLine, encouragements); + writableSettingsStore.SetString(CollectionPath, PropertyName, value); + } + catch (Exception ex) + { + Debug.Fail(ex.Message); + } + } + } +} \ No newline at end of file diff --git a/EncouragePackage/IEncouragements.cs b/EncouragePackage/IEncouragements.cs index 6f8589c..fd4f4cc 100644 --- a/EncouragePackage/IEncouragements.cs +++ b/EncouragePackage/IEncouragements.cs @@ -1,7 +1,10 @@ -namespace Haack.Encourage +using System.Collections.Generic; +namespace Haack.Encourage { public interface IEncouragements { + IEnumerable AllEncouragements { get; set; } + string GetRandomEncouragement(); } } \ No newline at end of file diff --git a/EncouragePackage/Options/OptionsDialogPage.cs b/EncouragePackage/Options/OptionsDialogPage.cs index aa1cd53..edf34ea 100644 --- a/EncouragePackage/Options/OptionsDialogPage.cs +++ b/EncouragePackage/Options/OptionsDialogPage.cs @@ -7,6 +7,7 @@ using System.Windows; using Microsoft.VisualStudio.Shell; using MessageBox = System.Windows.Forms.MessageBox; +using Microsoft.VisualStudio.ComponentModelHost; namespace Haack.Encourage.Options { @@ -14,30 +15,9 @@ namespace Haack.Encourage.Options [CLSCompliant(false)] [ComVisible(true)] [Guid("1D9ECCF3-5D2F-4112-9B25-264596873DC9")] - [Export(typeof(IEncouragements))] - public class OptionsDialogPage : UIElementDialogPage, IEncouragements + public class OptionsDialogPage : UIElementDialogPage { - static readonly Random random = new Random(); - OptionsDialogPageControl optionsDialogControl; - const string defaultEncouragements = @"Nice Job! -Way to go! -Wow, nice change! -So good! -Bravo! -You rock! -Well done! -I see what you did there! -Genius work! -Thumbs up! -Coding win! -FTW! -Yep! -Nnnnailed it!"; - - // TODO: Could we make this a notify property so when it changes, we update the encouragements list - // rather than splitting on it every time? - public string Encouragements { get; set; } protected override UIElement Child { @@ -51,41 +31,25 @@ protected override void OnActivate(CancelEventArgs e) { base.OnActivate(e); - optionsDialogControl.Encouragements = Encouragements ?? defaultEncouragements; + var encouraments = GetEncouragements(); + optionsDialogControl.Encouragements = string.Join(Environment.NewLine, encouraments.AllEncouragements); } protected override void OnApply(PageApplyEventArgs args) { if (args.ApplyBehavior == ApplyKind.Apply) { - try - { - Encouragements = optionsDialogControl.Encouragements; - } - catch (Exception e) - { - MessageBox.Show("Could not save your encouragements" + e.Message); - } + var userEncouragments = optionsDialogControl.Encouragements.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + GetEncouragements().AllEncouragements = userEncouragments; } - base.OnApply(args); - } - IList EncouragementsList - { - get - { - return (Encouragements ?? defaultEncouragements).Split( - new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) - .ToList(); - } + base.OnApply(args); } - public string GetRandomEncouragement() + private IEncouragements GetEncouragements() { - if (!EncouragementsList.Any()) return null; - - int randomIndex = random.Next(0, EncouragementsList.Count); - return EncouragementsList[randomIndex]; + var componentModel = (IComponentModel)(Site.GetService(typeof(SComponentModel))); + return componentModel.DefaultExportProvider.GetExportedValue(); } } } From eecf10fc6aad2161e46fe59e417acc931cc132d9 Mon Sep 17 00:00:00 2001 From: Haacked Date: Tue, 29 Jul 2014 10:24:22 -0700 Subject: [PATCH 6/9] Fix reference to ComponentModelHost --- EncouragePackage/EncouragePackage.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/EncouragePackage/EncouragePackage.csproj b/EncouragePackage/EncouragePackage.csproj index c1aa5c1..e1d5152 100644 --- a/EncouragePackage/EncouragePackage.csproj +++ b/EncouragePackage/EncouragePackage.csproj @@ -45,6 +45,7 @@ true + @@ -58,7 +59,6 @@ - @@ -201,4 +201,4 @@ --> - + \ No newline at end of file From 168f5687e92dfa05c1c9c2c73c7263579df6df81 Mon Sep 17 00:00:00 2001 From: Haacked Date: Tue, 29 Jul 2014 10:40:45 -0700 Subject: [PATCH 7/9] Extraneous cleanup of no consequence --- .../EncourageIntellisenseController.cs | 7 ++----- ...EncourageIntellisenseControllerProvider.cs | 2 -- EncouragePackage/EncouragePackage.cs | 19 ++++++++----------- .../EncourageSignatureHelpSource.cs | 16 ++++++++-------- EncouragePackage/Options/OptionsDialogPage.cs | 15 ++++----------- 5 files changed, 22 insertions(+), 37 deletions(-) diff --git a/EncouragePackage/EncourageIntellisenseController.cs b/EncouragePackage/EncourageIntellisenseController.cs index 5d9be23..292c363 100644 --- a/EncouragePackage/EncourageIntellisenseController.cs +++ b/EncouragePackage/EncourageIntellisenseController.cs @@ -1,5 +1,4 @@ using System; -using EnvDTE; using Microsoft.VisualStudio.Language.Intellisense; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; @@ -27,7 +26,7 @@ public EncourageIntellisenseController( void OnDocumentDirtyStateChanged(object sender, EventArgs e) { - if (!this.textDocument.IsDirty) + if (!textDocument.IsDirty) { DisplayEncouragement(); } @@ -55,12 +54,10 @@ public void Detach(ITextView detacedTextView) public void ConnectSubjectBuffer(ITextBuffer subjectBuffer) { - } public void DisconnectSubjectBuffer(ITextBuffer subjectBuffer) { - } } -} \ No newline at end of file +} diff --git a/EncouragePackage/EncourageIntellisenseControllerProvider.cs b/EncouragePackage/EncourageIntellisenseControllerProvider.cs index 4376885..5be8f35 100644 --- a/EncouragePackage/EncourageIntellisenseControllerProvider.cs +++ b/EncouragePackage/EncourageIntellisenseControllerProvider.cs @@ -1,8 +1,6 @@ using System.Collections.Generic; using System.ComponentModel.Composition; -using EnvDTE; using Microsoft.VisualStudio.Language.Intellisense; -using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Utilities; diff --git a/EncouragePackage/EncouragePackage.cs b/EncouragePackage/EncouragePackage.cs index 9f438f5..bbc479c 100644 --- a/EncouragePackage/EncouragePackage.cs +++ b/EncouragePackage/EncouragePackage.cs @@ -1,19 +1,17 @@ -using System.ComponentModel.Composition; -using System.Diagnostics; -using System.Runtime.InteropServices; +using System.Runtime.InteropServices; using Haack.Encourage.Options; using Microsoft.VisualStudio.Shell; namespace Haack.Encourage { /// - /// This is the class that implements the package exposed by this assembly. - /// The minimum requirement for a class to be considered a valid package for Visual Studio - /// is to implement the IVsPackage interface and register itself with the shell. - /// This package uses the helper classes defined inside the Managed Package Framework (MPF) - /// to do it: it derives from the Package class that provides the implementation of the - /// IVsPackage interface and uses the registration attributes defined in the framework to - /// register itself and its components with the shell. + /// This is the class that implements the package exposed by this assembly. + /// The minimum requirement for a class to be considered a valid package for Visual Studio + /// is to implement the IVsPackage interface and register itself with the shell. + /// This package uses the helper classes defined inside the Managed Package Framework (MPF) + /// to do it: it derives from the Package class that provides the implementation of the + /// IVsPackage interface and uses the registration attributes defined in the framework to + /// register itself and its components with the shell. /// // This attribute tells the PkgDef creation utility (CreatePkgDef.exe) that this class is // a package. @@ -25,6 +23,5 @@ namespace Haack.Encourage [ProvideOptionPage(typeof(OptionsDialogPage), "Encourage", "Encouragement List", 0, 0, supportsAutomation: true)] public sealed class EncouragePackage : Package { - } } diff --git a/EncouragePackage/EncourageSignatureHelpSource.cs b/EncouragePackage/EncourageSignatureHelpSource.cs index 6fe60fe..8f63986 100644 --- a/EncouragePackage/EncourageSignatureHelpSource.cs +++ b/EncouragePackage/EncourageSignatureHelpSource.cs @@ -17,12 +17,12 @@ sealed class Signature : ISignature public ITrackingSpan ApplicableToSpan { - get { return this.trackingSpan; } + get { return trackingSpan; } } public string Content { - get { return this.content; } + get { return content; } } public IParameter CurrentParameter @@ -34,17 +34,17 @@ public IParameter CurrentParameter public string Documentation { - get { return this.documentation; } + get { return documentation; } } public ReadOnlyCollection Parameters { - get { return new ReadOnlyCollection(new IParameter[] { }); } + get { return new ReadOnlyCollection(new IParameter[] { }); } } public string PrettyPrintedContent { - get { return this.prettyPrintedContent; } + get { return prettyPrintedContent; } } internal Signature(ITrackingSpan trackingSpan, string content, string prettyPrintedContent, string documentation) @@ -57,9 +57,9 @@ internal Signature(ITrackingSpan trackingSpan, string content, string prettyPrin } /// - /// This object needs to be added as a key to the property bag of an ITextView where - /// encouragement should be applied. This prevents encouragement from being - /// introduced in places like signature overload. + /// This object needs to be added as a key to the property bag of an ITextView where + /// encouragement should be applied. This prevents encouragement from being + /// introduced in places like signature overload. /// internal static readonly object SessionKey = new object(); diff --git a/EncouragePackage/Options/OptionsDialogPage.cs b/EncouragePackage/Options/OptionsDialogPage.cs index edf34ea..beaf83a 100644 --- a/EncouragePackage/Options/OptionsDialogPage.cs +++ b/EncouragePackage/Options/OptionsDialogPage.cs @@ -1,13 +1,9 @@ using System; -using System.Collections.Generic; using System.ComponentModel; -using System.ComponentModel.Composition; -using System.Linq; using System.Runtime.InteropServices; using System.Windows; -using Microsoft.VisualStudio.Shell; -using MessageBox = System.Windows.Forms.MessageBox; using Microsoft.VisualStudio.ComponentModelHost; +using Microsoft.VisualStudio.Shell; namespace Haack.Encourage.Options { @@ -21,10 +17,7 @@ public class OptionsDialogPage : UIElementDialogPage protected override UIElement Child { - get - { - return optionsDialogControl ?? (optionsDialogControl = new OptionsDialogPageControl()); - } + get { return optionsDialogControl ?? (optionsDialogControl = new OptionsDialogPageControl()); } } protected override void OnActivate(CancelEventArgs e) @@ -39,14 +32,14 @@ protected override void OnApply(PageApplyEventArgs args) { if (args.ApplyBehavior == ApplyKind.Apply) { - var userEncouragments = optionsDialogControl.Encouragements.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + string[] userEncouragments = optionsDialogControl.Encouragements.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); GetEncouragements().AllEncouragements = userEncouragments; } base.OnApply(args); } - private IEncouragements GetEncouragements() + IEncouragements GetEncouragements() { var componentModel = (IComponentModel)(Site.GetService(typeof(SComponentModel))); return componentModel.DefaultExportProvider.GetExportedValue(); From 5df8cc330e2bc144a9fb60b8b16512c3b5a41d42 Mon Sep 17 00:00:00 2001 From: Jared Parsons Date: Tue, 29 Jul 2014 10:25:36 -0700 Subject: [PATCH 8/9] Added missing reference assembly --- ...icrosoft.VisualStudio.ComponentModelHost.dll | Bin 0 -> 38480 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 References/Vs2012/Microsoft.VisualStudio.ComponentModelHost.dll diff --git a/References/Vs2012/Microsoft.VisualStudio.ComponentModelHost.dll b/References/Vs2012/Microsoft.VisualStudio.ComponentModelHost.dll new file mode 100644 index 0000000000000000000000000000000000000000..676010097ddcd05c37b84ebcc36f5d6bba22f583 GIT binary patch literal 38480 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 Jk&Ec){{YXM$5sFU literal 0 HcmV?d00001 From 1768316d69ea2a918470ee28eef007afe3cb64d5 Mon Sep 17 00:00:00 2001 From: Haacked Date: Tue, 29 Jul 2014 10:46:02 -0700 Subject: [PATCH 9/9] Properly reference ComponentModelHost for VS 2012 --- EncouragePackage/EncouragePackage.csproj | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/EncouragePackage/EncouragePackage.csproj b/EncouragePackage/EncouragePackage.csproj index e1d5152..13a2391 100644 --- a/EncouragePackage/EncouragePackage.csproj +++ b/EncouragePackage/EncouragePackage.csproj @@ -45,7 +45,10 @@ true - + + False + ..\References\Vs2012\Microsoft.VisualStudio.ComponentModelHost.dll +