private void FSharpUpdateReferenceCallback(object sender, EventArgs e) { var projectItem = VSIXUtils.GetSelectObject <ProjectItem>(); _outputWindow.Show(); _outputWindow.WriteLine("--- Updating ServiceStack Reference '" + projectItem.Name + "' ---"); string projectItemPath = projectItem.Properties.Item("FullPath").Value.ToString(); var selectedFiles = projectItem.DTE.SelectedItems.Cast <SelectedItem>().ToList(); bool selectedFSharpDto = selectedFiles.Any((item) => item.Name.ToLowerInvariant().EndsWith(".dto.fs")); if (selectedFSharpDto) { string filePath = projectItemPath; var fSharpCodeAllLines = File.ReadAllLines(filePath).ToList(); string lineWithBaseUrl = fSharpCodeAllLines.FirstOrDefault(x => x.StartsWithIgnoreCase("BaseUrl: ")); if (lineWithBaseUrl == null) { _outputWindow.WriteLine("Unable to read URL from DTO file. Please ensure the file was generated correctly from a ServiceStack server."); return; } string baseUrl = lineWithBaseUrl.Substring(lineWithBaseUrl.IndexOf(" ", System.StringComparison.Ordinal)).Trim(); string appendFSharpPath = "types/fsharp"; string fSharpUrl = baseUrl.EndsWith("/") ? baseUrl + appendFSharpPath : baseUrl + "/" + appendFSharpPath; string updatedCode = new WebClient().DownloadString(fSharpUrl); using (var streamWriter = File.CreateText(filePath)) { streamWriter.Write(updatedCode); streamWriter.Flush(); } _outputWindow.WriteLine("--- Update ServiceStack Reference Complete ---"); } }
private void AddNewDtoFileToProject(string fileName, string templateCode, List <string> nugetPackages = null) { nugetPackages = nugetPackages ?? new List <string>(); var project = VSIXUtils.GetSelectedProject() ?? VSIXUtils.GetSelectObject <ProjectItem>().ContainingProject; // This is a temporary work around for ServiceStack *.Core packages whilst they are separate/in beta. // This is to be removed/updated once the Text, Client and/or Interfaces NuGet packages support NetCore by default. nugetPackages = ApplyNetCoreNuGetPackages(nugetPackages, project); var path = VSIXUtils.GetSelectedProjectPath() ?? VSIXUtils.GetSelectedFolderPath(); string fullPath = Path.Combine(path, fileName); using (var streamWriter = File.CreateText(fullPath)) { streamWriter.Write(templateCode); streamWriter.Flush(); } // HACK avoid VS2015 Update 2 seems to detect file in use semi regularly. Thread.Sleep(20); var newDtoFile = project.ProjectItems.AddFromFile(fullPath); newDtoFile.Open(EnvDTE.Constants.vsViewKindCode); newDtoFile.Save(); foreach (var nugetPackage in nugetPackages) { AddNuGetDependencyIfMissing(project, nugetPackage); } project.Save(); }
private void FSharpQueryAndAddUpdateMenuItem(object sender, EventArgs eventArgs) { OleMenuCommand command = (OleMenuCommand)sender; var monitorSelection = (IVsMonitorSelection)GetService(typeof(IVsMonitorSelection)); Guid guid = VSConstants.UICONTEXT.SolutionExistsAndNotBuildingAndNotDebugging_guid; uint contextCookie; int pfActive; monitorSelection.GetCmdUIContextCookie(ref guid, out contextCookie); var result = monitorSelection.IsCmdUIContextActive(contextCookie, out pfActive); var ready = result == VSConstants.S_OK && pfActive > 0; ProjectItem projectItem = VSIXUtils.GetSelectObject <ProjectItem>(); var selectedFiles = projectItem.DTE.SelectedItems.Cast <SelectedItem>(); bool selectedFSharpDto = selectedFiles.Any((item) => item.Name.ToLowerInvariant().EndsWith(".dto.fs")); command.Enabled = ready && selectedFSharpDto && projectItem.Kind != null && //Project is not unloaded !string.Equals(projectItem.ContainingProject.Kind, "{67294A52-A4F0-11D2-AA88-00C04F688DDE}", StringComparison.InvariantCultureIgnoreCase); command.Visible = selectedFSharpDto && projectItem.Kind != null && //Project is FSharp project string.Equals(projectItem.ContainingProject.Kind, "{F2A71F9B-5D33-465A-A702-920D77279786}", StringComparison.InvariantCultureIgnoreCase); }
private void AddNewDtoFileToProject(string fileName, string templateCode, List <string> nugetPackages = null) { nugetPackages = nugetPackages ?? new List <string>(); var project = VSIXUtils.GetSelectedProject() ?? VSIXUtils.GetSelectObject <ProjectItem>().ContainingProject; var path = VSIXUtils.GetSelectedProjectPath() ?? VSIXUtils.GetSelectedFolderPath(); string fullPath = Path.Combine(path, fileName); using (var streamWriter = File.CreateText(fullPath)) { streamWriter.Write(templateCode); streamWriter.Flush(); } // HACK avoid VS2015 Update 2 seems to detect file in use semi regularly. Thread.Sleep(20); var newDtoFile = project.ProjectItems.AddFromFile(fullPath); newDtoFile.Open(EnvDTE.Constants.vsViewKindCode); newDtoFile.Save(); foreach (var nugetPackage in nugetPackages) { AddNuGetDependencyIfMissing(project, nugetPackage); } project.Save(); }
private void UpdateReferenceCallback(object sender, EventArgs e) { var projectItem = VSIXUtils.GetSelectObject <ProjectItem>(); var selectedFiles = projectItem.DTE.SelectedItems.Cast <SelectedItem>(); var selectedItems = selectedFiles as IList <SelectedItem> ?? selectedFiles.ToList(); var typeHandlers = selectedItems.GetTypeHandlerForSelectedFiles(); if (typeHandlers.Count == 0) { return; } var typesHandler = typeHandlers.First(); UpdateGeneratedDtos(projectItem, typesHandler); }
private void QueryUpdateMenuItem(object sender, EventArgs eventArgs) { var command = (OleMenuCommand)sender; var ready = IsProjectReady(); var projectItem = VSIXUtils.GetSelectObject <ProjectItem>(); var selectedFiles = projectItem.DTE.SelectedItems.Cast <SelectedItem>(); var selectedItems = selectedFiles as IList <SelectedItem> ?? selectedFiles.ToList(); bool visible = projectItem.ContainingProject != null && projectItem.ContainingProject.Kind != null && //Project is not unloaded !string.Equals(projectItem.ContainingProject.Kind, VsHelperGuids.ProjectUnloaded, StringComparison.InvariantCultureIgnoreCase); if (!visible) { command.Visible = false; command.Enabled = false; return; } var typeHandlers = selectedItems.GetTypeHandlerForSelectedFiles(); if (typeHandlers.Count == 0) { command.Visible = false; command.Enabled = false; return; } var typeHandler = typeHandlers.First(); bool validVsProjectType = typeHandler.ValidVsProjectTypeGuids().FirstOrDefault( projectTypeGuid => string.Equals(projectItem.ContainingProject.Kind, projectTypeGuid, StringComparison.InvariantCultureIgnoreCase)) != null; // Ensure update button is visable and project is 'ready' (of right type and not building) or item clicked is typescript dtos file. bool enabled = ready || (typeHandler.GetType() == typeof(TypeScriptNativeTypesHandler) || typeHandler.GetType() == typeof(TypeScriptConcreteNativeTypesHandler)); command.Visible = validVsProjectType; command.Enabled = enabled; }
private void QueryUpdateMenuItem(object sender, EventArgs eventArgs) { var command = (OleMenuCommand)sender; var ready = IsProjectReady(); var projectItem = VSIXUtils.GetSelectObject <ProjectItem>(); var selectedFiles = projectItem.DTE.SelectedItems.Cast <SelectedItem>(); var selectedItems = selectedFiles as IList <SelectedItem> ?? selectedFiles.ToList(); var typeHandlers = selectedItems.GetTypeHandlerForSelectedFiles(); if (typeHandlers.Count > 0) { var typeHandler = typeHandlers.First(); bool validVsProjectType = typeHandler.ValidVsProjectTypeGuids().FirstOrDefault( projectTypeGuid => string.Equals(projectItem.ContainingProject.Kind, projectTypeGuid, StringComparison.InvariantCultureIgnoreCase)) != null; bool visible = projectItem.ContainingProject != null && projectItem.ContainingProject.Kind != null && //Project is not unloaded !string.Equals(projectItem.ContainingProject.Kind, VsHelperGuids.ProjectUnloaded, StringComparison.InvariantCultureIgnoreCase) && validVsProjectType; bool enabled = visible && ready; command.Visible = enabled; command.Enabled = enabled; } else { command.Visible = false; command.Enabled = false; } }
private void AddNewDtoFileToProject(string fileName, string templateCode, List <string> nugetPackages = null) { nugetPackages = nugetPackages ?? new List <string>(); var project = VSIXUtils.GetSelectedProject() ?? VSIXUtils.GetSelectObject <ProjectItem>().ContainingProject; var path = VSIXUtils.GetSelectedProjectPath() ?? VSIXUtils.GetSelectedFolderPath(); string fullPath = Path.Combine(path, fileName); File.WriteAllText(fullPath, templateCode); try { // HACK avoid VS2015 Update 2 seems to detect file in use semi regularly. Thread.Sleep(50); var newDtoFile = project.ProjectItems.AddFromFile(fullPath); newDtoFile.Open(EnvDteConstants.vsViewKindCode); newDtoFile.Save(); } catch (Exception) {} try { foreach (var nugetPackage in nugetPackages) { AddNuGetDependencyIfMissing(project, nugetPackage); } } catch (Exception) {} try { project.Save(); } catch (Exception) {} }