/* * Copyright 2003-2010 Tufts University Licensed under the * Educational Community License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may * obtain a copy of the License at * * http://www.osedu.org/licenses/ECL-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an "AS IS" * BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing * permissions and limitations under the License. */ package tufts.vue.action; /* * SVGConversion.java * * Created on June 3, 2003, 3:29 PM */ import java.awt.*; import java.awt.geom.Rectangle2D; import javax.swing.*; import java.io.*; import org.apache.xerces.dom.*; import org.apache.batik.dom.GenericDOMImplementation; import org.apache.batik.svggen.*; import org.w3c.dom.*; import tufts.vue.*; /** * * @author Daisuke Fujiwara */ /**A class which converts the current map image into SVG format and saves the content to a file*/ public class SVGConversion extends AbstractAction { /** Creates a new instance of SVGConversion */ public SVGConversion() { } public SVGConversion(String label) { super(label); putValue(Action.SHORT_DESCRIPTION,label); } public static void createSVG(File location) { LWMap currentMap = VUE.getActiveMap(); createSVG(location,currentMap); } /**A method which converts the given Java graphics into the SVG form and writes the output to a given file*/ public static void createSVG(File location,LWMap currentMap) { //sets up the document object model DOMImplementation domImpl = GenericDOMImplementation.getDOMImplementation(); String svgNS = "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"; Document document = domImpl.createDocument(svgNS, "svg", null);//new DocumentImpl(); //SVGGraphics2D svgGenerator = new SVGGraphics2D(document); SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document); ctx.setEmbeddedFontsOn(true); // ctx.set SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx, true); // svgGenerator.setUnsupportedAttributes(arg0) //Rectangle2D bounds = map.getAllComponentBounds(); //int xLocation = (int)bounds.getX() + 5, yLocation = (int)bounds.getY() + 5; //Dimension size = new Dimension((int)bounds.getWidth() + xLocation, (int)bounds.getHeight() + yLocation); Rectangle2D bounds = currentMap.getBounds(); // Dimension size = new Dimension((int)bounds.getWidth(), (int)bounds.getHeight()); //draws the background and the border of the image /* svgGenerator.setColor(Color.white); svgGenerator.fillRect(0, 0, size.width, size.height); svgGenerator.setColor(Color.black); svgGenerator.drawRect(0, 0, size.width-1, size.height-1); //translate and set the clip for the map content svgGenerator.translate(-(int)bounds.getX(), -(int)bounds.getY()); */ svgGenerator.setClip(bounds); //renders the map image into the SVGGraphics object //map.paintComponent(svgGenerator); DrawContext dc = new DrawContext(svgGenerator); dc.setMapDrawing(); dc.setPrintQuality(); dc.setAntiAlias(true); // dc.setAbsoluteScale(2.0); dc.setClipOptimized(false); // dc.setRawDrawing(); //dc.setClipOptimized(false); dc.setInteractive(false); dc.setDrawPathways(false); // render the map LWPathway.setShowSlides(false); currentMap.draw(dc); LWPathway.setShowSlides(true); try { //using the SVGGraphics object, write the SVG content to the given file // FileWriter out = new FileWriter(location); Writer out = new OutputStreamWriter(new FileOutputStream(location),"UTF-8"); svgGenerator.stream(out, true); out.flush(); out.close(); } catch (IOException e) { System.err.println("Couldn't convert to SVG:" + e); } catch (java.lang.OutOfMemoryError error) { System.err.println("Couldn't convert to SVG:" + error); } /* * There's no explanation to why this is being done, I'm not really sure * why you would do this. Every application I tried appeared to open the * file fine without this so I'm removing it, and it causes VUE to hang. -MK */ //there might be a better way to do this // replaceHeader(location); } /**A class which replaces the encoding of the xml to be utf - 8*/ public void replaceHeader(File file) { try { BufferedReader reader = new BufferedReader(new FileReader(file)); String line, content = null; boolean firstLine = true; //replaces the first line - xml declaration while ((line = reader.readLine()) != null) { if (firstLine) { content = "<?xml version=\"1.0\" encoding=\"utf-8\"?>"; firstLine = false; } else content += line; } reader.close(); FileWriter writer = new FileWriter(file); writer.write(content); writer.flush(); writer.close(); } catch (Exception e) { System.err.println("Something went wront when replacing the header:" + e); } } public void actionPerformed(java.awt.event.ActionEvent actionEvent) { //displays the file chooser so that the user can select the file to save the SVG image into try { File selectedFile = ActionUtil.selectFile("Saving SVG", "svg"); if (selectedFile != null) createSVG(selectedFile); } catch(Exception ex) { System.out.println("Couldn't convert to SVG:" + ex); } } }