package com.swingsane.business.image.transform;
import java.awt.Component;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.JOptionPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import com.swingsane.gui.dialog.CropImageDialog;
import com.swingsane.gui.panel.CropTransformSettingsPanel;
import com.swingsane.gui.panel.ITransformSettingsPanel;
import com.swingsane.preferences.IPreferredDefaults;
/**
* @author Roland Quast (roland@formreturn.com)
*
*/
public class CropTransform implements IImageTransform {
private Rectangle bounds = new Rectangle();
private ArrayList<ChangeListener> listenerList = new ArrayList<ChangeListener>();
private File sourceImageFile;
private File outputImageFile;
private Component parent;
private boolean readyToTransform = false;
private static final ImageTransformType imageTransformType = ImageTransformType.CROP;
public final void addChangeListener(final ChangeListener listener) {
listenerList.add(listener);
}
@Override
public final void configure(IPreferredDefaults preferredDefaultsImpl) throws Exception {
if (!isReadyToTransform()) {
CropImageDialog cropImageDialog = new CropImageDialog(parent);
cropImageDialog.setTransform(this);
cropImageDialog.loadImage();
cropImageDialog.setModal(true);
cropImageDialog.setVisible(true);
if (cropImageDialog.getDialogResult() == JOptionPane.OK_OPTION) {
setReadyToTransform(true);
}
}
}
private void fireChangeEvent(ChangeEvent e) {
for (ChangeListener changeListener : listenerList) {
changeListener.stateChanged(e);
}
}
public final Rectangle getBounds() {
return bounds;
}
@Override
public final File getOutputImageFile() {
return outputImageFile;
}
@Override
public final File getSourceImageFile() {
return sourceImageFile;
}
@Override
public final ITransformSettingsPanel getTransformSettingsPanel() {
CropTransformSettingsPanel transformSettingsPanel = new CropTransformSettingsPanel();
transformSettingsPanel.setTransform(this);
return transformSettingsPanel;
}
public final boolean isReadyToTransform() {
return readyToTransform;
}
public final void setBounds(Rectangle bounds) {
this.bounds = bounds;
}
public final void setHeight(int height) {
bounds.height = height;
ChangeEvent event = new ChangeEvent(bounds);
fireChangeEvent(event);
}
@Override
public final void setOutputImageFile(File outputImageFile) {
this.outputImageFile = outputImageFile;
}
public final void setParentComponent(Component parentComponent) {
parent = parentComponent;
}
public final void setReadyToTransform(boolean readyToTransform) {
this.readyToTransform = readyToTransform;
}
@Override
public final void setSourceImageFile(File sourceImageFile) {
this.sourceImageFile = sourceImageFile;
}
public final void setWidth(int width) {
bounds.width = width;
ChangeEvent event = new ChangeEvent(bounds);
fireChangeEvent(event);
}
public final void setX(int x) {
bounds.x = x;
ChangeEvent event = new ChangeEvent(bounds);
fireChangeEvent(event);
}
public final void setY(int y) {
bounds.y = y;
ChangeEvent event = new ChangeEvent(bounds);
fireChangeEvent(event);
}
@Override
public final String toString() {
return imageTransformType.toString();
}
@Override
public final void transform() throws IOException {
if (!isReadyToTransform()) {
return;
}
BufferedImage bufferedImage = ImageIO.read(sourceImageFile).getSubimage(bounds.x, bounds.y,
bounds.width, bounds.height);
ImageIO.write(bufferedImage, "PNG", outputImageFile);
}
}