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}