001package jmri.jmrit.logixng.actions.configurexml;
002
003import java.awt.GraphicsEnvironment;
004import java.util.ResourceBundle;
005
006import jmri.*;
007import jmri.configurexml.JmriConfigureXmlException;
008import jmri.jmrit.logixng.DigitalActionManager;
009import jmri.jmrit.logixng.NamedBeanAddressing;
010import jmri.jmrit.logixng.actions.ActionBlock;
011import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectEnumXml;
012import jmri.jmrit.logixng.util.configurexml.LogixNG_SelectNamedBeanXml;
013import jmri.jmrit.logixng.util.parser.ParserException;
014import jmri.util.swing.JmriJOptionPane;
015
016import org.jdom2.Element;
017
018/**
019 * Handle XML configuration for Block objects.
020 *
021 * @author Bob Jacobsen Copyright: Copyright (c) 2004, 2008, 2010
022 * @author Daniel Bergqvist Copyright 2021
023 * @author Dave Sand Copyright (C) 2021
024 */
025public class ActionBlockXml extends jmri.managers.configurexml.AbstractNamedBeanManagerConfigXML {
026
027    static final ResourceBundle rb = ResourceBundle.getBundle("jmri.jmrit.logixng.actions.ActionBundle");
028
029    public ActionBlockXml() {
030    }
031
032    /**
033     * Default implementation for storing the contents of a Block
034     *
035     * @param o Object to store, of type TriggerBlock
036     * @return Element containing the complete info
037     */
038    @Override
039    public Element store(Object o) {
040        ActionBlock p = (ActionBlock) o;
041
042        Element element = new Element("ActionBlock");
043        element.setAttribute("class", this.getClass().getName());
044        element.addContent(new Element("systemName").addContent(p.getSystemName()));
045
046        storeCommon(p, element);
047
048        var selectNamedBeanXml = new LogixNG_SelectNamedBeanXml<Block>();
049        var selectEnumXml = new LogixNG_SelectEnumXml<ActionBlock.DirectOperation>();
050
051        element.addContent(selectNamedBeanXml.store(p.getSelectNamedBean(), "namedBean"));
052        element.addContent(selectEnumXml.store(p.getSelectEnum(), "operation"));
053
054        element.addContent(new Element("dataAddressing").addContent(p.getDataAddressing().name()));
055        element.addContent(new Element("dataReference").addContent(p.getDataReference()));
056        element.addContent(new Element("dataLocalVariable").addContent(p.getDataLocalVariable()));
057        element.addContent(new Element("dataFormula").addContent(p.getDataFormula()));
058
059        element.addContent(new Element("blockValue").addContent(p.getBlockValue()));
060
061        return element;
062    }
063
064    @Override
065    public boolean load(Element shared, Element perNode) throws JmriConfigureXmlException {     // Test class that inherits this class throws exception
066        String sys = getSystemName(shared);
067        String uname = getUserName(shared);
068        ActionBlock h = new ActionBlock(sys, uname);
069
070        loadCommon(h, shared);
071
072        var selectNamedBeanXml = new LogixNG_SelectNamedBeanXml<Block>();
073        var selectEnumXml = new LogixNG_SelectEnumXml<ActionBlock.DirectOperation>();
074
075        selectNamedBeanXml.load(shared.getChild("namedBean"), h.getSelectNamedBean());
076        selectNamedBeanXml.loadLegacy(shared, h.getSelectNamedBean(), "block");
077
078        selectEnumXml.load(shared.getChild("operation"), h.getSelectEnum());
079        selectEnumXml.loadLegacy(
080                shared, h.getSelectEnum(),
081                "operationAddressing",
082                "operationDirect",
083                "operationReference",
084                "operationLocalVariable",
085                "operationFormula");
086
087        try {
088            Element elem = shared.getChild("dataAddressing");
089            if (elem != null) {
090                h.setDataAddressing(NamedBeanAddressing.valueOf(elem.getTextTrim()));
091            }
092
093            elem = shared.getChild("dataReference");
094            if (elem != null) h.setDataReference(elem.getTextTrim());
095
096            elem = shared.getChild("dataLocalVariable");
097            if (elem != null) h.setDataLocalVariable(elem.getTextTrim());
098
099            elem = shared.getChild("dataFormula");
100            if (elem != null) h.setDataFormula(elem.getTextTrim());
101
102
103            elem = shared.getChild("blockValue");
104            if (elem != null) h.setBlockValue(elem.getTextTrim());
105
106            // deprecated 4.23.5 remove 4.25.1
107            elem = shared.getChild("blockConstant");
108            if (elem != null) h.setBlockValue(elem.getTextTrim());
109
110            // deprecated 4.23.5 remove 4.25.1
111            elem = shared.getChild("blockMemory");
112            if (elem != null) {
113                String memoryName = elem.getTextTrim();
114                h.setBlockValue(">>> " + elem.getTextTrim() + " <<<");
115                if (!GraphicsEnvironment.isHeadless() && !Boolean.getBoolean("jmri.test.no-dialogs")) {
116                    JmriJOptionPane.showMessageDialog(null,
117                            rb.getString("ActionBlock_MemoryChange"),
118                            rb.getString("ActionBlock_MemoryTitle") + " " + memoryName,
119                            JmriJOptionPane.WARNING_MESSAGE);
120                }
121            }
122
123        } catch (ParserException e) {
124            throw new JmriConfigureXmlException(e);
125        }
126
127        InstanceManager.getDefault(DigitalActionManager.class).registerAction(h);
128        return true;
129    }
130
131//    private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(ActionBlockXml.class);
132}