diff --git a/VsDingExtensionProject/Guids.cs b/VsDingExtensionProject/Guids.cs index 90438f2..6362409 100644 --- a/VsDingExtensionProject/Guids.cs +++ b/VsDingExtensionProject/Guids.cs @@ -1,8 +1,9 @@ // Guids.cs // MUST match guids.h + using System; -namespace VitaliiGanzha.VsDingExtensionProject +namespace VitaliiGanzha.VsDingExtension { static class GuidList { diff --git a/VsDingExtensionProject/Properties/AssemblyInfo.cs b/VsDingExtensionProject/Properties/AssemblyInfo.cs index 92e3d86..d241dbb 100644 --- a/VsDingExtensionProject/Properties/AssemblyInfo.cs +++ b/VsDingExtensionProject/Properties/AssemblyInfo.cs @@ -29,8 +29,6 @@ using System.Runtime.InteropServices; // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] - +[assembly: AssemblyVersion("1.0.*")] diff --git a/VsDingExtensionProject/Resources.Designer.cs b/VsDingExtensionProject/Resources.Designer.cs index dc9f7dc..d98eab0 100644 --- a/VsDingExtensionProject/Resources.Designer.cs +++ b/VsDingExtensionProject/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace VitaliiGanzha.VsDingExtensionProject { +namespace VitaliiGanzha.VsDingExtension { using System; @@ -39,7 +39,7 @@ namespace VitaliiGanzha.VsDingExtensionProject { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VitaliiGanzha.VsDingExtensionProject.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("VitaliiGanzha.VsDingExtension.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -60,6 +60,24 @@ namespace VitaliiGanzha.VsDingExtensionProject { } } + /// + /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. + /// + internal static System.IO.UnmanagedMemoryStream build { + get { + return ResourceManager.GetStream("build", resourceCulture); + } + } + + /// + /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. + /// + internal static System.IO.UnmanagedMemoryStream debug { + get { + return ResourceManager.GetStream("debug", resourceCulture); + } + } + /// /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. /// diff --git a/VsDingExtensionProject/Resources.resx b/VsDingExtensionProject/Resources.resx index 4b7f1b3..4a8cf71 100644 --- a/VsDingExtensionProject/Resources.resx +++ b/VsDingExtensionProject/Resources.resx @@ -118,6 +118,12 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + Resources\build.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Resources\debug.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + Resources\ding.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 diff --git a/VsDingExtensionProject/Resources/build.wav b/VsDingExtensionProject/Resources/build.wav new file mode 100644 index 0000000..f837519 Binary files /dev/null and b/VsDingExtensionProject/Resources/build.wav differ diff --git a/VsDingExtensionProject/Resources/debug.wav b/VsDingExtensionProject/Resources/debug.wav new file mode 100644 index 0000000..ed6ed85 Binary files /dev/null and b/VsDingExtensionProject/Resources/debug.wav differ diff --git a/VsDingExtensionProject/Resources/speaker.ico b/VsDingExtensionProject/Resources/speaker.ico new file mode 100644 index 0000000..f7a3433 Binary files /dev/null and b/VsDingExtensionProject/Resources/speaker.ico differ diff --git a/VsDingExtensionProject/VsDingExtensionProject.csproj b/VsDingExtensionProject/VsDingExtensionProject.csproj index f7c63b3..87e8733 100644 --- a/VsDingExtensionProject/VsDingExtensionProject.csproj +++ b/VsDingExtensionProject/VsDingExtensionProject.csproj @@ -4,6 +4,10 @@ 12.0 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + speaker.ico @@ -14,8 +18,8 @@ {82b43b9b-a64c-4715-b499-d71e9ca2bd60};{60dc8134-eba5-43b8-bcc9-bb4bc16c2548};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Library Properties - VitaliiGanzha.VsDingExtensionProject - VsDingExtensionProject + VitaliiGanzha.VsDingExtension + VsDingExtension True Key.snk v4.5 @@ -28,6 +32,7 @@ DEBUG;TRACE prompt 4 + false pdbonly @@ -37,6 +42,7 @@ prompt 4 true + false @@ -172,7 +178,13 @@ + + Always + true + + + diff --git a/VsDingExtensionProject/VsDingExtensionProjectPackage.cs b/VsDingExtensionProject/VsDingExtensionProjectPackage.cs index 5dad53f..510fd5d 100644 --- a/VsDingExtensionProject/VsDingExtensionProjectPackage.cs +++ b/VsDingExtensionProject/VsDingExtensionProjectPackage.cs @@ -1,11 +1,6 @@ -using System; -using System.ComponentModel.Composition; -using System.ComponentModel.Composition.Hosting; -using System.Diagnostics; +using System.Diagnostics; using System.Globalization; -using System.IO; using System.Media; -using System.Reflection; using System.Runtime.InteropServices; using EnvDTE; using EnvDTE80; @@ -13,23 +8,9 @@ using Microsoft.VisualStudio.ComponentModelHost; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.TestWindow.Extensibility; -namespace VitaliiGanzha.VsDingExtensionProject +namespace VitaliiGanzha.VsDingExtension { - /// - /// 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. [PackageRegistration(UseManagedResourcesOnly = true)] - // This attribute is used to register the information needed to show this package - // in the Help/About dialog of Visual Studio. [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [Guid(GuidList.guidVsDingExtensionProjectPkgString)] [ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")] @@ -37,46 +18,44 @@ namespace VitaliiGanzha.VsDingExtensionProject { private DTE2 applicationObject; private AddIn addInInstance; + private BuildEvents buildEvents; + private DebuggerEvents debugEvents; + private SoundPlayer buildCompleteSoundPlayer; + private SoundPlayer debugSoundPlayer; + private SoundPlayer testCompleteSoundPlayer; - /// - /// 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 VsDingExtensionProjectPackage() { Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString())); } - - - ///////////////////////////////////////////////////////////////////////////// - // Overridden Package Implementation #region Package Members - /// - /// 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(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString())); base.Initialize(); + buildCompleteSoundPlayer = new SoundPlayer(Resources.build); + debugSoundPlayer = new SoundPlayer(Resources.debug); + testCompleteSoundPlayer = new SoundPlayer(Resources.ding); + applicationObject = (DTE2) GetService(typeof (DTE)); - applicationObject.Events.BuildEvents.OnBuildDone += BuildEventsOnOnBuildDone; - applicationObject.Events.DebuggerEvents.OnEnterBreakMode += DebuggerEventsOnOnEnterBreakMode; + this.buildEvents = applicationObject.Events.BuildEvents; + this.debugEvents = applicationObject.Events.DebuggerEvents; + + buildEvents.OnBuildDone += (scope, action) => buildCompleteSoundPlayer.Play(); + debugEvents.OnEnterBreakMode += (dbgEventReason reason, ref dbgExecutionAction action) => debugSoundPlayer.Play(); var componentModel = Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof (SComponentModel)) as IComponentModel; if (componentModel == null) { - throw new Exception("componentModel is null"); + Debug.WriteLine("componentModel is null"); + return; } var operationState = componentModel.GetService(); @@ -85,29 +64,12 @@ namespace VitaliiGanzha.VsDingExtensionProject private void OperationStateOnStateChanged(object sender, OperationStateChangedEventArgs operationStateChangedEventArgs) { + if (operationStateChangedEventArgs.State.HasFlag(TestOperationStates.TestExecutionFinished)) { - PlaySound(); + testCompleteSoundPlayer.Play(); } } - - private void DebuggerEventsOnOnEnterBreakMode(dbgEventReason reason, ref dbgExecutionAction executionAction) - { - PlaySound(); - } - - private void BuildEventsOnOnBuildDone(vsBuildScope scope, vsBuildAction action) - { - PlaySound(); - } - - private void PlaySound() - { - SoundPlayer player = new SoundPlayer(Resources.ding); - player.PlaySync(); - - } - #endregion } diff --git a/VsDingExtensionProject/source.extension.vsixmanifest b/VsDingExtensionProject/source.extension.vsixmanifest index cb33ea4..8c938db 100644 --- a/VsDingExtensionProject/source.extension.vsixmanifest +++ b/VsDingExtensionProject/source.extension.vsixmanifest @@ -2,8 +2,22 @@ - VsDingExtensionProject - Information about my package + Visual Studio Ding extension + This small extension will play notification sounds when following events occur: +- Build Complete +- Entering debugger mode (breakpoint hit, etc) +- Unit tests finished to run + +Useful when working with big solutions or when build/test run/hitting a breakpoint takes a lot of time and developer can be distructed on other things while he waits. + +Just install it and it is ready to use! + +This is an open source project, join! + +Twitter: @GanzhaVitalii + https://github.com/thecoderok/vsdingextension + speaker.ico + productivity diff --git a/VsDingExtensionProject/speaker.ico b/VsDingExtensionProject/speaker.ico new file mode 100644 index 0000000..f7a3433 Binary files /dev/null and b/VsDingExtensionProject/speaker.ico differ