/** * Frame for adding and editing the train roster for operations. * * @author Bob Jacobsen Copyright (C) 2001 * @author Daniel Boudreau Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014 * @version $Revision$ */ public class TrainsTableFrame extends OperationsFrame implements java.beans.PropertyChangeListener { /** */ private static final long serialVersionUID = 4237149773850338265L; public static final String MOVE = Bundle.getMessage("Move"); public static final String TERMINATE = Bundle.getMessage("Terminate"); public static final String RESET = Bundle.getMessage("Reset"); public static final String CONDUCTOR = Bundle.getMessage("Conductor"); CarManagerXml carManagerXml = CarManagerXml.instance(); // load cars EngineManagerXml engineManagerXml = EngineManagerXml.instance(); // load engines TrainManager trainManager = TrainManager.instance(); TrainManagerXml trainManagerXml = TrainManagerXml.instance(); LocationManager locationManager = LocationManager.instance(); TrainsTableModel trainsModel; TableSorter sorter; JTable trainsTable; JScrollPane trainsPane; // labels JLabel numTrains = new JLabel(); JLabel textTrains = new JLabel(Bundle.getMessage("Trains").toLowerCase()); JLabel textSep1 = new JLabel(" "); // radio buttons JRadioButton showTime = new JRadioButton(Bundle.getMessage("Time")); JRadioButton showId = new JRadioButton(Bundle.getMessage("Id")); JRadioButton moveRB = new JRadioButton(MOVE); JRadioButton terminateRB = new JRadioButton(TERMINATE); JRadioButton resetRB = new JRadioButton(RESET); JRadioButton conductorRB = new JRadioButton(CONDUCTOR); // major buttons JButton addButton = new JButton(Bundle.getMessage("Add")); JButton buildButton = new JButton(Bundle.getMessage("Build")); JButton printButton = new JButton(Bundle.getMessage("Print")); JButton openFileButton = new JButton(Bundle.getMessage("OpenFile")); JButton runFileButton = new JButton(Bundle.getMessage("RunFile")); JButton switchListsButton = new JButton(Bundle.getMessage("SwitchLists")); JButton terminateButton = new JButton(Bundle.getMessage("Terminate")); JButton saveButton = new JButton(Bundle.getMessage("SaveBuilds")); // check boxes JCheckBox buildMsgBox = new JCheckBox(Bundle.getMessage("BuildMessages")); JCheckBox buildReportBox = new JCheckBox(Bundle.getMessage("BuildReport")); JCheckBox printPreviewBox = new JCheckBox(Bundle.getMessage("Preview")); JCheckBox openFileBox = new JCheckBox(Bundle.getMessage("OpenFile")); JCheckBox runFileBox = new JCheckBox(Bundle.getMessage("RunFile")); JCheckBox showAllBox = new JCheckBox(Bundle.getMessage("ShowAllTrains")); public TrainsTableFrame() { super(); updateTitle(); // create ShutDownTasks createShutDownTask(); // always check for dirty operations files setModifiedFlag(true); // general GUI configuration getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); // Set up the jtable in a Scroll Pane.. trainsModel = new TrainsTableModel(); sorter = new TableSorter(trainsModel); trainsTable = new JTable(sorter); sorter.setTableHeader(trainsTable.getTableHeader()); trainsPane = new JScrollPane(trainsTable); trainsModel.initTable(trainsTable, this); // Set up the control panel // row 1 JPanel cp1 = new JPanel(); cp1.setLayout(new BoxLayout(cp1, BoxLayout.X_AXIS)); JPanel show = new JPanel(); show.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("ShowClickToSort"))); show.add(showTime); show.add(showId); JPanel options = new JPanel(); options.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Options"))); options.add(showAllBox); options.add(buildMsgBox); options.add(buildReportBox); options.add(printPreviewBox); options.add(openFileBox); options.add(runFileBox); JPanel action = new JPanel(); action.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Action"))); action.add(moveRB); action.add(conductorRB); action.add(terminateRB); action.add(resetRB); cp1.add(show); cp1.add(options); cp1.add(action); // tool tips, see setPrintButtonText() for more tool tips addButton.setToolTipText(Bundle.getMessage("AddTrain")); buildButton.setToolTipText(Bundle.getMessage("BuildSelectedTip")); switchListsButton.setToolTipText(Bundle.getMessage("PreviewPrintSwitchLists")); terminateButton.setToolTipText(Bundle.getMessage("TerminateSelectedTip")); saveButton.setToolTipText(Bundle.getMessage("SaveBuildsTip")); openFileButton.setToolTipText(Bundle.getMessage("OpenFileButtonTip")); runFileButton.setToolTipText(Bundle.getMessage("RunFileButtonTip")); buildMsgBox.setToolTipText(Bundle.getMessage("BuildMessagesTip")); printPreviewBox.setToolTipText(Bundle.getMessage("PreviewTip")); openFileBox.setToolTipText(Bundle.getMessage("OpenFileTip")); runFileBox.setToolTipText(Bundle.getMessage("RunFileTip")); showAllBox.setToolTipText(Bundle.getMessage("ShowAllTrainsTip")); moveRB.setToolTipText(Bundle.getMessage("MoveTip")); terminateRB.setToolTipText(Bundle.getMessage("TerminateTip")); resetRB.setToolTipText(Bundle.getMessage("ResetTip")); // row 2 JPanel addTrain = new JPanel(); addTrain.setBorder(BorderFactory.createTitledBorder("")); addTrain.add(numTrains); addTrain.add(textTrains); addTrain.add(textSep1); addTrain.add(addButton); numTrains.setText(Integer.toString(trainManager.getNumEntries())); JPanel select = new JPanel(); select.setBorder(BorderFactory.createTitledBorder("")); select.add(buildButton); select.add(printButton); select.add(openFileButton); select.add(runFileButton); select.add(switchListsButton); select.add(terminateButton); JPanel save = new JPanel(); save.setBorder(BorderFactory.createTitledBorder("")); save.add(saveButton); JPanel cp2 = new JPanel(); cp2.setLayout(new BoxLayout(cp2, BoxLayout.X_AXIS)); cp2.add(addTrain); cp2.add(select); cp2.add(save); // place controls in scroll pane JPanel controlPanel = new JPanel(); controlPanel.setLayout(new BoxLayout(controlPanel, BoxLayout.Y_AXIS)); controlPanel.add(cp1); controlPanel.add(cp2); JScrollPane controlPane = new JScrollPane(controlPanel); getContentPane().add(trainsPane); getContentPane().add(controlPane); // setup buttons addButtonAction(addButton); addButtonAction(buildButton); addButtonAction(printButton); addButtonAction(openFileButton); addButtonAction(runFileButton); addButtonAction(switchListsButton); addButtonAction(terminateButton); addButtonAction(saveButton); ButtonGroup showGroup = new ButtonGroup(); showGroup.add(showTime); showGroup.add(showId); showTime.setSelected(true); ButtonGroup actionGroup = new ButtonGroup(); actionGroup.add(moveRB); actionGroup.add(conductorRB); actionGroup.add(terminateRB); actionGroup.add(resetRB); addRadioButtonAction(showTime); addRadioButtonAction(showId); addRadioButtonAction(moveRB); addRadioButtonAction(terminateRB); addRadioButtonAction(resetRB); addRadioButtonAction(conductorRB); buildMsgBox.setSelected(trainManager.isBuildMessagesEnabled()); buildReportBox.setSelected(trainManager.isBuildReportEnabled()); printPreviewBox.setSelected(trainManager.isPrintPreviewEnabled()); openFileBox.setSelected(trainManager.isOpenFileEnabled()); runFileBox.setSelected(trainManager.isRunFileEnabled()); showAllBox.setSelected(trainsModel.isShowAll()); // show open files only if create csv is enabled updateRunAndOpenButtons(); addCheckBoxAction(buildMsgBox); addCheckBoxAction(buildReportBox); addCheckBoxAction(printPreviewBox); addCheckBoxAction(showAllBox); addCheckBoxAction(openFileBox); addCheckBoxAction(runFileBox); // Set the button text to Print or Preview setPrintButtonText(); // Set the train action button text to Move or Terminate setTrainActionButton(); // build menu JMenuBar menuBar = new JMenuBar(); JMenu toolMenu = new JMenu(Bundle.getMessage("Tools")); toolMenu.add(new OptionAction(Bundle.getMessage("TitleOptions"))); toolMenu.add(new PrintOptionAction()); toolMenu.add(new BuildReportOptionAction()); toolMenu.add(new TrainsByCarTypeAction(Bundle.getMessage("TitleModifyTrains"))); toolMenu.add(new TrainByCarTypeAction(Bundle.getMessage("MenuItemShowCarTypes"), null)); toolMenu.add(new ChangeDepartureTimesAction(Bundle.getMessage("TitleChangeDepartureTime"))); toolMenu.add(new TrainsTableSetColorAction()); toolMenu.add(new TrainsScheduleAction(Bundle.getMessage("TitleTimeTableTrains"))); toolMenu.add(new TrainCopyAction(Bundle.getMessage("TitleTrainCopy"))); toolMenu.add(new TrainsScriptAction(Bundle.getMessage("MenuItemScripts"), this)); toolMenu.add( new PrintSavedTrainManifestAction(Bundle.getMessage("MenuItemPrintSavedManifest"), false)); toolMenu.add( new PrintSavedTrainManifestAction(Bundle.getMessage("MenuItemPreviewSavedManifest"), true)); toolMenu.add(new SetupExcelProgramFrameAction(Bundle.getMessage("MenuItemSetupExcelProgram"))); toolMenu.add(new ExportTrainRosterAction()); toolMenu.add( new PrintTrainsAction(Bundle.getMessage("MenuItemPrint"), new Frame(), false, this)); toolMenu.add( new PrintTrainsAction(Bundle.getMessage("MenuItemPreview"), new Frame(), true, this)); menuBar.add(toolMenu); menuBar.add(new jmri.jmrit.operations.OperationsMenu()); setJMenuBar(menuBar); // add help menu to window addHelpMenu("package.jmri.jmrit.operations.Operations_Trains", true); // NOI18N initMinimumSize(); addHorizontalScrollBarKludgeFix(controlPane, controlPanel); // listen for timetable changes trainManager.addPropertyChangeListener(this); Setup.addPropertyChangeListener(this); // listen for location switch list changes addPropertyChangeLocations(); // auto save new AutoSave(); } public void radioButtonActionPerformed(java.awt.event.ActionEvent ae) { log.debug("radio button activated"); if (ae.getSource() == showId) { trainsModel.setSort(trainsModel.SORTBYID); } if (ae.getSource() == showTime) { trainsModel.setSort(trainsModel.SORTBYTIME); } if (ae.getSource() == moveRB) { trainManager.setTrainsFrameTrainAction(MOVE); } if (ae.getSource() == terminateRB) { trainManager.setTrainsFrameTrainAction(TERMINATE); } if (ae.getSource() == resetRB) { trainManager.setTrainsFrameTrainAction(RESET); } if (ae.getSource() == conductorRB) { trainManager.setTrainsFrameTrainAction(CONDUCTOR); } } TrainSwitchListEditFrame tslef; // add, build, print, switch lists, terminate, and save buttons public void buttonActionPerformed(java.awt.event.ActionEvent ae) { // log.debug("train button activated"); if (ae.getSource() == addButton) { new TrainEditFrame(null); } if (ae.getSource() == buildButton) { // uses a thread which allows table updates during build trainManager.buildSelectedTrains(getSortByList()); } if (ae.getSource() == printButton) { trainManager.printSelectedTrains(getSortByList()); } if (ae.getSource() == openFileButton) { // open the csv files List<Train> trains = getSortByList(); for (Train train : trains) { if (train.isBuildEnabled()) { if (!train.isBuilt() && trainManager.isBuildMessagesEnabled()) { JOptionPane.showMessageDialog( this, MessageFormat.format( Bundle.getMessage("NeedToBuildBeforeOpenFile"), new Object[] { train.getName(), (trainManager.isPrintPreviewEnabled() ? Bundle.getMessage("preview") : Bundle.getMessage("print")) }), MessageFormat.format( Bundle.getMessage("CanNotPrintManifest"), new Object[] { trainManager.isPrintPreviewEnabled() ? Bundle.getMessage("preview") : Bundle.getMessage("print") }), JOptionPane.ERROR_MESSAGE); } else if (train.isBuilt()) { train.openFile(); } } } } if (ae.getSource() == runFileButton) { // Processes the CSV Manifest files using an external custom program. if (!TrainCustomManifest.manifestCreatorFileExists()) { log.warn( "Manifest creator file not found!, directory name: " + TrainCustomManifest.getDirectoryName() + ", file name: " + TrainCustomManifest.getFileName()); // NOI18N JOptionPane.showMessageDialog( this, MessageFormat.format( Bundle.getMessage("LoadDirectoryNameFileName"), new Object[] { TrainCustomManifest.getDirectoryName(), TrainCustomManifest.getFileName() }), Bundle.getMessage("ManifestCreatorNotFound"), JOptionPane.ERROR_MESSAGE); return; } List<Train> trains = getSortByList(); for (Train train : trains) { if (train.isBuildEnabled()) { if (!train.isBuilt() && trainManager.isBuildMessagesEnabled()) { JOptionPane.showMessageDialog( this, MessageFormat.format( Bundle.getMessage("NeedToBuildBeforeRunFile"), new Object[] { train.getName(), (trainManager.isPrintPreviewEnabled() ? Bundle.getMessage("preview") : Bundle.getMessage("print")) }), MessageFormat.format( Bundle.getMessage("CanNotPrintManifest"), new Object[] { trainManager.isPrintPreviewEnabled() ? Bundle.getMessage("preview") : Bundle.getMessage("print") }), JOptionPane.ERROR_MESSAGE); } else if (train.isBuilt()) { // Make sure our csv manifest file exists for this Train. File csvFile = train.createCSVManifestFile(); // Add it to our collection to be processed. TrainCustomManifest.addCVSFile(csvFile); } } } // Now run the user specified custom Manifest processor program TrainCustomManifest.process(); } if (ae.getSource() == switchListsButton) { if (tslef != null) { tslef.dispose(); } tslef = new TrainSwitchListEditFrame(); tslef.initComponents(); } if (ae.getSource() == terminateButton) { trainManager.terminateSelectedTrains(getSortByList()); } if (ae.getSource() == saveButton) { storeValues(); } } int _status = TableSorter.ASCENDING; protected String getSortBy() { // set the defaults String sortBy = TrainsTableModel.TIMECOLUMNNAME; _status = TableSorter.ASCENDING; // now look to see if a sort is active for (int i = 0; i < sorter.getColumnCount(); i++) { String name = sorter.getColumnName(i); int status = sorter.getSortingStatus(i); // log.debug("Column " + name + " status " + status); if (status != TableSorter.NOT_SORTED && !name.equals("")) { sortBy = name; _status = status; break; } } return sortBy; } public List<Train> getSortByList() { List<Train> sysList; String sortBy = getSortBy(); if (sortBy.equals(TrainsTableModel.IDCOLUMNNAME)) { sysList = trainManager.getTrainsByIdList(); } else if (sortBy.equals(TrainsTableModel.TIMECOLUMNNAME)) { sysList = trainManager.getTrainsByTimeList(); } else if (sortBy.equals(TrainsTableModel.DEPARTSCOLUMNNAME)) { sysList = trainManager.getTrainsByDepartureList(); } else if (sortBy.equals(TrainsTableModel.TERMINATESCOLUMNNAME)) { sysList = trainManager.getTrainsByTerminatesList(); } else if (sortBy.equals(TrainsTableModel.ROUTECOLUMNNAME)) { sysList = trainManager.getTrainsByRouteList(); } else if (sortBy.equals(TrainsTableModel.STATUSCOLUMNNAME)) { sysList = trainManager.getTrainsByStatusList(); } else if (sortBy.equals(TrainsTableModel.DESCRIPTIONCOLUMNNAME)) { sysList = trainManager.getTrainsByDescriptionList(); } else { sysList = trainManager.getTrainsByNameList(); } return sysList; } // Modifies button text and tool tips private void setPrintButtonText() { if (printPreviewBox.isSelected()) { printButton.setText(Bundle.getMessage("Preview")); printButton.setToolTipText(Bundle.getMessage("PreviewSelectedTip")); buildReportBox.setToolTipText(Bundle.getMessage("BuildReportPreviewTip")); } else { printButton.setText(Bundle.getMessage("Print")); printButton.setToolTipText(Bundle.getMessage("PrintSelectedTip")); buildReportBox.setToolTipText(Bundle.getMessage("BuildReportPrintTip")); } } private void setTrainActionButton() { moveRB.setSelected(trainManager.getTrainsFrameTrainAction().equals(TrainsTableFrame.MOVE)); terminateRB.setSelected( trainManager.getTrainsFrameTrainAction().equals(TrainsTableFrame.TERMINATE)); resetRB.setSelected(trainManager.getTrainsFrameTrainAction().equals(TrainsTableFrame.RESET)); conductorRB.setSelected( trainManager.getTrainsFrameTrainAction().equals(TrainsTableFrame.CONDUCTOR)); } public void checkBoxActionPerformed(java.awt.event.ActionEvent ae) { if (ae.getSource() == buildMsgBox) { trainManager.setBuildMessagesEnabled(buildMsgBox.isSelected()); } if (ae.getSource() == buildReportBox) { trainManager.setBuildReportEnabled(buildReportBox.isSelected()); } if (ae.getSource() == printPreviewBox) { trainManager.setPrintPreviewEnabled(printPreviewBox.isSelected()); setPrintButtonText(); // set the button text for Print or Preview } if (ae.getSource() == openFileBox) { trainManager.setOpenFileEnabled(openFileBox.isSelected()); runFileBox.setSelected(false); trainManager.setRunFileEnabled(false); } if (ae.getSource() == runFileBox) { trainManager.setRunFileEnabled(runFileBox.isSelected()); openFileBox.setSelected(false); trainManager.setOpenFileEnabled(false); } if (ae.getSource() == showAllBox) { trainsModel.setShowAll(showAllBox.isSelected()); } } private void updateTitle() { String title = Bundle.getMessage("TitleTrainsTable"); TrainSchedule sch = TrainScheduleManager.instance().getScheduleById(trainManager.getTrainScheduleActiveId()); if (sch != null) { title = title + " (" + sch.getName() + ")"; } setTitle(title); } private void updateSwitchListButton() { log.debug("update switch list button"); List<Location> locations = locationManager.getList(); for (Location location : locations) { if (location != null && location.isSwitchListEnabled() && location.getStatus().equals(Location.MODIFIED)) { switchListsButton.setBackground(Color.RED); return; } } switchListsButton.setBackground(Color.GREEN); } // show open files only if create csv is enabled private void updateRunAndOpenButtons() { openFileBox.setVisible(Setup.isGenerateCsvManifestEnabled()); openFileButton.setVisible(Setup.isGenerateCsvManifestEnabled()); runFileBox.setVisible(Setup.isGenerateCsvManifestEnabled()); runFileButton.setVisible(Setup.isGenerateCsvManifestEnabled()); } private synchronized void addPropertyChangeLocations() { List<Location> locations = locationManager.getList(); for (Location location : locations) { location.addPropertyChangeListener(this); } } private synchronized void removePropertyChangeLocations() { List<Location> locations = locationManager.getList(); for (Location location : locations) { location.removePropertyChangeListener(this); } } public void dispose() { /* * all JMRI window position and size are now saved in user preference file * trainManager.setTrainsFrameTableColumnWidths(getCurrentTableColumnWidths()); // save column widths * trainManager.setTrainsFrame(null); */ trainsModel.dispose(); trainManager.runShutDownScripts(); trainManager.removePropertyChangeListener(this); Setup.removePropertyChangeListener(this); removePropertyChangeLocations(); super.dispose(); } protected void handleModified() { if (Setup.isAutoSaveEnabled()) { storeValues(); return; } if (OperationsXml.areFilesDirty()) { int result = javax.swing.JOptionPane.showOptionDialog( this, Bundle.getMessage("PromptQuitWindowNotWritten"), Bundle.getMessage("PromptSaveQuit"), javax.swing.JOptionPane.YES_NO_OPTION, javax.swing.JOptionPane.WARNING_MESSAGE, null, // icon new String[] { ResourceBundle.getBundle("jmri.util.UtilBundle").getString("WarnYesSave"), // NOI18N ResourceBundle.getBundle("jmri.util.UtilBundle").getString("WarnNoClose") }, // NOI18N ResourceBundle.getBundle("jmri.util.UtilBundle").getString("WarnYesSave")); if (result == javax.swing.JOptionPane.NO_OPTION) { return; } // user wants to save storeValues(); } } protected void storeValues() { super.storeValues(); saveTableDetails(trainsTable); } public void propertyChange(java.beans.PropertyChangeEvent e) { if (Control.showProperty) { log.debug( "Property change: ({}) old: ({}) new: ({})", e.getPropertyName(), e.getOldValue(), e.getNewValue()); } if (e.getPropertyName().equals(TrainManager.ACTIVE_TRAIN_SCHEDULE_ID)) { updateTitle(); } if (e.getPropertyName().equals(Location.STATUS_CHANGED_PROPERTY) || e.getPropertyName().equals(Location.SWITCHLIST_CHANGED_PROPERTY)) { updateSwitchListButton(); } if (e.getPropertyName().equals(Setup.MANIFEST_CSV_PROPERTY_CHANGE)) { updateRunAndOpenButtons(); } if (e.getPropertyName().equals(TrainManager.LISTLENGTH_CHANGED_PROPERTY)) { numTrains.setText(Integer.toString(trainManager.getNumEntries())); } } static Logger log = LoggerFactory.getLogger(TrainsTableFrame.class.getName()); }
/** * Frame for user edit of engine * * @author Dan Boudreau Copyright (C) 2008, 2011 * @version $Revision$ */ public class EngineEditFrame extends OperationsFrame implements java.beans.PropertyChangeListener { EngineManager manager = EngineManager.instance(); EngineManagerXml managerXml = EngineManagerXml.instance(); EngineModels engineModels = EngineModels.instance(); EngineTypes engineTypes = EngineTypes.instance(); EngineLengths engineLengths = EngineLengths.instance(); CarManagerXml carManagerXml = CarManagerXml.instance(); LocationManager locationManager = LocationManager.instance(); Engine _engine; // major buttons JButton editRoadButton = new JButton(Bundle.getMessage("Edit")); JButton clearRoadNumberButton = new JButton(Bundle.getMessage("Clear")); JButton editModelButton = new JButton(Bundle.getMessage("Edit")); JButton editTypeButton = new JButton(Bundle.getMessage("Edit")); JButton editLengthButton = new JButton(Bundle.getMessage("Edit")); JButton fillWeightButton = new JButton(); JButton editConsistButton = new JButton(Bundle.getMessage("Edit")); JButton editOwnerButton = new JButton(Bundle.getMessage("Edit")); JButton saveButton = new JButton(Bundle.getMessage("Save")); JButton deleteButton = new JButton(Bundle.getMessage("Delete")); JButton addButton = new JButton(Bundle.getMessage("Add")); // check boxes JCheckBox bUnitCheckBox = new JCheckBox(Bundle.getMessage("BUnit")); // text field JTextField roadNumberTextField = new JTextField(Control.max_len_string_road_number); JTextField builtTextField = new JTextField(Control.max_len_string_built_name + 3); JTextField hpTextField = new JTextField(8); JTextField weightTextField = new JTextField(Control.max_len_string_weight_name); JTextField commentTextField = new JTextField(35); JTextField valueTextField = new JTextField(8); // combo boxes JComboBox<String> roadComboBox = CarRoads.instance().getComboBox(); JComboBox<String> modelComboBox = engineModels.getComboBox(); JComboBox<String> typeComboBox = engineTypes.getComboBox(); JComboBox<String> lengthComboBox = engineLengths.getComboBox(); JComboBox<String> ownerComboBox = CarOwners.instance().getComboBox(); JComboBox<Location> locationBox = locationManager.getComboBox(); JComboBox<Track> trackLocationBox = new JComboBox<>(); JComboBox<String> consistComboBox = manager.getConsistComboBox(); JComboBox<IdTag> rfidComboBox = new JComboBox<IdTag>(); public static final String ROAD = Bundle.getMessage("Road"); public static final String MODEL = Bundle.getMessage("Model"); public static final String TYPE = Bundle.getMessage("Type"); public static final String COLOR = Bundle.getMessage("Color"); public static final String LENGTH = Bundle.getMessage("Length"); public static final String OWNER = Bundle.getMessage("Owner"); public static final String CONSIST = Bundle.getMessage("Consist"); public EngineEditFrame() { super(); } public void initComponents() { // set tips builtTextField.setToolTipText(Bundle.getMessage("buildDateTip")); rfidComboBox.setToolTipText(Bundle.getMessage("TipRfid")); editRoadButton.setToolTipText( MessageFormat.format( Bundle.getMessage("TipAddDeleteReplace"), new Object[] {Bundle.getMessage("Road").toLowerCase()})); editTypeButton.setToolTipText( MessageFormat.format( Bundle.getMessage("TipAddDeleteReplace"), new Object[] {Bundle.getMessage("Type").toLowerCase()})); editModelButton.setToolTipText( MessageFormat.format( Bundle.getMessage("TipAddDeleteReplace"), new Object[] {Bundle.getMessage("Model").toLowerCase()})); editLengthButton.setToolTipText( MessageFormat.format( Bundle.getMessage("TipAddDeleteReplace"), new Object[] {Bundle.getMessage("Length").toLowerCase()})); editOwnerButton.setToolTipText( MessageFormat.format( Bundle.getMessage("TipAddDeleteReplace"), new Object[] {Bundle.getMessage("Owner").toLowerCase()})); editConsistButton.setToolTipText( MessageFormat.format( Bundle.getMessage("TipAddDeleteReplace"), new Object[] {Bundle.getMessage("Consist").toLowerCase()})); bUnitCheckBox.setToolTipText(Bundle.getMessage("TipBoosterUnit")); // create panel JPanel pPanel = new JPanel(); pPanel.setLayout(new BoxLayout(pPanel, BoxLayout.Y_AXIS)); // Layout the panel by rows // row 1 JPanel pRoad = new JPanel(); pRoad.setLayout(new GridBagLayout()); pRoad.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Road"))); addItem(pRoad, roadComboBox, 1, 0); addItem(pRoad, editRoadButton, 2, 0); pPanel.add(pRoad); // row 2 JPanel pRoadNumber = new JPanel(); pRoadNumber.setLayout(new GridBagLayout()); pRoadNumber.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("RoadNumber"))); addItem(pRoadNumber, roadNumberTextField, 1, 0); addItem(pRoadNumber, clearRoadNumberButton, 2, 0); pPanel.add(pRoadNumber); // row 3 JPanel pModel = new JPanel(); pModel.setLayout(new GridBagLayout()); pModel.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Model"))); addItem(pModel, modelComboBox, 1, 0); addItem(pModel, editModelButton, 2, 0); pPanel.add(pModel); // row 4 JPanel pType = new JPanel(); pType.setLayout(new GridBagLayout()); pType.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Type"))); addItem(pType, typeComboBox, 1, 0); addItem(pType, editTypeButton, 2, 0); addItem(pType, bUnitCheckBox, 1, 1); pPanel.add(pType); // row 5 JPanel pLength = new JPanel(); pLength.setLayout(new GridBagLayout()); pLength.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Length"))); addItem(pLength, lengthComboBox, 1, 0); addItem(pLength, editLengthButton, 2, 0); pPanel.add(pLength); // row 6 JPanel pLocation = new JPanel(); pLocation.setLayout(new GridBagLayout()); pLocation.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("LocationAndTrack"))); addItem(pLocation, locationBox, 1, 0); addItem(pLocation, trackLocationBox, 2, 0); pPanel.add(pLocation); // optional panel JPanel pOptional = new JPanel(); pOptional.setLayout(new BoxLayout(pOptional, BoxLayout.Y_AXIS)); JScrollPane optionPane = new JScrollPane(pOptional); optionPane.setBorder( BorderFactory.createTitledBorder(Bundle.getMessage("BorderLayoutOptional"))); // row 11 JPanel pWeightTons = new JPanel(); pWeightTons.setLayout(new GridBagLayout()); pWeightTons.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("WeightTons"))); addItem(pWeightTons, weightTextField, 0, 0); pOptional.add(pWeightTons); // row 12 JPanel pHp = new JPanel(); pHp.setLayout(new GridBagLayout()); pHp.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Hp"))); addItem(pHp, hpTextField, 0, 0); pOptional.add(pHp); // row 13 JPanel pConsist = new JPanel(); pConsist.setLayout(new GridBagLayout()); pConsist.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Consist"))); addItem(pConsist, consistComboBox, 1, 0); addItem(pConsist, editConsistButton, 2, 0); pOptional.add(pConsist); // row 14 JPanel pBuilt = new JPanel(); pBuilt.setLayout(new GridBagLayout()); pBuilt.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Built"))); addItem(pBuilt, builtTextField, 1, 0); pOptional.add(pBuilt); // row 15 JPanel pOwner = new JPanel(); pOwner.setLayout(new GridBagLayout()); pOwner.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Owner"))); addItem(pOwner, ownerComboBox, 1, 0); addItem(pOwner, editOwnerButton, 2, 0); pOptional.add(pOwner); // row 18 if (Setup.isValueEnabled()) { JPanel pValue = new JPanel(); pValue.setLayout(new GridBagLayout()); pValue.setBorder(BorderFactory.createTitledBorder(Setup.getValueLabel())); addItem(pValue, valueTextField, 1, 0); pOptional.add(pValue); } // row 20 if (Setup.isRfidEnabled()) { JPanel pRfid = new JPanel(); pRfid.setLayout(new GridBagLayout()); pRfid.setBorder(BorderFactory.createTitledBorder(Setup.getRfidLabel())); addItem(pRfid, rfidComboBox, 1, 0); jmri.InstanceManager.getDefault(jmri.IdTagManager.class) .getNamedBeanList() .forEach((tag) -> rfidComboBox.addItem((jmri.IdTag) tag)); pOptional.add(pRfid); } // row 22 JPanel pComment = new JPanel(); pComment.setLayout(new GridBagLayout()); pComment.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Comment"))); addItem(pComment, commentTextField, 1, 0); pOptional.add(pComment); // button panel JPanel pButtons = new JPanel(); pButtons.setLayout(new GridBagLayout()); addItem(pButtons, deleteButton, 0, 25); addItem(pButtons, addButton, 1, 25); addItem(pButtons, saveButton, 3, 25); // add panels getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); getContentPane().add(pPanel); getContentPane().add(optionPane); getContentPane().add(pButtons); // setup buttons addEditButtonAction(editRoadButton); addButtonAction(clearRoadNumberButton); addEditButtonAction(editModelButton); addEditButtonAction(editTypeButton); addEditButtonAction(editLengthButton); addEditButtonAction(editConsistButton); addEditButtonAction(editOwnerButton); addButtonAction(deleteButton); addButtonAction(addButton); addButtonAction(saveButton); addButtonAction(fillWeightButton); // setup combobox addComboBoxAction(modelComboBox); addComboBoxAction(locationBox); // setup checkbox // build menu // JMenuBar menuBar = new JMenuBar(); // JMenu toolMenu = new JMenu(Bundle.getMessage("Tools")); // menuBar.add(toolMenu); // setJMenuBar(menuBar); addHelpMenu("package.jmri.jmrit.operations.Operations_LocomotivesAdd", true); // NOI18N // get notified if combo box gets modified CarRoads.instance().addPropertyChangeListener(this); engineModels.addPropertyChangeListener(this); engineTypes.addPropertyChangeListener(this); engineLengths.addPropertyChangeListener(this); CarOwners.instance().addPropertyChangeListener(this); locationManager.addPropertyChangeListener(this); manager.addPropertyChangeListener(this); pack(); setMinimumSize(new Dimension(Control.panelWidth500, Control.panelHeight500)); setVisible(true); } public void loadEngine(Engine engine) { _engine = engine; if (!CarRoads.instance().containsName(engine.getRoadName())) { String msg = MessageFormat.format( Bundle.getMessage("roadNameNotExist"), new Object[] {engine.getRoadName()}); if (JOptionPane.showConfirmDialog( this, msg, Bundle.getMessage("engineAddRoad"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { CarRoads.instance().addName(engine.getRoadName()); } } roadComboBox.setSelectedItem(engine.getRoadName()); roadNumberTextField.setText(engine.getNumber()); if (!engineModels.containsName(engine.getModel())) { String msg = MessageFormat.format( Bundle.getMessage("modelNameNotExist"), new Object[] {engine.getModel()}); if (JOptionPane.showConfirmDialog( this, msg, Bundle.getMessage("engineAddModel"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { engineModels.addName(engine.getModel()); } } modelComboBox.setSelectedItem(engine.getModel()); if (!engineTypes.containsName(engine.getTypeName())) { String msg = MessageFormat.format( Bundle.getMessage("typeNameNotExist"), new Object[] {engine.getTypeName()}); if (JOptionPane.showConfirmDialog( this, msg, Bundle.getMessage("engineAddType"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { engineTypes.addName(engine.getTypeName()); } } typeComboBox.setSelectedItem(engine.getTypeName()); bUnitCheckBox.setSelected(engine.isBunit()); if (!engineLengths.containsName(engine.getLength())) { String msg = MessageFormat.format( Bundle.getMessage("lengthNameNotExist"), new Object[] {engine.getLength()}); if (JOptionPane.showConfirmDialog( this, msg, Bundle.getMessage("engineAddLength"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { engineLengths.addName(engine.getLength()); } } lengthComboBox.setSelectedItem(engine.getLength()); weightTextField.setText(engine.getWeightTons()); hpTextField.setText(engine.getHp()); locationBox.setSelectedItem(engine.getLocation()); Location l = locationManager.getLocationById(engine.getLocationId()); if (l != null) { l.updateComboBox(trackLocationBox); trackLocationBox.setSelectedItem(engine.getTrack()); } else { trackLocationBox.removeAllItems(); } builtTextField.setText(engine.getBuilt()); if (!CarOwners.instance().containsName(engine.getOwner())) { String msg = MessageFormat.format( Bundle.getMessage("ownerNameNotExist"), new Object[] {engine.getOwner()}); if (JOptionPane.showConfirmDialog( this, msg, Bundle.getMessage("addOwner"), JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { CarOwners.instance().addName(engine.getOwner()); } } consistComboBox.setSelectedItem(engine.getConsistName()); ownerComboBox.setSelectedItem(engine.getOwner()); valueTextField.setText(engine.getValue()); rfidComboBox.setSelectedItem(engine.getIdTag()); commentTextField.setText(engine.getComment()); setTitle(Bundle.getMessage("TitleEngineEdit")); } // combo boxes public void comboBoxActionPerformed(java.awt.event.ActionEvent ae) { if (ae.getSource() == modelComboBox) { if (modelComboBox.getSelectedItem() != null) { String model = (String) modelComboBox.getSelectedItem(); // load the default hp and length for the model selected hpTextField.setText(engineModels.getModelHorsepower(model)); weightTextField.setText(engineModels.getModelWeight(model)); if (engineModels.getModelLength(model) != null && !engineModels.getModelLength(model).equals("")) { lengthComboBox.setSelectedItem(engineModels.getModelLength(model)); } if (engineModels.getModelType(model) != null && !engineModels.getModelType(model).equals("")) { typeComboBox.setSelectedItem(engineModels.getModelType(model)); } } } if (ae.getSource() == locationBox) { if (locationBox.getSelectedItem() == null) { trackLocationBox.removeAllItems(); } else { log.debug("EnginesSetFrame sees location: " + locationBox.getSelectedItem()); Location l = ((Location) locationBox.getSelectedItem()); l.updateComboBox(trackLocationBox); } } } public void checkBoxActionPerformed(java.awt.event.ActionEvent ae) { JCheckBox b = (JCheckBox) ae.getSource(); log.debug("checkbox change " + b.getText()); } // Save, Delete, Add, Clear, Calculate buttons public void buttonActionPerformed(java.awt.event.ActionEvent ae) { if (ae.getSource() == saveButton) { // log.debug("engine save button activated"); String roadNum = roadNumberTextField.getText(); if (roadNum.length() > 10) { JOptionPane.showMessageDialog( this, Bundle.getMessage("engineRoadNum"), Bundle.getMessage("engineRoadLong"), JOptionPane.ERROR_MESSAGE); return; } // check to see if engine with road and number already exists Engine engine = manager.getByRoadAndNumber( (String) roadComboBox.getSelectedItem(), roadNumberTextField.getText()); if (engine != null) { if (_engine == null || !engine.getId().equals(_engine.getId())) { JOptionPane.showMessageDialog( this, Bundle.getMessage("engineExists"), Bundle.getMessage("engineCanNotUpdate"), JOptionPane.ERROR_MESSAGE); return; } } // if the road or number changes, the loco needs a new id if (_engine != null && _engine.getRoadName() != null && !_engine.getRoadName().equals(Engine.NONE) && (!_engine.getRoadName().equals(roadComboBox.getSelectedItem()) || !_engine.getNumber().equals(roadNumberTextField.getText()))) { String road = (String) roadComboBox.getSelectedItem(); String number = roadNumberTextField.getText(); manager.changeId(_engine, road, number); _engine.setRoadName(road); _engine.setNumber(number); } addEngine(); /* * all JMRI window position and size are now saved // save frame * size and position manager.setEditFrame(this); */ writeFiles(); if (Setup.isCloseWindowOnSaveEnabled()) { dispose(); } } if (ae.getSource() == deleteButton) { log.debug("engine delete button activated"); if (_engine != null && _engine.getRoadName().equals(roadComboBox.getSelectedItem()) && _engine.getNumber().equals(roadNumberTextField.getText())) { manager.deregister(_engine); _engine = null; // save engine file writeFiles(); } else { Engine e = manager.getByRoadAndNumber( (String) roadComboBox.getSelectedItem(), roadNumberTextField.getText()); if (e != null) { manager.deregister(e); // save engine file writeFiles(); } } } if (ae.getSource() == addButton) { String roadNum = roadNumberTextField.getText(); if (roadNum.length() > 10) { JOptionPane.showMessageDialog( this, Bundle.getMessage("engineRoadNum"), Bundle.getMessage("engineRoadLong"), JOptionPane.ERROR_MESSAGE); return; } Engine e = manager.getByRoadAndNumber( (String) roadComboBox.getSelectedItem(), roadNumberTextField.getText()); if (e != null) { log.info("Can not add, engine already exists"); JOptionPane.showMessageDialog( this, Bundle.getMessage("engineExists"), Bundle.getMessage("engineCanNotUpdate"), JOptionPane.ERROR_MESSAGE); return; } addEngine(); // save engine file writeFiles(); } if (ae.getSource() == clearRoadNumberButton) { roadNumberTextField.setText(""); roadNumberTextField.requestFocus(); } } private void addEngine() { if (roadComboBox.getSelectedItem() != null && !roadComboBox.getSelectedItem().equals("")) { if (_engine == null || !_engine.getRoadName().equals(roadComboBox.getSelectedItem()) || !_engine.getNumber().equals(roadNumberTextField.getText())) { _engine = manager.newEngine( (String) roadComboBox.getSelectedItem(), roadNumberTextField.getText()); } if (modelComboBox.getSelectedItem() != null) { _engine.setModel((String) modelComboBox.getSelectedItem()); } if (typeComboBox.getSelectedItem() != null) { _engine.setTypeName((String) typeComboBox.getSelectedItem()); } _engine.setBunit(bUnitCheckBox.isSelected()); if (lengthComboBox.getSelectedItem() != null) { _engine.setLength((String) lengthComboBox.getSelectedItem()); } _engine.setBuilt(builtTextField.getText()); if (ownerComboBox.getSelectedItem() != null) { _engine.setOwner((String) ownerComboBox.getSelectedItem()); } if (consistComboBox.getSelectedItem() != null) { if (consistComboBox.getSelectedItem().equals(EngineManager.NONE)) { _engine.setConsist(null); if (_engine.isBunit()) _engine.setBlocking(Engine.B_UNIT_BLOCKING); else _engine.setBlocking(Engine.DEFAULT_BLOCKING_ORDER); } else { _engine.setConsist(manager.getConsistByName((String) consistComboBox.getSelectedItem())); if (_engine.getConsist() != null) { _engine.setBlocking(_engine.getConsist().getSize()); } } } // confirm that weight is a number if (!weightTextField.getText().equals("")) { try { Integer.parseInt(weightTextField.getText()); _engine.setWeightTons(weightTextField.getText()); } catch (Exception e) { JOptionPane.showMessageDialog( this, Bundle.getMessage("engineWeight"), Bundle.getMessage("engineCanNotWeight"), JOptionPane.ERROR_MESSAGE); } } // confirm that horsepower is a number if (!hpTextField.getText().equals("")) { try { Integer.parseInt(hpTextField.getText()); _engine.setHp(hpTextField.getText()); } catch (Exception e) { JOptionPane.showMessageDialog( this, Bundle.getMessage("engineHorsepower"), Bundle.getMessage("engineCanNotHp"), JOptionPane.ERROR_MESSAGE); } } if (locationBox.getSelectedItem() == null) { _engine.setLocation(null, null); } else { if (trackLocationBox.getSelectedItem() == null) { JOptionPane.showMessageDialog( this, Bundle.getMessage("rsFullySelect"), Bundle.getMessage("rsCanNotLoc"), JOptionPane.ERROR_MESSAGE); } else { String status = _engine.setLocation( (Location) locationBox.getSelectedItem(), (Track) trackLocationBox.getSelectedItem()); if (!status.equals(Track.OKAY)) { log.debug("Can't set engine's location because of {}", status); JOptionPane.showMessageDialog( this, MessageFormat.format( Bundle.getMessage("rsCanNotLocMsg"), new Object[] {_engine.toString(), status}), Bundle.getMessage("rsCanNotLoc"), JOptionPane.ERROR_MESSAGE); // does the user want to force the rolling stock to this track? int results = JOptionPane.showOptionDialog( this, MessageFormat.format( Bundle.getMessage("rsForce"), new Object[] { _engine.toString(), (Track) trackLocationBox.getSelectedItem() }), MessageFormat.format(Bundle.getMessage("rsOverride"), new Object[] {status}), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, null, null); if (results == JOptionPane.YES_OPTION) { log.debug("Force rolling stock to track"); _engine.setLocation( (Location) locationBox.getSelectedItem(), (Track) trackLocationBox.getSelectedItem(), true); } } } } _engine.setComment(commentTextField.getText()); _engine.setValue(valueTextField.getText()); _engine.setIdTag((IdTag) rfidComboBox.getSelectedItem()); } } private void addEditButtonAction(JButton b) { b.addActionListener( new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent e) { buttonEditActionPerformed(e); } }); } /** * Need to also write the location and train files if a road name was deleted. Need to also write * files if car type was changed. */ private void writeFiles() { OperationsXml.save(); // save engine file } private boolean editActive = false; EngineAttributeEditFrame f; // edit buttons only one frame active at a time public void buttonEditActionPerformed(java.awt.event.ActionEvent ae) { if (editActive) { f.dispose(); } f = new EngineAttributeEditFrame(); f.setLocationRelativeTo(this); f.addPropertyChangeListener(this); editActive = true; if (ae.getSource() == editRoadButton) { f.initComponents(ROAD, (String) roadComboBox.getSelectedItem()); } if (ae.getSource() == editModelButton) { f.initComponents(MODEL, (String) modelComboBox.getSelectedItem()); } if (ae.getSource() == editTypeButton) { f.initComponents(TYPE, (String) typeComboBox.getSelectedItem()); } if (ae.getSource() == editLengthButton) { f.initComponents(LENGTH, (String) lengthComboBox.getSelectedItem()); } if (ae.getSource() == editOwnerButton) { f.initComponents(OWNER, (String) ownerComboBox.getSelectedItem()); } if (ae.getSource() == editConsistButton) { f.initComponents(CONSIST, (String) consistComboBox.getSelectedItem()); } } public void dispose() { removePropertyChangeListeners(); super.dispose(); } private void removePropertyChangeListeners() { CarRoads.instance().removePropertyChangeListener(this); engineModels.removePropertyChangeListener(this); engineTypes.removePropertyChangeListener(this); engineLengths.removePropertyChangeListener(this); CarOwners.instance().removePropertyChangeListener(this); locationManager.removePropertyChangeListener(this); manager.removePropertyChangeListener(this); } public void propertyChange(java.beans.PropertyChangeEvent e) { if (Control.showProperty) { log.debug( "Property change: ({}) old: ({}) new: ({})", e.getPropertyName(), e.getOldValue(), e.getNewValue()); } if (e.getPropertyName().equals(CarRoads.CARROADS_CHANGED_PROPERTY)) { CarRoads.instance().updateComboBox(roadComboBox); if (_engine != null) { roadComboBox.setSelectedItem(_engine.getRoadName()); } } if (e.getPropertyName().equals(EngineModels.ENGINEMODELS_CHANGED_PROPERTY)) { engineModels.updateComboBox(modelComboBox); if (_engine != null) { modelComboBox.setSelectedItem(_engine.getModel()); } } if (e.getPropertyName().equals(EngineTypes.ENGINETYPES_CHANGED_PROPERTY)) { engineTypes.updateComboBox(typeComboBox); if (_engine != null) { typeComboBox.setSelectedItem(_engine.getTypeName()); } } if (e.getPropertyName().equals(EngineLengths.ENGINELENGTHS_CHANGED_PROPERTY)) { engineLengths.updateComboBox(lengthComboBox); if (_engine != null) { lengthComboBox.setSelectedItem(_engine.getLength()); } } if (e.getPropertyName().equals(EngineManager.CONSISTLISTLENGTH_CHANGED_PROPERTY)) { manager.updateConsistComboBox(consistComboBox); if (_engine != null) { consistComboBox.setSelectedItem(_engine.getConsistName()); } } if (e.getPropertyName().equals(CarOwners.CAROWNERS_CHANGED_PROPERTY)) { CarOwners.instance().updateComboBox(ownerComboBox); if (_engine != null) { ownerComboBox.setSelectedItem(_engine.getOwner()); } } if (e.getPropertyName().equals(LocationManager.LISTLENGTH_CHANGED_PROPERTY)) { LocationManager.instance().updateComboBox(locationBox); if (_engine != null) { locationBox.setSelectedItem(_engine.getLocation()); } } if (e.getPropertyName().equals(EngineAttributeEditFrame.DISPOSE)) { editActive = false; } } private static final Logger log = LoggerFactory.getLogger(EngineEditFrame.class.getName()); }