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        dialog.pack();
044        dialog.setBounds(
045                (int) ( jmri.util.JmriJFrame.getScreenDimensions().get(0).getBounds().getSize().getWidth() * 0.10 ),
046                (int) ( jmri.util.JmriJFrame.getScreenDimensions().get(0).getBounds().getSize().getHeight() * 0.10 ),
047                (int) ( jmri.util.JmriJFrame.getScreenDimensions().get(0).getBounds().getSize().getWidth() * 0.80 ),
048                (int) (jmri.util.JmriJFrame.getScreenDimensions().get(0).getBounds().getSize().getHeight()* 0.80 ));
049        dialog.setVisible(true);
050        return dialog.restartProgram;
051    }
052
053    public EditConnectionPreferencesDialog() {
054        super();
055        setModal(true);
056        editConnectionPreferences = new EditConnectionPreferences(this);
057        editConnectionPreferences.init();
058        add(editConnectionPreferences);
059//        addHelpMenu("package.apps.TabbedPreferences", true); // NOI18N
060        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
061        addWindowListener(EditConnectionPreferencesDialog.this);
062    }
063
064    public void gotoPreferenceItem(String item, String sub) {
065        editConnectionPreferences.gotoPreferenceItem(item, sub);
066    }
067
068    @Override
069    public void windowClosing(WindowEvent e) {
070        ShutDownManager sdm = InstanceManager.getDefault(ShutDownManager.class);
071        if (!editConnectionPreferences.isPreferencesValid() && !sdm.isShuttingDown()) {
072            for (PreferencesPanel panel : editConnectionPreferences.getPreferencesPanels().values()) {
073                if (!panel.isPreferencesValid()) {
074                    switch (JmriJOptionPane.showConfirmDialog(this,
075                            Bundle.getMessage("InvalidPreferencesMessage", panel.getTabbedPreferencesTitle()),
076                            Bundle.getMessage("InvalidPreferencesTitle"),
077                            JmriJOptionPane.YES_NO_OPTION,
078                            JmriJOptionPane.ERROR_MESSAGE)) {
079                        case JmriJOptionPane.YES_OPTION:
080                            // abort window closing and return to broken preferences
081                            editConnectionPreferences.gotoPreferenceItem(panel.getPreferencesItem(), panel.getTabbedPreferencesTitle());
082                            return;
083                        default:
084                            // do nothing
085                            break;
086                    }
087                }
088            }
089        }
090        if (editConnectionPreferences.isDirty()) {
091            switch (JmriJOptionPane.showConfirmDialog(this,
092                    Bundle.getMessage("UnsavedChangesMessage", editConnectionPreferences.getTitle()), // NOI18N
093                    Bundle.getMessage("UnsavedChangesTitle"), // NOI18N
094                    JmriJOptionPane.YES_NO_CANCEL_OPTION,
095                    JmriJOptionPane.QUESTION_MESSAGE)) {
096                case JmriJOptionPane.YES_OPTION:
097                    // save preferences
098                    editConnectionPreferences.savePressed(editConnectionPreferences.invokeSaveOptions());
099                    break;
100                case JmriJOptionPane.NO_OPTION:
101                    // do nothing
102                    break;
103                case JmriJOptionPane.CANCEL_OPTION:
104                default:
105                    // abort window closing
106                    return;
107            }
108        }
109        this.setVisible(false);
110    }
111
112    @Override
113    public void windowOpened(WindowEvent e) {
114    }
115
116    @Override
117    public void windowClosed(WindowEvent e) {
118    }
119
120    @Override
121    public void windowIconified(WindowEvent e) {
122    }
123
124    @Override
125    public void windowDeiconified(WindowEvent e) {
126    }
127
128    @Override
129    public void windowActivated(WindowEvent e) {
130    }
131
132    @Override
133    public void windowDeactivated(WindowEvent e) {
134    }
135}