001package apps.gui3.tabbedpreferences;
002
003import java.awt.event.WindowEvent;
004import java.awt.event.WindowListener;
005import javax.swing.JDialog;
006import javax.swing.SwingUtilities;
007import javax.swing.WindowConstants;
008import jmri.InstanceManager;
009import jmri.ShutDownManager;
010import jmri.swing.PreferencesPanel;
011import jmri.util.swing.JmriJOptionPane;
012
013/**
014 * Provide a Connection preferences dialog.
015 * <p>
016 * References the status of an {@link EditConnectionPreferences} object that 
017 * is created (via new()) as part of this constructor.
018 * 
019 * @author Kevin Dickerson Copyright 2010
020 */
021public final class EditConnectionPreferencesDialog extends JDialog implements WindowListener {
022
023    final EditConnectionPreferences editConnectionPreferences;
024    boolean restartProgram = false;
025    
026    @Override
027    public String getTitle() {
028        return editConnectionPreferences.getTitle();
029    }
030
031    public boolean isMultipleInstances() {
032        return true;
033    }
034    
035    /**
036     * Displays a dialog for editing the connections.
037     *
038     * @return true if the program should restart, false if the program should quit.
039     */
040    public static boolean showDialog() {
041        EditConnectionPreferencesDialog dialog = new EditConnectionPreferencesDialog();
042        SwingUtilities.updateComponentTreeUI(dialog);  // hack because sometimes this was created before L&F was set?
043        
044        dialog.pack();
045        dialog.setVisible(true);
046        return dialog.restartProgram;
047    }
048
049    public EditConnectionPreferencesDialog() {
050        super();
051        setModal(true);
052        editConnectionPreferences = new EditConnectionPreferences(this);
053        editConnectionPreferences.init();
054        add(editConnectionPreferences);
055//        addHelpMenu("package.apps.TabbedPreferences", true); // NOI18N
056        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
057        addWindowListener(EditConnectionPreferencesDialog.this);
058    }
059
060    public void gotoPreferenceItem(String item, String sub) {
061        editConnectionPreferences.gotoPreferenceItem(item, sub);
062    }
063
064    @Override
065    public void windowClosing(WindowEvent e) {
066        ShutDownManager sdm = InstanceManager.getDefault(ShutDownManager.class);
067        if (!editConnectionPreferences.isPreferencesValid() && !sdm.isShuttingDown()) {
068            for (PreferencesPanel panel : editConnectionPreferences.getPreferencesPanels().values()) {
069                if (!panel.isPreferencesValid()) {
070                    switch (JmriJOptionPane.showConfirmDialog(this,
071                            Bundle.getMessage("InvalidPreferencesMessage", panel.getTabbedPreferencesTitle()),
072                            Bundle.getMessage("InvalidPreferencesTitle"),
073                            JmriJOptionPane.YES_NO_OPTION,
074                            JmriJOptionPane.ERROR_MESSAGE)) {
075                        case JmriJOptionPane.YES_OPTION:
076                            // abort window closing and return to broken preferences
077                            editConnectionPreferences.gotoPreferenceItem(panel.getPreferencesItem(), panel.getTabbedPreferencesTitle());
078                            return;
079                        default:
080                            // do nothing
081                            break;
082                    }
083                }
084            }
085        }
086        if (editConnectionPreferences.isDirty()) {
087            switch (JmriJOptionPane.showConfirmDialog(this,
088                    Bundle.getMessage("UnsavedChangesMessage", editConnectionPreferences.getTitle()), // NOI18N
089                    Bundle.getMessage("UnsavedChangesTitle"), // NOI18N
090                    JmriJOptionPane.YES_NO_CANCEL_OPTION,
091                    JmriJOptionPane.QUESTION_MESSAGE)) {
092                case JmriJOptionPane.YES_OPTION:
093                    // save preferences
094                    editConnectionPreferences.savePressed(editConnectionPreferences.invokeSaveOptions());
095                    break;
096                case JmriJOptionPane.NO_OPTION:
097                    // do nothing
098                    break;
099                case JmriJOptionPane.CANCEL_OPTION:
100                default:
101                    // abort window closing
102                    return;
103            }
104        }
105        this.setVisible(false);
106    }
107
108    @Override
109    public void windowOpened(WindowEvent e) {
110    }
111
112    @Override
113    public void windowClosed(WindowEvent e) {
114    }
115
116    @Override
117    public void windowIconified(WindowEvent e) {
118    }
119
120    @Override
121    public void windowDeiconified(WindowEvent e) {
122    }
123
124    @Override
125    public void windowActivated(WindowEvent e) {
126    }
127
128    @Override
129    public void windowDeactivated(WindowEvent e) {
130    }
131}