From c1b2a69a9395acefbd5f59ce2fcaf63d41416f73 Mon Sep 17 00:00:00 2001 From: Julian Storer Date: Fri, 5 Feb 2010 16:56:51 +0000 Subject: [PATCH] Improved CodeEditor cursor behaviour. --- .../code_editor/juce_CodeDocument.cpp | 11 ++++--- .../code_editor/juce_CodeEditorComponent.cpp | 30 +++++++++++++++---- .../code_editor/juce_CodeEditorComponent.h | 3 +- 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/gui/components/code_editor/juce_CodeDocument.cpp b/src/gui/components/code_editor/juce_CodeDocument.cpp index 7579cf061a..12235ffbc7 100644 --- a/src/gui/components/code_editor/juce_CodeDocument.cpp +++ b/src/gui/components/code_editor/juce_CodeDocument.cpp @@ -34,18 +34,18 @@ BEGIN_JUCE_NAMESPACE class CodeDocumentLine { public: - CodeDocumentLine (const String& line_, + CodeDocumentLine (const tchar* const line_, const int lineLength_, const int numNewLineChars, const int lineStartInFile_) - : line (line_), + : line (line_, lineLength_), lineStartInFile (lineStartInFile_), lineLength (lineLength_), lineLengthWithoutNewLines (lineLength_ - numNewLineChars) { } - ~CodeDocumentLine() throw() + ~CodeDocumentLine() { } @@ -85,9 +85,8 @@ public: ++pos; } - newLines.add (new CodeDocumentLine (String (t + startOfLine, pos - startOfLine), - pos - startOfLine, numNewLineChars, - startOfLine)); + newLines.add (new CodeDocumentLine (t + startOfLine, pos - startOfLine, + numNewLineChars, startOfLine)); } jassert (pos == text.length()); diff --git a/src/gui/components/code_editor/juce_CodeEditorComponent.cpp b/src/gui/components/code_editor/juce_CodeEditorComponent.cpp index 780c39438b..aa75f63b5e 100644 --- a/src/gui/components/code_editor/juce_CodeEditorComponent.cpp +++ b/src/gui/components/code_editor/juce_CodeEditorComponent.cpp @@ -285,6 +285,7 @@ CodeEditorComponent::CodeEditorComponent (CodeDocument& document_, linesOnScreen (0), columnsOnScreen (0), scrollbarThickness (16), + columnToTryToMaintain (-1), useSpacesForTabs (false), xOffset (0), codeTokeniser (codeTokeniser_) @@ -348,6 +349,7 @@ void CodeEditorComponent::codeDocumentChanged (const CodeDocument::Position& aff triggerAsyncUpdate(); ((CaretComponent*) caret)->updatePosition (*this); + columnToTryToMaintain = -1; if (affectedTextEnd.getPosition() >= selectionStart.getPosition() && affectedTextStart.getPosition() <= selectionEnd.getPosition()) @@ -462,6 +464,7 @@ void CodeEditorComponent::rebuildLineTokens() void CodeEditorComponent::moveCaretTo (const CodeDocument::Position& newPos, const bool highlighting) { caretPos = newPos; + columnToTryToMaintain = -1; if (highlighting) { @@ -690,6 +693,21 @@ void CodeEditorComponent::cursorRight (const bool moveInWholeWordSteps, const bo moveCaretTo (caretPos.movedBy (1), selecting); } +void CodeEditorComponent::moveLineDelta (const int delta, const bool selecting) +{ + CodeDocument::Position pos (caretPos); + const int newLineNum = pos.getLineNumber() + delta; + + if (columnToTryToMaintain < 0) + columnToTryToMaintain = indexToColumn (pos.getLineNumber(), pos.getIndexInLine()); + + pos.setLineAndIndex (newLineNum, columnToIndex (newLineNum, columnToTryToMaintain)); + + const int colToMaintain = columnToTryToMaintain; + moveCaretTo (pos, selecting); + columnToTryToMaintain = colToMaintain; +} + void CodeEditorComponent::cursorDown (const bool selecting) { newTransaction(); @@ -697,7 +715,7 @@ void CodeEditorComponent::cursorDown (const bool selecting) if (caretPos.getLineNumber() == document.getNumLines() - 1) moveCaretTo (CodeDocument::Position (&document, std::numeric_limits::max(), std::numeric_limits::max()), selecting); else - moveCaretTo (caretPos.movedByLines (1), selecting); + moveLineDelta (1, selecting); } void CodeEditorComponent::cursorUp (const bool selecting) @@ -707,7 +725,7 @@ void CodeEditorComponent::cursorUp (const bool selecting) if (caretPos.getLineNumber() == 0) moveCaretTo (CodeDocument::Position (&document, 0, 0), selecting); else - moveCaretTo (caretPos.movedByLines (-1), selecting); + moveLineDelta (-1, selecting); } void CodeEditorComponent::pageDown (const bool selecting) @@ -715,7 +733,7 @@ void CodeEditorComponent::pageDown (const bool selecting) newTransaction(); scrollBy (jlimit (0, linesOnScreen, 1 + document.getNumLines() - firstLineOnScreen - linesOnScreen)); - moveCaretTo (caretPos.movedByLines (linesOnScreen), selecting); + moveLineDelta (linesOnScreen, selecting); } void CodeEditorComponent::pageUp (const bool selecting) @@ -723,7 +741,7 @@ void CodeEditorComponent::pageUp (const bool selecting) newTransaction(); scrollBy (-linesOnScreen); - moveCaretTo (caretPos.movedByLines (-linesOnScreen), selecting); + moveLineDelta (-linesOnScreen, selecting); } void CodeEditorComponent::scrollUp() @@ -732,7 +750,7 @@ void CodeEditorComponent::scrollUp() scrollBy (1); if (caretPos.getLineNumber() < firstLineOnScreen) - moveCaretTo (caretPos.movedByLines (1), false); + moveLineDelta (1, false); } void CodeEditorComponent::scrollDown() @@ -741,7 +759,7 @@ void CodeEditorComponent::scrollDown() scrollBy (-1); if (caretPos.getLineNumber() >= firstLineOnScreen + linesOnScreen) - moveCaretTo (caretPos.movedByLines (-1), false); + moveLineDelta (-1, false); } void CodeEditorComponent::goToStartOfDocument (const bool selecting) diff --git a/src/gui/components/code_editor/juce_CodeEditorComponent.h b/src/gui/components/code_editor/juce_CodeEditorComponent.h index 98e25d33d8..a4e4d31dbe 100644 --- a/src/gui/components/code_editor/juce_CodeEditorComponent.h +++ b/src/gui/components/code_editor/juce_CodeEditorComponent.h @@ -247,7 +247,7 @@ private: int firstLineOnScreen, gutter, spacesPerTab; float charWidth; int lineHeight, linesOnScreen, columnsOnScreen; - int scrollbarThickness; + int scrollbarThickness, columnToTryToMaintain; bool useSpacesForTabs; double xOffset; @@ -278,6 +278,7 @@ private: void clearCachedIterators (const int firstLineToBeInvalid) throw(); void updateCachedIterators (int maxLineNum); void getIteratorForPosition (int position, CodeDocument::Iterator& result); + void moveLineDelta (const int delta, const bool selecting); //============================================================================== void updateScrollBars();