001package jmri.jmrit.symbolicprog; 002 003import java.util.Set; 004import java.util.prefs.BackingStoreException; 005import java.util.prefs.Preferences; 006import javax.annotation.Nonnull; 007import jmri.implementation.FileLocationsPreferences; 008import jmri.jmrit.symbolicprog.tabbedframe.PaneProgFrame; 009import jmri.profile.Profile; 010import jmri.profile.ProfileUtils; 011import jmri.spi.PreferencesManager; 012import jmri.util.prefs.AbstractPreferencesManager; 013import jmri.util.prefs.InitializationException; 014import org.openide.util.lookup.ServiceProvider; 015import org.slf4j.Logger; 016import org.slf4j.LoggerFactory; 017 018/** 019 * 020 * @author Randall Wood (C) 2015 021 * @author Bob Jacobsen (C) 2026 022 */ 023@ServiceProvider(service = PreferencesManager.class) 024public class ProgrammerConfigManager extends AbstractPreferencesManager { 025 026 public static final String DEFAULT_FILE = "defaultFile"; 027 public static final String SHOW_EMPTY_PANES = "showEmptyPanes"; 028 public static final String DONT_DETACH_PANES = "dontDetachPanes"; 029 public static final String SHOW_CV_NUMBERS = "showCvNumbers"; 030 public static final String CAN_CACHE_DEFAULT = "canCacheDefault"; 031 public static final String DO_CONFIRM_READ = "doConfirmRead"; 032 public static final String DISABLE_PROGRAMMING_TRACK = "disableProgrammingTrack"; 033 public static final String DISABLE_PROGRAMMING_ON_MAIN = "disableProgrammingOnMain"; 034 private String defaultFile = null; 035 private boolean showEmptyPanes = true; 036 private boolean dontDetachPanes = false; 037 private boolean showCvNumbers = false; 038 private boolean canCacheDefault = false; 039 private boolean doConfirmRead = false; 040 private boolean disableProgrammingTrack = false; 041 private boolean disableProgrammingOnMain = false; 042 043 @Override 044 public void initialize(Profile profile) throws InitializationException { 045 if (!this.isInitialized(profile)) { 046 Preferences preferences = ProfileUtils.getPreferences(profile, this.getClass(), true); 047 if (preferences.get(DEFAULT_FILE, this.getDefaultFile()) != null) { 048 this.setDefaultFile(preferences.get(DEFAULT_FILE, this.getDefaultFile())); 049 ProgDefault.setDefaultProgFile(this.getDefaultFile()); 050 } 051 052 this.setShowEmptyPanes(preferences.getBoolean(SHOW_EMPTY_PANES, this.isShowEmptyPanes())); 053 PaneProgFrame.setShowEmptyPanes(this.isShowEmptyPanes()); 054 055 this.setDontDetachPanes(preferences.getBoolean(DONT_DETACH_PANES, this.isDontDetachPanes())); 056 PaneProgFrame.setDontDetachPanes(this.isDontDetachPanes()); 057 058 this.setShowCvNumbers(preferences.getBoolean(SHOW_CV_NUMBERS, this.isShowCvNumbers())); 059 PaneProgFrame.setShowCvNumbers(this.isShowCvNumbers()); 060 061 this.setCanCacheDefault(preferences.getBoolean(CAN_CACHE_DEFAULT, this.isCanCacheDefault())); 062 PaneProgFrame.setCanCacheDefault(this.isCanCacheDefault()); 063 064 this.setDoConfirmRead(preferences.getBoolean(DO_CONFIRM_READ, this.isDoConfirmRead())); 065 PaneProgFrame.setDoConfirmRead(this.isDoConfirmRead()); 066 067 this.setDisableProgrammingTrack(preferences.getBoolean(DISABLE_PROGRAMMING_TRACK, this.isDisableProgrammingTrack())); 068 PaneProgFrame.setDisableProgrammingTrack(this.isDisableProgrammingTrack()); 069 070 this.setDisableProgrammingOnMain(preferences.getBoolean(DISABLE_PROGRAMMING_ON_MAIN, this.isDisableProgrammingOnMain())); 071 PaneProgFrame.setDisableProgrammingOnMain(this.isDisableProgrammingOnMain()); 072 073 this.setInitialized(profile, true); 074 } 075 } 076 077 @Override 078 @Nonnull 079 public Set<Class<? extends PreferencesManager>> getRequires() { 080 Set<Class<? extends PreferencesManager>> requires = super.getRequires(); 081 requires.add(FileLocationsPreferences.class); 082 return requires; 083 } 084 085 @Override 086 @Nonnull 087 public Set<Class<?>> getProvides() { 088 Set<Class<?>> provides = super.getProvides(); 089 provides.stream().forEach((provide) -> { 090 log.debug("ProgammerConfigManager provides {}", provide); 091 }); 092 return provides; 093 } 094 095 @Override 096 public void savePreferences(Profile profile) { 097 Preferences preferences = ProfileUtils.getPreferences(profile, this.getClass(), true); 098 if (this.defaultFile != null) { 099 preferences.put(DEFAULT_FILE, this.defaultFile); 100 } else { 101 preferences.remove(DEFAULT_FILE); 102 } 103 preferences.putBoolean(SHOW_EMPTY_PANES, this.showEmptyPanes); 104 preferences.putBoolean(DONT_DETACH_PANES, this.dontDetachPanes); 105 preferences.putBoolean(SHOW_CV_NUMBERS, this.showCvNumbers); 106 preferences.putBoolean(CAN_CACHE_DEFAULT, this.canCacheDefault); 107 preferences.putBoolean(DO_CONFIRM_READ, this.doConfirmRead); 108 preferences.putBoolean(DISABLE_PROGRAMMING_TRACK, this.disableProgrammingTrack); 109 preferences.putBoolean(DISABLE_PROGRAMMING_ON_MAIN, this.disableProgrammingOnMain); 110 try { 111 preferences.sync(); 112 } catch (BackingStoreException ex) { 113 log.error("Unable to save preferences.", ex); 114 } 115 } 116 117 /** 118 * @return the defaultFile 119 */ 120 public String getDefaultFile() { 121 return defaultFile; 122 } 123 124 /** 125 * @param defaultFile the defaultFile to set 126 */ 127 public void setDefaultFile(String defaultFile) { 128 java.lang.String oldDefaultFile = this.defaultFile; 129 this.defaultFile = defaultFile; 130 firePropertyChange(DEFAULT_FILE, oldDefaultFile, defaultFile); 131 } 132 133 /** 134 * @return the showEmptyPanes 135 */ 136 public boolean isShowEmptyPanes() { 137 return showEmptyPanes; 138 } 139 140 /** 141 * @param showEmptyPanes the showEmptyPanes to set 142 */ 143 public void setShowEmptyPanes(boolean showEmptyPanes) { 144 boolean oldShowEmptyPanes = this.showEmptyPanes; 145 this.showEmptyPanes = showEmptyPanes; 146 firePropertyChange(SHOW_EMPTY_PANES, oldShowEmptyPanes, showEmptyPanes); 147 } 148 149 /** 150 * @return the dontDetachPanes 151 */ 152 public boolean isDontDetachPanes() { 153 return dontDetachPanes; 154 } 155 156 /** 157 * @param dontDetachPanes the dontDetachPanes to set 158 */ 159 public void setDontDetachPanes(boolean dontDetachPanes) { 160 boolean oldDontDetachPanes = this.dontDetachPanes; 161 this.dontDetachPanes = dontDetachPanes; 162 firePropertyChange(DONT_DETACH_PANES, oldDontDetachPanes, dontDetachPanes); 163 } 164 165 /** 166 * @return the showCvNumbers 167 */ 168 public boolean isShowCvNumbers() { 169 return showCvNumbers; 170 } 171 172 /** 173 * @param showCvNumbers the showCvNumbers to set 174 */ 175 public void setShowCvNumbers(boolean showCvNumbers) { 176 boolean oldShowCvNumbers = this.showCvNumbers; 177 this.showCvNumbers = showCvNumbers; 178 firePropertyChange(SHOW_CV_NUMBERS, oldShowCvNumbers, showCvNumbers); 179 } 180 181 /** 182 * @return the canCacheDefault 183 */ 184 public boolean isCanCacheDefault() { 185 return canCacheDefault; 186 } 187 188 /** 189 * @param canCacheDefault new value 190 */ 191 public void setCanCacheDefault(boolean canCacheDefault) { 192 boolean oldCanCacheDefault = this.canCacheDefault; 193 this.canCacheDefault = canCacheDefault; 194 firePropertyChange(CAN_CACHE_DEFAULT, oldCanCacheDefault, canCacheDefault); 195 } 196 197 /** 198 * @return the doConfirmRead 199 */ 200 public boolean isDoConfirmRead() { 201 return doConfirmRead; 202 } 203 204 /** 205 * @return the disableProgrammingTrack 206 */ 207 public boolean isDisableProgrammingTrack() { 208 return disableProgrammingTrack; 209 } 210 211 /** 212 * @return the disableProgrammingOnMain 213 */ 214 public boolean isDisableProgrammingOnMain() { 215 return disableProgrammingOnMain; 216 } 217 218 /** 219 * @param doConfirmRead new value 220 */ 221 public void setDoConfirmRead(boolean doConfirmRead) { 222 boolean oldDoConfirmRead = this.doConfirmRead; 223 this.doConfirmRead = doConfirmRead; 224 firePropertyChange(DO_CONFIRM_READ, oldDoConfirmRead, doConfirmRead); 225 } 226 227 /** 228 * @param disableProgrammingTrack new value 229 */ 230 public void setDisableProgrammingTrack(boolean disableProgrammingTrack) { 231 boolean oldDisableProgrammingTrack = this.disableProgrammingTrack; 232 this.disableProgrammingTrack = disableProgrammingTrack; 233 firePropertyChange(DISABLE_PROGRAMMING_TRACK, oldDisableProgrammingTrack, disableProgrammingTrack); 234 } 235 236 /** 237 * @param disableProgrammingOnMain new value 238 */ 239 public void setDisableProgrammingOnMain(boolean disableProgrammingOnMain) { 240 boolean oldDisableProgrammingOnMain = this.disableProgrammingOnMain; 241 this.disableProgrammingOnMain = disableProgrammingOnMain; 242 firePropertyChange(DISABLE_PROGRAMMING_ON_MAIN, oldDisableProgrammingOnMain, disableProgrammingOnMain); 243 } 244 245 private static final Logger log = LoggerFactory.getLogger(ProgrammerConfigManager.class); 246 247}