001package jmri.jmrix.openlcb.swing.lccpro;
002
003import java.awt.*;
004
005import java.beans.PropertyChangeEvent;
006import java.beans.PropertyChangeListener;
007
008import java.io.File;
009import java.io.IOException;
010
011import javax.swing.*;
012
013import jmri.*;
014import jmri.jmrix.can.CanSystemConnectionMemo;
015import jmri.util.swing.JmriJOptionPane;
016
017import org.openlcb.*;
018import org.openlcb.cdi.impl.ConfigRepresentation;
019
020/**
021 * Do a backup of a specified node.
022 *
023 * Not truly an Action, though it might be some day
024 * @author Bob Jacobsen   (c) 2026
025 */
026
027
028class NodeBackupAction {
029
030    private ConfigRepresentation _cdi;
031    private String _name;
032    
033    static JFileChooser directoryChooser = new JFileChooser();
034    static final String PREFNAME = "backupDirectory";
035    
036    static {
037        directoryChooser.setFileSelectionMode(javax.swing.JFileChooser.DIRECTORIES_ONLY);
038        directoryChooser.setDialogTitle(Bundle.getMessage("ChooseADirectory"));
039        directoryChooser.setSelectedFile(new File("."));
040        
041        var prefsMgr = InstanceManager.getDefault(UserPreferencesManager.class);
042        var dirPref = prefsMgr.getProperty(NodeBackupAction.class.getName(), PREFNAME);
043        if (dirPref != null) {
044            directoryChooser.setSelectedFile(new File(dirPref.toString()));
045        }
046
047    }
048    
049    static public void showOpenDialog(Component here) {
050        var response = directoryChooser.showOpenDialog(here);
051        
052        if (response == JFileChooser.APPROVE_OPTION) {
053            String directory = directoryChooser.getSelectedFile().getAbsolutePath();
054            var prefsMgr = InstanceManager.getDefault(UserPreferencesManager.class);
055            prefsMgr.setProperty(NodeBackupAction.class.getName(), PREFNAME, directory);
056        }
057    }
058    
059    public void doBackup(MimicNodeStore.NodeMemo nodememo, CanSystemConnectionMemo memo, String name) {
060        var node = nodememo.getNodeID();
061        _name = name;
062        log.info("Backup {} '{}' ", node.toString(), _name);    
063        
064        var iface = memo.get(OlcbInterface.class);
065        
066        _cdi = iface.getConfigForNode(node);
067               
068        if (_cdi.getRoot() != null) {
069            storeCdiData();
070        } else {
071            JmriJOptionPane.showMessageDialogNonModal(null,
072                    Bundle.getMessage("MessageCdiLoad", _name, node),
073                    Bundle.getMessage("TitleCdiLoad", name),
074                    JmriJOptionPane.INFORMATION_MESSAGE,
075                    null);
076            _cdi.addPropertyChangeListener(new CdiListener());
077        }
078    }
079    
080    private class CdiListener implements PropertyChangeListener {
081        @Override
082        public void propertyChange(PropertyChangeEvent e) {
083            String propertyName = e.getPropertyName();
084            log.debug("CdiListener event = {}", propertyName);
085
086            if (propertyName.equals("UPDATE_CACHE_COMPLETE")) {
087                Window[] windows = Window.getWindows();
088                for (Window window : windows) {
089                    if (window instanceof JDialog) {
090                        JDialog dialog = (JDialog) window;
091                        if (Bundle.getMessage("TitleCdiLoad", _name).equals(dialog.getTitle())) {
092                            dialog.dispose();
093                            break;
094                        }
095                    }
096                }
097                storeCdiData();
098            }
099        }
100    }
101    
102    protected void storeCdiData() {
103        log.debug("Load complete");
104        var filename = org.openlcb.cdi.swing.CdiPanel
105                        .fileNameGenerator.generateFileName(_cdi, _name);
106        String directory = directoryChooser.getSelectedFile().getAbsolutePath();
107        String storeName = directory+File.separator+filename;
108        log.info("Storing to file {}", storeName);
109        try {
110            org.openlcb.cdi.cmd.BackupConfig.writeConfigToFile(storeName, _cdi);
111        } catch (IOException e) {
112            log.error("Error writing file! ", e);
113        }
114        
115    }
116
117    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(NodeBackupAction.class);
118}