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}