Browse Source

Fixed SD2-1297: Implement "safe saving"

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@2997 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
392ef70922
  1. 9
      src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs
  2. 2
      src/Main/Base/Project/Resources/LoadSaveOptionPanel.xfrm
  3. 4
      src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/LoadSavePanel.cs
  4. 18
      src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs
  5. 9
      src/Main/Base/Project/Src/Services/File/FileService.cs
  6. 41
      src/Main/Base/Project/Src/Services/File/OpenedFile.cs

9
src/Libraries/ICSharpCode.TextEditor/Project/Src/Document/DefaultTextEditorProperties.cs

@ -52,7 +52,6 @@ namespace ICSharpCode.TextEditor.Document @@ -52,7 +52,6 @@ namespace ICSharpCode.TextEditor.Document
bool showVerticalRuler = true;
bool convertTabsToSpaces = false;
System.Drawing.Text.TextRenderingHint textRenderingHint = System.Drawing.Text.TextRenderingHint.SystemDefault;
bool createBackupCopy = false;
bool mouseWheelScrollDown = true;
bool mouseWheelTextZoom = true;
@ -196,14 +195,6 @@ namespace ICSharpCode.TextEditor.Document @@ -196,14 +195,6 @@ namespace ICSharpCode.TextEditor.Document
set { textRenderingHint = value; }
}
public bool CreateBackupCopy {
get {
return createBackupCopy;
}
set {
createBackupCopy = value;
}
}
public bool MouseWheelScrollDown {
get {
return mouseWheelScrollDown;

2
src/Main/Base/Project/Resources/LoadSaveOptionPanel.xfrm

@ -14,7 +14,7 @@ @@ -14,7 +14,7 @@
<System.Windows.Forms.CheckBox>
<Name value="useRecycleBinCheckBox" />
<Location value="8, 19" />
<Text value="Use recycle bin when deleting files" />
<Text value="${res:Dialog.Options.IDEOptions.LoadSaveOptions.UseRecycleBin}" />
<TabIndex value="0" />
<Size value="248, 24" />
<UseVisualStyleBackColor value="True" />

4
src/Main/Base/Project/Src/Gui/Dialogs/OptionPanels/IDEOptions/LoadSavePanel.cs

@ -33,7 +33,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -33,7 +33,7 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
SetupFromXmlStream(this.GetType().Assembly.GetManifestResourceStream("Resources.LoadSaveOptionPanel.xfrm"));
((CheckBox)ControlDictionary[loadUserDataCheckBox]).Checked = PropertyService.Get("SharpDevelop.LoadDocumentProperties", true);
((CheckBox)ControlDictionary[createBackupCopyCheckBox]).Checked = PropertyService.Get("SharpDevelop.CreateBackupCopy", false);
((CheckBox)ControlDictionary[createBackupCopyCheckBox]).Checked = FileService.SaveUsingTemporaryFile;
((ComboBox)ControlDictionary[lineTerminatorStyleComboBox]).Items.Add(StringParser.Parse("${res:Dialog.Options.IDEOptions.LoadSaveOptions.WindowsRadioButton}"));
((ComboBox)ControlDictionary[lineTerminatorStyleComboBox]).Items.Add(StringParser.Parse("${res:Dialog.Options.IDEOptions.LoadSaveOptions.MacintoshRadioButton}"));
@ -58,12 +58,12 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels @@ -58,12 +58,12 @@ namespace ICSharpCode.SharpDevelop.Gui.OptionPanels
public override bool StorePanelContents()
{
PropertyService.Set("SharpDevelop.LoadDocumentProperties", ((CheckBox)ControlDictionary[loadUserDataCheckBox]).Checked);
PropertyService.Set("SharpDevelop.CreateBackupCopy", ((CheckBox)ControlDictionary[createBackupCopyCheckBox]).Checked);
PropertyService.Set("SharpDevelop.LineTerminatorStyle", (LineTerminatorStyle)((ComboBox)ControlDictionary[lineTerminatorStyleComboBox]).SelectedIndex);
FileChangeWatcher.DetectExternalChangesOption = detectExternalChangesCheckBox.Checked;
FileChangeWatcher.AutoLoadExternalChangesOption = autoLoadExternalChangesCheckBox.Checked;
FileService.DeleteToRecycleBin = useRecycleBinCheckBox.Checked;
FileService.SaveUsingTemporaryFile = ((CheckBox)ControlDictionary[createBackupCopyCheckBox]).Checked;
return true;
}

18
src/Main/Base/Project/Src/Services/File/FileChangeWatcher.cs

@ -49,7 +49,6 @@ namespace ICSharpCode.SharpDevelop @@ -49,7 +49,6 @@ namespace ICSharpCode.SharpDevelop
{
if (file == null)
throw new ArgumentNullException("file");
WorkbenchSingleton.AssertMainThread();
this.file = file;
WorkbenchSingleton.MainForm.Activated += MainForm_Activated;
file.FileNameChanged += file_FileNameChanged;
@ -77,12 +76,26 @@ namespace ICSharpCode.SharpDevelop @@ -77,12 +76,26 @@ namespace ICSharpCode.SharpDevelop
}
}
bool enabled = true;
public bool Enabled {
get { return enabled; }
set {
enabled = value;
SetWatcher();
}
}
void SetWatcher()
{
WorkbenchSingleton.AssertMainThread();
if (watcher != null) {
watcher.EnableRaisingEvents = false;
}
if (!enabled)
return;
if (DetectExternalChangesOption == false)
return;
@ -113,6 +126,9 @@ namespace ICSharpCode.SharpDevelop @@ -113,6 +126,9 @@ namespace ICSharpCode.SharpDevelop
void OnFileChangedEvent(object sender, FileSystemEventArgs e)
{
if (e.ChangeType != WatcherChangeTypes.Deleted) {
if (file == null)
return;
LoggingService.Debug("File " + file.FileName + " was changed externally");
wasChangedExternally = true;
if (WorkbenchSingleton.Workbench.IsActiveWindow) {
// delay showing message a bit, prevents showing two messages

9
src/Main/Base/Project/Src/Services/File/FileService.cs

@ -303,6 +303,15 @@ namespace ICSharpCode.SharpDevelop @@ -303,6 +303,15 @@ namespace ICSharpCode.SharpDevelop
}
}
public static bool SaveUsingTemporaryFile {
get {
return PropertyService.Get("SharpDevelop.SaveUsingTemporaryFile", true);
}
set {
PropertyService.Set("SharpDevelop.SaveUsingTemporaryFile", value);
}
}
/// <summary>
/// Removes a file, raising the appropriate events. This method may show message boxes.
/// </summary>

41
src/Main/Base/Project/Src/Services/File/OpenedFile.cs

@ -203,27 +203,26 @@ namespace ICSharpCode.SharpDevelop @@ -203,27 +203,26 @@ namespace ICSharpCode.SharpDevelop
if (IsUntitled)
throw new InvalidOperationException("Cannot save an untitled file to disk!");
/*
* TODO: Reimplement "safe saving"
if (document.TextEditorProperties.CreateBackupCopy) {
try {
if (File.Exists(fileName)) {
string backupName = fileName + ".bak";
File.Copy(fileName, backupName, true);
}
} catch (Exception) {
//
// MessageService.ShowError(e, "Can not create backup copy of " + fileName);
}
}
*/
using (FileStream fs = new FileStream(FileName, FileMode.Create, FileAccess.Write)) {
bool safeSaving = FileService.SaveUsingTemporaryFile;
string saveAs = safeSaving ? FileName + ".bak" : FileName;
using (FileStream fs = new FileStream(saveAs, FileMode.Create, FileAccess.Write)) {
if (currentView != null) {
SaveCurrentViewToStream(fs);
} else {
fs.Write(fileData, 0, fileData.Length);
}
}
if (safeSaving) {
DateTime? creationTime = null;
if (File.Exists(FileName)) {
creationTime = File.GetCreationTimeUtc(FileName);
File.Delete(FileName);
}
File.Move(saveAs, FileName);
if (creationTime != null) {
File.SetCreationTimeUtc(FileName, creationTime.Value);
}
}
IsDirty = false;
}
@ -424,5 +423,17 @@ namespace ICSharpCode.SharpDevelop @@ -424,5 +423,17 @@ namespace ICSharpCode.SharpDevelop
SwitchedToView(newView);
}
public override void SaveToDisk()
{
try {
if (fileChangeWatcher != null)
fileChangeWatcher.Enabled = false;
base.SaveToDisk();
} finally {
if (fileChangeWatcher != null)
fileChangeWatcher.Enabled = true;
}
}
}
}

Loading…
Cancel
Save