package prefuse.util.display; import java.awt.event.ActionEvent; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStream; import java.util.HashSet; import javax.imageio.ImageIO; import javax.swing.AbstractAction; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import prefuse.Display; import prefuse.util.io.IOLib; import prefuse.util.io.SimpleFileFilter; /** * Swing ActionListener that reveals a dialog box that allows users to * export the current Display view to an image file. * * @author <a href="http://jheer.org">jeffrey heer</a> */ public class ExportDisplayAction extends AbstractAction { private Display display; private JFileChooser chooser; private ScaleSelector scaler; /** * Create a new ExportDisplayAction for the given Display. * @param display the Display to capture */ public ExportDisplayAction(Display display) { this.display = display; } private void init() { scaler = new ScaleSelector(); chooser = new JFileChooser(); chooser.setDialogType(JFileChooser.SAVE_DIALOG); chooser.setDialogTitle("Export Prefuse Display..."); chooser.setAcceptAllFileFilterUsed(false); HashSet seen = new HashSet(); String[] fmts = ImageIO.getWriterFormatNames(); for ( int i=0; i<fmts.length; i++ ) { String s = fmts[i].toLowerCase(); if ( s.length() == 3 && !seen.contains(s) ) { seen.add(s); chooser.setFileFilter(new SimpleFileFilter(s, s.toUpperCase()+" Image (*."+s+")")); } } seen.clear(); seen = null; chooser.setAccessory(scaler); } /** * Shows the image export dialog and processes the results. * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent) */ public void actionPerformed(ActionEvent evt) { // lazy initialization if ( chooser == null ) init(); // open image save dialog File f = null; scaler.setImage(display.getOffscreenBuffer()); int returnVal = chooser.showSaveDialog(display); if (returnVal == JFileChooser.APPROVE_OPTION) { f = chooser.getSelectedFile(); } else { return; } String format = ((SimpleFileFilter)chooser.getFileFilter()).getExtension(); String ext = IOLib.getExtension(f); if ( !format.equals(ext) ) { f = new File(f.toString()+"."+format); } double scale = scaler.getScale(); // save image boolean success = false; try { OutputStream out = new BufferedOutputStream( new FileOutputStream(f)); System.out.print("Saving image "+f.getName()+", "+ format+" format..."); success = display.saveImage(out, format, scale); out.flush(); out.close(); System.out.println("\tDONE"); } catch ( Exception e ) { success = false; } // show result dialog on failure if ( !success ) { JOptionPane.showMessageDialog(display, "Error Saving Image!", "Image Save Error", JOptionPane.ERROR_MESSAGE); } } } // end of class SaveImageAction