001package jmri.jmrit.symbolicprog;
002
003import java.awt.event.ActionEvent;
004import java.io.File;
005import java.io.FileOutputStream;
006import java.io.IOException;
007import java.io.OutputStreamWriter;
008import java.nio.charset.StandardCharsets;
009import javax.swing.AbstractAction;
010import javax.swing.JFileChooser;
011
012import jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrame;
013
014import org.apache.commons.csv.CSVFormat;
015import org.apache.commons.csv.CSVPrinter;
016
017import org.slf4j.Logger;
018import org.slf4j.LoggerFactory;
019
020/**
021 * Action to export the Function labels to a Comma Separated Variable (CSV) data file.
022 *
023 * @author Bob Jacobsen Copyright (C) 2003, 2026
024 */
025public class CsvFunctionExportAction extends AbstractAction {
026
027    public CsvFunctionExportAction(String actionName, PaneProgFrame parent) {
028        super(actionName);
029        this.parent = parent;
030    }
031
032    JFileChooser fileChooser;
033    PaneProgFrame parent;
034
035    @Override
036    public void actionPerformed(ActionEvent e) {
037
038        if (fileChooser == null) {
039            fileChooser = new jmri.util.swing.JmriJFileChooser();
040        }
041
042        int retVal = fileChooser.showSaveDialog(parent);
043
044        if (retVal == JFileChooser.APPROVE_OPTION) {
045            File file = fileChooser.getSelectedFile();
046            if (log.isDebugEnabled()) {
047                log.debug("start to export to CSV file {}", file);
048            }
049
050            try (CSVPrinter str = new CSVPrinter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8), CSVFormat.DEFAULT)) {
051                str.printRecord("Number", "Label");
052                var labels = parent.getFnLabelPane().getLabels();
053                for (int i = 0; i < labels.size(); i++) {
054                    String label = labels.get(i);
055                    str.printRecord(i, label);
056                }
057                str.flush();
058            } catch (IOException ex) {
059                log.error("Error writing file", ex);
060            }
061        }
062    }
063
064    private static final Logger log = LoggerFactory.getLogger(CsvFunctionExportAction.class);
065}