override public void Undo() { for (int i = 0; i < ranges.Length; i++) { Range range = ranges[i]; LineIterator iterator = isUp ? lines.GetLineRange(range.iLine1, range.iLine0 - range.iLine1 - 1) : lines.GetLineRange(range.iLine0, range.iLine1 - range.iLine0 + 1); while (iterator.MoveNext()) { iterator.SwapCurrent(isUp); } } SetSelectionMementos(mementos); }
override public void Redo() { SetSelectionMementos(mementos); int move = isUp ? -1 : 1; List <Place> places = new List <Place>(); for (int i = 0; i < selections.Count; i++) { Selection selection = selections[i]; Place anchor = lines.PlaceOf(selection.anchor); Place caret = lines.PlaceOf(selection.caret); places.Add(anchor); places.Add(caret); anchor.iLine += move; caret.iLine += move; selection.anchor = lines.IndexOf(anchor); selection.caret = lines.IndexOf(caret); } for (int i = 0; i < ranges.Length; i++) { Range range = ranges[i]; LineIterator iterator = isUp ? lines.GetLineRange(range.iLine0, range.iLine1 - range.iLine0 + 1) : lines.GetLineRange(range.iLine1, range.iLine0 - range.iLine1 - 1); while (iterator.MoveNext()) { iterator.SwapCurrent(isUp); } } for (int i = 0; i < selections.Count; i++) { Selection selection = selections[i]; Place anchor = places[i * 2]; Place caret = places[i * 2 + 1]; anchor.iLine += move; caret.iLine += move; selection.anchor = lines.IndexOf(anchor); selection.caret = lines.IndexOf(caret); } }