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}