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);
        }
示例#3
0
        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();
        }
示例#4
0
 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);
 }
示例#5
0
        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();
        }
示例#7
0
        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();
        }
示例#8
0
        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);
        }
示例#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();
        }
示例#10
0
        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);
        }
示例#11
0
        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);
        }