001package jmri.jmrix.openlcb.swing; 002 003import java.awt.Toolkit; 004import java.awt.datatransfer.*; 005import java.awt.event.*; 006 007import javax.swing.*; 008 009import jmri.util.swing.*; 010import jmri.jmrix.can.CanSystemConnectionMemo; 011import jmri.jmrix.openlcb.OlcbAddress; 012 013import org.openlcb.EventID; 014import org.openlcb.swing.EventIdTextField; 015 016/** 017 * This is an entry field for Event IDs that also 018 * accepts event names 019 * 020 * @author Bob Jacobsen (C) 2024 021 */ 022public class NamedEventIdTextField extends OvertypeTextArea { 023 024 public NamedEventIdTextField(CanSystemConnectionMemo memo) { 025 this(23, memo); // heuristically-found default size 026 } 027 028 public NamedEventIdTextField(int size, CanSystemConnectionMemo memo) { 029 super(size); 030 this.memo = memo; 031 032 // set up semi-automatic tool tip 033 addMouseListener(JmriMouseListener.adapt(new JmriMouseListener() { 034 @Override 035 public void mouseEntered(JmriMouseEvent arg0) { 036 // Generate dynamic tooltip text here 037 setToolTipText(makeToolTipText(getText())); 038 } 039 040 @Override public void mouseClicked(JmriMouseEvent e) {} 041 @Override public void mouseExited(JmriMouseEvent arg0) {} 042 @Override public void mousePressed(JmriMouseEvent arg0) {} 043 @Override public void mouseReleased(JmriMouseEvent arg0) {} 044 })); 045 046 // Add a focus listener to update the tooltip dynamically 047 addFocusListener(new FocusListener() { 048 @Override 049 public void focusGained(FocusEvent e) { 050 setToolTipText(makeToolTipText(getText())); 051 } 052 053 @Override public void focusLost(FocusEvent e) {} 054 }); 055 056 var popup = EventIdTextField.createPopupMenu(this); 057 // add a custom copy operator to capture the numerical value 058 JMenuItem menuItem = new JMenuItem("Copy Numerical Event ID"); 059 popup.add(menuItem); 060 var self = this; 061 menuItem.addActionListener(new ActionListener() { 062 @Override 063 public void actionPerformed(ActionEvent e) { 064 String s = new OlcbAddress(self.getText(), memo).toDottedString(); 065 SwingUtilities.invokeLater(new Runnable() { 066 @Override 067 public void run() { 068 self.selectAll(); 069 } 070 }); 071 StringSelection eventToCopy = new StringSelection(s); 072 Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); 073 clipboard.setContents(eventToCopy, new ClipboardOwner() { 074 @Override 075 public void lostOwnership(Clipboard clipboard, Transferable transferable) { 076 } 077 }); 078 } 079 }); 080 this.setComponentPopupMenu(popup); 081 } 082 083 final CanSystemConnectionMemo memo; 084 085 protected String makeToolTipText(String fieldText) { 086 var address = new OlcbAddress(fieldText, memo); 087 if (address.isFromName()) { 088 return fieldText+" is "+address.toDottedString(); 089 } 090 return "Enter an event ID or event name"; 091 } 092 093 public EventID getEventID() { 094 return new EventID(new OlcbAddress(getText(), memo).toDottedString()); 095 } 096 097 // private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(NamedEventIdTextField.class); 098}