53 lines
1.5 KiB
C#
53 lines
1.5 KiB
C#
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
|
|
|
using System;
|
|
using System.Diagnostics;
|
|
|
|
namespace ICSharpCode.AvalonEdit.Document
|
|
{
|
|
/// <summary>
|
|
/// Describes a change to a TextDocument.
|
|
/// </summary>
|
|
sealed class DocumentChangeOperation : IUndoableOperationWithContext
|
|
{
|
|
TextDocument document;
|
|
DocumentChangeEventArgs change;
|
|
|
|
public DocumentChangeOperation(TextDocument document, DocumentChangeEventArgs change)
|
|
{
|
|
this.document = document;
|
|
this.change = change;
|
|
}
|
|
|
|
public void Undo(UndoStack stack)
|
|
{
|
|
Debug.Assert(stack.state == UndoStack.StatePlayback);
|
|
stack.RegisterAffectedDocument(document);
|
|
stack.state = UndoStack.StatePlaybackModifyDocument;
|
|
this.Undo();
|
|
stack.state = UndoStack.StatePlayback;
|
|
}
|
|
|
|
public void Redo(UndoStack stack)
|
|
{
|
|
Debug.Assert(stack.state == UndoStack.StatePlayback);
|
|
stack.RegisterAffectedDocument(document);
|
|
stack.state = UndoStack.StatePlaybackModifyDocument;
|
|
this.Redo();
|
|
stack.state = UndoStack.StatePlayback;
|
|
}
|
|
|
|
public void Undo()
|
|
{
|
|
OffsetChangeMap map = change.OffsetChangeMapOrNull;
|
|
document.Replace(change.Offset, change.InsertionLength, change.RemovedText, map != null ? map.Invert() : null);
|
|
}
|
|
|
|
public void Redo()
|
|
{
|
|
document.Replace(change.Offset, change.RemovalLength, change.InsertedText, change.OffsetChangeMapOrNull);
|
|
}
|
|
}
|
|
}
|