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}