001package jmri.jmrix.dccpp.swing.virtuallcd;
002
003
004import javax.swing.JMenuItem;
005import javax.swing.JPopupMenu;
006
007import jmri.InstanceManager;
008import jmri.UserPreferencesManager;
009import jmri.configurexml.JmriConfigureXmlException;
010import jmri.jmrix.dccpp.*;
011import jmri.jmrix.dccpp.swing.virtuallcd.configurexml.VirtualLCDConfigurationXml;
012import jmri.util.JmriJFrame;
013import jmri.util.swing.*;
014
015import org.jdom2.Element;
016
017/**
018 * Frame to image the DCC-EX command station's OLED display
019 *   Also sends request to DCC-EX to send copies of all LCD messages to this instance of JMRI
020 *
021 * @author BobJacobsen  Copyright (C) 2023
022 * @author MSteveTodd   Copyright (C) 2023
023 */
024public class VirtualLCDFrame extends JmriJFrame  {
025
026    private final DCCppSystemConnectionMemo _memo;
027    private final VirtualLCDPanel _virtualLCDPanel;
028    private JPopupMenu popup;
029
030    private static String getElementName(DCCppSystemConnectionMemo memo) {
031        return "virtual_lcd_config" + "___" + memo.getSystemPrefix();
032    }
033
034    public VirtualLCDFrame(DCCppSystemConnectionMemo memo) {
035        // Save window position but not window size
036        // Set the title, include prefix in event of multiple connections
037        super(false, true, Bundle.getMessage("VirtualLCDFrameTitle") + " (" + memo.getSystemPrefix() + ")");
038        _memo = memo;
039        _virtualLCDPanel = new VirtualLCDPanel(this, false);
040        _virtualLCDPanel.setMemo(memo);
041    }
042
043    @Override
044    public void dispose() {
045        InstanceManager.getOptionalDefault(UserPreferencesManager.class).ifPresent(p -> {
046            Element parent = new Element(getElementName(_memo), UserPreferencesManager.GENERIC_NAMESPACE);
047            Element e = VirtualLCDConfigurationXml.store(_virtualLCDPanel);
048            parent.addContent(e);
049            p.storeElement(parent);
050        });
051        _virtualLCDPanel.dispose();
052        super.dispose();
053    }
054
055    /**
056     * {@inheritDoc}
057     */
058    @Override
059    public void initComponents() {
060        super.initComponents();
061        _virtualLCDPanel.initComponents();
062        add(_virtualLCDPanel);
063
064        //Create the popup menu.
065        popup = new JPopupMenu();
066        JMenuItem menuItem = new JMenuItem(Bundle.getMessage("EditVirtualLCD"));
067        menuItem.addActionListener(evt -> {
068            ConfigureVirtualLCD.editConfigureVirtualLCD(null, _virtualLCDPanel);
069        });
070        popup.add(menuItem);
071
072        //Add listener to components that can bring up popup menus.
073        JmriMouseListener popupListener = new JmriMouseAdapter() {
074            @Override
075            public void mousePressed(JmriMouseEvent e) {
076                maybeShowPopup(e);
077            }
078
079            @Override
080            public void mouseReleased(JmriMouseEvent e) {
081                maybeShowPopup(e);
082            }
083
084            private void maybeShowPopup(JmriMouseEvent e) {
085                if (e.isPopupTrigger()) {
086                    popup.show(e.getComponent(), e.getX(), e.getY());
087                }
088            }
089        };
090        addMouseListener(JmriMouseListener.adapt(popupListener));
091
092        // pack to layout display
093        pack();
094
095        InstanceManager.getOptionalDefault(UserPreferencesManager.class).ifPresent(p -> {
096            Element e = p.loadElement(getElementName(_memo));
097            if (e != null) {
098                try {
099                    VirtualLCDConfigurationXml.load(_virtualLCDPanel, e, true);
100                } catch (JmriConfigureXmlException ex) {
101                    log.error("Unexpected exception during loading of settings", ex);
102                }
103            }
104        });
105    }
106
107    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(VirtualLCDFrame.class);
108
109}