/** * 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); } }