override public void Redo() { deleted = new string[mementos.Length]; int offset = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; memento.caret += offset; memento.anchor += offset; string deletedI; if (!memento.Empty) { deletedI = lines.GetText(memento.Left, memento.Count); lines.RemoveText(memento.Left, memento.Count); offset -= memento.Count; } else { deletedI = ""; } deleted[i] = deletedI; mementos[i] = memento; } SetSelectionMementos(mementos); foreach (Selection selection in selections) { selection.anchor = selection.Left; selection.caret = selection.anchor; lines.SetPreferredPos(selection, lines.PlaceOf(selection.caret)); } lines.JoinSelections(); }
override public void Undo() { int offset = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; memento.anchor += offset; memento.caret += offset; int anchor = memento.anchor; lines.RemoveText(memento.Left, memento.Count); string text = deleted[i]; lines.InsertText(memento.Left, text); offset += text.Length; memento.anchor = anchor; memento.caret = anchor; Place place = lines.PlaceOf(memento.caret); memento.preferredPos = lines[place.iLine].PosOfIndex(place.iChar); mementos[i] = memento; } deleted = null; SetSelectionMementos(mementos); lines.viStoreSelector.ViStoreMementos(mementos); }
override public void Redo() { deleted = new string[mementos.Length]; int offset = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; memento.anchor += offset; memento.caret += offset; string deletedI = lines.GetText(memento.Left, memento.Count); string pastedI = pasted[i]; lines.RemoveText(memento.Left, memento.Count); lines.InsertText(memento.Left, pastedI); memento.caret += pastedI.Length; memento.anchor += pastedI.Length; offset += -memento.Count + pastedI.Length; mementos[i] = memento; deleted[i] = deletedI; } SetSelectionMementos(mementos); foreach (Selection selection in selections) { selection.anchor = selection.Left; selection.caret = selection.anchor; Place place = lines.PlaceOf(selection.caret); lines.SetPreferredPos(selection, place); } lines.JoinSelections(); }
protected SelectionMemento[] GetSelectionMementos() { SelectionMemento[] mementos = new SelectionMemento[selections.Count]; for (int i = 0; i < mementos.Length; i++) { mementos[i] = selections[i].Memento; mementos[i].index = i; } Array.Sort(mementos, SelectionMemento.CompareSelections); return(mementos); }
public static int CompareSelections(SelectionMemento a, SelectionMemento b) { int aLeft = a.anchor < a.caret ? a.anchor : a.caret; int bLeft = b.anchor < b.caret ? b.anchor : b.caret; int result; if (aLeft == bLeft) { result = (a.anchor < a.caret ? a.caret : a.anchor) - (b.anchor < b.caret ? b.caret : b.anchor); } else { result = aLeft - bLeft; } return(result); }
override public void Redo() { deleted = new string[mementos.Length]; int offset = 0; for (int i = 0; i < mementos.Length; i++) { string text = GetText(i); SelectionMemento memento = mementos[i]; memento.anchor += offset; memento.caret += offset; string deletedI = lines.GetText(memento.Left, memento.Count); lines.RemoveText(memento.Left, memento.Count); lines.InsertText(memento.Left, text); memento.caret += text.Length; memento.anchor += text.Length; offset += -memento.Count + text.Length; mementos[i] = memento; deleted[i] = deletedI; } SetSelectionMementos(mementos); if (changeSelection) { foreach (Selection selection in selections) { selection.anchor = selection.Left; selection.caret = selection.anchor; Place place = lines.PlaceOf(selection.caret); lines.SetPreferredPos(selection, place); } } else { for (int i = 0; i < selections.Count; i++) { Selection selection = selections[i]; int length = GetText(i).Length; selection.anchor -= length; selection.caret -= length; Place place = lines.PlaceOf(selection.caret); lines.SetPreferredPos(selection, place); } } lines.JoinSelections(); }
override public void Redo() { deleted = new string[mementos.Length]; int offset = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; memento.anchor += offset; memento.caret += offset; string deletedI; if (memento.caret > 0) { deletedI = lines.GetText(memento.caret - 1, 1); if (deletedI == "\n" && memento.caret > 1 && lines.GetText(memento.caret - 2, 1) == "\r") { deletedI = "\r\n"; lines.RemoveText(memento.caret - 2, 2); memento.caret -= 2; offset -= 2; } else { lines.RemoveText(memento.caret - 1, 1); memento.caret--; offset--; } } else { deletedI = ""; } deleted[i] = deletedI; memento.anchor = memento.caret; Place place = lines.PlaceOf(memento.caret); memento.preferredPos = lines[place.iLine].PosOfIndex(place.iChar); mementos[i] = memento; } SetSelectionMementos(mementos); lines.JoinSelections(); }
override public void Undo() { int offset = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; memento.anchor += offset; memento.caret += offset; string deletedI = deleted[i]; string pastedI = pasted[i]; memento.anchor -= pastedI.Length; memento.caret -= pastedI.Length; lines.RemoveText(memento.Left, pastedI.Length); lines.InsertText(memento.Left, deletedI); offset += deletedI.Length - pastedI.Length; Place place = lines.PlaceOf(memento.caret); memento.preferredPos = lines[place.iLine].PosOfIndex(place.iChar); mementos[i] = memento; } deleted = null; SetSelectionMementos(mementos); lines.viStoreSelector.ViStoreMementos(mementos); }
override public void Redo() { int deletedLength = 0; for (int i = 0; i < ranges.Length; i++) { Range range = ranges[i]; deletedLength += range.iLine1 - range.iLine0 + 1; } deleted = new Memento[deletedLength]; SelectionPart[] parts = new SelectionPart[mementos.Length * 2]; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; if (memento.anchor <= memento.caret) { parts[i * 2] = new SelectionPart(false, memento.index); parts[i * 2 + 1] = new SelectionPart(true, memento.index); } else { parts[i * 2] = new SelectionPart(true, memento.index); parts[i * 2 + 1] = new SelectionPart(false, memento.index); } } int k = 0; int iPart = 0; int start = 0; int offset = 0; for (int i = 0; i < ranges.Length; i++) { Range range = ranges[i]; int iLine0 = range.iLine0; int iLine1 = range.iLine1; LineIterator iterator = lines.GetLineRange(iLine0, iLine1 - iLine0 + 1); start = range.start; while (iterator.MoveNext()) { Line line = iterator.current; int oldCount = line.charsCount; string deletedI; int tabsCount; line.GetFirstIntegerTabs(out deletedI, out tabsCount); List <char> chars = new List <char>(); if (isLeft) { if (lines.spacesInsteadTabs) { for (int j = 0; j < (tabsCount - 1) * lines.tabSize; j++) { chars.Add(' '); } } else { for (int j = 0; j < tabsCount - 1; j++) { chars.Add('\t'); } } if (tabsCount == 0) { string spaces = ""; for (int j = deletedI.Length; j < line.charsCount && line.chars[j].c == ' '; j++) { spaces += ' '; } deletedI = spaces + deletedI; } } else { if (lines.spacesInsteadTabs) { for (int j = 0; j < (tabsCount + 1) * lines.tabSize; j++) { chars.Add(' '); } } else { for (int j = 0; j < tabsCount + 1; j++) { chars.Add('\t'); } } } line.Chars_RemoveRange(0, deletedI.Length); line.Chars_InsertRange(0, chars); int delta = chars.Count - deletedI.Length; iterator.InvalidateCurrentText(delta); deleted[k++] = new Memento(deletedI, chars.Count); while (iPart < parts.Length) { SelectionPart part = parts[iPart]; Selection selection = selections[part.index]; int selectionValue = part.isCaret ? selection.caret : selection.anchor; if (delta < 0 && selectionValue - start >= 0 && selectionValue - start < -delta) { selectionValue = start; } else if (selectionValue >= start) { break; } if (part.isCaret) { selection.caret = selectionValue + offset; } else { selection.anchor = selectionValue + offset; } iPart++; } offset += delta; start += oldCount; } } while (iPart < parts.Length) { SelectionPart part = parts[iPart++]; if (part.isCaret) { selections[part.index].caret += offset; } else { selections[part.index].anchor += offset; } } lines.ResetTextCache(); }
override public bool Init() { bool allow = false; foreach (Selection selection in selections) { if (!selection.Empty) { Place place0 = lines.PlaceOf(selection.Left); Place place1 = lines.PlaceOf(selection.Right); if (place1.iLine - place0.iLine > 0) { allow = true; break; } } } if (!allow) { return(false); } lines.JoinSelections(); mementos = GetSelectionMementos(); List <Range> ranges = new List <Range>(); int iRange = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; Place place0 = lines.PlaceOf(memento.Left); Place place1 = lines.PlaceOf(memento.Right); int iLine0 = place0.iLine; int iLine1 = place1.iLine; if (iLine1 > iLine0 && place1.iChar == 0) { iLine1--; } int start = memento.Left - place0.iChar; if (iRange > 0) { Range prevRange = ranges[iRange - 1]; if (prevRange.iLine1 >= iLine0 - 1) { prevRange.iLine1 = iLine1; ranges[iRange - 1] = prevRange; } else { ranges.Add(new Range(iLine0, iLine1, start)); iRange++; } } else { ranges.Add(new Range(iLine0, iLine1, start)); iRange++; } } this.ranges = ranges.ToArray(); return(true); }
override public bool Init() { int minIndex = 0; int maxIndex = 0; if (selections.Count > 0) { minIndex = selections[0].anchor; maxIndex = selections[0].anchor; } for (int i = 0; i < selections.Count; i++) { Selection selection = selections[i]; if (minIndex > selection.anchor) { minIndex = selection.anchor; } if (maxIndex < selection.anchor) { maxIndex = selection.anchor; } if (minIndex > selection.caret) { minIndex = selection.caret; } if (maxIndex < selection.caret) { maxIndex = selection.caret; } } if (isUp && lines.PlaceOf(minIndex).iLine <= 0 || !isUp && lines.PlaceOf(maxIndex).iLine >= lines.LinesCount - 1) { return(false); } lines.JoinSelections(); mementos = GetSelectionMementos(); List <Range> ranges = new List <Range>(); int iRange = 0; for (int i = 0; i < mementos.Length; i++) { SelectionMemento memento = mementos[i]; Place place0 = lines.PlaceOf(memento.Left); Place place1 = lines.PlaceOf(memento.Right); int iLine0 = place0.iLine; int iLine1 = place1.iLine; int start = memento.Left - place0.iChar; if (iRange > 0) { Range prevRange = ranges[iRange - 1]; if (prevRange.iLine1 >= iLine0 - 1) { prevRange.iLine1 = iLine1; ranges[iRange - 1] = prevRange; } else { ranges.Add(new Range(iLine0, iLine1, start)); iRange++; } } else { ranges.Add(new Range(iLine0, iLine1, start)); iRange++; } } this.ranges = ranges.ToArray(); return(true); }