/* * Copyright (C) 2010 Brockmann Consult GmbH (info@brockmann-consult.de) * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the Free * Software Foundation; either version 3 of the License, or (at your option) * any later version. * This program is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for * more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, see http://www.gnu.org/licenses/ */ package org.esa.snap.timeseries.export.text; import com.bc.ceres.core.ProgressMonitor; import com.bc.ceres.swing.progress.ProgressMonitorSwingWorker; import org.esa.snap.core.datamodel.Band; import org.esa.snap.core.datamodel.Placemark; import org.esa.snap.core.datamodel.PlacemarkGroup; import org.esa.snap.core.datamodel.ProductNode; import org.esa.snap.core.help.HelpSys; import org.esa.snap.core.ui.SelectExportMethodDialog; import org.esa.snap.rcp.SnapApp; import org.esa.snap.rcp.SnapDialogs; import org.esa.snap.timeseries.core.timeseries.datamodel.AbstractTimeSeries; import org.esa.snap.timeseries.export.util.TimeSeriesExportHelper; import org.esa.snap.util.SystemUtils; import org.esa.snap.util.io.SnapFileChooser; import org.esa.snap.util.io.SnapFileFilter; import javax.swing.JFileChooser; import java.awt.Component; import java.awt.Dimension; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; public class ExportTimeBasedText extends ProgressMonitorSwingWorker<String, Void> { private static final String DLG_TITLE = "Exporting time series pin pixels"; private static final String ERR_MSG_BASE = "Time series pin pixels cannot be exported:\n"; private static final String EXPORT_DIR_PREFERENCES_KEY = "user.export.dir"; private static final SnapFileFilter csvFileFilter = new SnapFileFilter("CSV", "csv", "Comma separated values"); private final AbstractTimeSeries timeSeries; private final PrintWriter writer; private final StringBuffer clipboardText; private ExportTimeBasedText(Component parentComponent, AbstractTimeSeries timeSeries, PrintWriter writer, StringBuffer clipboardText) { super(parentComponent, DLG_TITLE); this.timeSeries = timeSeries; this.writer = writer; this.clipboardText = clipboardText; } @Override protected String doInBackground(ProgressMonitor pm) throws Exception { List<List<Band>> bandList = new ArrayList<>(); final List<String> timeVariables = timeSeries.getEoVariables(); for (String timeVariable : timeVariables) { bandList.add(timeSeries.getBandsForVariable(timeVariable)); } final PlacemarkGroup pinGroup = timeSeries.getTsProduct().getPinGroup(); final ProductNode[] placemarkArray = pinGroup.toArray(); if (placemarkArray.length == 0) { return "There are no pins which could be exported."; } List<Placemark> placemarks = new ArrayList<>(); for (ProductNode placemark : placemarkArray) { placemarks.add((Placemark) placemark); } CsvExporter exporter = new TimeCsvExporter(bandList, placemarks, writer); exporter.exportCsv(pm); return null; } @Override public void done() { // On error, show error message String errorMessage; try { errorMessage = get(); } catch (Exception e) { errorMessage = e.getMessage(); } if (errorMessage != null) { SnapDialogs.showError(DLG_TITLE, ERR_MSG_BASE + errorMessage); } else { if (clipboardText != null) { SystemUtils.copyToClipboard(clipboardText.toString()); clipboardText.setLength(0); } } } public static void export(Component parent, AbstractTimeSeries timeSeries, String helpID) { // Get export method from user final String questionText = "How do you want to export the pixel values?\n"; /*I18N*/ final int method = SelectExportMethodDialog.run(SnapApp.getDefault().getMainFrame(), DLG_TITLE, questionText, helpID); final PrintWriter writer; final StringBuffer clipboardText; final int initialBufferSize = 256000; if (method == SelectExportMethodDialog.EXPORT_TO_CLIPBOARD) { // Write into string buffer final StringWriter stringWriter = new StringWriter(initialBufferSize); writer = new PrintWriter(stringWriter); clipboardText = stringWriter.getBuffer(); } else if (method == SelectExportMethodDialog.EXPORT_TO_FILE) { // Write into file, get file from user final File file = fetchOutputFile(helpID); if (file == null) { return; // Cancel } final FileWriter fileWriter; try { fileWriter = new FileWriter(file); } catch (IOException e) { SnapDialogs.showError(DLG_TITLE, ERR_MSG_BASE + "Failed to create file '" + file + "':\n" + e.getMessage()); return; // Error } writer = new PrintWriter(new BufferedWriter(fileWriter, initialBufferSize)); clipboardText = null; } else { return; // Cancel } ExportTimeBasedText exportTimeBasedText = new ExportTimeBasedText(parent, timeSeries, writer, clipboardText); exportTimeBasedText.executeWithBlocking(); } private static File fetchOutputFile(String helpID) { SnapApp snapApp = SnapApp.getDefault(); final String lastDir = snapApp.getPreferences().get(EXPORT_DIR_PREFERENCES_KEY, SystemUtils.getUserHomeDir().getPath()); final File currentDir = new File(lastDir); final SnapFileChooser fileChooser = new SnapFileChooser(); HelpSys.enableHelpKey(fileChooser, helpID); fileChooser.setCurrentDirectory(currentDir); fileChooser.addChoosableFileFilter(csvFileFilter); fileChooser.setAcceptAllFileFilterUsed(false); fileChooser.setDialogTitle(snapApp.getInstanceName() + " - " + "Export time series as CSV file..."); 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 result = fileChooser.showSaveDialog(snapApp.getMainFrame()); File file = fileChooser.getSelectedFile(); final File currentDirectory = fileChooser.getCurrentDirectory(); if (currentDirectory != null) { snapApp.getPreferences().put(EXPORT_DIR_PREFERENCES_KEY, currentDirectory.getPath()); } if (result != JFileChooser.APPROVE_OPTION) { return null; } if (file == null || file.getName().isEmpty()) { return null; } if (!TimeSeriesExportHelper.promptForOverwrite(file)) { return null; } return file; } }