/*********************************************** * created on 10.05.2005 * last modified: 31.05.2005 * * @author neun and sstein * * Saves the actual map window as svg graphics * ***********************************************/ package org.openjump.core.ui.plugin.file; import com.vividsolutions.jump.I18N; import com.vividsolutions.jump.task.TaskMonitor; import com.vividsolutions.jump.workbench.WorkbenchContext; import com.vividsolutions.jump.workbench.model.Layer; import com.vividsolutions.jump.workbench.plugin.AbstractPlugIn; import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory; import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck; import com.vividsolutions.jump.workbench.plugin.ThreadedPlugIn; import com.vividsolutions.jump.workbench.plugin.PlugInContext; import com.vividsolutions.jump.workbench.ui.GUIUtil; import com.vividsolutions.jump.workbench.ui.LayerViewPanel; import com.vividsolutions.jump.workbench.ui.MenuNames; import com.vividsolutions.jump.workbench.ui.renderer.LayerRenderer; import com.vividsolutions.jump.workbench.ui.renderer.Renderer; import com.vividsolutions.jump.workbench.ui.renderer.RenderingManager; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.util.List; import javax.swing.JFileChooser; import org.apache.batik.svggen.SVGGraphics2D; import org.apache.batik.dom.GenericDOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.DOMImplementation; /** * Saves the actual map window as svg graphics * * @author neun and sstein */ public class SaveImageAsSVGPlugIn extends AbstractPlugIn implements ThreadedPlugIn{ File selFile = null; public SaveImageAsSVGPlugIn() { } public void initialize(PlugInContext context) throws Exception { context.getFeatureInstaller().addMainMenuItemWithJava14Fix(this, new String[] { MenuNames.FILE, MenuNames.FILE_SAVEVIEW }, I18N.get("org.openjump.core.ui.plugin.file.SaveImageAsSVGPlugIn.save-image-in-svg-format") + "..." + "{pos:10}", false, null, createEnableCheck(context.getWorkbenchContext())); //enable check } public boolean execute(PlugInContext context) throws Exception { JFileChooser fc = GUIUtil.createJFileChooserWithOverwritePrompting("svg"); // Show save dialog; this method does not return until the dialog is closed fc.showSaveDialog(context.getWorkbenchFrame()); File file = fc.getSelectedFile(); try{ String name = file.getPath(); name = this.addExtension(name,"svg"); File newFile = new File(name); this.selFile = newFile; return true; } catch(Exception e){ return false; } } public void run(TaskMonitor monitor, PlugInContext context) throws Exception { //Get a DOMImplementation DOMImplementation domImpl = GenericDOMImplementation .getDOMImplementation(); //Create an instance of org.w3c.dom.Document Document document = domImpl.createDocument(null, "svg", null); //Create an instance of the SVG Generator /* SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(document); ctx.setEmbeddedFontsOn(true); SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx, true); */ SVGGraphics2D svgGenerator = new SVGGraphics2D(document); // --- Test with changed classes of Openjump and the new maxFeatures // field in FeatureCollectionRenderer.class LayerViewPanel lvp = context.getLayerViewPanel(); RenderingManager rms = lvp.getRenderingManager(); List layers = context.getLayerManager().getVisibleLayers(false); for (int i=0; i < layers.size(); i++) { Layer layer = (Layer)layers.get(i); Renderer myR = rms.getRenderer(layer); if( myR instanceof LayerRenderer){ LayerRenderer myRnew = (LayerRenderer)myR; myRnew.setMaxFeatures(10000); } } lvp.repaint(); lvp.paintComponent(svgGenerator); //------------------------------ //reset the old state of 100 features for (int i=0; i < layers.size(); i++) { Layer layer = (Layer)layers.get(i); Renderer myR = rms.getRenderer(layer); if( myR instanceof LayerRenderer){ LayerRenderer myRnew = (LayerRenderer)myR; myRnew.setMaxFeatures(100); } } //------------------------------ /** old working code for original jump // paint using new renderer LayerViewPanel lvp = context.getLayerViewPanel(); RenderingManager rm = lvp.getRenderingManager(); Class[] types1 = {Object.class, Renderer.class}; List layers = context.getLayerManager().getVisibleLayers(false); for (int i=0; i < layers.size(); i++) { Layer layer = (Layer)layers.get(i); //-- do now this: // rm.setRenderer(layer,new SvgRenderer(layer, context.getLayerViewPanel())); // but for an invisible method setRenderer() SvgRenderer sr = new SvgRenderer(layer, context.getLayerViewPanel()); Object[] params1 ={layer, sr}; AccessToPrivateMethods.invokePrivateMethod("setRenderer",rm,RenderingManager.class,params1,types1); sr.createRunnable(); //do paint (also on screen) } //paint the layerview into the svgGenerator lvp.paintComponent(svgGenerator); **/ //Finally, stream out SVG to the your file //Writer out = new FileWriter("MyMoMap.svg"); //FileWriter out = new FileWriter(selFile); try{ FileOutputStream fos = new FileOutputStream(this.selFile, false); OutputStreamWriter out = new OutputStreamWriter(fos, "UTF-8"); svgGenerator.stream(out, true); out.close(); } catch(Exception e){ context.getWorkbenchFrame().warnUser("error:" + e.getMessage()); } } public static MultiEnableCheck createEnableCheck(WorkbenchContext workbenchContext) { EnableCheckFactory checkFactory = new EnableCheckFactory(workbenchContext); return new MultiEnableCheck() .add(checkFactory.createWindowWithLayerNamePanelMustBeActiveCheck()) .add(checkFactory.createAtLeastNLayersMustBeSelectedCheck(0)); } private String addExtension(String path, String extension) { if (path.toUpperCase().endsWith(extension.toUpperCase())) { return path; } if (path.endsWith(".")) { return path + extension; } return path + "." + extension; } }