void (EditorEx editor, int startLine, int endLine, boolean showFolding, boolean showGutter) { FoldingModelEx foldingModel = editor.getFoldingModel(); boolean isFoldingEnabled = foldingModel.isFoldingEnabled(); if (!showFolding) { foldingModel.setFoldingEnabled(false); } int textImageWidth; int markersImageWidth; int textImageHeight; BufferedImage textImage; BufferedImage markersImage; JComponent rowHeader; try { Document doc = editor.getDocument(); int endOffset = endLine < doc.getLineCount() ? doc.getLineEndOffset(Math.max(0, endLine - 1)) : doc.getTextLength(); int widthAdjustment = EditorUtil.getSpaceWidth(Font.PLAIN, editor); textImageWidth = Math.min( editor.getMaxWidthInRange(doc.getLineStartOffset(startLine), endOffset) + widthAdjustment, getWidthLimit(editor) ); int startVisualLine = editor.logicalToVisualPosition(new LogicalPosition(startLine, 0)).line; int endVisualLine = editor.logicalToVisualPosition(new LogicalPosition(Math.max(endLine, startLine + 1), 0)).line; int y1 = editor.visualLineToY(startVisualLine); // as endLine is exclusive (not shown), we should also exclude block inlays associated with it int y2 = editor.visualLineToY(endVisualLine) - EditorUtil.getInlaysHeight(editor, endVisualLine, true); textImageHeight = y2 <= y1 ? editor.getLineHeight() : y2 - y1; LOG.assertTrue(textImageHeight > 0, "Height: " + textImageHeight + "; startLine:" + startLine + "; endLine:" + endLine + "; y1:" + y1 + "; y2:" + y2); textImage = UIUtil.createImage(editor.getContentComponent(), textImageWidth, textImageHeight, BufferedImage.TYPE_INT_RGB); Graphics textGraphics = textImage.getGraphics(); EditorUIUtil.setupAntialiasing(textGraphics); if (showGutter) { rowHeader = editor.getGutterComponentEx(); markersImageWidth = Math.max(1, rowHeader.getWidth()); markersImage = UIUtil.createImage(editor.getComponent(), markersImageWidth, textImageHeight, BufferedImage.TYPE_INT_RGB); Graphics markerGraphics = markersImage.getGraphics(); EditorUIUtil.setupAntialiasing(markerGraphics); markerGraphics.translate(0, -y1); markerGraphics.setClip(0, y1, rowHeader.getWidth(), textImageHeight); markerGraphics.setColor(getBackgroundColor(editor)); markerGraphics.fillRect(0, y1, rowHeader.getWidth(), textImageHeight); rowHeader.paint(markerGraphics); } else { markersImageWidth = 0; rowHeader = null; markersImage = null; } textGraphics.translate(0, -y1); textGraphics.setClip(0, y1, textImageWidth, textImageHeight); boolean wasVisible = editor.setCaretVisible(false); editor.getContentComponent().paint(textGraphics); if (wasVisible) { editor.setCaretVisible(true); } } finally { if (!showFolding) { foldingModel.setFoldingEnabled(isFoldingEnabled); } } JComponent component = new JComponent() { @Override public Dimension getPreferredSize() { return new Dimension(textImageWidth + markersImageWidth, textImageHeight); } @Override protected void paintComponent(Graphics graphics) { if (markersImage != null) { StartupUiUtil.drawImage(graphics, markersImage, 0, 0, null); StartupUiUtil.drawImage(graphics, textImage, rowHeader.getWidth(), 0, null); } else { StartupUiUtil.drawImage(graphics, textImage, 0, 0, null); } } }; setLayout(new BorderLayout()); add(component); setBorder(createEditorFragmentBorder(editor)); }