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}