protected override void OnClosed(EventArgs e) { if (_savedChanges) { // Make sure the current document has the necessary // extensions loaded. // UNDONE: We should be able to do this with the document // closed or open as text as well via a registered service // on the ORMDesignerPackage, but this is sufficient for now. Dictionary <string, string> requiredExtensions = null; string[] loadedExtensions = null; foreach (IORMGenerator selectedGenerator in _mainBranch.SelectedGenerators) { foreach (string requiredExtension in selectedGenerator.GetRequiredExtensionsForInputFormat("ORM")) { if (loadedExtensions == null) { loadedExtensions = (new ORMExtensionManager(_projectItem)).GetLoadedExtensions(_serviceProvider); } if (Array.BinarySearch <string>(loadedExtensions, requiredExtension) < 0) { if (requiredExtensions == null) { requiredExtensions = new Dictionary <string, string>(); } else if (requiredExtensions.ContainsKey(requiredExtension)) { continue; } requiredExtensions.Add(requiredExtension, requiredExtension); } } } if (requiredExtensions != null) { _savedChanges = ORMExtensionManager.EnsureExtensions(_projectItem, _serviceProvider, requiredExtensions.Values); } } if (_savedChanges) { // Delete the removed items from the project if (_removedItems != null) { EnvDTE.ProjectItems subItems = _projectItem.ProjectItems; foreach (string itemName in _removedItems.Keys) { try { EnvDTE.ProjectItem subItem = subItems.Item(itemName); if (subItem != null) { subItem.Delete(); } } catch (ArgumentException) { // Swallow } } } // throw away the original build item group if (_originalItemGroup != null) { try { #if VISUALSTUDIO_10_0 _project.RemoveChild(_originalItemGroup); #else _project.RemoveItemGroup(_originalItemGroup); #endif } catch (InvalidOperationException) { // Swallow } } #if VISUALSTUDIO_10_0 Dictionary <string, ProjectItemElement> removeItems = new Dictionary <string, ProjectItemElement>(); #else Dictionary <string, BuildItem> removeItems = new Dictionary <string, BuildItem>(); #endif string tmpFile = null; try { EnvDTE.ProjectItems projectItems = _projectItem.ProjectItems; #if VISUALSTUDIO_10_0 string itemDirectory = (new FileInfo((string)_project.FullPath)).DirectoryName; foreach (ProjectItemElement item in _itemGroup.Items) #else string itemDirectory = (new FileInfo((string)_project.FullFileName)).DirectoryName; foreach (BuildItem item in this._itemGroup) #endif { string filePath = string.Concat(itemDirectory, Path.DirectorySeparatorChar, item.Include); string fileName = (new FileInfo(item.Include)).Name; if (File.Exists(filePath)) { try { projectItems.AddFromFile(filePath); } catch (ArgumentException) { // Swallow } } else { if (tmpFile == null) { tmpFile = Path.GetTempFileName(); } EnvDTE.ProjectItem projectItem = projectItems.AddFromTemplate(tmpFile, fileName); string customTool = item.GetMetadata(ITEMMETADATA_GENERATOR); if (!string.IsNullOrEmpty(customTool)) { projectItem.Properties.Item("CustomTool").Value = customTool; } } removeItems[item.Include] = null; } } finally { if (tmpFile != null) { File.Delete(tmpFile); } } #if VISUALSTUDIO_10_0 foreach (ProjectItemGroupElement group in this._project.ItemGroups) #else foreach (BuildItemGroup group in this._project.ItemGroups) #endif { if (group.Condition.Trim() == this._itemGroup.Condition.Trim()) { continue; } #if VISUALSTUDIO_10_0 foreach (ProjectItemElement item in group.Items) #else foreach (BuildItem item in group) #endif { if (removeItems.ContainsKey(item.Include)) { removeItems[item.Include] = item; } } } foreach (string key in removeItems.Keys) { #if VISUALSTUDIO_10_0 ProjectItemElement removeItem; ProjectElementContainer removeFrom; if (null != (removeItem = removeItems[key]) && null != (removeFrom = removeItem.Parent)) { removeFrom.RemoveChild(removeItem); } #else BuildItem removeItem = removeItems[key]; if (removeItem != null) { _project.RemoveItem(removeItem); } #endif } VSLangProj.VSProjectItem vsProjectItem = _projectItem.Object as VSLangProj.VSProjectItem; if (vsProjectItem != null) { vsProjectItem.RunCustomTool(); } } else { #if VISUALSTUDIO_10_0 _project.RemoveChild(_itemGroup); #else _project.RemoveItemGroup(_itemGroup); #endif } base.OnClosed(e); }