Esempio n. 1
0
        public static void MoveBlockDown(TextEditorData data)
        {
            int  lineStart    = data.Caret.Line;
            int  lineEnd      = data.Caret.Line;
            bool setSelection = lineStart != lineEnd;

            if (data.IsSomethingSelected)
            {
                setSelection = true;
                lineStart    = data.MainSelection.MinLine;
                lineEnd      = data.MainSelection.MaxLine;
            }

            if (lineStart <= 0)
            {
                return;
            }
            data.Document.BeginAtomicUndo();

            //Mono.TextEditor.LineSegment startLine = data.Document.GetLine (lineStart);
            //int relCaretOffset = data.Caret.Offset - startLine.Offset;

            Mono.TextEditor.LineSegment nextLine = data.Document.GetLine(lineEnd + 1);
            if (nextLine == null)
            {
                return;
            }
            string            text            = data.Document.GetTextAt(nextLine.Offset, nextLine.EditableLength);
            List <TextMarker> prevLineMarkers = new List <TextMarker> (nextLine.Markers);

            nextLine.ClearMarker();

            for (int i = lineEnd + 1; i >= lineStart; i--)
            {
                LineSegment cur  = data.Document.GetLine(i);
                LineSegment prev = data.Document.GetLine(i - 1);
                data.Replace(cur.Offset, cur.EditableLength, i != lineStart ? data.Document.GetTextAt(prev.Offset, prev.EditableLength) : text);
                data.Document.GetLine(i).ClearMarker();
                foreach (TextMarker marker in (i != lineStart ? data.Document.GetLine(i - 1).Markers : prevLineMarkers))
                {
                    data.Document.GetLine(i).AddMarker(marker);
                }
            }

            data.Caret.Line++;
            if (setSelection)
            {
                data.SetSelection(data.Document.GetLine(lineStart + 1).Offset, data.Document.GetLine(lineEnd + 1).Offset + data.Document.GetLine(lineEnd + 1).EditableLength);
            }
            data.Document.EndAtomicUndo();
        }
Esempio n. 2
0
        public static void MoveBlockUp(TextEditorData data)
        {
            int  lineStart    = data.Caret.Line;
            int  lineEnd      = data.Caret.Line;
            bool setSelection = lineStart != lineEnd;

            if (data.IsSomethingSelected)
            {
                setSelection = true;
                lineStart    = data.MainSelection.MinLine;
                lineEnd      = data.MainSelection.MaxLine;
            }

            if (lineStart <= 0)
            {
                return;
            }

            using (var undo = data.OpenUndoGroup()) {
                //Mono.TextEditor.LineSegment startLine = data.Document.GetLine (lineStart);
                //int relCaretOffset = data.Caret.Offset - startLine.Offset;

                Mono.TextEditor.LineSegment prevLine = data.Document.GetLine(lineStart - 1);
                string            text            = data.Document.GetTextAt(prevLine.Offset, prevLine.EditableLength);
                List <TextMarker> prevLineMarkers = new List <TextMarker> (prevLine.Markers);
                prevLine.ClearMarker();

                for (int i = lineStart - 1; i <= lineEnd; i++)
                {
                    LineSegment cur  = data.Document.GetLine(i);
                    LineSegment next = data.Document.GetLine(i + 1);
                    data.Replace(cur.Offset, cur.EditableLength, i != lineEnd ? data.Document.GetTextAt(next.Offset, next.EditableLength) : text);
                    data.Document.GetLine(i).ClearMarker();
                    foreach (TextMarker marker in (i != lineEnd ? data.Document.GetLine(i + 1).Markers : prevLineMarkers))
                    {
                        data.Document.GetLine(i).AddMarker(marker);
                    }
                }

                data.Caret.Line--;
                if (setSelection)
                {
                    data.SetSelection(data.Document.GetLine(lineStart - 1).Offset, data.Document.GetLine(lineEnd - 1).Offset + data.Document.GetLine(lineEnd - 1).EditableLength);
                }
            }
        }