Browse Source

Fixed SD2-784 - File still considered dirty after undoing all changes.

Fixed incorrect behavior of TextEditor.IsModified when continued undo groups are used.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@5762 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
pull/1/head
Daniel Grunwald 15 years ago
parent
commit
a39d830eba
  1. 26
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs
  2. 1
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  3. 35
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/UndoStack.cs
  4. 2
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditor.cs

26
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs

@ -44,23 +44,36 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.Files.Add(file); this.Files.Add(file);
file.ForceInitializeView(this); file.ForceInitializeView(this);
codeEditor.Document.Changed += textEditor_Document_Changed; file.IsDirtyChanged += PrimaryFile_IsDirtyChanged;
codeEditor.Document.UndoStack.PropertyChanged += codeEditor_Document_UndoStack_PropertyChanged;
codeEditor.CaretPositionChanged += CaretChanged; codeEditor.CaretPositionChanged += CaretChanged;
codeEditor.TextCopied += codeEditor_TextCopied; codeEditor.TextCopied += codeEditor_TextCopied;
} }
void codeEditor_TextCopied(object sender, ICSharpCode.AvalonEdit.Editing.TextEventArgs e) void codeEditor_Document_UndoStack_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{ {
TextEditorSideBar.Instance.PutInClipboardRing(e.Text); PrimaryFile.IsDirty = !codeEditor.Document.UndoStack.IsOriginalFile;
} }
void textEditor_Document_Changed(object sender, DocumentChangeEventArgs e) void PrimaryFile_IsDirtyChanged(object sender, EventArgs e)
{ {
if (!isLoading) { var document = codeEditor.Document;
PrimaryFile.IsDirty = true; if (document != null) {
var undoStack = document.UndoStack;
if (this.PrimaryFile.IsDirty) {
if (undoStack.IsOriginalFile)
undoStack.DiscardOriginalFileMarker();
} else {
undoStack.MarkAsOriginalFile();
}
} }
} }
void codeEditor_TextCopied(object sender, ICSharpCode.AvalonEdit.Editing.TextEventArgs e)
{
TextEditorSideBar.Instance.PutInClipboardRing(e.Text);
}
public CodeEditor CodeEditor { public CodeEditor CodeEditor {
get { return codeEditor; } get { return codeEditor; }
} }
@ -221,6 +234,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
public override void Dispose() public override void Dispose()
{ {
this.PrimaryFile.IsDirtyChanged -= PrimaryFile_IsDirtyChanged;
base.Dispose(); base.Dispose();
BookmarksDetach(); BookmarksDetach();
codeEditor.Dispose(); codeEditor.Dispose();

1
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -285,6 +285,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.Encoding = reader.CurrentEncoding; this.Encoding = reader.CurrentEncoding;
} }
} }
primaryTextEditor.IsModified = false;
NewLineConsistencyCheck.StartConsistencyCheck(this); NewLineConsistencyCheck.StartConsistencyCheck(this);
} }

35
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Document/UndoStack.cs

@ -49,11 +49,22 @@ namespace ICSharpCode.AvalonEdit.Document
/// </summary> /// </summary>
int elementsOnUndoUntilOriginalFile; int elementsOnUndoUntilOriginalFile;
bool isOriginalFile = true;
/// <summary> /// <summary>
/// Gets whether the document is currently in its original state (no modifications). /// Gets whether the document is currently in its original state (no modifications).
/// </summary> /// </summary>
public bool IsOriginalFile { public bool IsOriginalFile {
get { return elementsOnUndoUntilOriginalFile == 0; } get { return isOriginalFile; }
}
void RecalcIsOriginalFile()
{
bool newIsOriginalFile = (elementsOnUndoUntilOriginalFile == 0);
if (newIsOriginalFile != isOriginalFile) {
isOriginalFile = newIsOriginalFile;
NotifyPropertyChanged("IsOriginalFile");
}
} }
/// <summary> /// <summary>
@ -61,10 +72,8 @@ namespace ICSharpCode.AvalonEdit.Document
/// </summary> /// </summary>
public void MarkAsOriginalFile() public void MarkAsOriginalFile()
{ {
bool oldIsOriginalFile = IsOriginalFile;
elementsOnUndoUntilOriginalFile = 0; elementsOnUndoUntilOriginalFile = 0;
if (!oldIsOriginalFile) RecalcIsOriginalFile();
NotifyPropertyChanged("IsOriginalFile");
} }
/// <summary> /// <summary>
@ -72,24 +81,20 @@ namespace ICSharpCode.AvalonEdit.Document
/// </summary> /// </summary>
public void DiscardOriginalFileMarker() public void DiscardOriginalFileMarker()
{ {
bool oldIsOriginalFile = IsOriginalFile;
elementsOnUndoUntilOriginalFile = int.MinValue; elementsOnUndoUntilOriginalFile = int.MinValue;
if (oldIsOriginalFile) RecalcIsOriginalFile();
NotifyPropertyChanged("IsOriginalFile");
} }
void FileModified(int newElementsOnUndoStack) void FileModified(int newElementsOnUndoStack)
{ {
if (newElementsOnUndoStack == 0 || elementsOnUndoUntilOriginalFile == int.MinValue) if (elementsOnUndoUntilOriginalFile == int.MinValue)
return; return;
bool oldIsOriginalFile = IsOriginalFile;
elementsOnUndoUntilOriginalFile += newElementsOnUndoStack; elementsOnUndoUntilOriginalFile += newElementsOnUndoStack;
if (elementsOnUndoUntilOriginalFile > undostack.Count) if (elementsOnUndoUntilOriginalFile > undostack.Count)
elementsOnUndoUntilOriginalFile = int.MinValue; elementsOnUndoUntilOriginalFile = int.MinValue;
if (oldIsOriginalFile != IsOriginalFile) // don't call RecalcIsOriginalFile(): wait until end of undo group
NotifyPropertyChanged("IsOriginalFile");
} }
#endregion #endregion
@ -220,11 +225,11 @@ namespace ICSharpCode.AvalonEdit.Document
} else if (actionCountInUndoGroup > 1) { } else if (actionCountInUndoGroup > 1) {
// combine all actions within the group into a single grouped action // combine all actions within the group into a single grouped action
undostack.PushBack(new UndoOperationGroup(undostack, actionCountInUndoGroup)); undostack.PushBack(new UndoOperationGroup(undostack, actionCountInUndoGroup));
actionCountInUndoGroup = 1; // actions were combined FileModified(-actionCountInUndoGroup + 1 + optionalActionCount);
} }
EnforceSizeLimit(); EnforceSizeLimit();
allowContinue = true; allowContinue = true;
FileModified(actionCountInUndoGroup); RecalcIsOriginalFile(); // can raise event
} }
} }
@ -261,6 +266,7 @@ namespace ICSharpCode.AvalonEdit.Document
state = StateListen; state = StateListen;
} }
FileModified(-1); FileModified(-1);
RecalcIsOriginalFile();
if (undostack.Count == 0) if (undostack.Count == 0)
NotifyPropertyChanged("CanUndo"); NotifyPropertyChanged("CanUndo");
if (redostack.Count == 1) if (redostack.Count == 1)
@ -294,6 +300,7 @@ namespace ICSharpCode.AvalonEdit.Document
state = StateListen; state = StateListen;
} }
FileModified(1); FileModified(1);
RecalcIsOriginalFile();
if (redostack.Count == 0) if (redostack.Count == 0)
NotifyPropertyChanged("CanRedo"); NotifyPropertyChanged("CanRedo");
if (undostack.Count == 1) if (undostack.Count == 1)
@ -347,6 +354,8 @@ namespace ICSharpCode.AvalonEdit.Document
actionCountInUndoGroup++; actionCountInUndoGroup++;
if (isOptional) if (isOptional)
optionalActionCount++; optionalActionCount++;
else
FileModified(1);
EndUndoGroup(); EndUndoGroup();
if (wasEmpty) if (wasEmpty)
NotifyPropertyChanged("CanUndo"); NotifyPropertyChanged("CanUndo");

2
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditor.cs

@ -406,7 +406,7 @@ namespace ICSharpCode.AvalonEdit
/// </summary> /// </summary>
public bool IsModified { public bool IsModified {
get { return (bool)GetValue(IsModifiedProperty); } get { return (bool)GetValue(IsModifiedProperty); }
set { SetValue(IsModifiedProperty, value); } set { SetValue(IsModifiedProperty, Boxes.Box(value)); }
} }
static void OnIsModifiedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) static void OnIsModifiedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)

Loading…
Cancel
Save