Пример #1
0
        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);
        }
        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 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);
        }
Пример #4
0
        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();
        }