package ro.emilianbold.editor; import java.awt.Font; import java.awt.Graphics; import java.util.List; import javax.swing.text.Position; import org.netbeans.editor.CodeFoldingSideBar; import org.netbeans.editor.CodeFoldingSideBar.PaintInfo; import org.netbeans.editor.view.spi.CodeFoldingPainter; public class TriangleCodeFoldingPainter extends CodeFoldingPainter { @Override public void paint(Graphics g, PaintInfo paintInfo, int markSize, Font defFont, List visibleMarks) { if (paintInfo.getPaintOperation() == CodeFoldingSideBar.PAINT_NOOP && paintInfo.getInnerLevel() == 0) { return; //No painting for this view } boolean isFolded = paintInfo.isCollapsed(); int y = paintInfo.getPaintY(); int height = paintInfo.getPaintHeight(); int halfMarkSize = markSize / 2; int markX = (defFont.getSize() - markSize) / 2; // x position of mark rectangle int markY = y + g.getFontMetrics(defFont).getDescent(); // y position of mark rectangle int lineX = markX + halfMarkSize; // x position of the centre of mark int paintOperation = paintInfo.getPaintOperation(); if (paintOperation == CodeFoldingSideBar.PAINT_MARK || paintOperation == CodeFoldingSideBar.SINGLE_PAINT_MARK) { if (isFolded) { g.drawPolygon(new int[]{lineX, lineX, markX + markSize}, new int[]{markY, markY + markSize, markY + halfMarkSize}, 3); if (paintInfo.getInnerLevel() > 0) { g.drawLine(lineX, y, lineX, markY); if (paintOperation != CodeFoldingSideBar.SINGLE_PAINT_MARK) { g.drawLine(lineX, markY + markSize, lineX, y + height); } } } else { g.drawPolygon(new int[]{markX, markX + markSize, markX + halfMarkSize}, new int[]{markY, markY, markY + markSize}, 3); if (paintInfo.getInnerLevel() > 0) { g.drawLine(lineX, y, lineX, markY); } if (paintOperation != CodeFoldingSideBar.SINGLE_PAINT_MARK) { g.drawLine(lineX, markY + markSize, lineX, y + height); } } visibleMarks.add(new CodeFoldingSideBar.Mark(markX, markY, markSize, isFolded)); } else if (paintOperation == CodeFoldingSideBar.PAINT_LINE) { g.drawLine(lineX, y, lineX, y + height); } else if (paintOperation == CodeFoldingSideBar.PAINT_END_MARK) { g.drawPolygon(new int[]{markX, markX + markSize, markX + halfMarkSize}, new int[]{markY + markSize, markY + markSize, markY}, 3); g.drawLine(lineX, y, lineX, markY); if (paintInfo.getInnerLevel() > 0) { g.drawLine(lineX, y + height, lineX, markY + markSize); } visibleMarks.add(new CodeFoldingSideBar.Mark(markX, markY, markSize, isFolded, Position.Bias.Backward)); //NOTE the backward ! } } }