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}