From 4cf6263988155c6384659976ec4a8d01769d70e2 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 3 Sep 2008 21:43:33 +0000 Subject: [PATCH] Fixed exception during shutdown that caused SharpDevelop to not save any settings. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3480 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../AbstractViewContentHandlingLoadErrors.cs | 2 +- .../Layouts/AvalonWorkbenchWindow.cs | 4 +- .../Base/Project/Src/Util/ExtensionMethods.cs | 39 ++++++++++++++++--- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs b/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs index c97afa1906..90bda7680a 100644 --- a/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs +++ b/src/Main/Base/Project/Src/Gui/AbstractViewContentHandlingLoadErrors.cs @@ -91,7 +91,7 @@ namespace ICSharpCode.SharpDevelop.Gui errorTextBox.Background = SystemColors.WindowBrush; } errorTextBox.Text = ex.ToString(); - contentControl.Content = errorTextBox; + contentControl.SetContent(errorTextBox); } Dictionary errorList = new Dictionary(); diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs index 5794f3b34a..e4b076bd2c 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs @@ -235,7 +235,7 @@ namespace ICSharpCode.SharpDevelop.Gui if (!page.IsFocused) page.Focus(); }; viewTabControl.TabStripPlacement = Dock.Bottom; - this.Content = viewTabControl; + this.SetContent(viewTabControl); viewTabControl.SelectionChanged += delegate { UpdateActiveViewContent(); @@ -248,7 +248,7 @@ namespace ICSharpCode.SharpDevelop.Gui this.Content = null; if (viewTabControl != null) { foreach (TabItem page in viewTabControl.Items) { - page.Content = null; + page.SetContent(null); } viewTabControl = null; } diff --git a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs index 3e1650bde7..4a075b0909 100644 --- a/src/Main/Base/Project/Src/Util/ExtensionMethods.cs +++ b/src/Main/Base/Project/Src/Util/ExtensionMethods.cs @@ -121,23 +121,50 @@ namespace ICSharpCode.SharpDevelop /// If the content is a Windows-Forms control, it is wrapped in a WindowsFormsHost. /// If the content control already contains a WindowsFormsHost with that content, /// the old WindowsFormsHost is kept. + /// When a WindowsFormsHost is replaced with another content, the host is disposed (but the control + /// inside the host isn't) /// public static void SetContent(this ContentControl contentControl, object content) { if (contentControl == null) throw new ArgumentNullException("contentControl"); + var host = contentControl.Content as SDWindowsFormsHost; + if (host != null) { + if (host.Child == content) + return; + host.Dispose(); + } if (content is WinForms.Control) { - var host = contentControl.Content as WinForms.Integration.WindowsFormsHost; - if (host == null || host.Child != content) { - contentControl.Content = new WinForms.Integration.WindowsFormsHost { - Child = (System.Windows.Forms.Control)content - }; - } + contentControl.Content = new SDWindowsFormsHost((WinForms.Control)content); } else if (content is string) { contentControl.Content = new TextBlock(new Run(content.ToString())) { TextWrapping = TextWrapping.Wrap }; } else { contentControl.Content = content; } } + + class SDWindowsFormsHost : WinForms.Integration.WindowsFormsHost + { + public SDWindowsFormsHost(WinForms.Control child) + { + this.Child = child; + child.Disposed += child_Disposed; + } + + void child_Disposed(object sender, EventArgs e) + { + Dispose(); + } + + protected override void Dispose(bool disposing) + { + if (disposing && Child != null) { + Child.Disposed -= child_Disposed; + // prevent child from being disposed + Child = null; + } + base.Dispose(disposing); + } + } } }