001package jmri.jmrit.operations.trains.tools;
002
003import java.awt.Frame;
004import java.awt.event.ActionEvent;
005import java.io.IOException;
006import java.util.List;
007
008import javax.swing.AbstractAction;
009
010import org.slf4j.Logger;
011import org.slf4j.LoggerFactory;
012
013import jmri.InstanceManager;
014import jmri.jmrit.operations.rollingstock.cars.CarTypes;
015import jmri.jmrit.operations.setup.Control;
016import jmri.jmrit.operations.trains.Train;
017import jmri.jmrit.operations.trains.TrainCommon;
018import jmri.jmrit.operations.trains.TrainManager;
019import jmri.util.davidflanagan.HardcopyWriter;
020
021/**
022 * Action to print a summary of trains that service specific car types.
023 * <p>
024 * This uses the older style printing, for compatibility with Java 1.1.8 in
025 * Macintosh MRJ
026 *
027 * @author Bob Jacobsen Copyright (C) 2003
028 * @author Dennis Miller Copyright (C) 2005
029 * @author Daniel Boudreau Copyright (C) 2010
030 */
031public class PrintTrainsByCarTypesAction extends AbstractAction {
032
033    static final String NEW_LINE = "\n"; // NOI18N
034    static final String TAB = "\t"; // NOI18N
035
036    public PrintTrainsByCarTypesAction(boolean isPreview) {
037        super(isPreview ? Bundle.getMessage("MenuItemPreviewByType") : Bundle.getMessage("MenuItemPrintByType"));
038        _isPreview = isPreview;
039    }
040
041    /**
042     * Variable to set whether this is to be printed or previewed
043     */
044    boolean _isPreview;
045    HardcopyWriter writer;
046    int max_name_length = Control.max_len_string_train_name + 1;
047
048    @Override
049    public void actionPerformed(ActionEvent e) {
050        // obtain a HardcopyWriter
051        try {
052            writer = new HardcopyWriter(new Frame(), Bundle.getMessage("TitleTrainsByType"), Control.reportFontSize, .5,
053                    .5, .5, .5,
054                    _isPreview);
055        } catch (HardcopyWriter.PrintCanceledException ex) {
056            log.debug("Print cancelled");
057            return;
058        }
059
060        // Loop through the car types showing which trains will service that car
061        // type
062        String carTypes[] = InstanceManager.getDefault(CarTypes.class).getNames();
063        List<Train> trains = InstanceManager.getDefault(TrainManager.class).getTrainsByNameList();
064
065        try {
066            // title line
067            String s = Bundle.getMessage("Type") +
068                    TAB +
069                    TrainCommon.padString(Bundle.getMessage("Trains"),
070                            max_name_length) +
071                    Bundle.getMessage("Description") +
072                    NEW_LINE;
073            writer.write(s);
074
075            for (String type : carTypes) {
076                s = type + NEW_LINE;
077                writer.write(s);
078
079                for (Train train : trains) {
080                    if (train.isTypeNameAccepted(type)) {
081                        s = TAB +
082                                TrainCommon.padString(train.getName(), max_name_length) +
083                                train.getDescription() +
084                                NEW_LINE;
085                        writer.write(s);
086                    }
087                }
088            }
089            // and force completion of the printing
090            writer.close();
091        } catch (IOException we) {
092            log.error("Error printing PrintLocationAction", we);
093        }
094    }
095
096    private final static Logger log = LoggerFactory.getLogger(PrintTrainsByCarTypesAction.class);
097}