Browse Source

Upgrade to new AvalonDock version, support for ViewClosed event.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/3.0wpf@3450 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
90e697e7b7
  1. BIN
      src/Libraries/AvalonDock/AvalonDock.dll
  2. 5
      src/Main/Base/Project/Src/Gui/IWorkbench.cs
  3. 5
      src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs
  4. 20
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs
  5. 27
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs
  6. 33
      src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs
  7. 141
      src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs
  8. 12
      src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs

BIN
src/Libraries/AvalonDock/AvalonDock.dll

Binary file not shown.

5
src/Main/Base/Project/Src/Gui/IWorkbench.cs

@ -140,11 +140,6 @@ namespace ICSharpCode.SharpDevelop.Gui
/// </summary> /// </summary>
PadDescriptor GetPad(Type type); PadDescriptor GetPad(Type type);
/// <summary>
/// Closes the IViewContent content when content is open.
/// </summary>
void CloseContent(IViewContent content);
/// <summary> /// <summary>
/// Closes all views inside the workbench. /// Closes all views inside the workbench.
/// </summary> /// </summary>

5
src/Main/Base/Project/Src/Gui/IWorkbenchLayout.cs

@ -79,11 +79,6 @@ namespace ICSharpCode.SharpDevelop.Gui
/// </summary> /// </summary>
bool IsVisible(PadDescriptor padContent); bool IsVisible(PadDescriptor padContent);
/// <summary>
/// Re-initializes all components of the layout manager.
/// </summary>
void RedrawAllComponents();
/// <summary> /// <summary>
/// Shows a new <see cref="IViewContent"/>. /// Shows a new <see cref="IViewContent"/>.
/// </summary> /// </summary>

20
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonDockLayout.cs

@ -29,6 +29,10 @@ namespace ICSharpCode.SharpDevelop.Gui
List<IWorkbenchWindow> workbenchWindows = new List<IWorkbenchWindow>(); List<IWorkbenchWindow> workbenchWindows = new List<IWorkbenchWindow>();
internal bool Busy; internal bool Busy;
public WpfWorkbench Workbench {
get { return workbench; }
}
public DockingManager DockingManager { public DockingManager DockingManager {
get { return dockingManager; } get { return dockingManager; }
} }
@ -39,12 +43,6 @@ namespace ICSharpCode.SharpDevelop.Gui
dockingManager.PropertyChanged += dockingManager_PropertyChanged; 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) void dockingManager_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
if (e.PropertyName == "ActiveContent") { if (e.PropertyName == "ActiveContent") {
@ -153,10 +151,6 @@ namespace ICSharpCode.SharpDevelop.Gui
return pads[padContent].IsVisible; return pads[padContent].IsVisible;
} }
public void RedrawAllComponents()
{
}
public IWorkbenchWindow ShowView(IViewContent content) public IWorkbenchWindow ShowView(IViewContent content)
{ {
AvalonWorkbenchWindow window = new AvalonWorkbenchWindow(this); AvalonWorkbenchWindow window = new AvalonWorkbenchWindow(this);
@ -165,9 +159,15 @@ namespace ICSharpCode.SharpDevelop.Gui
window.ViewContents.AddRange(content.SecondaryViewContents); window.ViewContents.AddRange(content.SecondaryViewContents);
documentPane.Items.Add(window); documentPane.Items.Add(window);
dockingManager.Show(window); dockingManager.Show(window);
window.Closed += window_Closed;
return window; return window;
} }
void window_Closed(object sender, EventArgs e)
{
workbenchWindows.Remove((IWorkbenchWindow)sender);
}
public void LoadConfiguration() public void LoadConfiguration()
{ {
try { try {

27
src/Main/Base/Project/Src/Gui/Workbench/Layouts/AvalonWorkbenchWindow.cs

@ -293,6 +293,8 @@ namespace ICSharpCode.SharpDevelop.Gui
content.TabPageTextChanged += OnTabPageTextChanged; content.TabPageTextChanged += OnTabPageTextChanged;
content.TitleNameChanged += OnTitleNameChanged; content.TitleNameChanged += OnTitleNameChanged;
content.IsDirtyChanged += OnIsDirtyChanged; content.IsDirtyChanged += OnIsDirtyChanged;
this.dockLayout.Workbench.OnViewOpened(new ViewContentEventArgs(content));
} }
void UnregisterContent(IViewContent content) void UnregisterContent(IViewContent content)
@ -302,6 +304,8 @@ namespace ICSharpCode.SharpDevelop.Gui
content.TabPageTextChanged -= OnTabPageTextChanged; content.TabPageTextChanged -= OnTabPageTextChanged;
content.TitleNameChanged -= OnTitleNameChanged; content.TitleNameChanged -= OnTitleNameChanged;
content.IsDirtyChanged -= OnIsDirtyChanged; content.IsDirtyChanged -= OnIsDirtyChanged;
this.dockLayout.Workbench.OnViewClosed(new ViewContentEventArgs(content));
} }
void OnTabPageTextChanged(object sender, EventArgs e) void OnTabPageTextChanged(object sender, EventArgs e)
@ -309,9 +313,19 @@ namespace ICSharpCode.SharpDevelop.Gui
RefreshTabPageTexts(); RefreshTabPageTexts();
} }
bool forceClose;
public bool CloseWindow(bool force) 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( MessageBoxResult dr = MessageBox.Show(
ResourceService.GetString("MainWindow.SaveChangesMessage"), ResourceService.GetString("MainWindow.SaveChangesMessage"),
ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?", ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?",
@ -338,14 +352,17 @@ namespace ICSharpCode.SharpDevelop.Gui
case MessageBoxResult.No: case MessageBoxResult.No:
break; break;
case MessageBoxResult.Cancel: case MessageBoxResult.Cancel:
return false; e.Cancel = true;
break;
} }
} }
}
dockLayout.OnWorkbenchWindowClosed(this);
protected override void OnClosed()
{
base.OnClosed();
Dispose(); Dispose();
CommandManager.InvalidateRequerySuggested(); CommandManager.InvalidateRequerySuggested();
return true;
} }
public void RedrawContent() public void RedrawContent()

33
src/Main/Base/Project/Src/Gui/Workbench/WpfWorkbench.cs

@ -31,13 +31,22 @@ namespace ICSharpCode.SharpDevelop.Gui
public event EventHandler ActiveContentChanged; public event EventHandler ActiveContentChanged;
public event ViewContentEventHandler ViewOpened; public event ViewContentEventHandler ViewOpened;
void OnViewOpened(ViewContentEventArgs e) internal void OnViewOpened(ViewContentEventArgs e)
{ {
if (ViewOpened != null) { if (ViewOpened != null) {
ViewOpened(this, e); ViewOpened(this, e);
} }
} }
public event ViewContentEventHandler ViewClosed; public event ViewContentEventHandler ViewClosed;
internal void OnViewClosed(ViewContentEventArgs e)
{
if (ViewClosed != null) {
ViewClosed(this, e);
}
}
public event System.Windows.Forms.KeyEventHandler ProcessCommandKey; public event System.Windows.Forms.KeyEventHandler ProcessCommandKey;
public System.Windows.Forms.IWin32Window MainWin32Window { get; private set; } public System.Windows.Forms.IWin32Window MainWin32Window { get; private set; }
@ -100,7 +109,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public ICollection<IViewContent> ViewContentCollection { public ICollection<IViewContent> ViewContentCollection {
get { 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) void OnActiveWindowChanged(object sender, EventArgs e)
{ {
if (closeAll)
return;
if (workbenchLayout != null) { if (workbenchLayout != null) {
this.ActiveContent = workbenchLayout.ActiveContent; this.ActiveContent = workbenchLayout.ActiveContent;
this.ActiveWorkbenchWindow = workbenchLayout.ActiveWorkbenchWindow; this.ActiveWorkbenchWindow = workbenchLayout.ActiveWorkbenchWindow;
@ -235,7 +247,6 @@ namespace ICSharpCode.SharpDevelop.Gui
WorkbenchLayout.ShowView(content); WorkbenchLayout.ShowView(content);
content.WorkbenchWindow.SelectWindow(); content.WorkbenchWindow.SelectWindow();
OnViewOpened(new ViewContentEventArgs(content));
} }
public void ShowPad(PadDescriptor content) public void ShowPad(PadDescriptor content)
@ -264,12 +275,22 @@ namespace ICSharpCode.SharpDevelop.Gui
return null; return null;
} }
public void CloseContent(IViewContent content) /// <summary>
{ /// Flag used to prevent repeated ActiveWindowChanged events during CloseAllViews().
} /// </summary>
bool closeAll;
public void CloseAllViews() 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() public void RedrawAllComponents()

141
src/Main/Core/Project/Src/Services/ResourceService/ResourceService.cs

@ -50,6 +50,8 @@ namespace ICSharpCode.Core
} }
} }
static readonly object loadLock = new object();
/// <summary>English strings (list of resource managers)</summary> /// <summary>English strings (list of resource managers)</summary>
static List<ResourceManager> strings = new List<ResourceManager>(); static List<ResourceManager> strings = new List<ResourceManager>();
/// <summary>Neutral/English images (list of resource managers)</summary> /// <summary>Neutral/English images (list of resource managers)</summary>
@ -178,33 +180,34 @@ namespace ICSharpCode.Core
static void LoadLanguageResources(string language) static void LoadLanguageResources(string language)
{ {
if (ClearCaches != null) lock (loadLock) {
ClearCaches(null, EventArgs.Empty);
try {
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
} catch (Exception) {
try { try {
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language.Split('-')[0]); Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language);
} catch (Exception) {} } catch (Exception) {
} try {
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(language.Split('-')[0]);
localStrings = Load(stringResources, language); } catch (Exception) {}
if (localStrings == null && language.IndexOf('-') > 0) { }
localStrings = Load(stringResources, language.Split('-')[0]);
} localStrings = Load(stringResources, language);
if (localStrings == null && language.IndexOf('-') > 0) {
localIcons = Load(imageResources, language); localStrings = Load(stringResources, language.Split('-')[0]);
if (localIcons == null && language.IndexOf('-') > 0) { }
localIcons = Load(imageResources, language.Split('-')[0]);
} localIcons = Load(imageResources, language);
if (localIcons == null && language.IndexOf('-') > 0) {
localStringsResMgrs.Clear(); localIcons = Load(imageResources, language.Split('-')[0]);
localIconsResMgrs.Clear(); }
currentLanguage = language;
foreach (ResourceAssembly ra in resourceAssemblies) { localStringsResMgrs.Clear();
ra.Load(); localIconsResMgrs.Clear();
currentLanguage = language;
foreach (ResourceAssembly ra in resourceAssemblies) {
ra.Load();
}
} }
if (ClearCaches != null)
ClearCaches(null, EventArgs.Empty);
} }
static Hashtable Load(string fileName) static Hashtable Load(string fileName)
@ -241,68 +244,72 @@ namespace ICSharpCode.Core
/// </exception> /// </exception>
public static string GetString(string name) public static string GetString(string name)
{ {
if (localStrings != null && localStrings[name] != null) { lock (loadLock) {
return localStrings[name].ToString(); 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;
} }
}
string s = null;
if (s == null) { foreach (ResourceManager resourceManger in localStringsResMgrs) {
foreach (ResourceManager resourceManger in strings) {
try { try {
s = resourceManger.GetString(name); s = resourceManger.GetString(name);
} }
catch (Exception) { } catch (Exception) { }
if (s != null) { if (s != null) {
break; 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) public static object GetImageResource(string name)
{ {
object iconobj = null; lock (loadLock) {
if (localIcons != null && localIcons[name] != null) { object iconobj = null;
iconobj = localIcons[name]; if (localIcons != null && localIcons[name] != null) {
} else { iconobj = localIcons[name];
foreach (ResourceManager resourceManger in localIconsResMgrs) { } else {
iconobj = resourceManger.GetObject(name); foreach (ResourceManager resourceManger in localIconsResMgrs) {
if (iconobj != null) { iconobj = resourceManger.GetObject(name);
break;
}
}
if (iconobj == null) {
foreach (ResourceManager resourceManger in icons) {
try {
iconobj = resourceManger.GetObject(name);
}
catch (Exception) { }
if (iconobj != null) { if (iconobj != null) {
break; break;
} }
} }
if (iconobj == null) {
foreach (ResourceManager resourceManger in icons) {
try {
iconobj = resourceManger.GetObject(name);
}
catch (Exception) { }
if (iconobj != null) {
break;
}
}
}
} }
return iconobj;
} }
return iconobj;
} }
} }
} }

12
src/Main/ICSharpCode.Core.Presentation/PresentationResourceService.cs

@ -22,6 +22,18 @@ namespace ICSharpCode.Core.Presentation
{ {
static readonly Dictionary<string, BitmapSource> bitmapCache = new Dictionary<string, BitmapSource>(); static readonly Dictionary<string, BitmapSource> bitmapCache = new Dictionary<string, BitmapSource>();
static PresentationResourceService()
{
ResourceService.ClearCaches += ResourceService_ClearCaches;
}
static void ResourceService_ClearCaches(object sender, EventArgs e)
{
lock (bitmapCache) {
bitmapCache.Clear();
}
}
/// <summary> /// <summary>
/// Creates a new System.Windows.Controls.Image object containing the image with the /// Creates a new System.Windows.Controls.Image object containing the image with the
/// specified resource name. /// specified resource name.

Loading…
Cancel
Save