001package jmri.jmrit.operations.rollingstock.cars;
002
003import java.util.Comparator;
004
005import org.jdom2.Element;
006
007import jmri.InstanceManager;
008import jmri.InstanceManagerAutoDefault;
009import jmri.jmrit.operations.rollingstock.RollingStockAttribute;
010import jmri.jmrit.operations.setup.Control;
011
012/**
013 * Represents the lengths that cars can have.
014 *
015 * @author Daniel Boudreau Copyright (C) 2008, 2014
016 */
017public class CarLengths extends RollingStockAttribute implements InstanceManagerAutoDefault {
018
019    private static final String LENGTHS = Bundle.getMessage("carLengths");
020    public static final String CARLENGTHS_CHANGED_PROPERTY = "CarLengths"; // NOI18N
021    public static final String CARLENGTHS_NAME_CHANGED_PROPERTY = "CarLengthsName"; // NOI18N
022    
023    protected static final int MIN_NAME_LENGTH = Control.max_len_string_length_name;
024
025    public CarLengths() {
026    }
027
028    @Override
029    protected String getDefaultNames() {
030        return LENGTHS;
031    }
032
033    // override, need to perform a number sort
034    @Override
035    public void setNames(String[] lengths) {
036        setValues(lengths);
037    }
038
039    @Override
040    public void addName(String length) {
041        super.addName(length);
042        setDirtyAndFirePropertyChange(CARLENGTHS_CHANGED_PROPERTY, null, length);
043    }
044
045    @Override
046    public void deleteName(String length) {
047        super.deleteName(length);
048        setDirtyAndFirePropertyChange(CARLENGTHS_CHANGED_PROPERTY, length, null);
049    }
050
051    public void replaceName(String oldName, String newName) {
052        super.addName(newName);
053        setDirtyAndFirePropertyChange(CARLENGTHS_NAME_CHANGED_PROPERTY, oldName, newName);
054        // need to keep old name so location manager can replace properly
055        super.deleteName(oldName);
056    }
057    
058    @Override
059    public void sort() {
060        list.sort(Comparator.comparingInt(Integer::parseInt));
061    }
062    
063    @Override
064    protected int getMinNameLength() {
065        return MIN_NAME_LENGTH;
066    }
067
068    /**
069     * Create an XML element to represent this Entry. This member has to remain
070     * synchronized with the detailed DTD in operations-cars.dtd.
071     * @param root The common Element for operations-cars.dtd.
072     *
073     */
074    public void store(Element root) {
075        store(root, Xml.LENGTHS, Xml.LENGTH);
076    }
077
078    public void load(Element root) {
079        load(root, Xml.LENGTHS, Xml.LENGTH, Xml.CAR_LENGTHS);
080    }
081
082    protected void setDirtyAndFirePropertyChange(String p, Object old, Object n) {
083        // Set dirty
084        InstanceManager.getDefault(CarManagerXml.class).setDirty(true);
085        super.firePropertyChange(p, old, n);
086    }
087
088//    private final static Logger log = LoggerFactory.getLogger(CarLengths.class);
089
090}