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}