001package jmri.jmrit.logixng.tools.swing;
002
003import jmri.jmrit.logixng.LogixNGPreferences;
004import jmri.jmrit.logixng.implementation.DefaultLogixNGPreferences;
005
006import java.awt.FlowLayout;
007import java.awt.GridLayout;
008
009import javax.swing.*;
010
011import org.openide.util.lookup.ServiceProvider;
012
013import jmri.InstanceManager;
014import jmri.jmrit.logixng.MaleSocket.ErrorHandlingType;
015import jmri.jmrit.logixng.actions.IfThenElse;
016// import jmri.swing.JTitledSeparator;
017import jmri.swing.PreferencesPanel;
018import jmri.util.swing.JComboBoxUtil;
019
020/**
021 * Preferences panel for LogixNG
022 *
023 * @author Daniel Bergqvist Copyright 2018
024 */
025@ServiceProvider(service = PreferencesPanel.class)
026public class LogixNGPreferencesPanel extends JPanel implements PreferencesPanel {
027
028    private final DefaultLogixNGPreferences preferences;
029
030    JCheckBox _startLogixNGOnLoadCheckBox;
031    JCheckBox _installDebuggerCheckBox;
032    JCheckBox _showSystemUserNamesCheckBox;
033    JCheckBox _treeEditorHighlightRow;
034    JCheckBox _showSystemNameInException;
035    JCheckBox _strictTypingGlobalVariables;
036    JCheckBox _strictTypingLocalVariables;
037    private JComboBox<ErrorHandlingType> _errorHandlingComboBox;
038    private JComboBox<IfThenElse.ExecuteType> _ifThenElseExecuteTypeDefault;
039
040
041    public LogixNGPreferencesPanel() {
042        LogixNGPreferences prefs = InstanceManager.getDefault(LogixNGPreferences.class);
043        if (!(prefs instanceof DefaultLogixNGPreferences)) {
044            throw new RuntimeException("LogixNGPreferences is not of type DefaultLogixNGPreferences");
045        }
046        preferences = (DefaultLogixNGPreferences)prefs;
047        initGUI();
048    }
049
050    private void initGUI() {
051        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
052//        add(new JTitledSeparator(Bundle.getMessage("TitleStartupSettingsPanel")));
053        add(getStartupPanel());
054    }
055
056    /**
057     * set the local prefs to match the GUI Local prefs are independent from the
058     * singleton instance prefs.
059     *
060     * @return true if set, false if values are unacceptable.
061     */
062    private boolean setValues() {
063        boolean didSet = true;
064        preferences.setStartLogixNGOnStartup(_startLogixNGOnLoadCheckBox.isSelected());
065        preferences.setInstallDebugger(_installDebuggerCheckBox.isSelected());
066        preferences.setShowSystemUserNames(_showSystemUserNamesCheckBox.isSelected());
067        preferences.setTreeEditorHighlightRow(_treeEditorHighlightRow.isSelected());
068        preferences.setErrorHandlingType(_errorHandlingComboBox.getItemAt(
069                _errorHandlingComboBox.getSelectedIndex()));
070        preferences.setShowSystemNameInException(_showSystemNameInException.isSelected());
071        preferences.setStrictTypingGlobalVariables(_strictTypingGlobalVariables.isSelected());
072        preferences.setStrictTypingLocalVariables(_strictTypingLocalVariables.isSelected());
073        preferences.setIfThenElseExecuteTypeDefault(_ifThenElseExecuteTypeDefault.getItemAt(
074                _ifThenElseExecuteTypeDefault.getSelectedIndex()));
075        return didSet;
076    }
077
078    private JPanel getStartupPanel() {
079        JPanel panel = new JPanel();
080
081        _startLogixNGOnLoadCheckBox = new JCheckBox(Bundle.getMessage("LabelStartLogixNGOnLoad"));
082        _startLogixNGOnLoadCheckBox.setToolTipText(Bundle.getMessage("ToolTipStartLogixNGOnLoad"));
083
084        _installDebuggerCheckBox = new JCheckBox(Bundle.getMessage("LabelInstallDebugger"));
085        _installDebuggerCheckBox.setToolTipText(Bundle.getMessage("ToolTipLabelInstallDebugger"));
086
087        _showSystemUserNamesCheckBox = new JCheckBox(Bundle.getMessage("LabelShowSystemUserNames"));
088        _showSystemUserNamesCheckBox.setToolTipText(Bundle.getMessage("ToolTipLabeShowSystemUserNames"));
089
090        _treeEditorHighlightRow = new JCheckBox(Bundle.getMessage("LabelTreeEditorHighlightRow"));
091        _treeEditorHighlightRow.setToolTipText(Bundle.getMessage("ToolTipTreeEditorHighlightRow"));
092
093        _showSystemNameInException = new JCheckBox(Bundle.getMessage("LabelShowSystemNameInException"));
094        _showSystemNameInException.setToolTipText(Bundle.getMessage("ToolTipShowSystemNameInException"));
095
096        _strictTypingGlobalVariables = new JCheckBox(Bundle.getMessage("LabelStrictTypingGlobalVariables"));
097        _strictTypingGlobalVariables.setToolTipText(Bundle.getMessage("ToolTipStrictTypingGlobalVariables"));
098
099        _strictTypingLocalVariables = new JCheckBox(Bundle.getMessage("LabelStrictTypingLocalVariables"));
100        _strictTypingLocalVariables.setToolTipText(Bundle.getMessage("ToolTipStrictTypingLocalVariables"));
101
102        JPanel gridPanel = new JPanel(new GridLayout(0, 1));
103
104        gridPanel.add(_startLogixNGOnLoadCheckBox);
105        gridPanel.add(_installDebuggerCheckBox);
106        gridPanel.add(_showSystemUserNamesCheckBox);
107        gridPanel.add(_treeEditorHighlightRow);
108        gridPanel.add(Box.createVerticalStrut(2));
109        gridPanel.add(_strictTypingGlobalVariables);
110        gridPanel.add(_strictTypingLocalVariables);
111        gridPanel.add(Box.createVerticalStrut(2));
112        gridPanel.add(_showSystemNameInException);
113
114        _startLogixNGOnLoadCheckBox.setSelected(preferences.getStartLogixNGOnStartup());
115        _installDebuggerCheckBox.setSelected(preferences.getInstallDebugger());
116        _showSystemUserNamesCheckBox.setSelected(preferences.getShowSystemUserNames());
117        _treeEditorHighlightRow.setSelected(preferences.getTreeEditorHighlightRow());
118        _showSystemNameInException.setSelected(preferences.getShowSystemNameInException());
119        _strictTypingGlobalVariables.setSelected(preferences.getStrictTypingGlobalVariables());
120        _strictTypingLocalVariables.setSelected(preferences.getStrictTypingLocalVariables());
121
122        gridPanel.add(Box.createVerticalStrut(2));
123        gridPanel.add(new JLabel(Bundle.getMessage("LabelDefaultErrorHandling")));
124        _errorHandlingComboBox = new JComboBox<>();
125        for (ErrorHandlingType type : ErrorHandlingType.values()) {
126            // ErrorHandlingType.Default cannot be used as default
127            if (type != ErrorHandlingType.Default) {
128                _errorHandlingComboBox.addItem(type);
129                if (preferences.getErrorHandlingType() == type) {
130                    _errorHandlingComboBox.setSelectedItem(type);
131                }
132            }
133        }
134        JComboBoxUtil.setupComboBoxMaxRows(_errorHandlingComboBox);
135        gridPanel.add(_errorHandlingComboBox);
136
137
138        gridPanel.add(Box.createVerticalStrut(2));
139        gridPanel.add(new JLabel(Bundle.getMessage("LabelDefaultIfThenElseExecution")));
140        _ifThenElseExecuteTypeDefault = new JComboBox<>();
141        for (IfThenElse.ExecuteType type : IfThenElse.ExecuteType.values()) {
142            _ifThenElseExecuteTypeDefault.addItem(type);
143            if (preferences.getIfThenElseExecuteTypeDefault() == type) {
144                _ifThenElseExecuteTypeDefault.setSelectedItem(type);
145            }
146        }
147        JComboBoxUtil.setupComboBoxMaxRows(_ifThenElseExecuteTypeDefault);
148        gridPanel.add(_ifThenElseExecuteTypeDefault);
149
150        panel.setLayout(new FlowLayout(FlowLayout.CENTER, 40, 0));
151        panel.add(gridPanel);
152
153        return panel;
154    }
155
156    @Override
157    public String getPreferencesItem() {
158        return "LOGIXNG"; // NOI18N
159    }
160
161    @Override
162    public String getPreferencesItemText() {
163        return Bundle.getMessage("MenuLogixNG"); // NOI18N
164    }
165
166    @Override
167    public String getTabbedPreferencesTitle() {
168        return getPreferencesItemText();
169    }
170
171    @Override
172    public String getLabelKey() {
173        return null;
174    }
175
176    @Override
177    public JComponent getPreferencesComponent() {
178        return this;
179    }
180
181    @Override
182    public boolean isPersistant() {
183        return false;
184    }
185
186    @Override
187    public String getPreferencesTooltip() {
188        return null;
189    }
190
191    @Override
192    public void savePreferences() {
193        if (setValues()) {
194            preferences.save();
195        }
196    }
197
198    @Override
199    public boolean isDirty() {
200        return preferences.isDirty();
201    }
202
203    @Override
204    public boolean isRestartRequired() {
205        return preferences.isRestartRequired();
206    }
207
208    @Override
209    public boolean isPreferencesValid() {
210        return true; // no validity checking performed
211    }
212
213}