001package jmri.jmrit.symbolicprog;
002
003import java.awt.event.ActionEvent;
004import java.awt.event.ItemEvent;
005import java.util.ResourceBundle;
006
007import javax.annotation.CheckForNull;
008import javax.swing.*;
009
010import jmri.InstanceManager;
011import jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrame;
012import jmri.profile.ProfileManager;
013import jmri.swing.PreferencesPanel;
014import jmri.util.swing.JComboBoxUtil;
015
016import org.openide.util.lookup.ServiceProvider;
017
018/**
019 * Provide GUI to configure symbolic programmer defaults.
020 *
021 * @author Bob Jacobsen Copyright (C) 2001, 2003, 2017
022 */
023@ServiceProvider(service = PreferencesPanel.class)
024public class ProgrammerConfigPane extends JPanel implements PreferencesPanel {
025
026    private final ResourceBundle apb = ResourceBundle.getBundle("apps.AppsConfigBundle");
027
028    public ProgrammerConfigPane() {
029        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
030        JPanel p = new JPanel();
031        p.setLayout(new java.awt.FlowLayout());
032        p.add(new JLabel("Format:"));
033        p.add(programmerBox = new JComboBox<>(ProgDefault.findListOfProgFiles()));
034        JComboBoxUtil.setupComboBoxMaxRows(programmerBox);
035        programmerBox.setSelectedItem(ProgDefault.getDefaultProgFile());
036        programmerBox.addActionListener((ActionEvent e) -> {
037            InstanceManager.getDefault(ProgrammerConfigManager.class).setDefaultFile(programmerBox.getSelectedItem().toString());
038        });
039        add(p);
040
041        // also create the advanced panel
042        advancedPanel = new JPanel();
043        advancedPanel.setLayout(new BoxLayout(advancedPanel, BoxLayout.Y_AXIS));
044
045        advancedPanel.add(showEmptyTabs = new JCheckBox(this.apb.getString("ProgShowEmptyTabs")));
046        showEmptyTabs.setSelected(PaneProgFrame.getShowEmptyPanes());
047        showEmptyTabs.addItemListener((ItemEvent e) -> {
048            InstanceManager.getDefault(ProgrammerConfigManager.class).setShowEmptyPanes(showEmptyTabs.isSelected());
049        });
050
051        advancedPanel.add(showCvNums = new JCheckBox(this.apb.getString("ProgShowCVInTips")));
052        showCvNums.setSelected(PaneProgFrame.getShowCvNumbers());
053        showCvNums.addItemListener((ItemEvent e) -> {
054            InstanceManager.getDefault(ProgrammerConfigManager.class).setShowCvNumbers(showCvNums.isSelected());
055        });
056
057        advancedPanel.add(canCacheDefault = new JCheckBox(this.apb.getString("ProgCanCacheDefault")));
058        canCacheDefault.setSelected(PaneProgFrame.getCanCacheDefault());
059        canCacheDefault.addItemListener((ItemEvent e) -> {
060            InstanceManager.getDefault(ProgrammerConfigManager.class).setCanCacheDefault(canCacheDefault.isSelected());
061        });
062
063        advancedPanel.add(doConfirmRead = new JCheckBox(this.apb.getString("ProgDoConfirmRead")));
064        doConfirmRead.setSelected(PaneProgFrame.getDoConfirmRead());
065        doConfirmRead.addItemListener((ItemEvent e) -> {
066            InstanceManager.getDefault(ProgrammerConfigManager.class).setDoConfirmRead(doConfirmRead.isSelected());
067        });
068
069        advancedPanel.add(new JSeparator(JSeparator.HORIZONTAL));
070
071        advancedPanel.add(disableProgrammingTrack = new JCheckBox(this.apb.getString("DisableProgrammingTrack")));
072        disableProgrammingTrack.setSelected(PaneProgFrame.getDisableProgrammingTrack());
073        disableProgrammingTrack.addItemListener((ItemEvent e) -> {
074            InstanceManager.getDefault(ProgrammerConfigManager.class).setDisableProgrammingTrack(disableProgrammingTrack.isSelected());
075        });
076
077        advancedPanel.add(disableProgrammingOnMain = new JCheckBox(this.apb.getString("DisableProgrammingOnMain")));
078        disableProgrammingOnMain.setSelected(PaneProgFrame.getDisableProgrammingOnMain());
079        disableProgrammingOnMain.addItemListener((ItemEvent e) -> {
080            InstanceManager.getDefault(ProgrammerConfigManager.class).setDisableProgrammingOnMain(disableProgrammingOnMain.isSelected());
081        });
082
083        this.add(advancedPanel);
084        this.add(Box.createVerticalGlue());
085    }
086    JComboBox<String> programmerBox;
087
088    @CheckForNull
089    public String getSelectedItem() {
090        return (String) programmerBox.getSelectedItem();
091    }
092
093    public JPanel getAdvancedPanel() {
094        return advancedPanel;
095    }
096
097    JPanel advancedPanel;
098    JCheckBox showEmptyTabs;
099    JCheckBox showCvNums;
100    JCheckBox canCacheDefault;
101    JCheckBox doConfirmRead;
102    JCheckBox disableProgrammingTrack;
103    JCheckBox disableProgrammingOnMain;
104
105    public boolean getShowEmptyTabs() {
106        return showEmptyTabs.isSelected();
107    }
108
109    public boolean getShowCvNums() {
110        return showCvNums.isSelected();
111    }
112
113    public boolean getCanCacheDefault() {
114        return canCacheDefault.isSelected();
115    }
116
117    public boolean getDoConfirmRead() {
118        return doConfirmRead.isSelected();
119    }
120
121    @Override
122    public String getPreferencesItem() {
123        return "ROSTER"; // NOI18N
124    }
125
126    @Override
127    public String getPreferencesItemText() {
128        return this.apb.getString("MenuRoster"); // NOI18N
129    }
130
131    @Override
132    public String getTabbedPreferencesTitle() {
133        return this.apb.getString("TabbedLayoutProgrammer"); // NOI18N
134    }
135
136    @Override
137    public String getLabelKey() {
138        return this.apb.getString("LabelTabbedLayoutProgrammer"); // NOI18N
139    }
140
141    @Override
142    public JComponent getPreferencesComponent() {
143        return this;
144    }
145
146    @Override
147    public boolean isPersistant() {
148        return true;
149    }
150
151    @Override
152    public String getPreferencesTooltip() {
153        return null;
154    }
155
156    @Override
157    public void savePreferences() {
158        InstanceManager.getDefault(ProgrammerConfigManager.class).savePreferences(ProfileManager.getDefault().getActiveProfile());
159    }
160
161    @Override
162    public boolean isDirty() {
163        String programmer = this.getSelectedItem();
164        return (this.getShowEmptyTabs() != PaneProgFrame.getShowEmptyPanes()
165                || this.getShowCvNums() != PaneProgFrame.getShowCvNumbers()
166                || this.getCanCacheDefault() != PaneProgFrame.getCanCacheDefault()
167                || this.getDoConfirmRead() != PaneProgFrame.getDoConfirmRead()
168                || ((programmer != null)
169                        ? !programmer.equals(ProgDefault.getDefaultProgFile())
170                        : ProgDefault.getDefaultProgFile() != null));
171    }
172
173    @Override
174    public boolean isRestartRequired() {
175        return this.isDirty();
176    }
177
178    @Override
179    public boolean isPreferencesValid() {
180        return true; // no validity checking performed
181    }
182}