diff --git a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp index f7efc25f44..afa4a73e9d 100644 --- a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp +++ b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.cpp @@ -131,16 +131,28 @@ void SourceCodeEditor::setEditor (CodeEditorComponent* newEditor) getAppSettings().appearance.settings.addListener (this); } -void SourceCodeEditor::highlightLine (int lineNum, int characterIndex) +void SourceCodeEditor::scrollToKeepRangeOnScreen (const Range& range) { - if (lineNum <= editor->getFirstLineOnScreen() - || lineNum >= editor->getFirstLineOnScreen() + editor->getNumLinesOnScreen() - 1) - { - editor->scrollToLine (jmax (0, jmin (lineNum - editor->getNumLinesOnScreen() / 3, - editor->getDocument().getNumLines() - editor->getNumLinesOnScreen()))); - } + const int space = jmin (10, editor->getNumLinesOnScreen() / 3); + const CodeDocument::Position start (editor->getDocument(), range.getStart()); + const CodeDocument::Position end (editor->getDocument(), range.getEnd()); - editor->moveCaretTo (CodeDocument::Position (editor->getDocument(), lineNum - 1, characterIndex), false); + editor->scrollToKeepLinesOnScreen (Range (start.getLineNumber() - space, end.getLineNumber() + space)); +} + +void SourceCodeEditor::highlight (const Range& range, bool cursorAtStart) +{ + scrollToKeepRangeOnScreen (range); + + if (cursorAtStart) + { + editor->moveCaretTo (CodeDocument::Position (editor->getDocument(), range.getEnd()), false); + editor->moveCaretTo (CodeDocument::Position (editor->getDocument(), range.getStart()), true); + } + else + { + editor->setHighlightedRegion (range); + } } void SourceCodeEditor::resized() diff --git a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h index 016cb569ea..81bb8bc13d 100644 --- a/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h +++ b/extras/Introjucer/Source/Code Editor/jucer_SourceCodeEditor.h @@ -143,7 +143,8 @@ public: void createEditor (CodeDocument& codeDocument); void setEditor (CodeEditorComponent*); - void highlightLine (int lineNum, int characterIndex); + void scrollToKeepRangeOnScreen (const Range& range); + void highlight (const Range& range, bool cursorAtStart); ScopedPointer editor; diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp index 9570c17091..d520c6f526 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp @@ -704,16 +704,20 @@ void CodeEditorComponent::scrollBy (int deltaLines) scrollToLine (firstLineOnScreen + deltaLines); } +void CodeEditorComponent::scrollToKeepLinesOnScreen (const Range& lines) +{ + if (lines.getStart() < firstLineOnScreen) + scrollBy (lines.getStart() - firstLineOnScreen); + else if (lines.getEnd() >= firstLineOnScreen + linesOnScreen) + scrollBy (lines.getEnd() - (firstLineOnScreen + linesOnScreen - 1)); +} + void CodeEditorComponent::scrollToKeepCaretOnScreen() { if (getWidth() > 0 && getHeight() > 0) { const int caretLine = caretPos.getLineNumber(); - - if (caretLine < firstLineOnScreen) - scrollBy (caretLine - firstLineOnScreen); - else if (caretLine >= firstLineOnScreen + linesOnScreen) - scrollBy (caretLine - (firstLineOnScreen + linesOnScreen - 1)); + scrollToKeepLinesOnScreen (Range (caretLine, caretLine)); const int column = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine()); if (column >= xOffset + columnsOnScreen - 1) diff --git a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h index 2104a71bef..ba934fd713 100644 --- a/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h +++ b/modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.h @@ -142,6 +142,7 @@ public: void scrollBy (int deltaLines); void scrollToColumn (int newFirstColumnOnScreen); void scrollToKeepCaretOnScreen(); + void scrollToKeepLinesOnScreen (const Range& linesToShow); void insertTextAtCaret (const String& textToInsert); void insertTabAtCaret();