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(dontDetachPanes = new JCheckBox(this.apb.getString("ProgDontDetachTabs")));
052        dontDetachPanes.setSelected(PaneProgFrame.getDontDetachPanes());
053        dontDetachPanes.addItemListener((ItemEvent e) -> {
054            InstanceManager.getDefault(ProgrammerConfigManager.class).setDontDetachPanes(dontDetachPanes.isSelected());
055        });
056
057        advancedPanel.add(showCvNums = new JCheckBox(this.apb.getString("ProgShowCVInTips")));
058        showCvNums.setSelected(PaneProgFrame.getShowCvNumbers());
059        showCvNums.addItemListener((ItemEvent e) -> {
060            InstanceManager.getDefault(ProgrammerConfigManager.class).setShowCvNumbers(showCvNums.isSelected());
061        });
062
063        advancedPanel.add(canCacheDefault = new JCheckBox(this.apb.getString("ProgCanCacheDefault")));
064        canCacheDefault.setSelected(PaneProgFrame.getCanCacheDefault());
065        canCacheDefault.addItemListener((ItemEvent e) -> {
066            InstanceManager.getDefault(ProgrammerConfigManager.class).setCanCacheDefault(canCacheDefault.isSelected());
067        });
068
069        advancedPanel.add(doConfirmRead = new JCheckBox(this.apb.getString("ProgDoConfirmRead")));
070        doConfirmRead.setSelected(PaneProgFrame.getDoConfirmRead());
071        doConfirmRead.addItemListener((ItemEvent e) -> {
072            InstanceManager.getDefault(ProgrammerConfigManager.class).setDoConfirmRead(doConfirmRead.isSelected());
073        });
074
075        advancedPanel.add(new JSeparator(JSeparator.HORIZONTAL));
076
077        advancedPanel.add(disableProgrammingTrack = new JCheckBox(this.apb.getString("DisableProgrammingTrack")));
078        disableProgrammingTrack.setSelected(PaneProgFrame.getDisableProgrammingTrack());
079        disableProgrammingTrack.addItemListener((ItemEvent e) -> {
080            InstanceManager.getDefault(ProgrammerConfigManager.class).setDisableProgrammingTrack(disableProgrammingTrack.isSelected());
081        });
082
083        advancedPanel.add(disableProgrammingOnMain = new JCheckBox(this.apb.getString("DisableProgrammingOnMain")));
084        disableProgrammingOnMain.setSelected(PaneProgFrame.getDisableProgrammingOnMain());
085        disableProgrammingOnMain.addItemListener((ItemEvent e) -> {
086            InstanceManager.getDefault(ProgrammerConfigManager.class).setDisableProgrammingOnMain(disableProgrammingOnMain.isSelected());
087        });
088
089        this.add(advancedPanel);
090        this.add(Box.createVerticalGlue());
091    }
092    JComboBox<String> programmerBox;
093
094    @CheckForNull
095    public String getSelectedItem() {
096        return (String) programmerBox.getSelectedItem();
097    }
098
099    public JPanel getAdvancedPanel() {
100        return advancedPanel;
101    }
102
103    JPanel advancedPanel;
104    JCheckBox showEmptyTabs;
105    JCheckBox dontDetachPanes;
106    JCheckBox showCvNums;
107    JCheckBox canCacheDefault;
108    JCheckBox doConfirmRead;
109    JCheckBox disableProgrammingTrack;
110    JCheckBox disableProgrammingOnMain;
111
112    public boolean getShowEmptyTabs() {
113        return showEmptyTabs.isSelected();
114    }
115
116    public boolean getDontDetachPanes() {
117        return dontDetachPanes.isSelected();
118    }
119
120    public boolean getShowCvNums() {
121        return showCvNums.isSelected();
122    }
123
124    public boolean getCanCacheDefault() {
125        return canCacheDefault.isSelected();
126    }
127
128    public boolean getDoConfirmRead() {
129        return doConfirmRead.isSelected();
130    }
131
132    @Override
133    public String getPreferencesItem() {
134        return "ROSTER"; // NOI18N
135    }
136
137    @Override
138    public String getPreferencesItemText() {
139        return this.apb.getString("MenuRoster"); // NOI18N
140    }
141
142    @Override
143    public String getTabbedPreferencesTitle() {
144        return this.apb.getString("TabbedLayoutProgrammer"); // NOI18N
145    }
146
147    @Override
148    public String getLabelKey() {
149        return this.apb.getString("LabelTabbedLayoutProgrammer"); // NOI18N
150    }
151
152    @Override
153    public JComponent getPreferencesComponent() {
154        return this;
155    }
156
157    @Override
158    public boolean isPersistant() {
159        return true;
160    }
161
162    @Override
163    public String getPreferencesTooltip() {
164        return null;
165    }
166
167    @Override
168    public void savePreferences() {
169        InstanceManager.getDefault(ProgrammerConfigManager.class).savePreferences(ProfileManager.getDefault().getActiveProfile());
170    }
171
172    @Override
173    public boolean isDirty() {
174        String programmer = this.getSelectedItem();
175        return (this.getShowEmptyTabs() != PaneProgFrame.getShowEmptyPanes()
176                || this.getDontDetachPanes() != PaneProgFrame.getDontDetachPanes()
177                || this.getShowCvNums() != PaneProgFrame.getShowCvNumbers()
178                || this.getCanCacheDefault() != PaneProgFrame.getCanCacheDefault()
179                || this.getDoConfirmRead() != PaneProgFrame.getDoConfirmRead()
180                || ((programmer != null)
181                        ? !programmer.equals(ProgDefault.getDefaultProgFile())
182                        : ProgDefault.getDefaultProgFile() != null));
183    }
184
185    @Override
186    public boolean isRestartRequired() {
187        return this.isDirty();
188    }
189
190    @Override
191    public boolean isPreferencesValid() {
192        return true; // no validity checking performed
193    }
194}