diff --git a/src/Libraries/AvalonDock/AvalonDock.dll b/src/Libraries/AvalonDock/AvalonDock.dll index 57f4b1e24b..0adc2c8efd 100644 Binary files a/src/Libraries/AvalonDock/AvalonDock.dll and b/src/Libraries/AvalonDock/AvalonDock.dll differ diff --git a/src/Main/Base/Project/Src/Gui/IWorkbench.cs b/src/Main/Base/Project/Src/Gui/IWorkbench.cs index 0931e5677e..c841b1db00 100644 --- a/src/Main/Base/Project/Src/Gui/IWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/IWorkbench.cs @@ -140,11 +140,6 @@ namespace ICSharpCode.SharpDevelop.Gui /// PadDescriptor GetPad(Type type); - /// - /// Closes the IViewContent content when content is open. - /// - void CloseContent(IViewContent content); - /// /// Closes all views inside the workbench. /// diff --git a/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs b/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs index 11e3008cad..be42f1bbb1 100644 --- a/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs +++ b/src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs @@ -79,11 +79,6 @@ namespace ICSharpCode.SharpDevelop.Gui /// bool IsVisible(PadDescriptor padContent); - /// - /// Re-initializes all components of the layout manager. - /// - void RedrawAllComponents(); - /// /// Shows a new . /// diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs index 8496281d95..45fc80a749 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs @@ -29,6 +29,10 @@ namespace ICSharpCode.SharpDevelop.Gui List workbenchWindows = new List(); internal bool Busy; + public WpfWorkbench Workbench { + get { return workbench; } + } + public DockingManager DockingManager { get { return dockingManager; } } @@ -39,12 +43,6 @@ namespace ICSharpCode.SharpDevelop.Gui dockingManager.PropertyChanged += dockingManager_PropertyChanged; } - public void OnWorkbenchWindowClosed(AvalonWorkbenchWindow window) - { - workbenchWindows.Remove(window); - documentPane.Items.Remove(window); - } - void dockingManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == "ActiveContent") { @@ -153,10 +151,6 @@ namespace ICSharpCode.SharpDevelop.Gui return pads[padContent].IsVisible; } - public void RedrawAllComponents() - { - } - public IWorkbenchWindow ShowView(IViewContent content) { AvalonWorkbenchWindow window = new AvalonWorkbenchWindow(this); @@ -165,9 +159,15 @@ namespace ICSharpCode.SharpDevelop.Gui window.ViewContents.AddRange(content.SecondaryViewContents); documentPane.Items.Add(window); dockingManager.Show(window); + window.Closed += window_Closed; return window; } + void window_Closed(object sender, EventArgs e) + { + workbenchWindows.Remove((IWorkbenchWindow)sender); + } + public void LoadConfiguration() { try { 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 a1edf72afc..b6720d839b 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs @@ -293,6 +293,8 @@ namespace ICSharpCode.SharpDevelop.Gui content.TabPageTextChanged += OnTabPageTextChanged; content.TitleNameChanged += OnTitleNameChanged; content.IsDirtyChanged += OnIsDirtyChanged; + + this.dockLayout.Workbench.OnViewOpened(new ViewContentEventArgs(content)); } void UnregisterContent(IViewContent content) @@ -302,6 +304,8 @@ namespace ICSharpCode.SharpDevelop.Gui content.TabPageTextChanged -= OnTabPageTextChanged; content.TitleNameChanged -= OnTitleNameChanged; content.IsDirtyChanged -= OnIsDirtyChanged; + + this.dockLayout.Workbench.OnViewClosed(new ViewContentEventArgs(content)); } void OnTabPageTextChanged(object sender, EventArgs e) @@ -309,9 +313,19 @@ namespace ICSharpCode.SharpDevelop.Gui RefreshTabPageTexts(); } + bool forceClose; + public bool CloseWindow(bool force) { - if (!force && this.IsDirty) { + forceClose = force; + Close(); + return this.ViewContents.Count == 0; + } + + protected override void OnClosing(System.ComponentModel.CancelEventArgs e) + { + base.OnClosing(e); + if (!e.Cancel && !forceClose && this.IsDirty) { MessageBoxResult dr = MessageBox.Show( ResourceService.GetString("MainWindow.SaveChangesMessage"), ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?", @@ -338,14 +352,17 @@ namespace ICSharpCode.SharpDevelop.Gui case MessageBoxResult.No: break; case MessageBoxResult.Cancel: - return false; + e.Cancel = true; + break; } } - - dockLayout.OnWorkbenchWindowClosed(this); + } + + protected override void OnClosed() + { + base.OnClosed(); Dispose(); CommandManager.InvalidateRequerySuggested(); - return true; } public void RedrawContent() diff --git a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs index 51b27a5ac9..533f6e2b2d 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs @@ -31,13 +31,22 @@ namespace ICSharpCode.SharpDevelop.Gui public event EventHandler ActiveContentChanged; public event ViewContentEventHandler ViewOpened; - void OnViewOpened(ViewContentEventArgs e) + internal void OnViewOpened(ViewContentEventArgs e) { if (ViewOpened != null) { ViewOpened(this, e); } } + public event ViewContentEventHandler ViewClosed; + + internal void OnViewClosed(ViewContentEventArgs e) + { + if (ViewClosed != null) { + ViewClosed(this, e); + } + } + public event System.Windows.Forms.KeyEventHandler ProcessCommandKey; public System.Windows.Forms.IWin32Window MainWin32Window { get; private set; } @@ -100,7 +109,7 @@ namespace ICSharpCode.SharpDevelop.Gui public ICollection ViewContentCollection { get { - return WorkbenchWindowCollection.SelectMany(w => w.ViewContents).ToList().ToArray(); + return WorkbenchWindowCollection.SelectMany(w => w.ViewContents).ToList().AsReadOnly(); } } @@ -162,6 +171,9 @@ namespace ICSharpCode.SharpDevelop.Gui void OnActiveWindowChanged(object sender, EventArgs e) { + if (closeAll) + return; + if (workbenchLayout != null) { this.ActiveContent = workbenchLayout.ActiveContent; this.ActiveWorkbenchWindow = workbenchLayout.ActiveWorkbenchWindow; @@ -235,7 +247,6 @@ namespace ICSharpCode.SharpDevelop.Gui WorkbenchLayout.ShowView(content); content.WorkbenchWindow.SelectWindow(); - OnViewOpened(new ViewContentEventArgs(content)); } public void ShowPad(PadDescriptor content) @@ -264,12 +275,22 @@ namespace ICSharpCode.SharpDevelop.Gui return null; } - public void CloseContent(IViewContent content) - { - } + /// + /// Flag used to prevent repeated ActiveWindowChanged events during CloseAllViews(). + /// + bool closeAll; public void CloseAllViews() { + try { + closeAll = true; + foreach (IWorkbenchWindow window in this.WorkbenchWindowCollection.ToArray()) { + window.CloseWindow(false); + } + } finally { + closeAll = false; + OnActiveWindowChanged(this, EventArgs.Empty); + } } public void RedrawAllComponents() diff --git a/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs b/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs index 14a0ce6fea..2c5b20ba79 100644 --- a/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs +++ b/src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs @@ -50,6 +50,8 @@ namespace ICSharpCode.Core } } + static readonly object loadLock = new object(); + /// English strings (list of resource managers) static List strings = new List(); /// Neutral/English images (list of resource managers) @@ -178,33 +180,34 @@ namespace ICSharpCode.Core static void LoadLanguageResources(string language) { - if (ClearCaches != null) - ClearCaches(null, EventArgs.Empty); - - try { - Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); - } catch (Exception) { + lock (loadLock) { try { - Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language.Split('-')[0]); - } catch (Exception) {} - } - - localStrings = Load(stringResources, language); - if (localStrings == null && language.IndexOf('-') > 0) { - localStrings = Load(stringResources, language.Split('-')[0]); - } - - localIcons = Load(imageResources, language); - if (localIcons == null && language.IndexOf('-') > 0) { - localIcons = Load(imageResources, language.Split('-')[0]); - } - - localStringsResMgrs.Clear(); - localIconsResMgrs.Clear(); - currentLanguage = language; - foreach (ResourceAssembly ra in resourceAssemblies) { - ra.Load(); + Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language); + } catch (Exception) { + try { + Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language.Split('-')[0]); + } catch (Exception) {} + } + + localStrings = Load(stringResources, language); + if (localStrings == null && language.IndexOf('-') > 0) { + localStrings = Load(stringResources, language.Split('-')[0]); + } + + localIcons = Load(imageResources, language); + if (localIcons == null && language.IndexOf('-') > 0) { + localIcons = Load(imageResources, language.Split('-')[0]); + } + + localStringsResMgrs.Clear(); + localIconsResMgrs.Clear(); + currentLanguage = language; + foreach (ResourceAssembly ra in resourceAssemblies) { + ra.Load(); + } } + if (ClearCaches != null) + ClearCaches(null, EventArgs.Empty); } static Hashtable Load(string fileName) @@ -241,68 +244,72 @@ namespace ICSharpCode.Core /// public static string GetString(string name) { - if (localStrings != null && localStrings[name] != null) { - return localStrings[name].ToString(); - } - - string s = null; - foreach (ResourceManager resourceManger in localStringsResMgrs) { - try { - s = resourceManger.GetString(name); - } - catch (Exception) { } - - if (s != null) { - break; + lock (loadLock) { + if (localStrings != null && localStrings[name] != null) { + return localStrings[name].ToString(); } - } - - if (s == null) { - foreach (ResourceManager resourceManger in strings) { + + string s = null; + foreach (ResourceManager resourceManger in localStringsResMgrs) { try { s = resourceManger.GetString(name); } catch (Exception) { } - + if (s != null) { break; } } + + if (s == null) { + foreach (ResourceManager resourceManger in strings) { + try { + s = resourceManger.GetString(name); + } + catch (Exception) { } + + if (s != null) { + break; + } + } + } + if (s == null) { + throw new ResourceNotFoundException("string >" + name + "<"); + } + + return s; } - if (s == null) { - throw new ResourceNotFoundException("string >" + name + "<"); - } - - return s; } public static object GetImageResource(string name) { - object iconobj = null; - if (localIcons != null && localIcons[name] != null) { - iconobj = localIcons[name]; - } else { - foreach (ResourceManager resourceManger in localIconsResMgrs) { - iconobj = resourceManger.GetObject(name); - if (iconobj != null) { - break; - } - } - - if (iconobj == null) { - foreach (ResourceManager resourceManger in icons) { - try { - iconobj = resourceManger.GetObject(name); - } - catch (Exception) { } - + lock (loadLock) { + object iconobj = null; + if (localIcons != null && localIcons[name] != null) { + iconobj = localIcons[name]; + } else { + foreach (ResourceManager resourceManger in localIconsResMgrs) { + iconobj = resourceManger.GetObject(name); if (iconobj != null) { break; } } + + if (iconobj == null) { + foreach (ResourceManager resourceManger in icons) { + try { + iconobj = resourceManger.GetObject(name); + } + catch (Exception) { } + + if (iconobj != null) { + break; + } + } + } } + return iconobj; } - return iconobj; } } } diff --git a/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs b/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs index 17da34a931..298a80f148 100644 --- a/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs +++ b/src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs @@ -22,6 +22,18 @@ namespace ICSharpCode.Core.Presentation { static readonly Dictionary bitmapCache = new Dictionary(); + static PresentationResourceService() + { + ResourceService.ClearCaches += ResourceService_ClearCaches; + } + + static void ResourceService_ClearCaches(object sender, EventArgs e) + { + lock (bitmapCache) { + bitmapCache.Clear(); + } + } + /// /// Creates a new System.Windows.Controls.Image object containing the image with the /// specified resource name.