using System;
using System.ComponentModel.Design;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio;
using Microsoft.VisualStudio.OLE.Interop;
using Microsoft.VisualStudio.Shell;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.Win32;
using System.Threading.Tasks;
using Microsoft.VisualStudio.Threading;
using System.Threading;
using Task = System.Threading.Tasks.Task;
namespace TestExecWin
{
[PackageRegistration(UseManagedResourcesOnly = true, AllowsBackgroundLoading = true)]
[InstalledProductRegistration("#110", "#112", "1.3", IconResourceID = 400)]
[ProvideMenuResource("Menus.ctmenu", 1)]
[ProvideToolWindow(typeof(TestExecWindow))]
[ProvideAutoLoad(VSConstants.UICONTEXT.SolutionExistsAndFullyLoaded_string, PackageAutoLoadFlags.BackgroundLoad)]
[Guid(TestExecWindowPackage.PackageGuidString)]
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")]
public sealed class TestExecWindowPackage : AsyncPackage
{
private EnvDTE80.DTE2 dte;
private DteInitializer dteInitializer;
public const string PackageGuidString = "452b9afb-c2c1-462b-885d-5e6986f6aad5";
public TestExecWindowPackage()
{
}
private void InitializeDTE()
{
Debug.WriteLine("InitializeDTE-Begin");
this.dte = this.GetService(typeof(Microsoft.VisualStudio.Shell.Interop.SDTE))
as EnvDTE80.DTE2;
Executor.dte = this.dte;
VisualStudioConnector.dte = this.dte;
if (this.dte == null)
{
Debug.WriteLine("InitializeDTE: DTE is not yet fully initialized");
IVsShell shellService;
shellService = this.GetService(typeof(SVsShell)) as IVsShell;
this.dteInitializer = new DteInitializer(shellService, this.InitializeDTE);
}
else
{
Debug.WriteLine("InitializeDTE: DTE is set");
this.dteInitializer = null;
}
Debug.WriteLine("InitializeDTE-End");
}
#region Package Members
protected override async Task InitializeAsync(CancellationToken cancellationToken, IProgress<Microsoft.VisualStudio.Shell.ServiceProgressData> progress)
{
await Task.Delay(5000);
await JoinableTaskFactory.SwitchToMainThreadAsync(cancellationToken);
TestExecWindowCommand.Initialize(this);
base.Initialize();
InitializeDTE();
}
#endregion
}
internal class DteInitializer : IVsShellPropertyEvents
{
private IVsShell shellService;
private uint cookie;
private Action callback;
internal DteInitializer(IVsShell shellService, Action callback)
{
int hr;
this.shellService = shellService;
this.callback = callback;
hr = this.shellService.AdviseShellPropertyChanges(this, out this.cookie);
Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hr);
}
int IVsShellPropertyEvents.OnShellPropertyChange(int propid, object var)
{
int hr;
bool isZombie;
if (propid == (int)__VSSPROPID.VSSPROPID_Zombie)
{
isZombie = (bool)var;
if (!isZombie)
{
hr = this.shellService.UnadviseShellPropertyChanges(this.cookie);
Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(hr);
this.cookie = 0;
this.callback();
}
}
return VSConstants.S_OK;
}
}
}