private Fold findOpenFoldClosestTo(Point p) { Fold fold = null; RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; if (rsta.isCodeFoldingEnabled()) { // Should always be true int offs = rsta.viewToModel(p); // TODO: Optimize me if (offs > -1) { try { int line = rsta.getLineOfOffset(offs); int origLine = line; FoldManager fm = rsta.getFoldManager(); do { fold = fm.getFoldForLine(line); } while (fold == null && line-- >= 0); if (fold != null && !fold.containsOrStartsOnLine(origLine)) { // Found closest fold, but doesn't actually contain line fold = null; } } catch (BadLocationException ble) { ble.printStackTrace(); // Never happens } } } return fold; }
private void search(int direction) { String searchText = searchField.getText(); if (searchText == null || searchText.length() == 0 || rTextArea.getText() == null) { return; } boolean forward = direction >= 0; boolean matchCase = matchCaseCB.isSelected(); boolean regex = regexCB.isSelected(); boolean wholeWord = wholeWordCB.isSelected(); if (markAllCB.isSelected()) { rTextArea.markAll(searchText, matchCase, wholeWord, regex); } else { rTextArea.clearMarkAllHighlights(); } SearchContext context = new SearchContext(); context.setSearchFor(searchText); context.setMatchCase(matchCase); context.setRegularExpression(regex); context.setSearchForward(forward); context.setWholeWord(wholeWord); // TODO hack: move cursor before previous search for not jump to next occurrence if (direction == 0 && !COLOR_BG_ERROR.equals(searchField.getBackground())) { try { int caretPos = rTextArea.getCaretPosition(); int lineNum = rTextArea.getLineOfOffset(caretPos) - 1; if (lineNum > 1) { rTextArea.setCaretPosition(rTextArea.getLineStartOffset(lineNum)); } } catch (BadLocationException e) { LOG.error("Caret move error", e); } } boolean found = SearchEngine.find(rTextArea, context); if (!found) { int pos = SearchEngine.getNextMatchPos( searchText, rTextArea.getText(), forward, matchCase, wholeWord); if (pos != -1) { rTextArea.setCaretPosition(forward ? 0 : rTextArea.getDocument().getLength() - 1); search(direction); searchField.setBackground(COLOR_BG_WARN); return; } searchField.setBackground(COLOR_BG_ERROR); } else { searchField.setBackground(COLOR_BG_NORMAL); } }
/** * Overridden to show the content of a collapsed fold on mouse-overs. * * @param e The mouse location. */ public String getToolTipText(MouseEvent e) { String text = null; RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; if (rsta.isCodeFoldingEnabled()) { FoldManager fm = rsta.getFoldManager(); int pos = rsta.viewToModel(new Point(0, e.getY())); if (pos >= 0) { // Not -1 int line = 0; try { line = rsta.getLineOfOffset(pos); } catch (BadLocationException ble) { ble.printStackTrace(); // Never happens return null; } Fold fold = fm.getFoldForLine(line); if (fold != null && fold.isCollapsed()) { int endLine = fold.getEndLine(); if (fold.getLineCount() > 25) { // Not too big endLine = fold.getStartLine() + 25; } StringBuffer sb = new StringBuffer("<html><nobr>"); while (line <= endLine && line < rsta.getLineCount()) { // Sanity Token t = rsta.getTokenListForLine(line); while (t != null && t.isPaintable()) { t.appendHTMLRepresentation(sb, rsta, true, true); t = t.getNextToken(); } sb.append("<br>"); line++; } text = sb.toString(); } } } return text; }