Example #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);
        }
Example #2
0
        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);
                }
            }
        }
Example #3
0
        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);
        }
Example #4
0
 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();
        }
Example #6
0
        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);
        }
Example #8
0
        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);
        }
Example #9
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();
        }