From 7ecde12379a75e9ea624b5d004e56e2f17702221 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Thu, 27 Aug 2015 17:40:59 -0700 Subject: [PATCH 1/8] Fix build error --- Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs b/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs index 30af41fb4..dff51e5e1 100644 --- a/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs +++ b/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs @@ -477,7 +477,7 @@ protected override void Reload() { var ignoredPaths = GetProjectProperty(NodejsConstants.AnalysisIgnoredDirectories); if (!string.IsNullOrWhiteSpace(ignoredPaths)) { - _analysisIgnoredDirs.Append(ignoredPaths.Split(';').Select(x => '\\' + x + '\\').ToArray()); + _analysisIgnoredDirs = _analysisIgnoredDirs.Concat(ignoredPaths.Split(';').Select(x => '\\' + x + '\\').ToArray()).ToArray(); } var maxFileSizeProp = GetProjectProperty(NodejsConstants.AnalysisMaxFileSize); From 98c81c1bc4b5a791002e777915a2b0d0f34d9845 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Thu, 27 Aug 2015 17:41:34 -0700 Subject: [PATCH 2/8] Revert "Remove duplicate targets include" This reverts commit a02e74189ff40f82e230599b87ba183d33d766c6. --- .../InstallerTelemetryAction/InstallerTelemetryAction.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Nodejs/Setup/InstallerTelemetryAction/InstallerTelemetryAction.csproj b/Nodejs/Setup/InstallerTelemetryAction/InstallerTelemetryAction.csproj index ee0571d23..d7254662b 100644 --- a/Nodejs/Setup/InstallerTelemetryAction/InstallerTelemetryAction.csproj +++ b/Nodejs/Setup/InstallerTelemetryAction/InstallerTelemetryAction.csproj @@ -63,6 +63,7 @@ + \ No newline at end of file From 9f97d72aec605e32b5983ea9db76b80ae7db5a5f Mon Sep 17 00:00:00 2001 From: zhengbli Date: Fri, 28 Aug 2015 11:17:40 -0700 Subject: [PATCH 3/8] Change the command for adding new project from existing code --- Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs index 9cef375c6..44ec5d395 100644 --- a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs +++ b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs @@ -81,7 +81,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"), (int)VSConstants.VSStd97CmdID.AddExistingProject, ref pathRef, ref outRef); statusBar.SetText(String.Empty); } else { statusBar.SetText("An error occurred and your project was not created."); From 1fb97ac1877bd0c95626d37a8c188bb2566af3c2 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Fri, 28 Aug 2015 11:22:13 -0700 Subject: [PATCH 4/8] Revert "Fix build error" This reverts commit 7ecde12379a75e9ea624b5d004e56e2f17702221. --- Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs b/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs index dff51e5e1..30af41fb4 100644 --- a/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs +++ b/Nodejs/Product/Nodejs/Project/NodejsProjectNode.cs @@ -477,7 +477,7 @@ protected override void Reload() { var ignoredPaths = GetProjectProperty(NodejsConstants.AnalysisIgnoredDirectories); if (!string.IsNullOrWhiteSpace(ignoredPaths)) { - _analysisIgnoredDirs = _analysisIgnoredDirs.Concat(ignoredPaths.Split(';').Select(x => '\\' + x + '\\').ToArray()).ToArray(); + _analysisIgnoredDirs.Append(ignoredPaths.Split(';').Select(x => '\\' + x + '\\').ToArray()); } var maxFileSizeProp = GetProjectProperty(NodejsConstants.AnalysisMaxFileSize); From a3235bea25cf7e2b6a7aa8077e407fedf95988ce Mon Sep 17 00:00:00 2001 From: zhengbli Date: Mon, 31 Aug 2015 12:01:24 -0700 Subject: [PATCH 5/8] Raise different commands for new projects from existing code --- Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs index 44ec5d395..16660491c 100644 --- a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs +++ b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs @@ -81,7 +81,15 @@ 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.AddExistingProject, ref pathRef, ref outRef); + var addExistingProjectCmd = NodejsPackage.Instance.DTE.Commands.Item("File.AddExistingProject"); + if (addExistingProjectCmd.IsAvailable) + { + NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), (int)VSConstants.VSStd97CmdID.AddExistingProject, ref pathRef, ref outRef); + } + else + { + NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), (int)VSConstants.VSStd97CmdID.OpenProject, ref pathRef, ref outRef); + } statusBar.SetText(String.Empty); } else { statusBar.SetText("An error occurred and your project was not created."); From 40231213d383bce36299799985120fa692a9e935 Mon Sep 17 00:00:00 2001 From: zhengbli Date: Tue, 1 Sep 2015 17:12:12 -0700 Subject: [PATCH 6/8] Make the ImportWizardCommand aware of the context --- .../Product/Nodejs/Commands/ImportWizardCommand.cs | 12 ++++++------ Nodejs/Product/Nodejs/NodejsPackage.cs | 14 ++++++++++++++ Nodejs/Product/ProjectWizard/ImportWizard.cs | 7 ++++++- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs index 16660491c..a78e2dfa1 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(); + String context = ""; 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]; + context = argItems[2]; } } } @@ -81,13 +84,10 @@ public override void DoCommand(object sender, EventArgs args) { } if (File.Exists(path)) { object outRef = null, pathRef = "\"" + path + "\""; - var addExistingProjectCmd = NodejsPackage.Instance.DTE.Commands.Item("File.AddExistingProject"); - if (addExistingProjectCmd.IsAvailable) - { + if (context == "AddNewProject") { NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), (int)VSConstants.VSStd97CmdID.AddExistingProject, ref pathRef, ref outRef); } - else - { + else { NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), (int)VSConstants.VSStd97CmdID.OpenProject, ref pathRef, ref outRef); } statusBar.SetText(String.Empty); diff --git a/Nodejs/Product/Nodejs/NodejsPackage.cs b/Nodejs/Product/Nodejs/NodejsPackage.cs index cc530fd82..714725ffc 100644 --- a/Nodejs/Product/Nodejs/NodejsPackage.cs +++ b/Nodejs/Product/Nodejs/NodejsPackage.cs @@ -38,6 +38,7 @@ using Microsoft.NodejsTools.Project; using Microsoft.NodejsTools.Repl; using Microsoft.NodejsTools.Telemetry; +using Microsoft.NodejsTools.ProjectWizard; using Microsoft.VisualStudio; using Microsoft.VisualStudio.ComponentModelHost; using Microsoft.VisualStudio.Debugger.Interop; @@ -182,6 +183,8 @@ public EnvDTE.DTE DTE { // Overridden Package Implementation #region Package Members + private List subscribedCommandEvents = new List(); + /// /// 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. @@ -190,6 +193,17 @@ protected override void Initialize() { Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString())); base.Initialize(); + var addNewProjectGuid = typeof(VSConstants.VSStd97CmdID).GUID.ToString("B"); + var addNewProjectId = (int)VSConstants.VSStd97CmdID.AddNewProject; + var addNewProjectEvent = DTE.Events.CommandEvents[addNewProjectGuid, addNewProjectId]; + addNewProjectEvent.BeforeExecute += delegate { + NewProjectFromExistingWizard.AddingNewProject = true; + }; + addNewProjectEvent.AfterExecute += delegate { + NewProjectFromExistingWizard.AddingNewProject = false; + }; + subscribedCommandEvents.Add(addNewProjectEvent); + var langService = new NodejsLanguageInfo(this); ((IServiceContainer)this).AddService(langService.GetType(), langService, true); diff --git a/Nodejs/Product/ProjectWizard/ImportWizard.cs b/Nodejs/Product/ProjectWizard/ImportWizard.cs index 0fa117b04..bdb7e6a2f 100644 --- a/Nodejs/Product/ProjectWizard/ImportWizard.cs +++ b/Nodejs/Product/ProjectWizard/ImportWizard.cs @@ -29,6 +29,7 @@ public void BeforeOpeningFile(EnvDTE.ProjectItem projectItem) { } public void ProjectFinishedGenerating(EnvDTE.Project project) { } public void ProjectItemFinishedGenerating(EnvDTE.ProjectItem projectItem) { } public void RunFinished() { } + public static Boolean AddingNewProject { get; set; } = false; public void RunStarted(object automationObject, Dictionary replacementsDictionary, WizardRunKind runKind, object[] customParams) { try { @@ -45,6 +46,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 +76,12 @@ out package directory = Path.GetDirectoryName(Path.GetDirectoryName(replacementsDictionary["$destinationdirectory$"])); } - object inObj = projName + "|" + directory, outObj = null; + var context = addingNewProject ? "AddNewProject" : "OpenProject"; + object inObj = projName + "|" + directory + "|" + context, outObj = null; dte.Commands.Raise(Guids.NodejsCmdSet.ToString("B"), (int)PkgCmdId.cmdidImportWizard, ref inObj, ref outObj); }); } + addingNewProject = AddingNewProject; throw new WizardCancelledException(); } From f7039bd2a6c1db26c7f046e53c8514cbb5d7830d Mon Sep 17 00:00:00 2001 From: zhengbli Date: Tue, 1 Sep 2015 17:16:34 -0700 Subject: [PATCH 7/8] Add comments --- Nodejs/Product/Nodejs/NodejsPackage.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Nodejs/Product/Nodejs/NodejsPackage.cs b/Nodejs/Product/Nodejs/NodejsPackage.cs index 714725ffc..bbc5f1749 100644 --- a/Nodejs/Product/Nodejs/NodejsPackage.cs +++ b/Nodejs/Product/Nodejs/NodejsPackage.cs @@ -183,6 +183,8 @@ public EnvDTE.DTE DTE { // Overridden Package Implementation #region Package Members + // Hold references for the subscribed events. Otherwise the callbacks will be garbage collected + // after the initialization private List subscribedCommandEvents = new List(); /// From 1e5a088212bcea5838bec3271a4d08910e5a359b Mon Sep 17 00:00:00 2001 From: zhengbli Date: Fri, 4 Sep 2015 00:12:50 -0700 Subject: [PATCH 8/8] cr feedback --- .../Nodejs/Commands/ImportWizardCommand.cs | 11 ++--- Nodejs/Product/Nodejs/NodejsPackage.cs | 42 ++++++++++++------- Nodejs/Product/ProjectWizard/ImportWizard.cs | 13 +++--- 3 files changed, 37 insertions(+), 29 deletions(-) diff --git a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs index a78e2dfa1..280ec4a10 100644 --- a/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs +++ b/Nodejs/Product/Nodejs/Commands/ImportWizardCommand.cs @@ -33,7 +33,7 @@ public override void DoCommand(object sender, EventArgs args) { statusBar.SetText("Importing project..."); var dlg = new Microsoft.NodejsTools.Project.ImportWizard.ImportWizard(); - String context = ""; + int commandIdToRaise = (int)VSConstants.VSStd97CmdID.OpenProject; Microsoft.VisualStudio.Shell.OleMenuCmdEventArgs oleArgs = args as Microsoft.VisualStudio.Shell.OleMenuCmdEventArgs; if (oleArgs != null) { @@ -47,7 +47,7 @@ public override void DoCommand(object sender, EventArgs args) { ".njsproj" ); dlg.ImportSettings.SourcePath = argItems[1]; - context = argItems[2]; + commandIdToRaise = int.Parse(argItems[2]); } } } @@ -84,12 +84,7 @@ public override void DoCommand(object sender, EventArgs args) { } if (File.Exists(path)) { object outRef = null, pathRef = "\"" + path + "\""; - if (context == "AddNewProject") { - NodejsPackage.Instance.DTE.Commands.Raise(VSConstants.GUID_VSStandardCommandSet97.ToString("B"), (int)VSConstants.VSStd97CmdID.AddExistingProject, ref pathRef, ref outRef); - } - else { - 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 bbc5f1749..2dac7dbb8 100644 --- a/Nodejs/Product/Nodejs/NodejsPackage.cs +++ b/Nodejs/Product/Nodejs/NodejsPackage.cs @@ -36,9 +36,9 @@ 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.NodejsTools.ProjectWizard; using Microsoft.VisualStudio; using Microsoft.VisualStudio.ComponentModelHost; using Microsoft.VisualStudio.Debugger.Interop; @@ -111,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. @@ -183,10 +186,6 @@ public EnvDTE.DTE DTE { // Overridden Package Implementation #region Package Members - // Hold references for the subscribed events. Otherwise the callbacks will be garbage collected - // after the initialization - private List subscribedCommandEvents = new List(); - /// /// 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. @@ -195,18 +194,13 @@ protected override void Initialize() { Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering Initialize() of: {0}", this.ToString())); base.Initialize(); - var addNewProjectGuid = typeof(VSConstants.VSStd97CmdID).GUID.ToString("B"); - var addNewProjectId = (int)VSConstants.VSStd97CmdID.AddNewProject; - var addNewProjectEvent = DTE.Events.CommandEvents[addNewProjectGuid, addNewProjectId]; - addNewProjectEvent.BeforeExecute += delegate { - NewProjectFromExistingWizard.AddingNewProject = true; - }; - addNewProjectEvent.AfterExecute += delegate { - NewProjectFromExistingWizard.AddingNewProject = false; - }; - subscribedCommandEvents.Add(addNewProjectEvent); + SubscribeToVsCommandEvents( + (int)VSConstants.VSStd97CmdID.AddNewProject, + delegate { NewProjectFromExistingWizard.IsAddNewProjectCmd = true; }, + delegate { NewProjectFromExistingWizard.IsAddNewProjectCmd = false; } + ); - var langService = new NodejsLanguageInfo(this); + var langService = new NodejsLanguageInfo(this); ((IServiceContainer)this).AddService(langService.GetType(), langService, true); ((IServiceContainer)this).AddService(typeof(ClipboardServiceBase), new ClipboardService(), true); @@ -262,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 bdb7e6a2f..64b24ede0 100644 --- a/Nodejs/Product/ProjectWizard/ImportWizard.cs +++ b/Nodejs/Product/ProjectWizard/ImportWizard.cs @@ -19,17 +19,18 @@ 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) { } public void RunFinished() { } - public static Boolean AddingNewProject { get; set; } = false; public void RunStarted(object automationObject, Dictionary replacementsDictionary, WizardRunKind runKind, object[] customParams) { try { @@ -76,12 +77,14 @@ out package directory = Path.GetDirectoryName(Path.GetDirectoryName(replacementsDictionary["$destinationdirectory$"])); } - var context = addingNewProject ? "AddNewProject" : "OpenProject"; + 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 = AddingNewProject; + addingNewProject = IsAddNewProjectCmd; throw new WizardCancelledException(); }