package me.drton.flightplot;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;
import javax.imageio.stream.ImageOutputStream;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.prefs.Preferences;
public class PlotExportDialog extends JDialog {
private static final String DIALOG_SETTING = "PlotExportDialog";
private static final String LAST_EXPORT_DIRECTORY_SETTING = "LastExportDirectory";
private JPanel contentPane;
private JButton buttonExport;
private JButton buttonClose;
private JTextField widthField;
private JTextField heightField;
private JComboBox formatComboBox;
private JTextField scaleField;
private FlightPlot app;
private File lastExportDirectory;
public PlotExportDialog(FlightPlot app) {
this.app = app;
setContentPane(contentPane);
setModal(true);
getRootPane().setDefaultButton(buttonExport);
buttonExport.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onOK();
}
});
buttonClose.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClose();
}
});
// call onClose() when cross is clicked
setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
onClose();
}
});
// call onClose() on ESCAPE
contentPane.registerKeyboardAction(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onClose();
}
}, KeyStroke.getKeyStroke(KeyEvent.VK_ESCAPE, 0), JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
pack();
}
private void onOK() {
String format = ((String) formatComboBox.getSelectedItem()).toLowerCase();
JFileChooser fc = new JFileChooser();
if (lastExportDirectory != null) {
fc.setCurrentDirectory(lastExportDirectory);
}
FileNameExtensionFilter extensionFilter = new FileNameExtensionFilter(format.toUpperCase() + " Image (*." + format + ")", format);
fc.setFileFilter(extensionFilter);
fc.setDialogTitle("Export Plot");
int returnVal = fc.showDialog(null, "Export Plot");
if (returnVal == JFileChooser.APPROVE_OPTION) {
lastExportDirectory = fc.getCurrentDirectory();
String fileName = fc.getSelectedFile().toString();
if (extensionFilter == fc.getFileFilter() && !fileName.toLowerCase().endsWith("." + format)) {
fileName += "." + format;
}
try {
int width = Integer.parseInt(widthField.getText());
int height = Integer.parseInt(heightField.getText());
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = img.createGraphics();
double scale = Double.parseDouble(scaleField.getText());
AffineTransform st = AffineTransform.getScaleInstance(scale, scale);
g2.transform(st);
app.getChart().draw(g2, new Rectangle2D.Double(0.0D, 0.0D, width / scale, height / scale), null, null);
g2.dispose();
ImageWriter imgWriter = ImageIO.getImageWritersByFormatName(format).next();
ImageWriteParam imgWriteParam = imgWriter.getDefaultWriteParam();
if ("jpg".equals(format)) {
imgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
imgWriteParam.setCompressionQuality(1.0f);
}
ImageOutputStream outputStream = new FileImageOutputStream(new File(fileName));
imgWriter.setOutput(outputStream);
IIOImage outputImage = new IIOImage(img, null, null);
imgWriter.write(null, outputImage, imgWriteParam);
imgWriter.dispose();
app.setStatus(String.format("Exported to \"%s\"", fileName));
} catch (Exception e) {
app.setStatus("Error: " + e);
e.printStackTrace();
}
}
dispose();
}
private void onClose() {
dispose();
}
public void savePreferences(Preferences preferences) {
PreferencesUtil.saveWindowPreferences(this, preferences.node(DIALOG_SETTING));
if (lastExportDirectory != null) {
preferences.put(LAST_EXPORT_DIRECTORY_SETTING, lastExportDirectory.getAbsolutePath());
}
}
public void loadPreferences(Preferences preferences) {
PreferencesUtil.loadWindowPreferences(this, preferences.node(DIALOG_SETTING), -1, -1);
String lastExportDirectoryPath = preferences.get(LAST_EXPORT_DIRECTORY_SETTING, null);
if (null != lastExportDirectoryPath) {
lastExportDirectory = new File(lastExportDirectoryPath);
}
}
}