001package jmri.jmrix.can.cbus.swing.modeswitcher;
002
003import java.awt.BorderLayout;
004import java.awt.event.ActionListener;
005
006import javax.swing.*;
007
008import jmri.jmrix.can.*;
009import jmri.util.ThreadingUtil;
010
011import org.slf4j.Logger;
012import org.slf4j.LoggerFactory;
013
014/**
015 * Mode Switcher to switch programming track mode.
016 *
017 * @author Andrew Crosland Copyright (C) 2020
018 */
019public class SprogCbusSprog3PlusModeSwitcherFrame extends SprogCbusModeSwitcherFrame {
020    
021    public static final int PROG_OFF_MODE = 0; // Prog track off when not programming
022    public static final int PROG_ON_MODE = 1;  // Prog track follows main when not programming
023    public static final int PROG_AR_MODE = 2;  // Prog track is auto-reverse power district, no programming on progtrack
024
025    private JRadioButton progOffButton;
026    private JRadioButton progOnButton;
027    private JRadioButton progArButton;
028    
029    public SprogCbusSprog3PlusModeSwitcherFrame(CanSystemConnectionMemo memo) {
030        super(memo, Bundle.getMessage("SprogCbusPlusModeSwitcher"));
031    }
032    
033    
034    /**
035     * Display radio buttons to select programming track mode).
036     * <p>
037     * 
038     * {@inheritDoc}
039     */
040    @Override
041    public void initComponents() {
042        if (initSetup()) {
043            // Create selection buttons and set initial state
044            progOffButton = new JRadioButton(Bundle.getMessage("ProgOffMode"));
045            progOnButton = new JRadioButton(Bundle.getMessage("ProgOnMode"));
046            progArButton = new JRadioButton(Bundle.getMessage("ProgArMode"));
047            ButtonGroup buttons = new ButtonGroup();
048            buttons.add(progOffButton);
049            buttons.add(progOnButton);
050            buttons.add(progArButton);
051            
052            // Get current preferences
053            // It is expected that the saved preferences will usually match the hardware.
054            mode = PROG_OFF_MODE;
055            if (preferences.getProgTrackMode() == PROG_OFF_MODE) {
056                progOffButton.setSelected(true);
057                pm.setGlobalProgrammerAvailable(true);
058            } else if (preferences.getProgTrackMode() == PROG_ON_MODE) {
059                progOnButton.setSelected(true);
060                mode = PROG_ON_MODE;
061                pm.setGlobalProgrammerAvailable(true);
062            } else if (preferences.getProgTrackMode() == PROG_AR_MODE) {
063                progArButton.setSelected(true);
064                mode = PROG_AR_MODE;
065                pm.setGlobalProgrammerAvailable(false);
066            } else {
067                // Default if inconsistent preference
068                progOffButton.setSelected(true);
069                pm.setGlobalProgrammerAvailable(true);
070            }
071            // Reset hardware mode and preferences in case there was any inconsistency
072            setHardwareMode(mode);
073            preferences.setProgTrackMode(mode);
074
075            // Handle Programming track mode button activity
076            ActionListener listener = ae -> {
077                if (progOnButton.isSelected()) {
078                    log.info("Setting prog track on when not programming");
079                    mode = PROG_ON_MODE;
080                    setHardwareMode(mode);
081                    pm.setGlobalProgrammerAvailable(true);
082                } else if (progArButton.isSelected()) {
083                    log.info("Setting prog track to auto-reverse");
084                    mode = PROG_AR_MODE;
085                    setHardwareMode(mode);
086                    pm.setGlobalProgrammerAvailable(false);
087                } else {
088                    log.info("Setting prog track off when not programming");
089                    mode = PROG_OFF_MODE;
090                    setHardwareMode(mode);
091                    pm.setGlobalProgrammerAvailable(true);
092                }
093                preferences.setProgTrackMode(mode);
094            };
095
096            progOffButton.addActionListener(listener);
097            progOnButton.addActionListener(listener);
098            progArButton.addActionListener(listener);
099            modePane.add(progOffButton);
100            modePane.add(progOnButton);
101            modePane.add(progArButton);
102
103            panel.add(label, BorderLayout.NORTH);
104            panel.add(modePane, BorderLayout.CENTER);
105        }
106        
107        // add help menu to window
108        setHelp();
109
110        this.add(panel);
111        ThreadingUtil.runOnGUI( () -> {
112            pack();
113            setVisible(true);
114        });
115    }
116    
117    
118    /**
119     * Define help menu for this window.
120     */
121    protected void setHelp() {
122        addHelpMenu("package.jmri.jmrix.can.cbus.swing.modeswitcher.SprogCbusSprog3PlusModeSwitcherFrame", true); // NOI18N
123    }
124
125    
126    /**
127     * disconnect from the CBUS
128     */
129    @Override
130    public void dispose() {
131        super.dispose();
132    }
133
134    
135    private final static Logger log = LoggerFactory.getLogger(SprogCbusSprog3PlusModeSwitcherFrame.class);
136    
137}