Added options for when to beep
This commit is contained in:
		
							parent
							
								
									172057ab1e
								
							
						
					
					
						commit
						cc3ae003ce
					
				
					 6 changed files with 108 additions and 14 deletions
				
			
		
							
								
								
									
										39
									
								
								VsDingExtensionProject/OptionsDialog.cs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								VsDingExtensionProject/OptionsDialog.cs
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,39 @@
 | 
			
		|||
using Microsoft.VisualStudio.Shell;
 | 
			
		||||
using System;
 | 
			
		||||
using System.ComponentModel;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
 | 
			
		||||
namespace VitaliiGanzha.VsDingExtension
 | 
			
		||||
{
 | 
			
		||||
    [ClassInterface(ClassInterfaceType.AutoDual)]
 | 
			
		||||
    [CLSCompliant(false), ComVisible(true)]
 | 
			
		||||
    public class OptionsDialog : DialogPage
 | 
			
		||||
    {
 | 
			
		||||
        [Category("Beeps")]
 | 
			
		||||
        [DisplayName("Breakpoint")]
 | 
			
		||||
        [Description("Beep when a breakpoint is hit")]
 | 
			
		||||
        public bool BreakpointBeep { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Category("Beeps")]
 | 
			
		||||
        [DisplayName("Build")]
 | 
			
		||||
        [Description("Beep when a build is completed")]
 | 
			
		||||
        public bool BuildBeep { get; set; }
 | 
			
		||||
 | 
			
		||||
        [Category("Beeps")]
 | 
			
		||||
        [DisplayName("Tests")]
 | 
			
		||||
        [Description("Beep when a test run is completed")]
 | 
			
		||||
        public bool TestBeep { get; set; }
 | 
			
		||||
 | 
			
		||||
        [DisplayName("Only when in background")]
 | 
			
		||||
        [Description("Beep only when Visual Studio does not have focus")]
 | 
			
		||||
        public bool BeepOnUnfocus { get; set; }
 | 
			
		||||
 | 
			
		||||
        public OptionsDialog()
 | 
			
		||||
        {
 | 
			
		||||
            BreakpointBeep = true;
 | 
			
		||||
            BuildBeep = true;
 | 
			
		||||
            TestBeep = true;
 | 
			
		||||
            BeepOnUnfocus = false;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -148,6 +148,9 @@
 | 
			
		|||
  </ItemGroup>
 | 
			
		||||
  <ItemGroup>
 | 
			
		||||
    <Compile Include="Guids.cs" />
 | 
			
		||||
    <Compile Include="OptionsDialog.cs">
 | 
			
		||||
      <SubType>Component</SubType>
 | 
			
		||||
    </Compile>
 | 
			
		||||
    <Compile Include="Resources.Designer.cs">
 | 
			
		||||
      <AutoGen>True</AutoGen>
 | 
			
		||||
      <DesignTime>True</DesignTime>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
using System;
 | 
			
		||||
using System.Diagnostics;
 | 
			
		||||
using System.Globalization;
 | 
			
		||||
using System.IO;
 | 
			
		||||
using System.Media;
 | 
			
		||||
using System.Runtime.InteropServices;
 | 
			
		||||
using EnvDTE;
 | 
			
		||||
| 
						 | 
				
			
			@ -8,6 +9,7 @@ using EnvDTE80;
 | 
			
		|||
using Microsoft.VisualStudio.ComponentModelHost;
 | 
			
		||||
using Microsoft.VisualStudio.Shell;
 | 
			
		||||
using Microsoft.VisualStudio.TestWindow.Extensibility;
 | 
			
		||||
using Process = System.Diagnostics.Process;
 | 
			
		||||
 | 
			
		||||
namespace VitaliiGanzha.VsDingExtension
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +17,7 @@ namespace VitaliiGanzha.VsDingExtension
 | 
			
		|||
    [InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)]
 | 
			
		||||
    [Guid(GuidList.guidVsDingExtensionProjectPkgString)]
 | 
			
		||||
    [ProvideAutoLoad("{f1536ef8-92ec-443c-9ed7-fdadf150da82}")]
 | 
			
		||||
    [ProvideOptionPage(typeof(OptionsDialog), "Ding", "Options", 0, 0, true)]
 | 
			
		||||
    public sealed class VsDingExtensionProjectPackage : Package
 | 
			
		||||
    {
 | 
			
		||||
        private DTE2 applicationObject;
 | 
			
		||||
| 
						 | 
				
			
			@ -24,18 +27,33 @@ namespace VitaliiGanzha.VsDingExtension
 | 
			
		|||
        private SoundPlayer buildCompleteSoundPlayer;
 | 
			
		||||
        private SoundPlayer debugSoundPlayer;
 | 
			
		||||
        private SoundPlayer testCompleteSoundPlayer;
 | 
			
		||||
        private bool onlyOnUnFocus;
 | 
			
		||||
        private bool onBuild;
 | 
			
		||||
        private bool onTestRunCompleted;
 | 
			
		||||
        private bool onBreakpoint;
 | 
			
		||||
 | 
			
		||||
        [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
 | 
			
		||||
        private static extern IntPtr GetForegroundWindow();
 | 
			
		||||
 | 
			
		||||
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
 | 
			
		||||
        private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);
 | 
			
		||||
 | 
			
		||||
        public VsDingExtensionProjectPackage()
 | 
			
		||||
        {
 | 
			
		||||
            Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString()));
 | 
			
		||||
            Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", ToString()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        #region Package Members
 | 
			
		||||
 | 
			
		||||
        protected override void OnSaveOptions(string key, Stream stream)
 | 
			
		||||
        {
 | 
			
		||||
            base.OnSaveOptions(key, stream);
 | 
			
		||||
            ApplySettings();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        protected override void Initialize()
 | 
			
		||||
        {
 | 
			
		||||
            Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}",
 | 
			
		||||
                this.ToString()));
 | 
			
		||||
            Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", ToString()));
 | 
			
		||||
            base.Initialize();
 | 
			
		||||
 | 
			
		||||
            buildCompleteSoundPlayer = new SoundPlayer(Resources.build);
 | 
			
		||||
| 
						 | 
				
			
			@ -43,21 +61,25 @@ namespace VitaliiGanzha.VsDingExtension
 | 
			
		|||
            testCompleteSoundPlayer = new SoundPlayer(Resources.ding);
 | 
			
		||||
 | 
			
		||||
            applicationObject = (DTE2)GetService(typeof(DTE));
 | 
			
		||||
            ApplySettings();
 | 
			
		||||
            buildEvents = applicationObject.Events.BuildEvents;
 | 
			
		||||
            debugEvents = applicationObject.Events.DebuggerEvents;
 | 
			
		||||
 | 
			
		||||
            this.buildEvents = applicationObject.Events.BuildEvents;
 | 
			
		||||
            this.debugEvents = applicationObject.Events.DebuggerEvents;
 | 
			
		||||
 | 
			
		||||
            buildEvents.OnBuildDone += (scope, action) => PlaySafe(buildCompleteSoundPlayer);
 | 
			
		||||
            buildEvents.OnBuildDone += (scope, action) =>
 | 
			
		||||
            {
 | 
			
		||||
                if (onBuild)
 | 
			
		||||
                    PlaySafe(buildCompleteSoundPlayer);
 | 
			
		||||
            };
 | 
			
		||||
            debugEvents.OnEnterBreakMode += delegate(dbgEventReason reason, ref dbgExecutionAction action)
 | 
			
		||||
            {
 | 
			
		||||
                if (reason != dbgEventReason.dbgEventReasonStep)
 | 
			
		||||
                if (reason != dbgEventReason.dbgEventReasonStep && onBreakpoint)
 | 
			
		||||
                {
 | 
			
		||||
                    PlaySafe(debugSoundPlayer);
 | 
			
		||||
                }
 | 
			
		||||
            };
 | 
			
		||||
 | 
			
		||||
            var componentModel =
 | 
			
		||||
                Microsoft.VisualStudio.Shell.Package.GetGlobalService(typeof(SComponentModel)) as IComponentModel;
 | 
			
		||||
                GetGlobalService(typeof(SComponentModel)) as IComponentModel;
 | 
			
		||||
 | 
			
		||||
            if (componentModel == null)
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -71,25 +93,52 @@ namespace VitaliiGanzha.VsDingExtension
 | 
			
		|||
 | 
			
		||||
        private void PlaySafe(SoundPlayer soundPlayer)
 | 
			
		||||
        {
 | 
			
		||||
            if (onlyOnUnFocus && !ApplicationIsActivated())
 | 
			
		||||
            {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            try
 | 
			
		||||
            {
 | 
			
		||||
                soundPlayer.Play();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception ex)
 | 
			
		||||
            {
 | 
			
		||||
                ActivityLog.LogError(this.GetType().FullName, ex.Message);
 | 
			
		||||
                ActivityLog.LogError(GetType().FullName, ex.Message);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        private void OperationStateOnStateChanged(object sender, OperationStateChangedEventArgs operationStateChangedEventArgs)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
            if (operationStateChangedEventArgs.State.HasFlag(TestOperationStates.TestExecutionFinished))
 | 
			
		||||
            if (onTestRunCompleted && operationStateChangedEventArgs.State.HasFlag(TestOperationStates.TestExecutionFinished))
 | 
			
		||||
            {
 | 
			
		||||
                PlaySafe(testCompleteSoundPlayer);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        #endregion
 | 
			
		||||
 | 
			
		||||
        private void ApplySettings()
 | 
			
		||||
        {
 | 
			
		||||
            onlyOnUnFocus = (applicationObject.Properties["Ding", "Options"].Item("BeepOnUnfocus").Value as bool?) ?? false;
 | 
			
		||||
            onBreakpoint = (applicationObject.Properties["Ding", "Options"].Item("BreakpointBeep").Value as bool?) ?? true;
 | 
			
		||||
            onTestRunCompleted = (applicationObject.Properties["Ding", "Options"].Item("TestBeep").Value as bool?) ?? true;          
 | 
			
		||||
            onBuild = (applicationObject.Properties["Ding", "Options"].Item("BuildBeep").Value as bool?) ?? true;
 | 
			
		||||
            Debug.WriteLine(string.Format("OnlyOnUnFocus: {0}", onlyOnUnFocus));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        public static bool ApplicationIsActivated()
 | 
			
		||||
        {
 | 
			
		||||
            var activatedHandle = GetForegroundWindow();
 | 
			
		||||
            if (activatedHandle == IntPtr.Zero)
 | 
			
		||||
            {
 | 
			
		||||
                return false;       // No window is currently activated
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            var procId = Process.GetCurrentProcess().Id;
 | 
			
		||||
            int activeProcId;
 | 
			
		||||
            GetWindowThreadProcessId(activatedHandle, out activeProcId);
 | 
			
		||||
 | 
			
		||||
            return activeProcId == procId;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
<?xml version="1.0" encoding="utf-8"?>
 | 
			
		||||
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
 | 
			
		||||
  <Metadata>
 | 
			
		||||
    <Identity Id="26ba08d0-0d25-4479-8684-3054dd122876" Version="1.1" Language="en-US" Publisher="Vitalii Ganzha" />
 | 
			
		||||
    <Identity Id="26ba08d0-0d25-4479-8684-3054dd122876" Version="1.2" Language="en-US" Publisher="Vitalii Ganzha" />
 | 
			
		||||
    <DisplayName>Visual Studio Ding extension</DisplayName>
 | 
			
		||||
    <Description xml:space="preserve">This small extension will play notification sounds when following events occur:
 | 
			
		||||
- Build Complete
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue