001package jmri.jmrit.throttle.panels;
002
003import java.awt.Color;
004import java.beans.PropertyChangeEvent;
005import java.beans.PropertyChangeListener;
006
007import jmri.DccThrottle;
008import jmri.InstanceManager;
009import jmri.LocoAddress;
010import jmri.jmrit.roster.RosterEntry;
011import jmri.jmrit.throttle.interfaces.AddressListener;
012import jmri.jmrit.throttle.preferences.ThrottlesPreferences;
013import jmri.util.swing.ResizableImagePanel;
014
015/**
016 * A panel to be used as background for JMRI throttle frames 
017 * 
018 * <hr>
019 * This file is part of JMRI.
020 * <p>
021 * JMRI is free software; you can redistribute it and/or modify it under the
022 * terms of version 2 of the GNU General Public License as published by the Free
023 * Software Foundation. See the "COPYING" file for a copy of this license.
024 * <p>
025 * JMRI is distributed in the hope that it will be useful, but WITHOUT ANY
026 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
027 * A PARTICULAR PURPOSE. See the GNU General Public License for more details.
028 *
029 * @author Lionel Jeanson - 2009, 2026
030 * 
031 */
032
033public class BackgroundPanel extends ResizableImagePanel implements AddressListener, PropertyChangeListener  {
034
035    AddressPanel addressPanel = null;
036
037    public BackgroundPanel() {
038        super();
039        initGUI();
040        InstanceManager.getDefault(ThrottlesPreferences.class).addPropertyChangeListener(this);
041        applyPreferences();
042    }
043    
044    private void initGUI() {
045        setBackground(Color.GRAY);
046        setRespectAspectRatio(true);
047    }
048    
049    private void applyPreferences() {
050        final ThrottlesPreferences preferences = InstanceManager.getDefault(ThrottlesPreferences.class);
051        
052        setResizingContainer(preferences.isResizingWindow());
053        setVisible(  (preferences.isUsingExThrottle()) && (preferences.isUsingRosterImage()));
054    }
055
056    public void setAddressPanel(AddressPanel ap) {
057        if (addressPanel != null) {
058            addressPanel.removeAddressListener(this);
059        }
060        addressPanel = ap;
061        if (addressPanel != null) {
062            addressPanel.addAddressListener(this);
063            updateImage(addressPanel.getRosterEntry());
064        }        
065    }
066
067    private void updateImage(RosterEntry rosterEntry) {
068        setImagePath(null);
069        if (rosterEntry != null) {
070            setImagePath(rosterEntry.getImagePath());
071        } else if (addressPanel != null) {
072            DccThrottle t = addressPanel.getThrottle();
073            if (t != null) {               
074                if (t.getLocoAddress().toString().compareTo("3(S)") == 0) { // default DCC address
075                    setImagePath(jmri.util.FileUtil.getExternalFilename("resources/icons/throttles/DCCImage.png"));
076                }
077                if (t.getLocoAddress().toString().compareTo("0(S)") == 0) { // default DC address
078                    setImagePath(jmri.util.FileUtil.getExternalFilename("resources/icons/throttles/DCImage.png"));
079                }
080            }
081        }
082    }
083    
084
085    @Override
086    public void notifyAddressThrottleFound(DccThrottle t) {
087        if (addressPanel != null) {
088            updateImage(addressPanel.getRosterEntry());
089        }       
090    }
091
092    @Override
093    public void notifyRosterEntrySelected(RosterEntry re) {
094        updateImage(re);
095    }
096
097    @Override
098    public void notifyAddressReleased(LocoAddress la) {
099        setImagePath(null);
100    } 
101
102    @Override
103    public void notifyAddressChosen(LocoAddress l) {
104    }
105
106    @Override
107    public void notifyConsistAddressChosen(LocoAddress l) {
108        if (addressPanel != null) {
109            updateImage(addressPanel.getRosterEntry());
110        }
111    }
112
113    @Override
114    public void notifyConsistAddressReleased(LocoAddress l) {
115        updateImage(null);
116    }
117
118    @Override
119    public void notifyConsistAddressThrottleFound(DccThrottle t) {
120        if (addressPanel != null) {
121            updateImage(addressPanel.getRosterEntry());
122        }
123    }
124
125    public void dispose() {
126        InstanceManager.getDefault(ThrottlesPreferences.class).removePropertyChangeListener(this);
127        if (addressPanel != null) {
128            addressPanel.removeAddressListener(this);
129            addressPanel = null;
130        }
131    }
132
133    @Override
134    public void propertyChange(PropertyChangeEvent e) {
135        if (e == null) {
136            return;
137        }        
138//        log.debug("Property change event received {} / {}", e.getPropertyName(), e.getNewValue());
139        if (ThrottlesPreferences.prefPopertyName.compareTo(e.getPropertyName()) == 0) {
140            applyPreferences();
141        }
142    }
143
144    // private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(BackgroundPanel.class);    
145}