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}