@Override public void paint(Graphics gfx) { Graphics2D g = (Graphics2D) gfx; g.setColor(editor.getColorsScheme().getDefaultBackground()); g.fillRect(0, 0, getWidth(), getHeight()); logger.debug(String.format("Rendering to buffer: %d", activeBuffer)); if (activeBuffer >= 0) { paintSelection(g); Minimap minimap = minimaps[activeBuffer]; Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); double documentEndY = editor .logicalPositionToXY( editor.offsetToLogicalPosition(editor.getDocument().getTextLength() - 1)) .getY(); coords .setMinimap(minimap) .setPanelHeight(getHeight()) .setPanelWidth(getWidth()) .setPercentageComplete( visibleArea.getMinY() / (documentEndY - (visibleArea.getMaxY() - visibleArea.getMinY()))) .setHidpiScale(getHidpiScale()); Rectangle src = coords.getImageSource(); Rectangle dest = coords.getImageDestination(); // Draw the image and scale it to stretch vertically. g.drawImage( minimap.img, // source image dest.x, dest.y, dest.width, dest.height, src.x, src.y, src.width, src.height, null); paintVisibleWindow(g); } }
private void paintSelection(Graphics2D g) { int selectionStartOffset = editor.getSelectionModel().getSelectionStart(); int selectionEndOffset = editor.getSelectionModel().getSelectionEnd(); int firstSelectedLine = coords.offsetToScreenSpace(selectionStartOffset); int firstSelectedCharacter = coords.offsetToCharacterInLine(selectionStartOffset); int lastSelectedLine = coords.offsetToScreenSpace(selectionEndOffset); int lastSelectedCharacter = coords.offsetToCharacterInLine(selectionEndOffset); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.90f)); g.setColor( editor .getColorsScheme() .getColor(ColorKey.createColorKey("SELECTION_BACKGROUND", JBColor.BLUE))); if (firstSelectedLine == lastSelectedLine) { // Single line is easy g.fillRect( firstSelectedCharacter, firstSelectedLine, lastSelectedCharacter - firstSelectedCharacter, config.pixelsPerLine); } else { // Draw the line leading in g.fillRect( firstSelectedCharacter, firstSelectedLine, getWidth() - firstSelectedCharacter, config.pixelsPerLine); // Then the line at the end g.fillRect(0, lastSelectedLine, lastSelectedCharacter, config.pixelsPerLine); if (firstSelectedLine + 1 != lastSelectedLine) { // And if there is anything in between, fill it in g.fillRect( 0, firstSelectedLine + config.pixelsPerLine, getWidth(), lastSelectedLine - firstSelectedLine - config.pixelsPerLine); } } }
private void paintVisibleWindow(Graphics2D g) { Rectangle visibleArea = editor.getScrollingModel().getVisibleArea(); int firstVisibleLine = getMapYFromEditorY((int) visibleArea.getMinY()); int height = coords.linesToPixels( (int) ((visibleArea.getMaxY() - visibleArea.getMinY()) / editor.getLineHeight())); // Draw the current viewport g.setColor(viewportColor); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.50f)); g.drawRect(0, firstVisibleLine, getWidth(), height); g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.20f)); g.fillRect(0, firstVisibleLine, getWidth(), height); }
private int getMapYFromEditorY(int y) { int offset = editor.logicalPositionToOffset(editor.xyToLogicalPosition(new Point(0, y))); return coords.offsetToScreenSpace(offset); }
private void readConfig() { config = configService.getState(); coords.setPixelsPerLine(config.pixelsPerLine); viewportColor = Color.decode("#" + config.viewportColor); }