private void UndoModification(Modification modification, ref Point cursorPosition) { int lineCountToRemove = modification.NewLinesCount; if (modification.StartLine + lineCountToRemove > textBufferLineList.Count) lineCountToRemove = textBufferLineList.Count - modification.StartLine; List<string> linesToRemove = textBufferLineList.GetRange(modification.StartLine, lineCountToRemove); if (modification.ActionType == Modification.Action.Insert) { AddInsertionToRedoGroup(modification.StartLine, modification.OriginalContents.Count, linesToRemove, cursorPosition); } else if (modification.ActionType == Modification.Action.Remove) { AddRemoveToRedoGroup(modification.StartLine, modification.OriginalContents.Count, linesToRemove, cursorPosition); } cursorPosition = modification.CursorPosition; textBufferLineList.RemoveRange(modification.StartLine, lineCountToRemove); textBufferLineList.InsertRange(modification.StartLine, modification.OriginalContents); }
internal void Add(Modification modification) { this.modifications.Add(modification); }
private void RedoModification(Modification modification, ref Point cursorPosition) { // If modification is to be done on the line beyond the last, then we are essentially // dealing with a non-existence line. In such cases, the "original line contents" (the // thing we would like to backup on the undo group) will be an empty line. // bool modificationBeyondFinalLine = (textBufferLineList.Count == modification.StartLine); List<string> originalContents = null; if (false != modificationBeyondFinalLine) { originalContents = new List<string>(); originalContents.Add(string.Empty); } else { // Before we redo the changes, there will be the "original contents" that we // would want to backup in the undo group. Store them somewhere safe and then // remove the lines from the line list. // originalContents = textBufferLineList.GetRange(modification.StartLine, modification.NewLinesCount); } if (modification.ActionType == Modification.Action.Insert) { RecordInsertionInternal(modification.StartLine, modification.OriginalContents.Count, originalContents, cursorPosition); } else if (modification.ActionType == Modification.Action.Remove) { RecordRemovalInternal(modification.StartLine, modification.OriginalContents.Count, originalContents, cursorPosition); } if (false == modificationBeyondFinalLine) textBufferLineList.RemoveRange(modification.StartLine, modification.NewLinesCount); textBufferLineList.InsertRange(modification.StartLine, modification.OriginalContents); cursorPosition = modification.CursorPosition; }