001package jmri.jmrix.can.cbus.swing;
002
003import java.awt.event.ActionEvent;
004import javax.swing.*;
005import javax.swing.event.ChangeEvent;
006
007import jmri.jmrix.can.cbus.swing.eventrequestmonitor.CbusEventRequestTablePane;
008import jmri.jmrix.can.cbus.swing.eventtable.CbusEventTablePane;
009import jmri.util.swing.JSpinnerUtil;
010
011/**
012 * Creates Panel for displaying New Event JSpinners and Button.
013 * @author Steve Young Copyright (C) 2018, 2020
014 */
015public class CbusNewEventPane extends JPanel {
016    
017    private JSpinner newnodenumberSpinner;
018    private JSpinner newevnumberSpinner;
019    private JButton newevbutton;
020    
021    private final CbusEventTablePane _evPanel;
022    private final CbusEventRequestTablePane _evReqPanel;
023    
024    private jmri.UserPreferencesManager p;
025    private static final String EVENTNUM_PREF = "EventNum"; // NOI18N
026    private static final String NODENUM_PREF = "NodeNum"; // NOI18N
027    
028    public CbusNewEventPane(CbusEventTablePane evPanel){
029        super();
030        _evPanel = evPanel;
031        _evReqPanel = null;
032        init();
033        
034    }
035    
036    public CbusNewEventPane( CbusEventRequestTablePane evReqPanel ){
037        super();
038        _evPanel = null;
039        _evReqPanel = evReqPanel;
040        init();
041    }
042    
043    final void init() {
044        
045        p = jmri.InstanceManager.getDefault(jmri.UserPreferencesManager.class);
046        int nodenum = 0; // default node 0
047        int eventnum = 1; // default event 1
048        Object nn = p.getProperty(this.getClass().getName(), NODENUM_PREF);
049        if ( nn!=null ){
050            nodenum = (Integer) nn;
051        }
052        Object en = p.getProperty(this.getClass().getName(), EVENTNUM_PREF);
053        if ( en!=null ){
054            eventnum = (Integer) en;
055        }
056        
057        newnodenumberSpinner = new JSpinner(new SpinnerNumberModel(nodenum, 0, 65535, 1));
058        newevnumberSpinner = new JSpinner(new SpinnerNumberModel(eventnum, 0, 65535, 1));
059    
060        this.setBorder(BorderFactory.createTitledBorder(
061        BorderFactory.createEtchedBorder(), (Bundle.getMessage("NewEvent"))));
062        
063        newevbutton = new JButton((Bundle.getMessage("NewEvent")));
064        newevbutton.addActionListener((ActionEvent e) -> newEvent());
065        
066        this.add(newSpinnerPanel(newnodenumberSpinner, 
067                Bundle.getMessage("CbusNode"), Bundle.getMessage("NewNodeTip")));
068        this.add(newSpinnerPanel(newevnumberSpinner, 
069                Bundle.getMessage("CbusEvent"), null)); 
070        this.add(newevbutton);  
071        
072    }
073    
074    private JPanel newSpinnerPanel( final JSpinner spinner, String label, String tip  ){
075        JPanel newnode = new JPanel();
076        newnode.add(new JLabel(label));
077        JSpinnerUtil.setCommitsOnValidEdit(spinner, true);
078        spinner.addChangeListener((ChangeEvent e) ->  eventChanged() );
079        newnode.add(spinner);
080        newnode.setToolTipText(tip);
081        spinner.setToolTipText(tip);
082        return newnode;
083    }
084
085    private void eventChanged(){
086        if (_evPanel!=null){
087            _evPanel.cbEvTable.tableChanged(null);
088        }
089        else if (_evReqPanel!=null){
090            _evReqPanel.tableChanged(null);
091        }
092        p.setProperty(this.getClass().getName(), NODENUM_PREF, newnodenumberSpinner.getValue());
093        p.setProperty(this.getClass().getName(), EVENTNUM_PREF, newevnumberSpinner.getValue());
094    }
095    
096    public void setNewButtonActive(boolean newState){
097        newevbutton.setEnabled(newState);
098    }
099    
100    public int getNn(){
101        return (Integer) newnodenumberSpinner.getValue();
102    }
103    
104    public int getEn(){
105        return (Integer) newevnumberSpinner.getValue();
106    }
107    
108    private void newEvent(){
109        if (_evPanel!=null){
110            _evPanel.cbEvTable.addEvent(getNn(),getEn());
111        }
112        else if (_evReqPanel!=null){
113            _evReqPanel.addEvent(getNn(),getEn());
114        }
115    }
116    
117    // private final static org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CbusNewEventPane.class);
118}