bool CodeEditorComponent::selectAll() { newTransaction(); moveCaretTo (CodeDocument::Position (&document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), false); moveCaretTo (CodeDocument::Position (&document, 0, 0), true); return true; }
void CodeEditorComponent::mouseDoubleClick (const MouseEvent& e) { CodeDocument::Position tokenStart (getPositionAt (e.x, e.y)); CodeDocument::Position tokenEnd (tokenStart); if (e.getNumberOfClicks() > 2) { tokenStart.setLineAndIndex (tokenStart.getLineNumber(), 0); tokenEnd.setLineAndIndex (tokenStart.getLineNumber() + 1, 0); } else { while (CharacterFunctions::isLetterOrDigit (tokenEnd.getCharacter())) tokenEnd.moveBy (1); tokenStart = tokenEnd; while (tokenStart.getIndexInLine() > 0 && CharacterFunctions::isLetterOrDigit (tokenStart.movedBy (-1).getCharacter())) tokenStart.moveBy (-1); } moveCaretTo (tokenEnd, false); moveCaretTo (tokenStart, true); }
void CodeEditorComponent::cursorDown (const bool selecting) { newTransaction(); if (caretPos.getLineNumber() == document.getNumLines() - 1) moveCaretTo (CodeDocument::Position (&document, INT_MAX, INT_MAX), selecting); else moveCaretTo (caretPos.movedByLines (1), selecting); }
void CodeEditorComponent::cursorUp (const bool selecting) { newTransaction(); if (caretPos.getLineNumber() == 0) moveCaretTo (CodeDocument::Position (&document, 0, 0), selecting); else moveCaretTo (caretPos.movedByLines (-1), selecting); }
void CodeEditorComponent::cursorRight (const bool moveInWholeWordSteps, const bool selecting) { newTransaction(); if (moveInWholeWordSteps) moveCaretTo (document.findWordBreakAfter (caretPos), selecting); else moveCaretTo (caretPos.movedBy (1), selecting); }
bool CodeEditorComponent::moveCaretLeft (const bool moveInWholeWordSteps, const bool selecting) { newTransaction(); if (moveInWholeWordSteps) moveCaretTo (document.findWordBreakBefore (caretPos), selecting); else moveCaretTo (caretPos.movedBy (-1), selecting); return true; }
//============================================================================== void CodeEditorComponent::mouseDown (const MouseEvent& e) { newTransaction(); dragType = notDragging; if (e.mods.isPopupMenu()) { setMouseCursor (MouseCursor::NormalCursor); if (getHighlightedRegion().isEmpty()) { CodeDocument::Position start, end; document.findTokenContaining (getPositionAt (e.x, e.y), start, end); if (start.getPosition() < end.getPosition()) selectRegion (start, end); } PopupMenu m; m.setLookAndFeel (&getLookAndFeel()); addPopupMenuItems (m, &e); m.showMenuAsync (PopupMenu::Options(), ModalCallbackFunction::forComponent (codeEditorMenuCallback, this)); } else { beginDragAutoRepeat (100); moveCaretTo (getPositionAt (e.x, e.y), e.mods.isShiftDown()); } }
bool CodeEditorComponent::moveCaretToEndOfLine (const bool selecting) { newTransaction(); moveCaretTo (CodeDocument::Position (document, caretPos.getLineNumber(), std::numeric_limits<int>::max()), selecting); return true; }
void CodeEditorComponent::pageDown (const bool selecting) { newTransaction(); scrollBy (jlimit (0, linesOnScreen, 1 + document.getNumLines() - firstLineOnScreen - linesOnScreen)); moveCaretTo (caretPos.movedByLines (linesOnScreen), selecting); }
void CodeEditorComponent::pageUp (const bool selecting) { newTransaction(); scrollBy (-linesOnScreen); moveCaretTo (caretPos.movedByLines (-linesOnScreen), selecting); }
void CodeEditorComponent::scrollDown() { newTransaction(); scrollBy (-1); if (caretPos.getLineNumber() >= firstLineOnScreen + linesOnScreen) moveCaretTo (caretPos.movedByLines (-1), false); }
bool CodeEditorComponent::moveCaretDown (const bool selecting) { newTransaction(); if (caretPos.getLineNumber() == document.getNumLines() - 1) moveCaretTo (CodeDocument::Position (&document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting); else moveLineDelta (1, selecting); return true; }
bool CodeEditorComponent::moveCaretUp (const bool selecting) { newTransaction(); if (caretPos.getLineNumber() == 0) moveCaretTo (CodeDocument::Position (&document, 0, 0), selecting); else moveLineDelta (-1, selecting); return true; }
void CodeEditorComponent::goToStartOfLine (const bool selecting) { newTransaction(); int index = findFirstNonWhitespaceChar (caretPos.getLineText()); if (index >= caretPos.getIndexInLine() && caretPos.getIndexInLine() > 0) index = 0; moveCaretTo (CodeDocument::Position (&document, caretPos.getLineNumber(), index), 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; }
bool CodeEditorComponent::moveCaretRight (const bool moveInWholeWordSteps, const bool selecting) { newTransaction(); if (selecting && dragType == notDragging) { selectRegion (CodeDocument::Position (selectionStart), CodeDocument::Position (selectionEnd)); dragType = draggingSelectionEnd; } if (isHighlightActive() && ! (selecting || moveInWholeWordSteps)) { moveCaretTo (selectionEnd, false); return true; } if (moveInWholeWordSteps) moveCaretTo (document.findWordBreakAfter (caretPos), selecting); else moveCaretTo (caretPos.movedBy (1), selecting); return true; }
void CodeEditorComponent::backspace (const bool moveInWholeWordSteps) { if (moveInWholeWordSteps) { cut(); // in case something is already highlighted moveCaretTo (document.findWordBreakBefore (caretPos), true); } else { if (selectionStart == selectionEnd) selectionStart.moveBy (-1); } cut(); }
bool CodeEditorComponent::deleteBackwards (const bool moveInWholeWordSteps) { if (moveInWholeWordSteps) { cut(); // in case something is already highlighted moveCaretTo (document.findWordBreakBefore (caretPos), true); } else if (selectionStart == selectionEnd && ! skipBackwardsToPreviousTab()) { selectionStart.moveBy (-1); } cut(); return true; }
void CodeEditorComponent::deleteForward (const bool moveInWholeWordSteps) { if (moveInWholeWordSteps) { cut(); // in case something is already highlighted moveCaretTo (document.findWordBreakAfter (caretPos), true); } else { if (selectionStart == selectionEnd) selectionEnd.moveBy (1); else newTransaction(); } cut(); }
void CodeEditorComponent::insertTabAtCaret() { if (CharacterFunctions::isWhitespace (caretPos.getCharacter()) && caretPos.getLineNumber() == caretPos.movedBy (1).getLineNumber()) { moveCaretTo (document.findWordBreakAfter (caretPos), false); } if (useSpacesForTabs) { const int caretCol = indexToColumn (caretPos.getLineNumber(), caretPos.getIndexInLine()); const int spacesNeeded = spacesPerTab - (caretCol % spacesPerTab); insertTextAtCaret (String::repeatedString (T(" "), spacesNeeded)); } else { insertTextAtCaret (T("\t")); } }
//============================================================================== void CodeEditorComponent::codeDocumentChanged (const CodeDocument::Position& affectedTextStart, const CodeDocument::Position& affectedTextEnd) { clearCachedIterators (affectedTextStart.getLineNumber()); triggerAsyncUpdate(); ((CaretComponent*) caret)->updatePosition (*this); if (affectedTextEnd.getPosition() >= selectionStart.getPosition() && affectedTextStart.getPosition() <= selectionEnd.getPosition()) deselectAll(); if (caretPos.getPosition() > affectedTextEnd.getPosition() || caretPos.getPosition() < affectedTextStart.getPosition()) moveCaretTo (affectedTextStart, false); updateScrollBars(); }
void CodeEditorComponent::codeDocumentChanged (const int startIndex, const int endIndex) { const CodeDocument::Position affectedTextStart (document, startIndex); const CodeDocument::Position affectedTextEnd (document, endIndex); clearCachedIterators (affectedTextStart.getLineNumber()); rebuildLineTokensAsync(); updateCaretPosition(); columnToTryToMaintain = -1; if (affectedTextEnd.getPosition() >= selectionStart.getPosition() && affectedTextStart.getPosition() <= selectionEnd.getPosition()) deselectAll(); if (caretPos.getPosition() > affectedTextEnd.getPosition() || caretPos.getPosition() < affectedTextStart.getPosition()) moveCaretTo (affectedTextStart, false); updateScrollBars(); }
void CodeEditorComponent::mouseDown (const MouseEvent& e) { newTransaction(); dragType = notDragging; if (! e.mods.isPopupMenu()) { beginDragAutoRepeat (100); moveCaretTo (getPositionAt (e.x, e.y), e.mods.isShiftDown()); } else { /*PopupMenu m; addPopupMenuItems (m, &e); const int result = m.show(); if (result != 0) performPopupMenuAction (result); */ } }
void CodeEditorComponent::selectAll() { newTransaction(); moveCaretTo (CodeDocument::Position (&document, INT_MAX, INT_MAX), false); moveCaretTo (CodeDocument::Position (&document, 0, 0), true); }
void CodeEditorComponent::goToEndOfLine (const bool selecting) { newTransaction(); moveCaretTo (CodeDocument::Position (&document, caretPos.getLineNumber(), INT_MAX), selecting); }
void CodeEditorComponent::goToEndOfDocument (const bool selecting) { newTransaction(); moveCaretTo (CodeDocument::Position (&document, INT_MAX, INT_MAX), selecting); }
void CodeEditorComponent::setHighlightedRegion (const Range<int>& newRange) { moveCaretTo (CodeDocument::Position (&document, newRange.getStart()), false); moveCaretTo (CodeDocument::Position (&document, newRange.getEnd()), true); }
bool CodeEditorComponent::moveCaretToEnd (const bool selecting) { newTransaction(); moveCaretTo (CodeDocument::Position (&document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), selecting); return true; }
void CodeEditorComponent::mouseDrag (const MouseEvent& e) { if (! e.mods.isPopupMenu()) moveCaretTo (getPositionAt (e.x, e.y), true); }
void CodeEditorComponent::goToStartOfDocument (const bool selecting) { newTransaction(); moveCaretTo (CodeDocument::Position (&document, 0, 0), selecting); }