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; }
/** * 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; }
protected void paintComponent(Graphics g) { if (textArea == null) { return; } visibleRect = g.getClipBounds(visibleRect); if (visibleRect == null) { // ??? visibleRect = getVisibleRect(); } // System.out.println("IconRowHeader repainting: " + visibleRect); if (visibleRect == null) { return; } Color bg = getBackground(); if (getGutter() != null) { // Should always be true bg = getGutter().getBackground(); } g.setColor(bg); g.fillRect(0, visibleRect.y, getWidth(), visibleRect.height); RSyntaxTextArea rsta = (RSyntaxTextArea) textArea; if (!rsta.isCodeFoldingEnabled()) { return; // We should be hidden in this case, but still... } if (textArea.getLineWrap()) { paintComponentWrapped(g); return; } // Get where to start painting (top of the row). // We need to be "scrolled up" up just enough for the missing part of // the first line. int cellHeight = textArea.getLineHeight(); int topLine = visibleRect.y / cellHeight; int y = topLine * cellHeight + (cellHeight - collapsedFoldIcon.getIconHeight()) / 2; textAreaInsets = textArea.getInsets(textAreaInsets); if (textAreaInsets != null) { y += textAreaInsets.top; } // Get the first and last lines to paint. FoldManager fm = rsta.getFoldManager(); topLine += fm.getHiddenLineCountAbove(topLine, true); int width = getWidth(); int x = width - 10; int line = topLine; boolean paintingOutlineLine = foldWithOutlineShowing != null && foldWithOutlineShowing.containsLine(line); while (y < visibleRect.y + visibleRect.height) { if (paintingOutlineLine) { g.setColor(getForeground()); int w2 = width / 2; if (line == foldWithOutlineShowing.getEndLine()) { int y2 = y + cellHeight / 2; g.drawLine(w2, y, w2, y2); g.drawLine(w2, y2, width - 2, y2); paintingOutlineLine = false; } else { g.drawLine(w2, y, w2, y + cellHeight); } } Fold fold = fm.getFoldForLine(line); if (fold != null) { if (fold == foldWithOutlineShowing && !fold.isCollapsed()) { g.setColor(getForeground()); int w2 = width / 2; g.drawLine(w2, y + cellHeight / 2, w2, y + cellHeight); paintingOutlineLine = true; } if (fold.isCollapsed()) { collapsedFoldIcon.paintIcon(this, g, x, y); // Skip to next line to paint, taking extra care for lines with // block ends and begins together, e.g. "} else {" do { line += fold.getLineCount(); fold = fm.getFoldForLine(line); } while (fold != null && fold.isCollapsed()); } else { expandedFoldIcon.paintIcon(this, g, x, y); } } line++; y += cellHeight; } }