001package jmri.jmrix.dccpp.swing.virtuallcd.configurexml;
002
003import java.awt.Dimension;
004import java.util.*;
005
006import jmri.configurexml.JmriConfigureXmlException;
007import jmri.jmrix.dccpp.DCCppSystemConnectionMemo;
008import jmri.jmrix.dccpp.swing.virtuallcd.VirtualLCDConfiguration;
009import jmri.jmrix.dccpp.swing.virtuallcd.VirtualLCDConfiguration.DisplayConfig;
010
011import org.jdom2.Element;
012
013/**
014 * Handle configuration for VirtualLCDConfiguration objects.
015 *
016 * @author Howard G. Penny  Copyright (c) 2005
017 * @author Daniel Bergqvist Copyright (c) 2026
018 */
019public class VirtualLCDConfigurationXml {
020
021    public static Element store(VirtualLCDConfiguration p) {
022
023        Element element = new Element("virtual_lcd_config");
024
025        if (p.getMemo() != null) {
026            element.addContent(new Element("systemConnection")
027                    .addContent(p.getMemo().getSystemPrefix()));
028        }
029        Dimension lcdSize = p.getLCDSize();
030        if (lcdSize != null) {
031            element.addContent(new Element("numColumns")
032                    .addContent(Integer.toString(lcdSize.width)));
033            element.addContent(new Element("numRows")
034                    .addContent(Integer.toString(lcdSize.height)));
035        }
036        element.addContent(new Element("displayConfig")
037                .addContent(p.getDisplayConfig().name()));
038        element.addContent(new Element("displayNo")
039                .addContent(Integer.toString(p.getDisplayNo())));
040        element.addContent(new Element("minDisplayNo")
041                .addContent(Integer.toString(p.getMinDisplayNo())));
042        element.addContent(new Element("maxDisplayNo")
043                .addContent(Integer.toString(p.getMaxDisplayNo())));
044
045        Element selectedDisplays = new Element("selectedDisplays");
046        for (int display : p.getSelectedDisplays()) {
047            selectedDisplays.addContent(new Element("displayNo")
048                    .addContent(Integer.toString(display)));
049        }
050        element.addContent(selectedDisplays);
051
052        return element;
053    }
054
055    public static void load(VirtualLCDConfiguration p, Element elem, boolean ignoreMemo)
056            throws JmriConfigureXmlException {
057
058        Element element = elem.getChild("virtual_lcd_config");
059
060        DCCppSystemConnectionMemo memo = null;
061
062        List<DCCppSystemConnectionMemo> systemConnections =
063                jmri.InstanceManager.getList(DCCppSystemConnectionMemo.class);
064
065        String systemConnectionName = "Unknown connection";
066
067        if (!ignoreMemo) {
068            Element systemConnection = element.getChild("systemConnection");
069            if (systemConnection != null) {
070                systemConnectionName = systemConnection.getTextTrim();
071
072                for (DCCppSystemConnectionMemo m : systemConnections) {
073                    if (m.getSystemPrefix().equals(systemConnectionName)) {
074                        memo = m;
075                        break;
076                    }
077                }
078            }
079
080            if (memo == null) {
081                throw new JmriConfigureXmlException("Cannot find connection: " + systemConnectionName);
082            }
083
084            p.setMemo(memo);
085        }
086
087        Element numColumnsElement = element.getChild("numColumns");
088        Element numRowsElement = element.getChild("numRows");
089        if (numColumnsElement != null && numRowsElement != null) {
090            int numColumns = Integer.parseInt(numColumnsElement.getTextTrim());
091            int numRows = Integer.parseInt(numRowsElement.getTextTrim());
092            p.setLCDSize(new Dimension(numColumns, numRows));
093        }
094
095        String displayConfigName = element.getChild("displayConfig").getTextTrim();
096        p.setDisplayConfig(DisplayConfig.valueOf(displayConfigName));
097
098        p.setDisplayNo(Integer.parseInt(element.getChild("displayNo").getTextTrim()));
099        p.setMinDisplayNo(Integer.parseInt(element.getChild("minDisplayNo").getTextTrim()));
100        p.setMaxDisplayNo(Integer.parseInt(element.getChild("maxDisplayNo").getTextTrim()));
101
102        Set<Integer> selectedDisplaysSet = new HashSet<>();
103        Element selectedDisplays = element.getChild("selectedDisplays");
104        for (Element e : selectedDisplays.getChildren()) {
105            selectedDisplaysSet.add(Integer.valueOf(e.getTextTrim()));
106        }
107        p.setSelectedDisplays(selectedDisplaysSet);
108    }
109
110//    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(VirtualLCDConfigurationXml.class);
111}