package org.esa.snap.timeseries.export.util;
import org.esa.snap.core.datamodel.RasterDataNode;
import org.esa.snap.rcp.SnapApp;
import org.esa.snap.rcp.SnapDialogs;
import org.esa.snap.util.SystemUtils;
import org.esa.snap.util.io.SnapFileChooser;
import org.esa.snap.util.io.SnapFileFilter;
import org.openide.util.HelpCtx;
import javax.swing.AbstractButton;
import javax.swing.BorderFactory;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
import javax.swing.JFileChooser;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.io.File;
import java.util.Enumeration;
/**
* @author Marco Peters
*/
public class TimeSeriesExportHelper {
public static class FileWithLevel {
public FileWithLevel(File file, int level) {
this.file = file;
this.level = level;
}
public File file;
public int level;
}
public static FileWithLevel getOutputFileWithLevelOption(RasterDataNode raster,
String title, String fileNamePrefix, String dirPreferencesKey,
SnapFileFilter fileFilter, String helpId) {
SnapApp snapApp = SnapApp.getDefault();
final String lastDir = snapApp.getPreferences().get(dirPreferencesKey, SystemUtils.getUserHomeDir().getPath());
final File currentDir = new File(lastDir);
final SnapFileChooser fileChooser = new SnapFileChooser();
if (helpId != null) {
HelpCtx.setHelpIDString(fileChooser, helpId);
}
fileChooser.setCurrentDirectory(currentDir);
fileChooser.addChoosableFileFilter(fileFilter);
fileChooser.setAcceptAllFileFilterUsed(false);
fileChooser.setDialogTitle(snapApp.getInstanceName() + " - " + title);
fileChooser.setCurrentFilename(fileNamePrefix + raster.getName());
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
Dimension fileChooserSize = fileChooser.getPreferredSize();
if (fileChooserSize != null) {
fileChooser.setPreferredSize(new Dimension(
fileChooserSize.width + 120, fileChooserSize.height));
} else {
fileChooser.setPreferredSize(new Dimension(512, 256));
}
int maxLevel = raster.getSourceImage().getModel().getLevelCount() - 1;
maxLevel = maxLevel > 10 ? 10 : maxLevel;
final JPanel levelPanel = new JPanel(new GridLayout(maxLevel, 1));
levelPanel.setBorder(BorderFactory.createTitledBorder("Resolution Level"));
ButtonGroup buttonGroup = new ButtonGroup();
for (int i = 0; i < maxLevel; i++) {
String buttonText = Integer.toString(i);
if (i == 0) {
buttonText += " (high, very slow)";
} else if (i == maxLevel - 1) {
buttonText += " (low, fast)";
}
final JRadioButton button = new JRadioButton(buttonText, true);
buttonGroup.add(button);
levelPanel.add(button);
button.setSelected(true);
}
final JPanel accessory = new JPanel();
accessory.setLayout(new BoxLayout(accessory, BoxLayout.Y_AXIS));
accessory.add(levelPanel);
fileChooser.setAccessory(accessory);
int result = fileChooser.showSaveDialog(snapApp.getMainFrame());
File file = fileChooser.getSelectedFile();
final File currentDirectory = fileChooser.getCurrentDirectory();
if (currentDirectory != null) {
snapApp.getPreferences().get(dirPreferencesKey, currentDirectory.getPath());
}
if (result != JFileChooser.APPROVE_OPTION) {
return null;
}
if (file == null || file.getName().isEmpty()) {
return null;
}
if (!promptForOverwrite(file)) {
return null;
}
int level = parseLevel(buttonGroup);
return new FileWithLevel(file, level);
}
public static boolean promptForOverwrite(File file) {
return !file.exists() || SnapDialogs.Answer.YES == SnapDialogs.requestDecision("File Exists",
"The file\n" + "'" + file.getPath() + "'\n" + "already exists.\n\n" + "Do you really want to overwrite it?\n",
false, null);
}
private static int parseLevel(ButtonGroup buttonGroup) {
Enumeration<AbstractButton> buttonEnumeration = buttonGroup.getElements();
while (buttonEnumeration.hasMoreElements()) {
AbstractButton abstractButton = buttonEnumeration.nextElement();
if (abstractButton.isSelected()) {
String buttonText = abstractButton.getText();
final int index = buttonText.indexOf(" (");
if (index != -1) {
buttonText = buttonText.substring(0, index);
}
return Integer.parseInt(buttonText);
}
}
return-1;
}
}