override public void Undo() { int k = 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); while (iterator.MoveNext()) { Memento deletedI = deleted[k++]; Line line = iterator.current; line.Chars_RemoveRange(0, deletedI.count); line.Chars_InsertRange(0, deletedI.text); iterator.InvalidateCurrentText(deletedI.text.Length - deletedI.count); } } deleted = null; SetSelectionMementos(mementos); lines.ResetTextCache(); lines.viStoreSelector.ViStoreMementos(mementos); }
public void SetStyleRange(StyleRange range) { short style = range.style; Place start = PlaceOf(range.start); Line line = this[start.iLine]; if (start.iChar + range.count <= line.charsCount) { line.SetRangeStyle(start.iChar, range.count, style); } else { Place end = PlaceOf(range.start + range.count); LineIterator iterator = GetLineRange(start.iLine, end.iLine - start.iLine + 1); if (iterator.MoveNext()) { iterator.current.SetRangeStyle(start.iChar, iterator.current.charsCount - start.iChar, style); for (int i = end.iLine - start.iLine - 1; i-- > 0;) { iterator.MoveNext(); iterator.current.SetRangeStyle(0, iterator.current.charsCount, style); } iterator.MoveNext(); iterator.current.SetRangeStyle(0, end.iChar, style); } } }
public int IndexOf(string text, int startIndex, int length) { Place place = PlaceOf(startIndex); int linesCount = LinesCount; if (text.IndexOf('\n') == -1 && text.IndexOf('\r') == -1) { return(SingleLineIndexOf(text, startIndex, length, place)); } LineSubdivider subdivider = new LineSubdivider(text, true); if (subdivider.GetLinesCount() == 1) { return(SingleLineIndexOf(text, startIndex, length, place)); } string[] texts = subdivider.GetLines(); string text0 = texts[0]; LineIterator iteratorI = GetLineRange(place.iLine, linesCount - place.iLine); iteratorI.MoveNext(); if (place.iChar > iteratorI.current.charsCount - text0.Length) { iteratorI.MoveNext(); } while (true) { Line line = iteratorI.current; if (line.Text.EndsWith(text0)) { int i = iteratorI.Index; bool correct = i + texts.Length <= linesCount; if (correct) { LineIterator iteratorJ = iteratorI.GetNextRange(texts.Length - 1); for (int j = 1; j < texts.Length - 1 && correct; j++) { iteratorJ.MoveNext(); if (texts[j] != iteratorJ.current.Text) { correct = false; } } iteratorJ.MoveNext(); if (correct && iteratorJ.current.Text.StartsWith(texts[texts.Length - 1])) { return(IndexOf(new Place(line.Text.Length - text0.Length, i))); } } } if (!iteratorI.MoveNext()) { break; } } return(-1); }
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); List <SelectionPlace> places = new List <SelectionPlace>(); foreach (Selection selection in lines.selections) { places.Add(new SelectionPlace(lines.PlaceOf(selection.anchor), lines.PlaceOf(selection.caret))); } lineBreaks = new string[lines.LinesCount]; LineIterator iterator = lines.GetLineRange(0, lines.LinesCount); while (iterator.MoveNext()) { Line line = iterator.current; string lineBreak = line.GetRN(); lineBreaks[iterator.Index] = lineBreak; if (lineBreak != linesLineBreak && lineBreak != "") { line.Chars_RemoveRange(line.charsCount - lineBreak.Length, lineBreak.Length); line.Chars_Add(new Char(linesLineBreak[0])); if (linesLineBreak.Length > 1) { line.Chars_Add(new Char(linesLineBreak[1])); } iterator.InvalidateCurrentText(linesLineBreak.Length - lineBreak.Length); } } for (int i = places.Count; i-- > 0;) { SelectionPlace place = places[i]; Selection selection = lines.selections[i]; selection.anchor = lines.IndexOf(place.anchor); selection.caret = lines.IndexOf(place.caret); } lines.ResetTextCache(); }
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); } }
override public void Undo() { LineIterator iterator = lines.GetLineRange(0, lines.LinesCount); while (iterator.MoveNext()) { Line line = iterator.current; string lineBreak = lineBreaks[iterator.Index]; if (lineBreak != linesLineBreak && lineBreak != "") { line.Chars_RemoveRange(line.charsCount - linesLineBreak.Length, linesLineBreak.Length); line.Chars_Add(new Char(lineBreak[0])); if (lineBreak.Length > 1) { line.Chars_Add(new Char(lineBreak[1])); } iterator.InvalidateCurrentText(lineBreak.Length - linesLineBreak.Length); } } SetSelectionMementos(mementos); lines.ResetTextCache(); lines.viStoreSelector.ViStoreMementos(mementos); }
private int SingleLineIndexOf(string text, int startIndex, int length, Place place) { int linesCount = LinesCount; LineIterator iterator = GetLineRange(place.iLine, linesCount - place.iLine); iterator.MoveNext(); { int index = iterator.current.Text.IndexOf(text, place.iChar); if (index != -1) { return(IndexOf(new Place(index, place.iLine))); } } while (iterator.MoveNext()) { int index = iterator.current.Text.IndexOf(text); if (index != -1) { return(IndexOf(new Place(index, iterator.Index))); } } return(-1); }
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(); }