Example #1
0
 private void MoveCaretToNextTabStop()
 {
     while (CaretColumn % IndentSize != 0 && CaretCharIsASpace)
     {
         Caret.MoveToNextCaretPosition();
     }
     Caret.EnsureVisible();
 }
Example #2
0
 private void MoveCaretToPreviousTabStop()
 {
     Caret.MoveToPreviousCaretPosition();
     while (CaretColumn % IndentSize != (IndentSize - 1) && CaretCharIsASpace)
     {
         Caret.MoveToPreviousCaretPosition();
     }
     Caret.MoveToNextCaretPosition();
     Caret.EnsureVisible();
 }
        private void MoveCaretToPreviousTabStop()
        {
            var caretStartingPosition = Caret.Position.VirtualBufferPosition;
            var caretStartingColumn   = CaretColumn;

            Caret.MoveToPreviousCaretPosition();
            var lastCaretColumn = -1;

            while (CaretColumn % IndentSize != (IndentSize - 1) && CaretCharIsASpace)
            {
                if (CaretColumn >= lastCaretColumn && lastCaretColumn != -1)
                {
                    break;                     // Prevent infinite loop on first char of first line or in box selection
                }
                lastCaretColumn = CaretColumn;
                Caret.MoveToPreviousCaretPosition();
            }

            if (Caret.Position.BufferPosition.Position != 0)
            {             // Do this for all cases except the first char of the document
                Caret.MoveToNextCaretPosition();
            }

            VirtualSnapshotPoint?caretNewPosition = Caret.Position.VirtualBufferPosition;
            int movedBy = caretStartingColumn - CaretColumn;

            if (movedBy % IndentSize != 0)
            {
                // We moved less than a full tab stop length. Only allow this if the cursor started in the middle of a full tab
                for (int i = 0; i < IndentSize; i++)
                {
                    if (Caret.Position.BufferPosition.Add(i).GetChar() != ' ')
                    {
                        caretNewPosition = null;
                        Caret.MoveTo(caretStartingPosition);                         // Do not align on non-exact tab stops
                        break;
                    }
                }
                if (caretNewPosition != null)
                {
                    Caret.MoveTo(caretNewPosition.Value);                     // Go back to original new position
                }
            }

            Caret.EnsureVisible();
        }
        private void MoveCaretToNextTabStop()
        {
            var caretStartingPosition = Caret.Position.VirtualBufferPosition;
            var caretStartingColumn   = CaretColumn;
            var lastCaretColumn       = -1;

            while (CaretColumn % IndentSize != 0 && CaretCharIsASpace)
            {
                if (CaretColumn <= lastCaretColumn)
                {
                    break;                     // Prevent infinite loop in box selection
                }
                lastCaretColumn = CaretColumn;
                Caret.MoveToNextCaretPosition();
            }

            if (CaretColumn % IndentSize != 0)
            {
                Caret.MoveTo(caretStartingPosition);                 // Do not align on non-exact tab stops
            }
            Caret.EnsureVisible();
        }
Example #5
0
        public override int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            if (ConvertTabsToSpaces &&
                TextView.Selection.IsEmpty &&
                pguidCmdGroup == VSConstants.VSStd2K &&
                !IsInAutomationFunction &&
                !DisplayHelper.IsCompletionActive &&
                !DisplayHelper.IsSignatureHelpActive
                )
            {
                switch (nCmdID)
                {
                case ARROW_LEFT:
                case ARROW_RIGHT:
                    if (CaretIsWithinCodeRange)
                    {
                        goto default;
                    }
                    break;

                case ARROW_UP:
                case ARROW_DOWN:
                    Caret.PositionChanged -= CaretOnPositionChanged;
                    if (!_savedCaretColumn.HasValue)
                    {
                        _savedCaretColumn = VirtualCaretColumn;
                    }
                    break;

                default:
                    _savedCaretColumn = null;
                    return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut));
                }

                switch (nCmdID)
                {
                case ARROW_LEFT:
                    Caret.MoveToPreviousCaretPosition();
                    if (CaretCharIsASpace)
                    {
                        MoveCaretToPreviousTabStop();
                        return(VSConstants.S_OK);
                    }
                    Caret.MoveToNextCaretPosition();
                    break;

                case ARROW_RIGHT:
                    if (CaretCharIsASpace)
                    {
                        Caret.MoveToNextCaretPosition();
                        MoveCaretToNextTabStop();
                        return(VSConstants.S_OK);
                    }
                    break;

                case ARROW_UP:
                    try
                    {
                        _snapshotLine = TextView.TextSnapshot.GetLineFromPosition(
                            Caret.Position.BufferPosition.Subtract(CaretColumn + 1));
                        MoveCaretToNearestVirtualTabStop();
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                    }
                    Caret.PositionChanged += CaretOnPositionChanged;
                    return(VSConstants.S_OK);

                case ARROW_DOWN:
                    try
                    {
                        _snapshotLine = FindNextLine();
                        MoveCaretToNearestVirtualTabStop();
                    }
                    catch (ArgumentOutOfRangeException)
                    {
                    }
                    Caret.PositionChanged += CaretOnPositionChanged;
                    return(VSConstants.S_OK);
                }
            }

            return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut));
        }
        public override int Exec(ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut)
        {
            ThreadHelper.ThrowIfNotOnUIThread();
            if (nCmdID < ARROW_LEFT ||
                nCmdID > SHIFT_ARROW_DOWN ||
                (!TextView.Selection.IsEmpty && TextView.Selection.Mode == TextSelectionMode.Box) ||
                pguidCmdGroup != VSConstants.VSStd2K ||
                IsInAutomationFunction ||
                DisplayHelper.IsCompletionActive ||
                DisplayHelper.IsSignatureHelpActive)
            {
                _savedCaretColumn = null;
                return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut));
            }

            lock (_activeLock)
            {
                try
                {
                    _isActive = true;

                    switch (nCmdID)
                    {
                    case ARROW_LEFT:
                    case ARROW_RIGHT:
                    case SHIFT_ARROW_LEFT:
                    case SHIFT_ARROW_RIGHT:
                        if (CaretIsWithinCodeRange)
                        {
                            goto default;
                        }
                        break;

                    case ARROW_UP:
                    case ARROW_DOWN:
                    case SHIFT_ARROW_UP:
                    case SHIFT_ARROW_DOWN:
                        _allowClearSavedCaretColumn = false;
                        if (!_savedCaretColumn.HasValue)
                        {
                            _savedCaretColumn = VirtualCaretColumn;
                        }
                        break;

                    default:
                        _savedCaretColumn = null;
                        ThreadHelper.ThrowIfNotOnUIThread();
                        return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut));
                    }

                    var caretStartingPosition = Caret.Position.VirtualBufferPosition;
                    var selectionAnchorPoint  = TextView.Selection.IsEmpty ? caretStartingPosition : TextView.Selection.AnchorPoint;
                    switch (nCmdID)
                    {
                    case ARROW_LEFT:
                    case SHIFT_ARROW_LEFT:
                        Caret.MoveToPreviousCaretPosition();
                        if (CaretCharIsASpace)
                        {
                            MoveCaretToPreviousTabStop();
                            AdjustTextSelection(nCmdID, selectionAnchorPoint);
                            return(VSConstants.S_OK);
                        }
                        Caret.MoveToNextCaretPosition();
                        break;

                    case ARROW_RIGHT:
                    case SHIFT_ARROW_RIGHT:
                        if (CaretCharIsASpace)
                        {
                            Caret.MoveToNextCaretPosition();
                            MoveCaretToNextTabStop();
                            AdjustTextSelection(nCmdID, selectionAnchorPoint);
                            return(VSConstants.S_OK);
                        }
                        break;

                    case ARROW_UP:
                    case SHIFT_ARROW_UP:
                        try
                        {
                            _snapshotLine = TextView.TextSnapshot.GetLineFromPosition(
                                Caret.Position.BufferPosition.Subtract(CaretColumn + 1));
                            MoveCaretToNearestVirtualTabStop();
                        }
                        catch (ArgumentOutOfRangeException)
                        {
                        }
                        _allowClearSavedCaretColumn = true;
                        AdjustTextSelection(nCmdID, selectionAnchorPoint);
                        return(VSConstants.S_OK);

                    case ARROW_DOWN:
                    case SHIFT_ARROW_DOWN:
                        try
                        {
                            _snapshotLine = FindNextLine();
                            MoveCaretToNearestVirtualTabStop();
                        }
                        catch (ArgumentOutOfRangeException)
                        {
                        }
                        _allowClearSavedCaretColumn = true;
                        AdjustTextSelection(nCmdID, selectionAnchorPoint);
                        return(VSConstants.S_OK);
                    }

                    return(NextTarget.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut));
                }
                finally
                {
                    _isActive = false;
                }
            }
        }