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}