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