Browse Source

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
shortcuts
Christian Hornung 18 years ago
parent
commit
ae8b3f06ab
  1. 14
      src/Main/Base/Project/Src/Commands/FileCommands.cs
  2. 4
      src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs
  3. 35
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs
  4. 49
      src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs

14
src/Main/Base/Project/Src/Commands/FileCommands.cs

@ -55,7 +55,12 @@ namespace ICSharpCode.SharpDevelop.Commands
{ {
public override void Run() 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) internal static void Save(IViewContent content)
@ -121,7 +126,12 @@ namespace ICSharpCode.SharpDevelop.Commands
{ {
public override void Run() 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) internal static void Save(IViewContent content)

4
src/Main/Base/Project/Src/Commands/FileTabStripCommands.cs

@ -48,7 +48,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip
{ {
IWorkbenchWindow window = Owner as IWorkbenchWindow; IWorkbenchWindow window = Owner as IWorkbenchWindow;
if (window != null) { if (window != null) {
SaveFile.Save(window.ActiveViewContent); SaveFile.Save(window);
} }
} }
} }
@ -60,7 +60,7 @@ namespace ICSharpCode.SharpDevelop.Commands.TabStrip
IWorkbenchWindow window = Owner as IWorkbenchWindow; IWorkbenchWindow window = Owner as IWorkbenchWindow;
if (window != null) { if (window != null) {
SaveFileAs.Save(window.ActiveViewContent); SaveFileAs.Save(window);
} }
} }
} }

35
src/Main/Base/Project/Src/Gui/Workbench/Layouts/SdiWorkspaceWindow.cs

@ -11,6 +11,7 @@ using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
using System.Drawing; using System.Drawing;
using System.IO; using System.IO;
using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -194,6 +195,14 @@ namespace ICSharpCode.SharpDevelop.Gui
get { return viewContents; } get { return viewContents; }
} }
/// <summary>
/// Gets whether any contained view content has changed
/// since the last save/load operation.
/// </summary>
public bool IsDirty {
get { return this.ViewContents.Any(vc => vc.IsDirty); }
}
public void SwitchView(int viewNumber) public void SwitchView(int viewNumber)
{ {
if (viewTabControl != null) { if (viewTabControl != null) {
@ -271,9 +280,7 @@ namespace ICSharpCode.SharpDevelop.Gui
void OnIsDirtyChanged(object sender, EventArgs e) void OnIsDirtyChanged(object sender, EventArgs e)
{ {
if (sender == ActiveViewContent) { UpdateTitle();
UpdateTitle();
}
} }
void UpdateTitle() void UpdateTitle()
@ -284,7 +291,7 @@ namespace ICSharpCode.SharpDevelop.Gui
string newTitle = content.TitleName; string newTitle = content.TitleName;
if (content.IsDirty) { if (this.IsDirty) {
newTitle += "*"; newTitle += "*";
} else if (content.IsReadOnly) { } else if (content.IsReadOnly) {
newTitle += "+"; newTitle += "+";
@ -322,7 +329,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public bool CloseWindow(bool force) public bool CloseWindow(bool force)
{ {
if (!force && ActiveViewContent != null && ActiveViewContent.IsDirty) { if (!force && this.IsDirty) {
DialogResult dr = MessageBox.Show(ResourceService.GetString("MainWindow.SaveChangesMessage"), DialogResult dr = MessageBox.Show(ResourceService.GetString("MainWindow.SaveChangesMessage"),
ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?", ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,
@ -330,16 +337,18 @@ namespace ICSharpCode.SharpDevelop.Gui
RightToLeftConverter.IsRightToLeft ? MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign : 0); RightToLeftConverter.IsRightToLeft ? MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign : 0);
switch (dr) { switch (dr) {
case DialogResult.Yes: case DialogResult.Yes:
if (ActiveViewContent.PrimaryFile != null) { foreach (IViewContent vc in this.ViewContents) {
while (true) { if (!vc.IsDirty) continue;
ActiveViewContent.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); if (vc.PrimaryFile != null) {
if (ActiveViewContent.IsDirty) { while (true) {
vc.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save);
if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { if (vc.IsDirty) {
if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) {
break;
}
} else {
break; break;
} }
} else {
break;
} }
} }
} }

49
src/Main/Base/Project/Src/Gui/Workbench/Layouts/SimpleWorkbenchLayout.cs

@ -9,6 +9,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Diagnostics; using System.Diagnostics;
using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using ICSharpCode.Core; using ICSharpCode.Core;
@ -393,6 +394,14 @@ namespace ICSharpCode.SharpDevelop.Gui
get { return viewContents; } get { return viewContents; }
} }
/// <summary>
/// Gets whether any contained view content has changed
/// since the last save/load operation.
/// </summary>
public bool IsDirty {
get { return this.ViewContents.Any(vc => vc.IsDirty); }
}
public void SwitchView(int viewNumber) public void SwitchView(int viewNumber)
{ {
if (viewTabControl != null) { if (viewTabControl != null) {
@ -410,7 +419,7 @@ namespace ICSharpCode.SharpDevelop.Gui
viewContents = new ViewContentCollection(this); viewContents = new ViewContentCollection(this);
OnTitleNameChanged(this, EventArgs.Empty); OnTitleNameChanged(this, EventArgs.Empty);
// this.TabPageContextMenuStrip = MenuService.CreateContextMenu(this, contextMenuPath); // this.TabPageContextMenuStrip = MenuService.CreateContextMenu(this, contextMenuPath);
} }
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
@ -418,10 +427,10 @@ namespace ICSharpCode.SharpDevelop.Gui
if (disposing) { if (disposing) {
// DetachContent must be called before the controls are disposed // DetachContent must be called before the controls are disposed
this.ViewContents.Clear(); this.ViewContents.Clear();
// if (this.TabPageContextMenu != null) { // if (this.TabPageContextMenu != null) {
// this.TabPageContextMenu.Dispose(); // this.TabPageContextMenu.Dispose();
// this.TabPageContextMenu = null; // this.TabPageContextMenu = null;
// } // }
} }
base.Dispose(disposing); base.Dispose(disposing);
} }
@ -467,20 +476,18 @@ namespace ICSharpCode.SharpDevelop.Gui
void OnIsDirtyChanged(object sender, EventArgs e) void OnIsDirtyChanged(object sender, EventArgs e)
{ {
if (sender == ActiveViewContent) { UpdateTitle();
UpdateTitle();
}
} }
void UpdateTitle() void UpdateTitle()
{ {
IViewContent content = ActiveViewContent; IViewContent content = ActiveViewContent;
if (content != null) { if (content != null) {
// base.ToolTipText = content.PrimaryFileName; // base.ToolTipText = content.PrimaryFileName;
string newTitle = content.TitleName; string newTitle = content.TitleName;
if (content.IsDirty) { if (this.IsDirty) {
newTitle += "*"; newTitle += "*";
} else if (content.IsReadOnly) { } else if (content.IsReadOnly) {
newTitle += "+"; newTitle += "+";
@ -518,7 +525,7 @@ namespace ICSharpCode.SharpDevelop.Gui
public bool CloseWindow(bool force) public bool CloseWindow(bool force)
{ {
if (!force && ActiveViewContent != null && ActiveViewContent.IsDirty) { if (!force && this.IsDirty) {
DialogResult dr = MessageBox.Show(ResourceService.GetString("MainWindow.SaveChangesMessage"), DialogResult dr = MessageBox.Show(ResourceService.GetString("MainWindow.SaveChangesMessage"),
ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?", ResourceService.GetString("MainWindow.SaveChangesMessageHeader") + " " + Title + " ?",
MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question,
@ -526,16 +533,18 @@ namespace ICSharpCode.SharpDevelop.Gui
RightToLeftConverter.IsRightToLeft ? MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign : 0); RightToLeftConverter.IsRightToLeft ? MessageBoxOptions.RtlReading | MessageBoxOptions.RightAlign : 0);
switch (dr) { switch (dr) {
case DialogResult.Yes: case DialogResult.Yes:
if (ActiveViewContent.PrimaryFile != null) { foreach (IViewContent vc in this.ViewContents) {
while (true) { if (!vc.IsDirty) continue;
ActiveViewContent.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save); if (vc.PrimaryFile != null) {
if (ActiveViewContent.IsDirty) { while (true) {
vc.Files.Foreach(ICSharpCode.SharpDevelop.Commands.SaveFile.Save);
if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) { if (vc.IsDirty) {
if (MessageService.AskQuestion("${res:MainWindow.DiscardChangesMessage}")) {
break;
}
} else {
break; break;
} }
} else {
break;
} }
} }
} }
@ -546,7 +555,7 @@ namespace ICSharpCode.SharpDevelop.Gui
return false; return false;
} }
} }
OnCloseEvent(null); OnCloseEvent(null);
Dispose(); Dispose();
return true; return true;

Loading…
Cancel
Save