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 @@ -44,23 +44,36 @@ namespace ICSharpCode.AvalonEdit.AddIn
this.Files.Add(file);
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.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) {
PrimaryFile.IsDirty = true;
var document = codeEditor.Document;
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 {
get { return codeEditor; }
}
@ -221,6 +234,7 @@ namespace ICSharpCode.AvalonEdit.AddIn @@ -221,6 +234,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
public override void Dispose()
{
this.PrimaryFile.IsDirtyChanged -= PrimaryFile_IsDirtyChanged;
base.Dispose();
BookmarksDetach();
codeEditor.Dispose();

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

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

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

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

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

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

Loading…
Cancel
Save