001package apps.gui3.tabbedpreferences;
002
003import java.awt.event.WindowEvent;
004
005import javax.swing.WindowConstants;
006
007import jmri.InstanceManager;
008import jmri.ShutDownManager;
009import jmri.swing.PreferencesPanel;
010import jmri.util.JmriJFrame;
011import jmri.util.swing.JmriJOptionPane;
012
013/**
014 * Support displaying {@link TabbedPreferences} in a window.
015 *<p>
016 * The {@link TabbedPreferences} object is requested from the InstanceManager, and
017 * if need-be created and initialized in the process of doing that.
018 *
019 * @author Kevin Dickerson Copyright 2010
020 * @author Bob Jacobsen Copyright 2019
021 */
022public class TabbedPreferencesFrame extends JmriJFrame {
023
024    @Override
025    public String getTitle() {
026        return getTabbedPreferences().getTitle();
027    }
028
029    public boolean isMultipleInstances() {
030        return true;
031    }
032
033    public TabbedPreferencesFrame() {
034        super();
035        add(getTabbedPreferences());
036        addHelpMenu("package.apps.TabbedPreferences", true); // NOI18N
037        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
038        pack();
039    }
040
041    public void gotoPreferenceItem(String item, String sub) {
042        getTabbedPreferences().gotoPreferenceItem(item, sub);
043    }
044
045    @Override
046    public void windowClosing(WindowEvent e) {
047        ShutDownManager sdm = InstanceManager.getDefault(ShutDownManager.class);
048        if (!getTabbedPreferences().isPreferencesValid() && !sdm.isShuttingDown()) {
049            for (PreferencesPanel panel : getTabbedPreferences().getPreferencesPanels().values()) {
050                if (!panel.isPreferencesValid()) {
051                    switch (JmriJOptionPane.showConfirmDialog(this,
052                            Bundle.getMessage("InvalidPreferencesMessage", panel.getTabbedPreferencesTitle()),
053                            Bundle.getMessage("InvalidPreferencesTitle"),
054                            JmriJOptionPane.YES_NO_OPTION,
055                            JmriJOptionPane.ERROR_MESSAGE)) {
056                        case JmriJOptionPane.YES_OPTION:
057                            // abort window closing and return to broken preferences
058                            getTabbedPreferences().gotoPreferenceItem(panel.getPreferencesItem(), panel.getTabbedPreferencesTitle());
059                            return;
060                        default:
061                            // do nothing
062                            break;
063                    }
064                }
065            }
066        }
067        if (getTabbedPreferences().isDirty()) {
068            var buttons = JmriJOptionPane.YES_NO_CANCEL_OPTION;
069            if (sdm.isShuttingDown()) {
070                buttons = JmriJOptionPane.YES_NO_OPTION;
071            }
072            switch (JmriJOptionPane.showConfirmDialog(this,
073                    Bundle.getMessage("UnsavedChangesMessage", getTabbedPreferences().getTitle()), // NOI18N
074                    Bundle.getMessage("UnsavedChangesTitle"), // NOI18N
075                    buttons,
076                    JmriJOptionPane.QUESTION_MESSAGE)) {
077                case JmriJOptionPane.YES_OPTION:
078                    // save preferences
079                    getTabbedPreferences().savePressed(getTabbedPreferences().invokeSaveOptions());
080                    break;
081                case JmriJOptionPane.NO_OPTION:
082                    // do nothing
083                    break;
084                case JmriJOptionPane.CANCEL_OPTION:
085                default:
086                    // abort window closing
087                    return;
088            }
089        }
090        this.setVisible(false);
091    }
092
093    /**
094     * Ensure a TabbedPreferences instance is always available.
095     *
096     * @return the default TabbedPreferences instance, creating it if needed
097     */
098    private TabbedPreferences getTabbedPreferences() {
099        return InstanceManager.getOptionalDefault(TabbedPreferences.class).orElseGet(() -> {
100            return InstanceManager.setDefault(TabbedPreferences.class, new TabbedPreferences());
101        });
102    }
103}