001package jmri.jmrit.operations.rollingstock.cars;
002
003import java.util.ArrayList;
004import java.util.List;
005
006import org.jdom2.Element;
007import org.slf4j.Logger;
008import org.slf4j.LoggerFactory;
009
010import jmri.InstanceManager;
011import jmri.InstanceManagerAutoDefault;
012import jmri.jmrit.operations.rollingstock.RollingStockAttribute;
013
014/**
015 * Represents the road names that cars can have.
016 *
017 * @author Daniel Boudreau Copyright (C) 2008, 2014
018 */
019public class CarRoads extends RollingStockAttribute implements InstanceManagerAutoDefault {
020
021    private static final String ROADS = Bundle.getMessage("carRoadNames");
022    public static final String CARROADS_CHANGED_PROPERTY = "CarRoads Length"; // NOI18N
023    public static final String CARROADS_NAME_CHANGED_PROPERTY = "CarRoads Name"; // NOI18N
024    
025    public static final String SPLIT_CHAR = " & "; // used to combine road name and load type in tracks and trains
026
027    public CarRoads() {
028    }
029
030    @Override
031    protected String getDefaultNames() {
032        return ROADS;
033    }
034
035    @Override
036    public void addName(String road) {
037        super.addName(road);
038        setDirtyAndFirePropertyChange(CARROADS_CHANGED_PROPERTY, null, road);
039    }
040
041    @Override
042    public void deleteName(String road) {
043        super.deleteName(road);
044        setDirtyAndFirePropertyChange(CARROADS_CHANGED_PROPERTY, road, null);
045    }
046
047    public void replaceName(String oldName, String newName) {
048        super.addName(newName);
049        setDirtyAndFirePropertyChange(CARROADS_NAME_CHANGED_PROPERTY, oldName, newName);
050        super.deleteName(oldName);
051        if (newName == null) {
052            setDirtyAndFirePropertyChange(CARROADS_CHANGED_PROPERTY, list.size() + 1, list.size());
053        }
054    }
055
056    /**
057     * Get the maximum character length of a road name when printing on a
058     * manifest or switch list. Characters after the hyphen are ignored.
059     *
060     * @return the maximum character length of a car road name
061     */
062    @edu.umd.cs.findbugs.annotations.SuppressFBWarnings( value="SLF4J_FORMAT_SHOULD_BE_CONST",
063            justification="I18N of Info Message")
064    @Override
065    public int getMaxNameLength() {
066        if (maxNameSubStringLength == 0) {
067            super.getMaxNameSubStringLength();
068            log.info(Bundle.getMessage("InfoMaxRoad", maxName, maxNameSubStringLength));
069        }
070        return maxNameSubStringLength;
071    }
072    
073    /**
074     * Gets a sorted list of road names for a given car type
075     *
076     * @param type car type
077     * @return list of road names
078     */
079    public List<String> getNames(String type) {
080        List<String> names = new ArrayList<>();  
081        List<Car> cars = InstanceManager.getDefault(CarManager.class).getByTypeList(type);
082        for (Car car : cars) {
083            if (!names.contains(car.getRoadName())) {
084                names.add(car.getRoadName());
085            }
086        }
087        java.util.Collections.sort(names);
088        return names;
089    }
090
091    /**
092     * Create an XML element to represent this Entry. This member has to remain
093     * synchronized with the detailed DTD in operations-cars.dtd.
094     *
095     * @param root The common Element for operations-cars.dtd.
096     *
097     */
098    public void store(Element root) {
099        store(root, Xml.ROADS, Xml.ROAD);
100    }
101
102    public void load(Element root) {
103        load(root, Xml.ROADS, Xml.ROAD, Xml.ROAD_NAMES);
104    }
105
106    protected void setDirtyAndFirePropertyChange(String p, Object old, Object n) {
107        // Set dirty
108        InstanceManager.getDefault(CarManagerXml.class).setDirty(true);
109        super.firePropertyChange(p, old, n);
110    }
111
112    private static final Logger log = LoggerFactory.getLogger(CarRoads.class);
113}