/* ExportAllChartsToFileAction.java created 2008-01-15
*
*/
package org.signalml.app.action.components;
import static org.signalml.app.util.i18n.SvarogI18n._;
import java.awt.Component;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.log4j.Logger;
import org.jfree.chart.JFreeChart;
import org.signalml.app.view.common.dialogs.OptionPane;
import org.signalml.app.view.common.dialogs.errors.Dialogs;
import org.signalml.app.view.workspace.ViewerFileChooser;
import org.signalml.plugin.export.view.AbstractSignalMLAction;
import org.signalml.util.Util;
/** ExportAllChartsToFileAction
*
*
* @author Michal Dobaczewski © 2007-2008 CC Otwarte Systemy Komputerowe Sp. z o.o.
*/
public abstract class ExportAllChartsToFileAction extends AbstractSignalMLAction {
protected static final Logger logger = Logger.getLogger(ExportAllChartsToFileAction.class);
private static final long serialVersionUID = 1L;
private ViewerFileChooser fileChooser;
private Component optionPaneParent;
public ExportAllChartsToFileAction() {
super();
setText(_("Save charts to PNG file"));
setIconPath("org/signalml/app/icon/picture_save.png");
setToolTip(_("Save charts to PNG file"));
}
protected abstract int getChartCount();
protected abstract Rectangle getChartBounds(int index);
protected abstract JFreeChart getChart(int index);
@Override
public void actionPerformed(ActionEvent ev) {
int chartCount = getChartCount();
if (chartCount == 0) {
return;
}
File file;
boolean hasFile = false;
do {
file = fileChooser.chooseChartSaveAsPngFile(optionPaneParent);
if (file == null) {
return;
}
String ext = Util.getFileExtension(file,false);
if (ext == null) {
file = new File(file.getAbsolutePath() + ".png");
}
hasFile = true;
if (file.exists()) {
int res = OptionPane.showFileAlreadyExists(optionPaneParent);
if (res != OptionPane.OK_OPTION) {
hasFile = false;
}
}
} while (!hasFile);
Rectangle rect = new Rectangle(0,0,0,0);
int i;
for (i=0; i<chartCount; i++) {
rect.add(getChartBounds(i));
}
BufferedImage image = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
Graphics2D g = (Graphics2D) image.getGraphics();
for (i=0; i<chartCount; i++) {
getChart(i).draw(g, getChartBounds(i));
}
try {
ImageIO.write(image, "png", file);
} catch (IOException ex) {
logger.error("Failed to save to file - i/o exception", ex);
Dialogs.showExceptionDialog((Window) null, ex);
return;
}
}
@Override
public void setEnabledAsNeeded() {
setEnabled(true);
}
public ViewerFileChooser getFileChooser() {
return fileChooser;
}
public void setFileChooser(ViewerFileChooser fileChooser) {
this.fileChooser = fileChooser;
}
public Component getOptionPaneParent() {
return optionPaneParent;
}
public void setOptionPaneParent(Component optionPaneParent) {
this.optionPaneParent = optionPaneParent;
}
}