001package jmri.jmrit.symbolicprog;
002
003import java.awt.event.ActionEvent;
004
005import java.io.File;
006import java.io.IOException;
007
008import javax.swing.AbstractAction;
009import javax.swing.JFileChooser;
010
011import jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrame;
012
013import org.slf4j.Logger;
014import org.slf4j.LoggerFactory;
015
016/**
017 * Action to import the Function Label values from a CSV format file.
018 *
019 * @author Bob Jacobsen Copyright (C) 2003, 2026
020 * @author Dave Heap Copyright (C) 2015
021 */
022public class CsvFunctionImportAction extends AbstractAction {
023
024    public CsvFunctionImportAction(String actionName, PaneProgFrame parent) {
025        super(actionName);
026        this.parent = parent;
027    }
028
029    PaneProgFrame parent;
030    JFileChooser fileChooser;
031
032    @Override
033    public void actionPerformed(ActionEvent e) {
034
035        if (fileChooser == null) {
036            fileChooser = new jmri.util.swing.JmriJFileChooser();
037        }
038
039        int retVal = fileChooser.showOpenDialog(parent);
040
041        if (retVal == JFileChooser.APPROVE_OPTION) {
042            File file = fileChooser.getSelectedFile();
043            if (log.isDebugEnabled()) {
044                log.debug("start to export to CSV file {}", file);
045            }
046
047            String status = null;
048            
049            try {
050                var csvFormat = org.apache.commons.csv.CSVFormat.Builder.create(org.apache.commons.csv.CSVFormat.DEFAULT).setHeader().build();
051                var csvFile = org.apache.commons.csv.CSVParser.parse(file, java.nio.charset.StandardCharsets.UTF_8, csvFormat);
052                for (var record : csvFile.getRecords()) {
053                    try {
054                        var number = Integer.parseInt(record.get("Number"));
055                        
056                        try {
057                            var label = record.get("Label");
058                            parent.getFnLabelPane().setLabel(number, label);
059                        } catch (ArrayIndexOutOfBoundsException el) {
060                            log.warn("Function {} not present in decoder definition", number);
061                            status = Bundle.getMessage("MenuImportNoFunctionError", number);
062                            break;
063                        } 
064                    } catch (NumberFormatException en) {
065                        log.warn("Could not parse something in the Number column");
066                        status = Bundle.getMessage("MenuImportNotParseError");
067                        continue;
068                    }
069                }
070            } catch (IOException ex) {
071                log.error("Error reading file", ex);
072                status = Bundle.getMessage("MenuImportError", file);
073            }
074            if (status == null) return;
075            
076            jmri.util.swing.JmriJOptionPane.showMessageDialog(null, status);
077        }
078    }
079
080    private static final Logger log = LoggerFactory.getLogger(CsvFunctionImportAction.class);
081}