// returns one of two possible departure strings for a train protected String getStatus(RouteLocation rl, boolean isManifest) { if (rl == _train.getRoute().getTerminatesRouteLocation()) { return MessageFormat.format( TrainManifestText.getStringTrainTerminates(), new Object[] {_train.getTrainTerminatesName()}); } if (rl != _train.getCurrentLocation() && _train.getExpectedArrivalTime(rl).equals(Train.ALREADY_SERVICED)) { return MessageFormat.format( TrainSwitchListText.getStringTrainDone(), new Object[] {_train.getName()}); } if (!_train.isBuilt()) { return _train.getStatus(); } if (Setup.isPrintLoadsAndEmptiesEnabled()) { int emptyCars = _train.getNumberEmptyCarsInTrain(rl); String text; if (isManifest) { text = TrainManifestText.getStringTrainDepartsLoads(); } else { text = TrainSwitchListText.getStringTrainDepartsLoads(); } return MessageFormat.format( text, new Object[] { TrainCommon.splitString(rl.getName()), rl.getTrainDirectionString(), _train.getNumberCarsInTrain(rl) - emptyCars, emptyCars, _train.getTrainLength(rl), Setup.getLengthUnit().toLowerCase(), _train.getTrainWeight(rl), _train.getTrainTerminatesName(), _train.getName() }); } else { String text; if (isManifest) { text = TrainManifestText.getStringTrainDepartsCars(); } else { text = TrainSwitchListText.getStringTrainDepartsCars(); } return MessageFormat.format( text, new Object[] { TrainCommon.splitString(rl.getName()), rl.getTrainDirectionString(), _train.getNumberCarsInTrain(rl), _train.getTrainLength(rl), Setup.getLengthUnit().toLowerCase(), _train.getTrainWeight(rl), _train.getTrainTerminatesName(), _train.getName() }); } }
public void writeFile(String name) { if (log.isDebugEnabled()) { log.debug("writeFile {}", name); } // This is taken in large part from "Java and XML" page 368 File file = findFile(name); if (file == null) { file = new File(name); } PrintWriter fileOut = null; try { fileOut = new PrintWriter( new BufferedWriter( new OutputStreamWriter(new FileOutputStream(file), "UTF-8")), // NOI18N true); // NOI18N } catch (IOException e) { log.error("Can not open export cars CSV file: " + file.getName()); return; } // create header String header = Bundle.getMessage("Name") + del + Bundle.getMessage("Description") + del + Bundle.getMessage("Time") + del + Bundle.getMessage("Route") + del + Bundle.getMessage("Departs") + del + Bundle.getMessage("Terminates") + del + Bundle.getMessage("Status") + del + Bundle.getMessage("Comment"); fileOut.println(header); int count = 0; for (Train train : TrainManager.instance().getTrainsByTimeList()) { if (!train.isBuildEnabled()) continue; count++; String routeName = ""; if (train.getRoute() != null) routeName = train.getRoute().getName(); String line = ESC + train.getName() + ESC + del + ESC + train.getDescription() + ESC + del + ESC + train.getDepartureTime() + ESC + del + ESC + routeName + ESC + del + ESC + train.getTrainDepartsName() + ESC + del + ESC + train.getTrainTerminatesName() + ESC + del + ESC + train.getStatus() + ESC + del + ESC + train.getComment() + ESC; fileOut.println(line); } fileOut.println(); // second create header for built trains header = Bundle.getMessage("Name") + del + Bundle.getMessage("csvParameters") + del + Bundle.getMessage("Attributes"); fileOut.println(header); for (Train train : TrainManager.instance().getTrainsByTimeList()) { if (!train.isBuildEnabled()) continue; if (train.isBuilt() && train.getRoute() != null) { StringBuffer line = new StringBuffer(ESC + train.getName() + ESC + del + Bundle.getMessage("Route")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + rl.getName() + ESC); } fileOut.println(line); line = new StringBuffer( ESC + train.getName() + ESC + del + Bundle.getMessage("csvArrivalTime")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + train.getExpectedArrivalTime(rl) + ESC); } fileOut.println(line); line = new StringBuffer( ESC + train.getName() + ESC + del + Bundle.getMessage("csvDepartureTime")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + train.getExpectedDepartureTime(rl) + ESC); } fileOut.println(line); line = new StringBuffer( ESC + train.getName() + ESC + del + Bundle.getMessage("csvTrainDirection")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + rl.getTrainDirectionString() + ESC); } fileOut.println(line); line = new StringBuffer( ESC + train.getName() + ESC + del + Bundle.getMessage("csvTrainWeight")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + train.getTrainWeight(rl) + ESC); } fileOut.println(line); line = new StringBuffer( ESC + train.getName() + ESC + del + Bundle.getMessage("csvTrainLength")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + train.getTrainLength(rl) + ESC); } fileOut.println(line); line = new StringBuffer(ESC + train.getName() + ESC + del + Bundle.getMessage("Cars")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + train.getNumberCarsInTrain(rl) + ESC); } fileOut.println(line); line = new StringBuffer(ESC + train.getName() + ESC + del + Bundle.getMessage("csvEmpties")); for (RouteLocation rl : train.getRoute().getLocationsBySequenceList()) { line.append(del + ESC + train.getNumberEmptyCarsInTrain(rl) + ESC); } fileOut.println(line); fileOut.println(); } } fileOut.flush(); fileOut.close(); log.info("Exported {} trains to file {}", count, defaultOperationsFilename()); JOptionPane.showMessageDialog( null, MessageFormat.format( Bundle.getMessage("ExportedTrainsToFile"), new Object[] {count, defaultOperationsFilename()}), Bundle.getMessage("ExportComplete"), JOptionPane.INFORMATION_MESSAGE); }
/** * Block cars by track (optional), then pick up and set out for each location in a train's route. * This shows each car with a check box or with a set button. The set button is displayed when the * checkbox isn't selected and the display is in "set" mode. If the car is a utility. Show the * number of cars that have the same attributes, and not the car's road and number. Each car is * displayed only once in one of three panes. The three panes are pick up, set out, or local move. * To keep track of each car and which pane to use, they are placed in the list "rollingStock" * with the prefix "p", "s" or "m" and the car's unique id. */ protected void blockCars(RouteLocation rl, boolean isManifest) { if (Setup.isPrintHeadersEnabled()) { JLabel header = new JLabel( Tab + trainCommon.getPickupCarHeader(isManifest, !TrainCommon.IS_TWO_COLUMN_TRACK)); setLabelFont(header); pPickups.add(header); header = new JLabel( Tab + trainCommon.getDropCarHeader(isManifest, !TrainCommon.IS_TWO_COLUMN_TRACK)); setLabelFont(header); pSetouts.add(header); header = new JLabel(Tab + trainCommon.getLocalMoveHeader(isManifest)); setLabelFont(header); pMoves.add(header); } List<Track> tracks = rl.getLocation().getTrackByNameList(null); List<RouteLocation> routeList = _train.getRoute().getLocationsBySequenceList(); List<Car> carList = carManager.getByTrainDestinationList(_train); for (Track track : tracks) { for (RouteLocation rld : routeList) { for (Car car : carList) { // determine if car is a pick up from the right track // caboose or FRED is placed at end of the train // passenger trains are already blocked in the car list if (car.getTrack() != null && car.getRouteLocation() == rl && car.getRouteDestination() != rl && (!Setup.isSortByTrackEnabled() || car.getTrackName().equals(track.getName())) && ((car.getRouteDestination() == rld && !car.isCaboose() && !car.hasFred()) || (rld == routeList.get(routeList.size() - 1) && (car.isCaboose() || car.hasFred())) || car.isPassenger())) { // yes we have a pick up pWorkPanes.setVisible(true); pickupPane.setVisible(true); if (!rollingStock.contains(car)) { rollingStock.add(car); car.addPropertyChangeListener(this); } // did we already process this car? if (checkBoxes.containsKey("p" + car.getId())) { if (isSetMode && !checkBoxes.get("p" + car.getId()).isSelected()) { // change to set button so user can remove car from train pPickups.add(addSet(car)); } else { pPickups.add(checkBoxes.get("p" + car.getId())); } // figure out the checkbox text, either single car or utility } else { String text; if (car.isUtility()) { text = trainCommon.pickupUtilityCars( carList, car, isManifest, !TrainCommon.IS_TWO_COLUMN_TRACK); if (text == null) { continue; // this car type has already been processed } } else { text = trainCommon.pickupCar(car, isManifest, !TrainCommon.IS_TWO_COLUMN_TRACK); } JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); addCheckBoxAction(checkBox); pPickups.add(checkBox); checkBoxes.put("p" + car.getId(), checkBox); } } } } // set outs and local moves for (Car car : carList) { if (car.getRouteDestination() != rl || car.getDestinationTrack() == null) { continue; } // car in train if track null, second check is for yard master window if (car.getTrack() == null || car.getTrack() != null && (car.getRouteLocation() != rl)) { if (Setup.isSortByTrackEnabled() && !car.getDestinationTrack().getName().equals(track.getName())) { continue; } // we have set outs pWorkPanes.setVisible(true); setoutPane.setVisible(true); if (!rollingStock.contains(car)) { rollingStock.add(car); car.addPropertyChangeListener(this); } if (checkBoxes.containsKey("s" + car.getId())) { if (isSetMode && !checkBoxes.get("s" + car.getId()).isSelected()) { // change to set button so user can remove car from train pSetouts.add(addSet(car)); } else { pSetouts.add(checkBoxes.get("s" + car.getId())); } } else { String text; if (car.isUtility()) { text = trainCommon.setoutUtilityCars(carList, car, !TrainCommon.LOCAL, isManifest); if (text == null) { continue; // this car type has already been processed } } else { text = trainCommon.dropCar(car, isManifest, !TrainCommon.IS_TWO_COLUMN_TRACK); } JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); addCheckBoxAction(checkBox); pSetouts.add(checkBox); checkBoxes.put("s" + car.getId(), checkBox); } // local move? } else if (car.getTrack() != null && car.getRouteLocation() == rl && (!Setup.isSortByTrackEnabled() || car.getTrack().getName().equals(track.getName()))) { movePane.setVisible(true); if (!rollingStock.contains(car)) { rollingStock.add(car); car.addPropertyChangeListener(this); } if (checkBoxes.containsKey("m" + car.getId())) { if (isSetMode && !checkBoxes.get("m" + car.getId()).isSelected()) { // change to set button so user can remove car from train pMoves.add(addSet(car)); } else { pMoves.add(checkBoxes.get("m" + car.getId())); } } else { String text; if (car.isUtility()) { text = trainCommon.setoutUtilityCars(carList, car, TrainCommon.LOCAL, isManifest); if (text == null) { continue; // this car type has already been processed } } else { text = trainCommon.localMoveCar(car, isManifest); } JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); addCheckBoxAction(checkBox); pMoves.add(checkBox); checkBoxes.put("m" + car.getId(), checkBox); } } } // if not sorting by track, we're done if (!Setup.isSortByTrackEnabled()) { break; } } // pad the panels in case the horizontal scroll bar appears pPickups.add(new JLabel(Space)); pSetouts.add(new JLabel(Space)); pMoves.add(new JLabel(Space)); }
@edu.umd.cs.findbugs.annotations.SuppressFBWarnings( value = "BC_UNCONFIRMED_CAST_OF_RETURN_VALUE", justification = "CarManager only provides Car Objects") private void runUpdate() { log.debug("run update"); removePropertyChangeListerners(); trainCommon.clearUtilityCarTypes(); // reset the utility car counts carCheckBoxes.clear(); pTrack.removeAll(); boolean pickup = false; boolean setout = false; if (_track != null) { pTrackPane.setBorder(BorderFactory.createTitledBorder(_track.getName())); textTrackCommentPane.setText(_track.getComment()); textTrackCommentPane.setVisible(!_track.getComment().equals(Track.NONE)); textTrackCommentWorkPane.setText(""); for (Train train : trainManager.getTrainsArrivingThisLocationList(_track.getLocation())) { JPanel pTrain = new JPanel(); pTrain.setLayout(new BoxLayout(pTrain, BoxLayout.Y_AXIS)); pTrain.setBorder( BorderFactory.createTitledBorder( MessageFormat.format( TrainSwitchListText.getStringScheduledWork(), new Object[] {train.getName(), train.getDescription()}))); // List locos first List<Engine> engList = engManager.getByTrainBlockingList(train); if (Setup.isPrintHeadersEnabled()) { for (Engine engine : engList) { if (engine.getTrack() == _track) { JLabel header = new JLabel(Tab + trainCommon.getPickupEngineHeader()); setLabelFont(header); pTrain.add(header); break; } } } for (Engine engine : engList) { if (engine.getTrack() == _track) { engine.addPropertyChangeListener(this); rollingStock.add(engine); JCheckBox checkBox = new JCheckBox(trainCommon.pickupEngine(engine)); setCheckBoxFont(checkBox); pTrain.add(checkBox); carCheckBoxes.put(engine.getId(), checkBox); pTrack.add(pTrain); } } if (Setup.isPrintHeadersEnabled()) { for (Engine engine : engList) { if (engine.getDestinationTrack() == _track) { JLabel header = new JLabel(Tab + trainCommon.getDropEngineHeader()); setLabelFont(header); pTrain.add(header); break; } } } for (Engine engine : engList) { if (engine.getDestinationTrack() == _track) { engine.addPropertyChangeListener(this); rollingStock.add(engine); JCheckBox checkBox = new JCheckBox(trainCommon.dropEngine(engine)); setCheckBoxFont(checkBox); pTrain.add(checkBox); carCheckBoxes.put(engine.getId(), checkBox); pTrack.add(pTrain); } } List<Car> carList = carManager.getByTrainDestinationList(train); if (Setup.isPrintHeadersEnabled()) { for (Car car : carList) { if (car.getTrack() == _track && car.getRouteDestination() != car.getRouteLocation()) { JLabel header = new JLabel( Tab + trainCommon.getPickupCarHeader( !IS_MANIFEST, !TrainCommon.IS_TWO_COLUMN_TRACK)); setLabelFont(header); pTrain.add(header); break; } } } // sort car pick ups by their destination List<RouteLocation> routeList = train.getRoute().getLocationsBySequenceList(); for (RouteLocation rl : routeList) { for (Car car : carList) { if (car.getTrack() == _track && car.getRouteDestination() != car.getRouteLocation() && car.getRouteDestination() == rl) { car.addPropertyChangeListener(this); rollingStock.add(car); String text; if (car.isUtility()) { text = trainCommon.pickupUtilityCars( carList, car, !IS_MANIFEST, !TrainCommon.IS_TWO_COLUMN_TRACK); if (text == null) { continue; // this car type has already been processed } } else { text = trainCommon.pickupCar(car, !IS_MANIFEST, !TrainCommon.IS_TWO_COLUMN_TRACK); } pickup = true; JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); pTrain.add(checkBox); carCheckBoxes.put(car.getId(), checkBox); pTrack.add(pTrain); } } } // now do car set outs if (Setup.isPrintHeadersEnabled()) { for (Car car : carList) { if (car.getDestinationTrack() == _track && car.getRouteDestination() != car.getRouteLocation()) { JLabel header = new JLabel( Tab + trainCommon.getDropCarHeader( !IS_MANIFEST, !TrainCommon.IS_TWO_COLUMN_TRACK)); setLabelFont(header); pTrain.add(header); break; } } } for (Car car : carList) { if (car.getDestinationTrack() == _track && car.getRouteLocation() != car.getRouteDestination()) { car.addPropertyChangeListener(this); rollingStock.add(car); String text; if (car.isUtility()) { text = trainCommon.setoutUtilityCars(carList, car, !TrainCommon.LOCAL, !IS_MANIFEST); if (text == null) { continue; // this car type has already been processed } } else { text = trainCommon.dropCar(car, !IS_MANIFEST, !TrainCommon.IS_TWO_COLUMN_TRACK); } setout = true; JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); pTrain.add(checkBox); carCheckBoxes.put(car.getId(), checkBox); pTrack.add(pTrain); } } // now do local car moves if (Setup.isPrintHeadersEnabled()) { for (Car car : carList) { if ((car.getTrack() == _track || car.getDestinationTrack() == _track) && car.getRouteDestination() == car.getRouteLocation()) { JLabel header = new JLabel(Tab + trainCommon.getLocalMoveHeader(!IS_MANIFEST)); setLabelFont(header); pTrain.add(header); break; } } } for (Car car : carList) { if ((car.getTrack() == _track || car.getDestinationTrack() == _track) && car.getRouteLocation() != null && car.getRouteLocation() == car.getRouteDestination()) { car.addPropertyChangeListener(this); rollingStock.add(car); String text; if (car.isUtility()) { text = trainCommon.setoutUtilityCars(carList, car, TrainCommon.LOCAL, !IS_MANIFEST); if (text == null) { continue; // this car type has already been processed } } else { text = trainCommon.localMoveCar(car, !IS_MANIFEST); } setout = true; JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); pTrain.add(checkBox); carCheckBoxes.put(car.getId(), checkBox); pTrack.add(pTrain); } } } // now do car holds // we only need the cars on this track List<RollingStock> rsList = carManager.getByTrainList(); List<Car> carList = new ArrayList<Car>(); for (RollingStock rs : rsList) { if (rs.getTrack() != _track || rs.getRouteLocation() != null) continue; carList.add((Car) rs); } JPanel pHoldCars = new JPanel(); pHoldCars.setLayout(new BoxLayout(pHoldCars, BoxLayout.Y_AXIS)); pHoldCars.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("HoldCars"))); for (Car car : carList) { String text; if (car.isUtility()) { String s = trainCommon.pickupUtilityCars( carList, car, !IS_MANIFEST, !TrainCommon.IS_TWO_COLUMN_TRACK); if (s == null) continue; text = TrainSwitchListText.getStringHoldCar().split("\\{")[0] + s.trim(); } else { text = MessageFormat.format( TrainSwitchListText.getStringHoldCar(), new Object[] { TrainCommon.padAndTruncateString( car.getRoadName(), CarRoads.instance().getMaxNameLength()), TrainCommon.padAndTruncateString( car.getNumber(), Control.max_len_string_print_road_number), TrainCommon.padAndTruncateString( car.getTypeName().split("-")[0], CarTypes.instance().getMaxNameLength()), TrainCommon.padAndTruncateString( car.getLength() + TrainCommon.LENGTHABV, Control.max_len_string_length_name), TrainCommon.padAndTruncateString( car.getLoadName(), CarLoads.instance().getMaxNameLength()), TrainCommon.padAndTruncateString( _track.getName(), LocationManager.instance().getMaxTrackNameLength()), TrainCommon.padAndTruncateString( car.getColor(), CarColors.instance().getMaxNameLength()) }); } JCheckBox checkBox = new JCheckBox(text); setCheckBoxFont(checkBox); pHoldCars.add(checkBox); carCheckBoxes.put(car.getId(), checkBox); pTrack.add(pHoldCars); } pTrackPane.validate(); if (pickup && !setout) { textTrackCommentWorkPane.setText(_track.getCommentPickup()); } else if (!pickup && setout) { textTrackCommentWorkPane.setText(_track.getCommentSetout()); } else if (pickup && setout) { textTrackCommentWorkPane.setText(_track.getCommentBoth()); } textTrackCommentWorkPane.setVisible(!textTrackCommentWorkPane.getText().equals("")); } else { pTrackPane.setBorder(BorderFactory.createTitledBorder("")); textTrackCommentPane.setVisible(false); textTrackCommentWorkPane.setVisible(false); } }