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}