001package jmri.jmrit.operations.trains.tools;
002
003import java.awt.Dimension;
004import java.awt.GridBagLayout;
005import java.util.List;
006
007import javax.swing.*;
008
009import org.slf4j.Logger;
010import org.slf4j.LoggerFactory;
011
012import jmri.InstanceManager;
013import jmri.jmrit.operations.OperationsFrame;
014import jmri.jmrit.operations.OperationsPanel;
015import jmri.jmrit.operations.routes.*;
016import jmri.jmrit.operations.setup.Control;
017import jmri.jmrit.operations.trains.Train;
018import jmri.jmrit.operations.trains.TrainManager;
019import jmri.util.swing.JmriJOptionPane;
020
021/**
022 * Change Departure Time frame for operations.
023 *
024 * @author Bob Jacobsen Copyright (C) 2001
025 * @author Daniel Boudreau Copyright (C) 2013, 2026
026 */
027public class ChangeDepartureTimesFrame extends OperationsFrame {
028
029    // major buttons
030    JButton changeButton = new JButton(Bundle.getMessage("Change"));
031
032    // combo boxes
033    JComboBox<Integer> hourBox = new JComboBox<>();
034    JComboBox<Integer> dayBox = new JComboBox<>();
035
036    JCheckBox routesCheckBox = new JCheckBox(Bundle.getMessage("ModifyRouteTimes"));
037
038    public ChangeDepartureTimesFrame() {
039        // general GUI config
040
041        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
042
043        // load day combobox
044        for (int i = 0; i < Control.numberOfDays; i++) {
045            dayBox.addItem(i);
046        }
047
048        // load hour combobox
049        for (int i = 0; i < 24; i++) {
050            hourBox.addItem(i);
051        }
052
053        OperationsPanel.padComboBox(dayBox, 3);
054        OperationsPanel.padComboBox(hourBox, 3);
055
056        // row 2
057        JPanel pHour = new JPanel();
058        pHour.setLayout(new GridBagLayout());
059        pHour.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("SelectHours")));
060        addItem(pHour, dayBox, 0, 0);
061        addItem(pHour, hourBox, 1, 0);
062        addItem(pHour, routesCheckBox, 2, 0);
063
064        // row 4
065        JPanel pButton = new JPanel();
066        pButton.add(changeButton);
067
068        getContentPane().add(pHour);
069        getContentPane().add(pButton);
070
071        // add help menu to window
072        addHelpMenu("package.jmri.jmrit.operations.Operations_ChangeTrainDepartureTimes", true); // NOI18N
073
074        setTitle(Bundle.getMessage("TitleChangeDepartureTime"));
075
076        // setup buttons
077        addButtonAction(changeButton);
078
079        initMinimumSize(new Dimension(Control.panelWidth500, Control.panelHeight200));
080    }
081
082    @Override
083    public void buttonActionPerformed(java.awt.event.ActionEvent ae) {
084        if (ae.getSource() == changeButton) {
085            log.debug("change button activated");
086            TrainManager trainManager = InstanceManager.getDefault(TrainManager.class);
087            if (trainManager.isAnyTrainBuilt()) {
088                JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("CanNotChangeTime"),
089                        Bundle.getMessage("MustTerminateOrReset"), JmriJOptionPane.ERROR_MESSAGE);
090            } else {
091                List<Train> trains = trainManager.getTrainsByIdList();
092                for (Train train : trains) {
093                    train.setDepartureTime(adjustDay(train.getDepartureTimeDay()),
094                            adjustHour(train.getDepartureTimeHour()), train.getDepartureTimeMinute());
095                }
096                // now check every route to see if there are any departure times that need
097                // adjustment
098                if (routesCheckBox.isSelected()) {
099                    RouteManager routeManager = InstanceManager.getDefault(RouteManager.class);
100                    List<Route> routes = routeManager.getRoutesByNameList();
101                    for (Route route : routes) {
102                        for (RouteLocation rl : route.getLocationsBySequenceList()) {
103                            if (!rl.getDepartureTimeHourMinutes().equals(RouteLocation.NONE)) {
104                                rl.setDepartureTime(adjustDay(rl.getDepartureTimeDay()),
105                                        adjustHour(rl.getDepartureTimeHour()), rl.getDepartureTimeMinute());
106                            }
107                        }
108                    }
109                }
110            }
111        }
112    }
113
114    private String adjustDay(String day) {
115        int d = (int) dayBox.getSelectedItem() + Integer.parseInt(day);
116        if (d > Control.numberOfDays - 1) {
117            d = d - Control.numberOfDays;
118        }
119        return Integer.toString(d);
120    }
121
122    private String adjustHour(String time) {
123        int hour = (int) hourBox.getSelectedItem() + Integer.parseInt(time);
124        if (hour > 23) {
125            hour = hour - 24;
126        }
127        return Integer.toString(hour);
128    }
129
130    private final static Logger log = LoggerFactory.getLogger(ChangeDepartureTimesFrame.class);
131}