package com.horstmann.violet.framework;
public class EditorFrame {
protected String imageExtensions;
EditorFrame(Class appClass) {
/* fileMenu.add(factory.createMenuItem(
"file.export_image", this, "exportImage"));
*/
fileMenu.add(factory.createMenuItem(
"file.export_image", new
ActionListener()
{
public void actionPerformed(ActionEvent event)
{
exportImage();
}
}));
}
/**
Exports the current graph to an image file.
*/
public void exportImage()
{
GraphFrame frame
= (GraphFrame)desktop.getSelectedFrame();
if (frame == null) return;
try
{
Save save = fileService.save(null, frame.getFileName(), exportFilter,
defaultExtension, imageExtensions);
OutputStream out = save.getOutputStream();
if (out != null)
{
String format;
String fileName = save.getName();
if (fileName == null)
{
int n = imageExtensions.indexOf("|");
if (n < 0) n = imageExtensions.length();
format = imageExtensions.substring(1, n);
}
else
format = fileName.substring(fileName.lastIndexOf(".") + 1);
if (!ImageIO.getImageWritersByFormatName(format)
.hasNext())
{
MessageFormat formatter = new MessageFormat(
editorResources.getString("error.unsupported_image"));
JOptionPane.showInternalMessageDialog(desktop,
formatter.format(new Object[] { format }));
return;
}
Graph graph = frame.getGraph();
try
{
saveImage(graph, out, format);
} catch(Exception e) {
e.printStackTrace();
}
out.close();
}
}
catch (Exception exception)
{
JOptionPane.showInternalMessageDialog(desktop,
exception);
}
}
/**
Exports a current graph to an image file.
@param graph the graph
@param out the output stream
@param format the image file format
*/
public static void saveImage(Graph graph, OutputStream out, String format)
throws IOException
{
BufferedImage dummy = new BufferedImage(1, 1,
BufferedImage.TYPE_INT_RGB);
// need a dummy image to get a Graphics to
// measure the size
Rectangle2D bounds = graph.getBounds(
(Graphics2D) dummy.getGraphics());
BufferedImage image
= new BufferedImage((int)bounds.getWidth() + 1,
(int)bounds.getHeight() + 1,
BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)image.getGraphics();
g2.translate(-bounds.getX(), -bounds.getY());
g2.setColor(Color.WHITE);
g2.fill(new Rectangle2D.Double(
bounds.getX(),
bounds.getY(),
bounds.getWidth() + 1,
bounds.getHeight() + 1));
g2.setColor(Color.BLACK);
g2.setBackground(Color.WHITE);
graph.draw(g2, null);
ImageIO.write(image, format, out);
}
}