001package jmri.jmrit.operations.rollingstock.cars.tools; 002 003import java.awt.event.ActionEvent; 004import java.io.*; 005import java.nio.charset.StandardCharsets; 006 007import javax.swing.AbstractAction; 008 009import jmri.InstanceManager; 010import jmri.jmrit.operations.rollingstock.cars.Car; 011import jmri.jmrit.operations.rollingstock.cars.CarManagerXml; 012import jmri.jmrit.operations.rollingstock.cars.gui.CarSetFrame; 013import jmri.jmrit.operations.router.Router; 014import jmri.jmrit.operations.setup.Setup; 015import jmri.jmrit.operations.trains.TrainPrintBuildReport; 016import jmri.jmrit.operations.trains.TrainUtilities; 017import jmri.util.swing.JmriJOptionPane; 018 019/** 020 * Creates a routing report for the selected car. 021 * 022 * @author Bob Jacobsen Copyright (C) 2001 023 * @author Daniel Boudreau Copyright (C) 2023 024 */ 025public class CarRoutingReportAction extends AbstractAction { 026 027 CarSetFrame _csFrame; 028 boolean _isPreview; 029 030 public CarRoutingReportAction(CarSetFrame frame, boolean isPreview) { 031 super(isPreview ? Bundle.getMessage("MenuPreviewRoutingReport") : Bundle.getMessage("MenuPrintRoutingReport")); 032 _csFrame = frame; 033 _isPreview = isPreview; 034 } 035 036 @Override 037 public void actionPerformed(ActionEvent e) { 038 createCarRoutingReport(_csFrame._car); 039 } 040 041 private void createCarRoutingReport(Car car) { 042 if (car != null && car.getLocation() != null && car.getFinalDestination() != null) { 043 PrintWriter printWriter = getCarRouterBuildReportPrintWriter(car); 044 Router router = InstanceManager.getDefault(Router.class); 045 router.isCarRouteable(car, null, car.getFinalDestination(), car.getFinalDestinationTrack(), printWriter); 046 showCarRoutingReport(car); 047 } else { 048 JmriJOptionPane.showMessageDialog(null, Bundle.getMessage("WarnMsgNoLocOrFD"), 049 Bundle.getMessage("WarnMsgNoLocOrFD"), JmriJOptionPane.WARNING_MESSAGE); 050 } 051 } 052 053 private PrintWriter getCarRouterBuildReportPrintWriter(Car car) { 054 // create car router report print writer 055 PrintWriter printWriter = null; 056 File file = InstanceManager.getDefault(CarManagerXml.class).createRawCarRouterReportFile(car.toString()); 057 try { 058 printWriter = new PrintWriter( 059 new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), StandardCharsets.UTF_8)), 060 true); 061 } catch (IOException e) { 062 log.error("Can not open build report file: {}", e.getLocalizedMessage()); 063 } 064 return printWriter; 065 } 066 067 private void showCarRoutingReport(Car car) { 068 CarManagerXml carManagerXml = InstanceManager.getDefault(CarManagerXml.class); 069 TrainPrintBuildReport.editReport(carManagerXml.getRawCarRouterReportFile(car.toString()), 070 carManagerXml.createCarRouterReportFile(car.toString())); 071 File file = carManagerXml.getCarRouterReportFile(car.toString()); 072 if (_isPreview && Setup.isBuildReportEditorEnabled()) { 073 TrainUtilities.openDesktop(file); 074 } else { 075 TrainPrintBuildReport.printReport(file, Bundle.getMessage("RoutingReportCar", car.toString()), _isPreview); 076 } 077 } 078 079 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(CarRoutingReportAction.class); 080}