Skip to content

Commit

Permalink
fix: use JFreeSVG to render SVG images (fixes #669)
Browse files Browse the repository at this point in the history
Batik is no longer bundled in recent versions of the IDE, and JFreeSVG is a lighter alternative.
  • Loading branch information
bjansen committed Feb 1, 2024
1 parent d647de1 commit e96469f
Show file tree
Hide file tree
Showing 2 changed files with 11 additions and 14 deletions.
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ dependencies {
exclude group:'com.ibm.icu', module:'icu4j'
}
implementation "org.antlr:antlr4-intellij-adaptor:0.1"
implementation group: 'org.jfree', name: 'org.jfree.svg', version: '5.0.5'
testImplementation group: 'junit', name: 'junit', version: '4.13.2'
testImplementation group: 'org.mockito', name: 'mockito-core', version: '5.10.0'
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,19 +15,17 @@
import com.intellij.openapi.vfs.VirtualFileWrapper;
import com.intellij.ui.JBColor;
import com.intellij.util.ui.UIUtil;
import org.apache.batik.dom.GenericDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.apache.batik.svggen.SVGGraphics2DIOException;
import org.apache.commons.lang.StringUtils;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.apache.commons.lang3.StringUtils;
import org.jfree.svg.SVGGraphics2D;

import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

/**
Expand All @@ -39,7 +37,7 @@ class ParseTreeContextualMenu {
static void showPopupMenu(UberTreeViewer parseTreeViewer, MouseEvent event) {
JPopupMenu menu = new JPopupMenu();

menu.add(createExportMenuItem(parseTreeViewer, "Export to image (white background)", false));
menu.add(createExportMenuItem(parseTreeViewer, "Export to image (current background)", false));
menu.add(createExportMenuItem(parseTreeViewer, "Export to image (transparent background)", true));

menu.show(parseTreeViewer, event.getX(), event.getY());
Expand Down Expand Up @@ -107,21 +105,19 @@ private static void exportToImage(UberTreeViewer parseTreeViewer, File file, boo
}

private static void exportToSvg(UberTreeViewer parseTreeViewer, File file, boolean useTransparentBackground) {
DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation();
Document document = domImpl.createDocument("http://www.w3.org/2000/svg", "svg", null);
SVGGraphics2D svgGenerator = new SVGGraphics2D(document);
SVGGraphics2D svgGenerator = new SVGGraphics2D(parseTreeViewer.getWidth(), parseTreeViewer.getHeight());

if (!useTransparentBackground) {
svgGenerator.setColor(JBColor.WHITE);
svgGenerator.fillRect(0, 0, parseTreeViewer.getWidth(), parseTreeViewer.getHeight());
}
parseTreeViewer.paint(svgGenerator);

try {
svgGenerator.stream(file.getAbsolutePath(), true);
} catch (SVGGraphics2DIOException e) {
try (var writer = new BufferedWriter(new FileWriter(file))) {
writer.write(svgGenerator.getSVGDocument());
} catch (IOException e) {
Logger.getInstance(ParseTreeContextualMenu.class)
.error("Error while exporting parse tree to SVG file " + file.getAbsolutePath(), e);
.error("Error while exporting parse tree to SVG file " + file.getAbsolutePath(), e);
}
}
}

0 comments on commit e96469f

Please sign in to comment.