package com.vividsolutions.jump.workbench.ui.plugin;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.*;
import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ImageIcon;
import javax.swing.JCheckBox;
import javax.swing.JComponent;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Icon;
import javax.swing.filechooser.FileFilter;
import org.openjump.core.ui.plugin.file.LayerPrinter2;
import org.openjump.core.ui.plugin.file.WorldFileWriter;
import com.vividsolutions.jts.geom.Envelope;
import com.vividsolutions.jts.geom.Geometry;
import com.vividsolutions.jts.util.Assert;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.workbench.WorkbenchContext;
import com.vividsolutions.jump.workbench.model.Layer;
import com.vividsolutions.jump.workbench.plugin.EnableCheck;
import com.vividsolutions.jump.workbench.plugin.EnableCheckFactory;
import com.vividsolutions.jump.workbench.plugin.MultiEnableCheck;
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.ValidatingTextField;
import com.vividsolutions.jump.workbench.ui.images.IconLoader;
public class SaveImageAsPlugIn extends ExportImagePlugIn {
//ImageIO doesn't know about the "gif" format. I guess it's a copyright
// issue [Jon Aquino 11/6/2003]
//Don't use TYPE_INT_ARGB for jpegs -- they will turn pink [Jon Aquino
// 11/6/2003]
private List myFileFilters = Arrays.asList(new Object[]{
createFileFilter("PNG - Portable Network Graphics", "png",
BufferedImage.TYPE_INT_ARGB),
createFileFilter("JPEG - Joint Photographic Experts Group", "jpg",
BufferedImage.TYPE_INT_RGB)});
private JFileChooser fileChooser = null;
private WorkbenchContext workbenchContext;
private JCheckBox worldFileCheckBox = null;
private JLabel pixelSizeLabel = new JLabel(I18N.get("ui.plugin.SaveImageAsPlugIn.width-in-pixels"));
private final ImageIcon icon = IconLoader.icon("Box.gif");
private Geometry fence = null;
private boolean fenceFound = false;
private ValidatingTextField pixelSizeField = new ValidatingTextField("9999",5,
new ValidatingTextField.Validator() {
public boolean isValid(String text) {
if (text.length() == 0) {
return true;
}
try {
int i = Integer.parseInt(text);
return i<=3800;
} catch (NumberFormatException e) {
return false;
}
}
});
private JFileChooser getFileChooser() {
if (fileChooser == null) {
fileChooser = new GUIUtil.FileChooserWithOverwritePrompting() {
protected File selectedFile() {
return new File(addExtension(
super.selectedFile().getPath(),
((MyFileFilter) getFileFilter()).getFormat()));
}
};
fileChooser.setDialogTitle(I18N.get("ui.plugin.SaveImageAsPlugIn.save-image"));
//Remove *.* [Jon Aquino 11/6/2003]
GUIUtil.removeChoosableFileFilters(fileChooser);
Map formatToFileFilterMap = new HashMap();
for (Iterator i = myFileFilters.iterator(); i.hasNext(); ) {
MyFileFilter fileFilter = (MyFileFilter) i.next();
fileChooser.addChoosableFileFilter(fileFilter);
formatToFileFilterMap.put(fileFilter.getFormat(), fileFilter);
}
String lastFilename = (String) PersistentBlackboardPlugIn
.get(workbenchContext).get(LAST_FILENAME_KEY);
if (lastFilename != null) {
fileChooser.setSelectedFile(new File(lastFilename));
}
fileChooser.setFileFilter((FileFilter) formatToFileFilterMap.get(
PersistentBlackboardPlugIn.get(workbenchContext)
.get(FORMAT_KEY, "png")));
Box box = new Box(BoxLayout.Y_AXIS);
JPanel jPanelSize = new JPanel(new FlowLayout(FlowLayout.LEFT));
JPanel jPanelWF = new JPanel(new FlowLayout(FlowLayout.LEFT));
worldFileCheckBox = new javax.swing.JCheckBox();
worldFileCheckBox.setText(I18N.get("ui.plugin.SaveImageAsPlugIn.write-world-file"));
if (fence != null){
JLabel fenceIcon = new JLabel(icon);
jPanelSize.add(fenceIcon);
}
jPanelSize.add(pixelSizeLabel);
jPanelSize.add(pixelSizeField);
jPanelWF.add(worldFileCheckBox);
box.add(jPanelSize);
box.add(jPanelWF);
box.add(Box.createRigidArea(new Dimension(5,180)));
fileChooser.setAccessory(box);
}
return fileChooser;
}
private int getPixelSize() {
String text = pixelSizeField.getText();
try {
return Integer.parseInt(text);
} catch (NumberFormatException e) {
return 800; //some reasonable default
}
}
private MyFileFilter createFileFilter(String description, String format,
int bufferedmageType) {
return new MyFileFilter(description, format);
}
private static class MyFileFilter extends FileFilter {
private FileFilter fileFilter;
private String format;
public MyFileFilter(String description, String format) {
fileFilter = GUIUtil.createFileFilter(description,
new String[]{format});
this.format = format;
}
public boolean accept(File f) {
return fileFilter.accept(f);
}
public String getDescription() {
return fileFilter.getDescription();
}
public String getFormat() {
return format;
}
}
private static final String FORMAT_KEY = "FORMAT";
private static final String LAST_FILENAME_KEY = "LAST FILENAME";
public boolean execute(PlugInContext context) throws Exception {
this.workbenchContext = context.getWorkbenchContext();
fence = context.getLayerViewPanel().getFence();
fenceFound = (fence != null);
if (fenceFound){
pixelSizeField.setText("800");
}
else {
pixelSizeField.setText(context.getLayerViewPanel().getWidth() + "");}
if (JFileChooser.APPROVE_OPTION != getFileChooser()
.showSaveDialog(context.getWorkbenchFrame())) {
fileChooser = null; //rebuild next invocation
return false;
}
MyFileFilter fileFilter = (MyFileFilter) getFileChooser()
.getFileFilter();
BufferedImage image;
LayerViewPanel viewPanel =context.getLayerViewPanel();
Envelope envelope = null;
if (!fenceFound && (getPixelSize() == context.getLayerViewPanel().getWidth())) {
image = image(viewPanel);
}
else {
LayerPrinter2 layerPrinter = new LayerPrinter2();
if (fenceFound)
{
envelope = fence.getEnvelopeInternal();
String fenceLayerName = I18N.get("model.FenceLayerFinder.fence");
Layer fenceLayer = workbenchContext.getLayerNamePanel().getLayerManager().getLayer(fenceLayerName);
fenceLayer.setVisible(false);
}
else {
envelope = workbenchContext.getLayerViewPanel().getViewport().getEnvelopeInModelCoordinates();
}
image = layerPrinter.print(workbenchContext.getLayerManager().getLayers(), envelope, getPixelSize());
viewPanel = layerPrinter.getLayerViewPanel();
}
String filename = addExtension(getFileChooser().getSelectedFile()
.getPath(), fileFilter.getFormat());
File imageFile = new File(filename);
save(image, fileFilter.getFormat(), imageFile);
PersistentBlackboardPlugIn.get(workbenchContext)
.put(FORMAT_KEY, fileFilter.getFormat());
PersistentBlackboardPlugIn.get(workbenchContext)
.put(LAST_FILENAME_KEY, filename);
if ((worldFileCheckBox != null) && (worldFileCheckBox.isSelected()))
WorldFileWriter.writeWorldFile( imageFile, viewPanel );
fileChooser = null; //rebuild next invocation
return true;
}
private void save(RenderedImage image, String format, File file)
throws IOException {
boolean writerFound = ImageIO.write(image, format, file);
Assert.isTrue( writerFound, I18N.get("ui.plugin.SaveImageAsPlugIn.cannot-find-writer-for-image-format")+" '"
+ format + "'");
}
public static MultiEnableCheck createEnableCheck(
WorkbenchContext workbenchContext) {
EnableCheckFactory checkFactory = new EnableCheckFactory(
workbenchContext);
return new MultiEnableCheck()
.add(checkFactory
.createWindowWithLayerViewPanelMustBeActiveCheck()).add(new EnableCheck() {
public String check(JComponent component) {
//Need Java 1.4's ImageIO class [Jon Aquino 11/6/2003]
return !java14OrNewer()
? "This feature requires Java 1.4 or newer"
: null;
}
});
}
private String addExtension(String path, String extension) {
if (path.toUpperCase().endsWith(extension.toUpperCase())) {
return path;
}
if (path.endsWith(".")) {
return path + extension;
}
return path + "." + extension;
}
}