/// <summary> /// Code from Xsd2Code.Addin::Connect /// </summary> private void openConfigurationWindow() { ProjectItem proitem = Dte.SelectedItems.Item(1).ProjectItem; Project proj = proitem.ContainingProject; string projectDirectory = Path.GetDirectoryName(proj.FullName); // Try to get default nameSpace string defaultNamespace = string.Empty; uint? targetFramework = 0; bool? isSilverlightApp = false; try { defaultNamespace = proj.Properties.Item("DefaultNamespace").Value as string; targetFramework = proj.Properties.Item("TargetFramework").Value as uint?; isSilverlightApp = proj.Properties.Item("SilverlightProject.IsSilverlightApplication").Value as bool?; } catch { } string xsdFileName = proitem.FileNames[0]; try { proitem.Save(xsdFileName); } catch (Exception) { } TargetFramework framework = TargetFramework.Net20; if (targetFramework.HasValue) { uint target = targetFramework.Value; switch (target) { case 196608: framework = TargetFramework.Net30; break; case 196613: framework = TargetFramework.Net35; break; case 262144: framework = TargetFramework.Net40; break; } } if (isSilverlightApp.HasValue) { if (isSilverlightApp.Value) { framework = TargetFramework.Silverlight; } } // We associate an outputfile with the selected XSD file to know were to look for the parameters // TODO embed all the parameters as attributes of the XSD file in the project ? IVsHierarchy hierarchy = null; uint itemid; string outputFile = null; IVsBuildPropertyStorage buildPropertyStorage = null; if (IsSingleProjectItemSelection(out hierarchy, out itemid)) { buildPropertyStorage = hierarchy as IVsBuildPropertyStorage; if (buildPropertyStorage != null) { buildPropertyStorage.GetItemAttribute(itemid, "Xsd2CodeOutputFile", out outputFile); } } var frm = new FormOption(); frm.Init(xsdFileName, proj.CodeModel.Language, defaultNamespace, framework, Path.IsPathRooted(outputFile) ? outputFile : Path.Combine(projectDirectory, outputFile ?? string.Empty)); DialogResult result = frm.ShowDialog(); GeneratorParams generatorParams = frm.GeneratorParams.Clone(); generatorParams.InputFilePath = xsdFileName; var gen = new GeneratorFacade(generatorParams); bool foundOutputFile = false; if (xsdFileName.Length > 0) { if (result == DialogResult.OK) { // Close file if open in IDE ProjectItem projElmts = null; if (!String.IsNullOrEmpty(outputFile)) { string rootedOutputFile = Path.IsPathRooted(outputFile) ? outputFile : Path.Combine(projectDirectory, outputFile); foundOutputFile = FindInProject(proj.ProjectItems, rootedOutputFile, out projElmts); if (foundOutputFile) { Window window = projElmts.Open(EnvDTE.Constants.vsViewKindCode); window.Close(vsSaveChanges.vsSaveChangesNo); } } Result <List <string> > generateResult = gen.Generate(); List <string> outputFileNames = generateResult.Entity; if (!generateResult.Success) { MessageBox.Show(generateResult.Messages.ToString(), "XSD2Code", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { string vsProjectOutputFilePath = outputFileNames[0]; // Save one of the output file path so we can read the parameters from it the next time if (buildPropertyStorage != null) { buildPropertyStorage.SetItemAttribute(itemid, "Xsd2CodeOutputFile", GetRelativePath(vsProjectOutputFilePath, projectDirectory)); } // try again now that the generation occured string newRootedOutputFile = Path.Combine(projectDirectory, vsProjectOutputFilePath); foundOutputFile = FindInProject(proj.ProjectItems, newRootedOutputFile, out projElmts); if (!foundOutputFile) { projElmts = proj.ProjectItems.AddFromFile(newRootedOutputFile); } if (frm.OpenAfterGeneration && projElmts != null) { Window window = projElmts.Open(EnvDTE.Constants.vsViewKindCode); window.Activate(); window.SetFocus(); try { // this.applicationObjectField.DTE.ExecuteCommand("Edit.RemoveAndSort", ""); Dte.ExecuteCommand("Edit.FormatDocument", string.Empty); } catch (Exception) { } } } } } return; }
/// <summary> /// This function is the callback used to execute the command when the menu item is clicked. /// See the constructor to see how the menu item is associated with this function using /// OleMenuCommandService service and MenuCommand class. /// </summary> /// <param name="sender">Event sender.</param> /// <param name="e">Event args.</param> private void MenuItemCallback(object sender, EventArgs e) { DTE dte = (DTE)ServiceProvider.GetService(typeof(DTE)); ProjectItem proitem = dte.SelectedItems.Item(1).ProjectItem; Project proj = proitem.ContainingProject; // Try to get default nameSpace string defaultNamespace = string.Empty; uint? targetFramework = 0; bool? isSilverlightApp = false; try { defaultNamespace = proj.Properties.Item("DefaultNamespace").Value as string; targetFramework = proj.Properties.Item("TargetFramework").Value as uint?; isSilverlightApp = proj.Properties.Item("SilverlightProject.IsSilverlightApplication").Value as bool?; } catch { } CodeModel codeModel = proitem.ContainingProject.CodeModel; string fileName = proitem.FileNames[0]; try { proitem.Save(fileName); } catch (Exception) { } TargetFramework framework = TargetFramework.Net20; if (targetFramework.HasValue) { uint target = targetFramework.Value; switch (target) { case 196608: framework = TargetFramework.Net30; break; case 196613: framework = TargetFramework.Net35; break; case 262144: framework = TargetFramework.Net40; break; } } if (isSilverlightApp.HasValue) { if (isSilverlightApp.Value) { framework = TargetFramework.Silverlight; } } var frm = new FormOption(); frm.Init(fileName, proj.CodeModel.Language, defaultNamespace, framework); DialogResult result = frm.ShowDialog(); GeneratorParams generatorParams = frm.GeneratorParams.Clone(); generatorParams.InputFilePath = fileName; var gen = new GeneratorFacade(generatorParams); // Close file if open in IDE ProjectItem projElmts; bool found = FindInProject(proj.ProjectItems, gen.GeneratorParams.OutputFilePath, out projElmts); if (found) { Window window = projElmts.Open(EnvDTE.Constants.vsViewKindCode); window.Close(vsSaveChanges.vsSaveChangesNo); } if (fileName.Length > 0) { if (result == DialogResult.OK) { Result <string> generateResult = gen.Generate(); string outputFileName = generateResult.Entity; if (!generateResult.Success) { MessageBox.Show(generateResult.Messages.ToString(), "XSD2Code", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { if (!found) { projElmts = proitem.Collection.AddFromFile(outputFileName); } if (frm.OpenAfterGeneration) { Window window = projElmts.Open(EnvDTE.Constants.vsViewKindCode); window.Activate(); window.SetFocus(); try { // this.applicationObjectField.DTE.ExecuteCommand("Edit.RemoveAndSort", ""); dte.ExecuteCommand("Edit.FormatDocument", string.Empty); } catch (Exception) { } } } } } }