public static void ShowDialog(IServiceProvider serviceProvider, ORMDesignerDocData docData) { ExtensionManager extensionManager = new ExtensionManager(docData.Store); IWin32Window dialogOwner = Utility.GetDialogOwnerWindow(serviceProvider); if (extensionManager.ShowDialog(dialogOwner) == DialogResult.OK) { // TODO: Prompt the user to make sure they really want us to start deleting stuff... ListView.CheckedListViewItemCollection checkedItems = extensionManager.lvExtensions.CheckedItems; ExtensionLoader extensionLoader = ORMDesignerPackage.ExtensionLoader; IDictionary<string, ExtensionModelBinding> availableExtensions = extensionLoader.AvailableCustomExtensions; Dictionary<string, ExtensionModelBinding> checkedTypes = new Dictionary<string, ExtensionModelBinding>(availableExtensions.Count); foreach (ListViewItem listViewItem in checkedItems) { string extensionNamespace = (string)listViewItem.Tag; checkedTypes.Add(extensionNamespace, availableExtensions[extensionNamespace]); } // Make sure all required extensions are turned on. This will turn previously ignored // secondary extensions back on. extensionLoader.VerifyRequiredExtensions(ref checkedTypes); Stream currentStream = null; Stream newStream = null; try { Object streamObj; (docData as EnvDTE.IExtensibleObject).GetAutomationObject("ORMXmlStream", null, out streamObj); currentStream = streamObj as Stream; Debug.Assert(currentStream != null); newStream = ExtensionLoader.CleanupStream(currentStream, extensionLoader.StandardDomainModels, checkedTypes.Values, null); docData.ReloadFromStream(newStream, currentStream); } finally { if (currentStream != null) { currentStream.Dispose(); } if (newStream != null) { newStream.Dispose(); } } } }