From ae8b3f06ab0b093a8c1753fbc86883e4b5f20d50 Mon Sep 17 00:00:00 2001 From: Christian Hornung Date: Thu, 31 Jul 2008 08:17:44 +0000 Subject: [PATCH] Improved behaviour of saving workbench windows with multiple view contents: The Save commands now apply to all view contents of the active workbench window, not only to the active view content. When a workbench window is closed, all its view contents are now saved, not only the active one. Workbench window title now displays a * when any of its view contents is dirty, not only the active one. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3266 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Base/Project/Src/Commands/FileCommands.cs | 14 +++++- .../Src/Commands/FileTabStripCommands.cs | 4 +- .../Workbench/Layouts/SdiWorkspaceWindow.cs | 35 ++++++++----- .../Layouts/SimpleWorkbenchLayout.cs | 49 +++++++++++-------- 4 files changed, 65 insertions(+), 37 deletions(-) diff --git a/src/Main/Base/Project/Src/Commands/FileCommands.cs b/src/Main/Base/Project/Src/Commands/FileCommands.cs index b2a975b75d..14c5ce50aa 100644 --- a/src/Main/Base/Project/Src/Commands/FileCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileCommands.cs @@ -55,7 +55,12 @@ namespace ICSharpCode.SharpDevelop.Commands { public override void Run() { - Save(WorkbenchSingleton.Workbench.ActiveViewContent); + Save(WorkbenchSingleton.Workbench.ActiveWorkbenchWindow); + } + + internal static void Save(IWorkbenchWindow window) + { + window.ViewContents.Foreach(Save); } internal static void Save(IViewContent content) @@ -121,7 +126,12 @@ namespace ICSharpCode.SharpDevelop.Commands { public override void Run() { - Save(WorkbenchSingleton.Workbench.ActiveViewContent); + Save(WorkbenchSingleton.Workbench.ActiveWorkbenchWindow); + } + + internal static void Save(IWorkbenchWindow window) + { + window.ViewContents.Foreach(Save); } internal static void Save(IViewContent content) diff --git a/src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs b/src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs index 2d93942114..3795ba2451 100644 --- a/src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs +++ b/src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs @@ -48,7 +48,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip { IWorkbenchWindow window = Owner as IWorkbenchWindow; if (window != null) { - SaveFile.Save(window.ActiveViewContent); + SaveFile.Save(window); } } } @@ -60,7 +60,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip IWorkbenchWindow window = Owner as IWorkbenchWindow; if (window != null) { - SaveFileAs.Save(window.ActiveViewContent); + SaveFileAs.Save(window); } } } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs index 0cb1001ea2..ad125c962b 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs @@ -11,6 +11,7 @@ using System.Collections.ObjectModel; using System.Diagnostics; using System.Drawing; using System.IO; +using System.Linq; using System.Windows.Forms; using ICSharpCode.Core; @@ -194,6 +195,14 @@ namespace ICSharpCode.SharpDevelop.Gui get { return viewContents; } } + /// + /// Gets whether any contained view content has changed + /// since the last save/load operation. + /// + public bool IsDirty { + get { return this.ViewContents.Any(vc => vc.IsDirty); } + } + public void SwitchView(int viewNumber) { if (viewTabControl != null) { @@ -271,9 +280,7 @@ namespace ICSharpCode.SharpDevelop.Gui void OnIsDirtyChanged(object sender, EventArgs e) { - if (sender == ActiveViewContent) { - UpdateTitle(); - } + UpdateTitle(); } void UpdateTitle() @@ -284,7 +291,7 @@ namespace ICSharpCode.SharpDevelop.Gui string newTitle = content.TitleName; - if (content.IsDirty) { + if (this.IsDirty) { newTitle += "*"; } else if (content.IsReadOnly) { newTitle += "+"; @@ -322,7 +329,7 @@ namespace ICSharpCode.SharpDevelop.Gui public bool CloseWindow(bool force) { - if (!force && ActiveViewContent != null && ActiveViewContent.IsDirty) { + if (!force && this.IsDirty) { DialogResult dr = MessageBox.Show(ResourceService.GetString("MainWindow.SaveChangesMessage"), ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, @@ -330,16 +337,18 @@ namespace ICSharpCode.SharpDevelop.Gui RightToLeftConverter.IsRightToLeft ? MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign : 0); switch (dr) { case DialogResult.Yes: - if (ActiveViewContent.PrimaryFile != null) { - while (true) { - ActiveViewContent.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); - if (ActiveViewContent.IsDirty) { - - if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { + foreach (IViewContent vc in this.ViewContents) { + if (!vc.IsDirty) continue; + if (vc.PrimaryFile != null) { + while (true) { + vc.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); + if (vc.IsDirty) { + if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { + break; + } + } else { break; } - } else { - break; } } } diff --git a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs index 1ebdab4538..7116fb1535 100644 --- a/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs +++ b/src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs @@ -9,6 +9,7 @@ using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; +using System.Linq; using System.Windows.Forms; using ICSharpCode.Core; @@ -393,6 +394,14 @@ namespace ICSharpCode.SharpDevelop.Gui get { return viewContents; } } + /// + /// Gets whether any contained view content has changed + /// since the last save/load operation. + /// + public bool IsDirty { + get { return this.ViewContents.Any(vc => vc.IsDirty); } + } + public void SwitchView(int viewNumber) { if (viewTabControl != null) { @@ -410,7 +419,7 @@ namespace ICSharpCode.SharpDevelop.Gui viewContents = new ViewContentCollection(this); OnTitleNameChanged(this, EventArgs.Empty); - // this.TabPageContextMenuStrip = MenuService.CreateContextMenu(this, contextMenuPath); + // this.TabPageContextMenuStrip = MenuService.CreateContextMenu(this, contextMenuPath); } protected override void Dispose(bool disposing) @@ -418,10 +427,10 @@ namespace ICSharpCode.SharpDevelop.Gui if (disposing) { // DetachContent must be called before the controls are disposed this.ViewContents.Clear(); - // if (this.TabPageContextMenu != null) { - // this.TabPageContextMenu.Dispose(); - // this.TabPageContextMenu = null; - // } + // if (this.TabPageContextMenu != null) { + // this.TabPageContextMenu.Dispose(); + // this.TabPageContextMenu = null; + // } } base.Dispose(disposing); } @@ -467,20 +476,18 @@ namespace ICSharpCode.SharpDevelop.Gui void OnIsDirtyChanged(object sender, EventArgs e) { - if (sender == ActiveViewContent) { - UpdateTitle(); - } + UpdateTitle(); } void UpdateTitle() { IViewContent content = ActiveViewContent; if (content != null) { - // base.ToolTipText = content.PrimaryFileName; + // base.ToolTipText = content.PrimaryFileName; string newTitle = content.TitleName; - if (content.IsDirty) { + if (this.IsDirty) { newTitle += "*"; } else if (content.IsReadOnly) { newTitle += "+"; @@ -518,7 +525,7 @@ namespace ICSharpCode.SharpDevelop.Gui public bool CloseWindow(bool force) { - if (!force && ActiveViewContent != null && ActiveViewContent.IsDirty) { + if (!force && this.IsDirty) { DialogResult dr = MessageBox.Show(ResourceService.GetString("MainWindow.SaveChangesMessage"), ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, @@ -526,16 +533,18 @@ namespace ICSharpCode.SharpDevelop.Gui RightToLeftConverter.IsRightToLeft ? MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign : 0); switch (dr) { case DialogResult.Yes: - if (ActiveViewContent.PrimaryFile != null) { - while (true) { - ActiveViewContent.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); - if (ActiveViewContent.IsDirty) { - - if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { + foreach (IViewContent vc in this.ViewContents) { + if (!vc.IsDirty) continue; + if (vc.PrimaryFile != null) { + while (true) { + vc.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); + if (vc.IsDirty) { + if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { + break; + } + } else { break; } - } else { - break; } } } @@ -546,7 +555,7 @@ namespace ICSharpCode.SharpDevelop.Gui return false; } } - + OnCloseEvent(null); Dispose(); return true;