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.