コード例 #1
0
ファイル: Caret.cs プロジェクト: mennodeij/XwtPlus.TextEditor
        public void SetToOffsetWithDesiredColumn(int desiredOffset)
        {
            DocumentLocation old = Location;

            int desiredLineNumber = TextEditor.Document.OffsetToLineNumber(desiredOffset);
            var desiredLine       = TextEditor.Document.GetLine(desiredLineNumber);
            int newColumn         = desiredOffset - desiredLine.Offset + 1;

            if (desiredLine.Length + 1 < Column && newColumn == 1)
            {
                if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual)
                {
                    newColumn = TextEditor.GetVirtualIndentationColumn(desiredLineNumber, 1);
                }
            }

            line   = desiredLineNumber;
            column = newColumn;
            var logicalDesiredColumn = desiredLine.GetLogicalColumn(TextEditor, DesiredColumn);

            if (logicalDesiredColumn <= desiredLine.Length + 1)
            {
                int possibleOffset = TextEditor.Document.LocationToOffset(desiredLineNumber, logicalDesiredColumn);
                column = logicalDesiredColumn;
            }
            else
            {
                column = System.Math.Max(newColumn, desiredLine.Length + 1);
            }

            UpdateCaretOffset();
            OnPositionChanged(new DocumentLocationEventArgs(old));
        }
コード例 #2
0
ファイル: Caret.cs プロジェクト: mennodeij/XwtPlus.TextEditor
        void CheckColumn()
        {
            var curLine = TextEditor.Document.GetLine(Line);

            if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual && curLine.Length == 0)
            {
                if (column > DocumentLocation.MinColumn)
                {
                    var indentColumn = TextEditor.GetVirtualIndentationColumn(Location);
                    if (column < indentColumn)
                    {
                        column = indentColumn;
                        UpdateCaretOffset();
                        return;
                    }
                    if (column == indentColumn)
                    {
                        return;
                    }
                }
            }

            if (!AllowCaretBehindLineEnd)
            {
                var max = curLine.Length + 1;
                if (column > max)
                {
                    column = max;
                    UpdateCaretOffset();
                }
            }
        }
コード例 #3
0
ファイル: Caret.cs プロジェクト: mennodeij/XwtPlus.TextEditor
        internal void UpdateCaretPosition(DocumentChangeEventArgs e)
        {
            if (e.AnchorMovementType == AnchorMovementType.BeforeInsertion && caretOffset == e.Offset)
            {
                offsetVersion = TextEditor.Document.Version;
                return;
            }
            var curVersion = TextEditor.Document.Version;

            if (offsetVersion == null)
            {
                offsetVersion = curVersion;
                return;
            }
            var newOffset = offsetVersion.MoveOffsetTo(curVersion, caretOffset);

            offsetVersion = curVersion;
            if (newOffset == caretOffset || !AutoUpdatePosition)
            {
                return;
            }
            DocumentLocation old = Location;
            var newLocation      = TextEditor.Document.OffsetToLocation(newOffset);
            int newColumn        = newLocation.Column;

            var curLine = TextEditor.Document.GetLine(newLocation.Line);

            if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual && curLine.Length == 0)
            {
                var indentColumn = TextEditor.GetVirtualIndentationColumn(Location);
                if (column == indentColumn)
                {
                    newColumn = indentColumn;
                }
            }
            if (AllowCaretBehindLineEnd)
            {
                if (curLine != null && column > curLine.Length)
                {
                    newColumn = column;
                }
            }
            line   = newLocation.Line;
            column = newColumn;

            SetDesiredColumn();
            UpdateCaretOffset();
            OnPositionChanged(new DocumentLocationEventArgs(old));
        }
コード例 #4
0
ファイル: Caret.cs プロジェクト: mennodeij/XwtPlus.TextEditor
        void SetColumn()
        {
            var curLine = TextEditor.Document.GetLine(Line);

            if (curLine == null)
            {
                return;
            }
            column = System.Math.Max(DocumentLocation.MinColumn, Column);
            column = curLine.GetLogicalColumn(TextEditor, DesiredColumn);
            if (TextEditor.HasIndentationTracker && TextEditor.Options.IndentStyle == IndentStyle.Virtual && curLine.GetVisualColumn(TextEditor, column) < DesiredColumn)
            {
                column = TextEditor.GetVirtualIndentationColumn(Line, column);
            }
            else
            {
                if (!AllowCaretBehindLineEnd && Column > curLine.Length + 1)
                {
                    column = System.Math.Min(curLine.Length + 1, column);
                }
            }
        }