diff --git a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs index 9cef375c6..280ec4a10 100644 --- a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs +++ b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs @@ -27,24 +27,27 @@ namespace Microsoft.NodejsTools.Commands { /// Provides the command to import a project from existing code. /// class ImportWizardCommand : Command { + public override void DoCommand(object sender, EventArgs args) { var statusBar = (IVsStatusbar)CommonPackage.GetGlobalService(typeof(SVsStatusbar)); statusBar.SetText("Importing project..."); var dlg = new Microsoft.NodejsTools.Project.ImportWizard.ImportWizard(); + int commandIdToRaise = (int)VSConstants.VSStd97CmdID.OpenProject; Microsoft.VisualStudio.Shell.OleMenuCmdEventArgs oleArgs = args as Microsoft.VisualStudio.Shell.OleMenuCmdEventArgs; if (oleArgs != null) { string projectArgs = oleArgs.InValue as string; if (projectArgs != null) { var argItems = projectArgs.Split('|'); - if (argItems.Length == 2) { + if (argItems.Length == 3) { dlg.ImportSettings.ProjectPath = CommonUtils.GetAvailableFilename( argItems[1], argItems[0], ".njsproj" ); dlg.ImportSettings.SourcePath = argItems[1]; + commandIdToRaise = int.Parse(argItems[2]); } } } @@ -81,7 +84,7 @@ public override void DoCommand(object sender, EventArgs args) { } if (File.Exists(path)) { object outRef = null, pathRef = "\"" + path + "\""; - NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), (int)VSConstants.VSStd97CmdID.OpenProject, ref pathRef, ref outRef); + NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), commandIdToRaise, ref pathRef, ref outRef); statusBar.SetText(String.Empty); } else { statusBar.SetText("An error occurred and your project was not created."); diff --git a/Nodejs/Product/Nodejs/NodejsPackage.cs b/Nodejs/Product/Nodejs/NodejsPackage.cs index cc530fd82..2dac7dbb8 100644 --- a/Nodejs/Product/Nodejs/NodejsPackage.cs +++ b/Nodejs/Product/Nodejs/NodejsPackage.cs @@ -36,6 +36,7 @@ using Microsoft.NodejsTools.Logging; using Microsoft.NodejsTools.Options; using Microsoft.NodejsTools.Project; +using Microsoft.NodejsTools.ProjectWizard; using Microsoft.NodejsTools.Repl; using Microsoft.NodejsTools.Telemetry; using Microsoft.VisualStudio; @@ -110,6 +111,9 @@ internal sealed partial class NodejsPackage : CommonPackage { internal VsProjectAnalyzer _analyzer; private NodejsToolsLogger _logger; private ITelemetryLogger _telemetryLogger; + // Hold references for the subscribed events. Otherwise the callbacks will be garbage collected + // after the initialization + private List _subscribedCommandEvents = new List(); /// /// Default constructor of the package. @@ -190,7 +194,13 @@ protected override void Initialize() { Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString())); base.Initialize(); - var langService = new NodejsLanguageInfo(this); + SubscribeToVsCommandEvents( + (int)VSConstants.VSStd97CmdID.AddNewProject, + delegate { NewProjectFromExistingWizard.IsAddNewProjectCmd = true; }, + delegate { NewProjectFromExistingWizard.IsAddNewProjectCmd = false; } + ); + + var langService = new NodejsLanguageInfo(this); ((IServiceContainer)this).AddService(langService.GetType(), langService, true); ((IServiceContainer)this).AddService(typeof(ClipboardServiceBase), new ClipboardService(), true); @@ -246,6 +256,22 @@ protected override void Initialize() { Environment.SetEnvironmentVariable(NodejsConstants.NodeToolsProcessIdEnvironmentVariable, Process.GetCurrentProcess().Id.ToString()); } + private void SubscribeToVsCommandEvents( + int eventId, + EnvDTE._dispCommandEvents_BeforeExecuteEventHandler beforeExecute = null, + EnvDTE._dispCommandEvents_AfterExecuteEventHandler afterExecute = null) { + var commandEventGuid = typeof(VSConstants.VSStd97CmdID).GUID.ToString("B"); + var targetEvent = DTE.Events.CommandEvents[commandEventGuid, eventId]; + if (beforeExecute != null) { + targetEvent.BeforeExecute += beforeExecute; + } + if (afterExecute != null) { + targetEvent.AfterExecute += afterExecute; + } + _subscribedCommandEvents.Add(targetEvent); + } + + private void IntellisenseOptionsPage_AnalysisLogMaximumChanged(object sender, EventArgs e) { if (_analyzer != null) { _analyzer.MaxLogLength = IntellisenseOptionsPage.AnalysisLogMax; diff --git a/Nodejs/Product/ProjectWizard/ImportWizard.cs b/Nodejs/Product/ProjectWizard/ImportWizard.cs index 0fa117b04..64b24ede0 100644 --- a/Nodejs/Product/ProjectWizard/ImportWizard.cs +++ b/Nodejs/Product/ProjectWizard/ImportWizard.cs @@ -19,12 +19,14 @@ using System.IO; using System.Windows.Forms; using EnvDTE; +using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; -using Microsoft.VisualStudio.TemplateWizard; - +using Microsoft.VisualStudio.TemplateWizard; + namespace Microsoft.NodejsTools.ProjectWizard { public sealed class NewProjectFromExistingWizard : IWizard { + public static Boolean IsAddNewProjectCmd { get; set; } public void BeforeOpeningFile(EnvDTE.ProjectItem projectItem) { } public void ProjectFinishedGenerating(EnvDTE.Project project) { } public void ProjectItemFinishedGenerating(EnvDTE.ProjectItem projectItem) { } @@ -45,6 +47,8 @@ public void RunStarted(object automationObject, Dictionary repla dte = new ServiceProvider(provider).GetService(typeof(DTE)) as DTE; } } + + bool addingNewProject = false; if (dte == null) { MessageBox.Show("Unable to start wizard: no automation object available.", "Node.js Tools for Visual Studio"); } else { @@ -73,10 +77,14 @@ out package directory = Path.GetDirectoryName(Path.GetDirectoryName(replacementsDictionary["$destinationdirectory$"])); } - object inObj = projName + "|" + directory, outObj = null; + var context = addingNewProject ? + (int)VSConstants.VSStd97CmdID.AddExistingProject : + (int)VSConstants.VSStd97CmdID.OpenProject; + object inObj = projName + "|" + directory + "|" + context, outObj = null; dte.Commands.Raise(Guids.NodejsCmdSet.ToString("B"), (int)PkgCmdId.cmdidImportWizard, ref inObj, ref outObj); }); } + addingNewProject = IsAddNewProjectCmd; throw new WizardCancelledException(); }