001package jmri.jmrit.operations.trains; 002 003import java.awt.*; 004import java.util.List; 005 006import javax.swing.*; 007 008import jmri.InstanceManager; 009import jmri.jmrit.operations.OperationsFrame; 010import jmri.jmrit.operations.OperationsXml; 011import jmri.jmrit.operations.rollingstock.cars.*; 012import jmri.jmrit.operations.rollingstock.engines.EngineManager; 013import jmri.jmrit.operations.rollingstock.engines.EngineModels; 014import jmri.jmrit.operations.routes.RouteLocation; 015import jmri.jmrit.operations.setup.Control; 016import jmri.jmrit.operations.setup.Setup; 017import jmri.util.swing.JmriJOptionPane; 018 019/** 020 * Frame for user edit of a train's build options 021 * 022 * @author Dan Boudreau Copyright (C) 2010, 2012, 2013 023 */ 024public class TrainEditBuildOptionsFrame extends OperationsFrame implements java.beans.PropertyChangeListener { 025 026 Train _train = null; 027 028 JPanel panelOwnerNames = new JPanel(); 029 JPanel panelBuilt = new JPanel(); 030 JPanel panelTrainReq1 = new JPanel(); 031 JPanel panelTrainReq2 = new JPanel(); 032 033 JScrollPane ownerPane; 034 JScrollPane builtPane; 035 JScrollPane trainReq1Pane; 036 JScrollPane trainReq2Pane; 037 038 JPanel engine1Option = new JPanel(); 039 JPanel engine1DropOption = new JPanel(); 040 JPanel engine1caboose = new JPanel(); 041 042 JPanel engine2Option = new JPanel(); 043 JPanel engine2DropOption = new JPanel(); 044 JPanel engine2caboose = new JPanel(); 045 046 // labels 047 JLabel trainName = new JLabel(); 048 JLabel trainDescription = new JLabel(); 049 JLabel before = new JLabel(Bundle.getMessage("Before")); 050 JLabel after = new JLabel(Bundle.getMessage("After")); 051 052 // major buttons 053 JButton addOwnerButton = new JButton(Bundle.getMessage("AddOwner")); 054 JButton deleteOwnerButton = new JButton(Bundle.getMessage("DeleteOwner")); 055 JButton saveTrainButton = new JButton(Bundle.getMessage("SaveTrain")); 056 057 // radio buttons 058 JRadioButton ownerNameAll = new JRadioButton(Bundle.getMessage("AcceptAll")); 059 JRadioButton ownerNameInclude = new JRadioButton(Bundle.getMessage("AcceptOnly")); 060 JRadioButton ownerNameExclude = new JRadioButton(Bundle.getMessage("Exclude")); 061 062 JRadioButton builtDateAll = new JRadioButton(Bundle.getMessage("AcceptAll")); 063 JRadioButton builtDateAfter = new JRadioButton(Bundle.getMessage("After")); 064 JRadioButton builtDateBefore = new JRadioButton(Bundle.getMessage("Before")); 065 JRadioButton builtDateRange = new JRadioButton(Bundle.getMessage("Range")); 066 067 ButtonGroup ownerGroup = new ButtonGroup(); 068 ButtonGroup builtGroup = new ButtonGroup(); 069 070 // train requirements 1st set 071 JRadioButton none1 = new JRadioButton(Bundle.getMessage("None")); 072 JRadioButton change1Engine = new JRadioButton(Bundle.getMessage("EngineChange")); 073 JRadioButton modify1Caboose = new JRadioButton(Bundle.getMessage("ChangeCaboose")); 074 JRadioButton helper1Service = new JRadioButton(Bundle.getMessage("HelperService")); 075 JRadioButton remove1Caboose = new JRadioButton(Bundle.getMessage("RemoveCaboose")); 076 JRadioButton keep1Caboose = new JRadioButton(Bundle.getMessage("KeepCaboose")); 077 JRadioButton change1Caboose = new JRadioButton(Bundle.getMessage("ChangeCaboose")); 078 079 ButtonGroup trainReq1Group = new ButtonGroup(); 080 ButtonGroup cabooseOption1Group = new ButtonGroup(); 081 082 // train requirements 2nd set 083 JRadioButton none2 = new JRadioButton(Bundle.getMessage("None")); 084 JRadioButton change2Engine = new JRadioButton(Bundle.getMessage("EngineChange")); 085 JRadioButton modify2Caboose = new JRadioButton(Bundle.getMessage("ChangeCaboose")); 086 JRadioButton helper2Service = new JRadioButton(Bundle.getMessage("HelperService")); 087 JRadioButton remove2Caboose = new JRadioButton(Bundle.getMessage("RemoveCaboose")); 088 JRadioButton keep2Caboose = new JRadioButton(Bundle.getMessage("KeepCaboose")); 089 JRadioButton change2Caboose = new JRadioButton(Bundle.getMessage("ChangeCaboose")); 090 091 ButtonGroup trainReq2Group = new ButtonGroup(); 092 ButtonGroup cabooseOption2Group = new ButtonGroup(); 093 094 // check boxes 095 JCheckBox buildNormalCheckBox = new JCheckBox(Bundle.getMessage("NormalModeWhenBuilding")); 096 JCheckBox sendToTerminalCheckBox = new JCheckBox(); 097 JCheckBox returnStagingCheckBox = new JCheckBox(Bundle.getMessage("AllowCarsToReturn")); 098 JCheckBox allowLocalMovesCheckBox = new JCheckBox(Bundle.getMessage("AllowLocalMoves")); 099 JCheckBox allowThroughCarsCheckBox = new JCheckBox(Bundle.getMessage("AllowThroughCars")); 100 JCheckBox serviceAllCarsCheckBox = new JCheckBox(Bundle.getMessage("ServiceAllCars")); 101 JCheckBox sendCustomStagngCheckBox = new JCheckBox(Bundle.getMessage("SendCustomToStaging")); 102 JCheckBox buildConsistCheckBox = new JCheckBox(Bundle.getMessage("BuildConsist")); 103 104 // text field 105 JTextField builtAfterTextField = new JTextField(10); 106 JTextField builtBeforeTextField = new JTextField(10); 107 108 // combo boxes 109 JComboBox<String> ownerBox = InstanceManager.getDefault(CarOwners.class).getComboBox(); 110 111 // train requirements 1st set 112 JComboBox<RouteLocation> routePickup1Box = new JComboBox<>(); 113 JComboBox<RouteLocation> routeDrop1Box = new JComboBox<>(); 114 JComboBox<String> roadCaboose1Box = new JComboBox<>(); 115 JComboBox<String> roadEngine1Box = InstanceManager.getDefault(CarRoads.class).getComboBox(); 116 JComboBox<String> modelEngine1Box = InstanceManager.getDefault(EngineModels.class).getComboBox(); 117 JComboBox<String> numEngines1Box = new JComboBox<>(); 118 119 // train requirements 2nd set 120 JComboBox<RouteLocation> routePickup2Box = new JComboBox<>(); 121 JComboBox<RouteLocation> routeDrop2Box = new JComboBox<>(); 122 JComboBox<String> roadCaboose2Box = new JComboBox<>(); 123 JComboBox<String> roadEngine2Box = InstanceManager.getDefault(CarRoads.class).getComboBox(); 124 JComboBox<String> modelEngine2Box = InstanceManager.getDefault(EngineModels.class).getComboBox(); 125 JComboBox<String> numEngines2Box = new JComboBox<>(); 126 127 public static final String DISPOSE = "dispose"; // NOI18N 128 129 public TrainEditBuildOptionsFrame() { 130 super(Bundle.getMessage("MenuItemBuildOptions")); 131 } 132 133 public void initComponents(TrainEditFrame parent) { 134 135 ownerPane = new JScrollPane(panelOwnerNames); 136 ownerPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 137 ownerPane.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("OwnersTrain"))); 138 139 builtPane = new JScrollPane(panelBuilt); 140 builtPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 141 builtPane.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("BuiltDatesTrain"))); 142 143 trainReq1Pane = new JScrollPane(panelTrainReq1); 144 trainReq1Pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 145 trainReq1Pane.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("TrainRequires"))); 146 147 trainReq2Pane = new JScrollPane(panelTrainReq2); 148 trainReq2Pane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); 149 trainReq2Pane.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("TrainRequires"))); 150 151 parent.setChildFrame(this); 152 _train = parent._train; 153 154 getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS)); 155 156 // Layout the panel by rows 157 JPanel p1 = new JPanel(); 158 p1.setLayout(new BoxLayout(p1, BoxLayout.X_AXIS)); 159 p1.setMaximumSize(new Dimension(2000, 250)); 160 161 // Layout the panel by rows 162 // row 1a 163 JPanel pName = new JPanel(); 164 pName.setLayout(new GridBagLayout()); 165 pName.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Name"))); 166 addItem(pName, trainName, 0, 0); 167 168 // row 1b 169 JPanel pDesc = new JPanel(); 170 pDesc.setLayout(new GridBagLayout()); 171 pDesc.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Description"))); 172 addItem(pDesc, trainDescription, 0, 0); 173 174 p1.add(pName); 175 p1.add(pDesc); 176 177 // row 2 178 JPanel pOption = new JPanel(); 179 pOption.setLayout(new GridBagLayout()); 180 pOption.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Options"))); 181 addItemLeft(pOption, buildNormalCheckBox, 0, 0); 182 addItemLeft(pOption, sendToTerminalCheckBox, 1, 0); 183 addItemLeft(pOption, returnStagingCheckBox, 0, 1); 184 addItemLeft(pOption, allowLocalMovesCheckBox, 1, 1); 185 addItemLeft(pOption, allowThroughCarsCheckBox, 0, 2); 186 addItemLeft(pOption, serviceAllCarsCheckBox, 1, 2); 187 addItemLeft(pOption, sendCustomStagngCheckBox, 0, 3); 188 addItemLeft(pOption, buildConsistCheckBox, 1, 3); 189 pOption.setMaximumSize(new Dimension(2000, 250)); 190 191 192 buildNormalCheckBox.setEnabled(Setup.isBuildAggressive()); 193 returnStagingCheckBox.setEnabled(false); // only enable if train departs and returns to same staging loc 194 195 // row 7 196 panelOwnerNames.setLayout(new GridBagLayout()); 197 ownerGroup.add(ownerNameAll); 198 ownerGroup.add(ownerNameInclude); 199 ownerGroup.add(ownerNameExclude); 200 201 // row 9 202 panelBuilt.setLayout(new GridBagLayout()); 203 builtAfterTextField.setToolTipText(Bundle.getMessage("EnterYearTip")); 204 builtBeforeTextField.setToolTipText(Bundle.getMessage("EnterYearTip")); 205 addItem(panelBuilt, builtDateAll, 0, 0); 206 addItem(panelBuilt, builtDateAfter, 1, 0); 207 addItem(panelBuilt, builtDateBefore, 2, 0); 208 addItem(panelBuilt, builtDateRange, 3, 0); 209 addItem(panelBuilt, after, 1, 1); 210 addItem(panelBuilt, builtAfterTextField, 2, 1); 211 addItem(panelBuilt, before, 1, 2); 212 addItem(panelBuilt, builtBeforeTextField, 2, 2); 213 builtGroup.add(builtDateAll); 214 builtGroup.add(builtDateAfter); 215 builtGroup.add(builtDateBefore); 216 builtGroup.add(builtDateRange); 217 218 // row 11 219 panelTrainReq1.setLayout(new BoxLayout(panelTrainReq1, BoxLayout.Y_AXIS)); 220 221 JPanel trainOption1 = new JPanel(); 222 trainOption1.add(none1); 223 trainOption1.add(change1Engine); 224 trainOption1.add(modify1Caboose); 225 trainOption1.add(helper1Service); 226 panelTrainReq1.add(trainOption1); 227 228 trainReq1Group.add(none1); 229 trainReq1Group.add(change1Engine); 230 trainReq1Group.add(modify1Caboose); 231 trainReq1Group.add(helper1Service); 232 233 // engine options 234 engine1Option.setLayout(new GridBagLayout()); 235 236 for (int i = 0; i < Setup.getMaxNumberEngines() + 1; i++) { 237 numEngines1Box.addItem(Integer.toString(i)); 238 } 239 numEngines1Box.addItem(Train.AUTO_HPT); 240 numEngines1Box.setMinimumSize(new Dimension(50, 20)); 241 modelEngine1Box.insertItemAt("", 0); 242 modelEngine1Box.setSelectedIndex(0); 243 modelEngine1Box.setMinimumSize(new Dimension(120, 20)); 244 modelEngine1Box.setToolTipText(Bundle.getMessage("ModelEngineTip")); 245 roadEngine1Box.insertItemAt("", 0); 246 roadEngine1Box.setSelectedIndex(0); 247 roadEngine1Box.setMinimumSize(new Dimension(120, 20)); 248 roadEngine1Box.setToolTipText(Bundle.getMessage("RoadEngineTip")); 249 panelTrainReq1.add(engine1Option); 250 251 // caboose options 252 engine1caboose.setLayout(new GridBagLayout()); 253 engine1caboose.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("ChangeCaboose"))); 254 roadCaboose1Box.setMinimumSize(new Dimension(120, 20)); 255 roadCaboose1Box.setToolTipText(Bundle.getMessage("RoadCabooseTip")); 256 panelTrainReq1.add(engine1caboose); 257 258 cabooseOption1Group.add(remove1Caboose); 259 cabooseOption1Group.add(keep1Caboose); 260 cabooseOption1Group.add(change1Caboose); 261 262 // drop engine panel 263 addItem(engine1DropOption, new JLabel(Bundle.getMessage("DropEnginesAt")), 0, 0); 264 addItem(engine1DropOption, routeDrop1Box, 1, 0); 265 panelTrainReq1.add(engine1DropOption); 266 267 // row 13 268 panelTrainReq2.setLayout(new BoxLayout(panelTrainReq2, BoxLayout.Y_AXIS)); 269 270 JPanel trainOption2 = new JPanel(); 271 trainOption2.add(none2); 272 trainOption2.add(change2Engine); 273 trainOption2.add(modify2Caboose); 274 trainOption2.add(helper2Service); 275 panelTrainReq2.add(trainOption2); 276 277 trainReq2Group.add(none2); 278 trainReq2Group.add(change2Engine); 279 trainReq2Group.add(modify2Caboose); 280 trainReq2Group.add(helper2Service); 281 282 // engine options 283 engine2Option.setLayout(new GridBagLayout()); 284 285 for (int i = 0; i < Setup.getMaxNumberEngines() + 1; i++) { 286 numEngines2Box.addItem(Integer.toString(i)); 287 } 288 numEngines2Box.addItem(Train.AUTO_HPT); 289 numEngines2Box.setMinimumSize(new Dimension(50, 20)); 290 modelEngine2Box.insertItemAt("", 0); 291 modelEngine2Box.setSelectedIndex(0); 292 modelEngine2Box.setMinimumSize(new Dimension(120, 20)); 293 modelEngine2Box.setToolTipText(Bundle.getMessage("ModelEngineTip")); 294 roadEngine2Box.insertItemAt("", 0); 295 roadEngine2Box.setSelectedIndex(0); 296 roadEngine2Box.setMinimumSize(new Dimension(120, 20)); 297 roadEngine2Box.setToolTipText(Bundle.getMessage("RoadEngineTip")); 298 panelTrainReq2.add(engine2Option); 299 300 // caboose options 301 engine2caboose.setLayout(new GridBagLayout()); 302 engine2caboose.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("ChangeCaboose"))); 303 roadCaboose2Box.setMinimumSize(new Dimension(120, 20)); 304 roadCaboose2Box.setToolTipText(Bundle.getMessage("RoadCabooseTip")); 305 panelTrainReq2.add(engine2caboose); 306 307 cabooseOption2Group.add(remove2Caboose); 308 cabooseOption2Group.add(keep2Caboose); 309 cabooseOption2Group.add(change2Caboose); 310 311 // drop engine panel 312 addItem(engine2DropOption, new JLabel(Bundle.getMessage("DropEnginesAt")), 0, 0); 313 addItem(engine2DropOption, routeDrop2Box, 1, 0); 314 panelTrainReq2.add(engine2DropOption); 315 316 // row 15 buttons 317 JPanel pB = new JPanel(); 318 pB.setLayout(new GridBagLayout()); 319 // pB.setMaximumSize(new Dimension(2000, 250)); 320 addItem(pB, saveTrainButton, 3, 0); 321 322 getContentPane().add(p1); 323 getContentPane().add(pOption); 324 getContentPane().add(ownerPane); 325 getContentPane().add(builtPane); 326 getContentPane().add(trainReq1Pane); 327 getContentPane().add(trainReq2Pane); 328 getContentPane().add(pB); 329 330 // setup buttons 331 addButtonAction(deleteOwnerButton); 332 addButtonAction(addOwnerButton); 333 addButtonAction(saveTrainButton); 334 335 addRadioButtonAction(ownerNameAll); 336 addRadioButtonAction(ownerNameInclude); 337 addRadioButtonAction(ownerNameExclude); 338 339 addRadioButtonAction(builtDateAll); 340 addRadioButtonAction(builtDateAfter); 341 addRadioButtonAction(builtDateBefore); 342 addRadioButtonAction(builtDateRange); 343 344 addRadioButtonAction(none1); 345 addRadioButtonAction(change1Engine); 346 addRadioButtonAction(modify1Caboose); 347 addRadioButtonAction(helper1Service); 348 addRadioButtonAction(remove1Caboose); 349 addRadioButtonAction(keep1Caboose); 350 addRadioButtonAction(change1Caboose); 351 352 addRadioButtonAction(none2); 353 addRadioButtonAction(change2Engine); 354 addRadioButtonAction(modify2Caboose); 355 addRadioButtonAction(helper2Service); 356 addRadioButtonAction(remove2Caboose); 357 addRadioButtonAction(keep2Caboose); 358 addRadioButtonAction(change2Caboose); 359 360 addComboBoxAction(numEngines1Box); 361 addComboBoxAction(modelEngine1Box); 362 addComboBoxAction(numEngines2Box); 363 addComboBoxAction(modelEngine2Box); 364 365 if (_train != null) { 366 trainName.setText(_train.getName()); 367 trainDescription.setText(_train.getDescription()); 368 buildNormalCheckBox.setSelected(_train.isBuildTrainNormalEnabled()); 369 sendToTerminalCheckBox.setSelected(_train.isSendCarsToTerminalEnabled()); 370 allowLocalMovesCheckBox.setSelected(_train.isAllowLocalMovesEnabled()); 371 allowThroughCarsCheckBox.setSelected(_train.isAllowThroughCarsEnabled()); 372 serviceAllCarsCheckBox.setSelected(_train.isServiceAllCarsWithFinalDestinationsEnabled()); 373 sendCustomStagngCheckBox.setSelected(_train.isSendCarsWithCustomLoadsToStagingEnabled()); 374 buildConsistCheckBox.setSelected(_train.isBuildConsistEnabled()); 375 sendToTerminalCheckBox.setText(Bundle.getMessage("SendToTerminal", 376 _train.getTrainTerminatesName())); 377 builtAfterTextField.setText(_train.getBuiltStartYear()); 378 builtBeforeTextField.setText(_train.getBuiltEndYear()); 379 setBuiltRadioButton(); 380 enableButtons(true); 381 // does train depart and return to same staging location? 382 updateReturnToStagingCheckbox(); 383 // listen for train changes 384 _train.addPropertyChangeListener(this); 385 } else { 386 enableButtons(false); 387 } 388 addHelpMenu("package.jmri.jmrit.operations.Operations_TrainBuildOptions", true); // NOI18N 389 updateOwnerNames(); 390 updateBuilt(); 391 updateTrainRequires1Option(); 392 updateTrainRequires2Option(); 393 394 // get notified if car owners or engine models gets modified 395 InstanceManager.getDefault(CarOwners.class).addPropertyChangeListener(this); 396 InstanceManager.getDefault(EngineModels.class).addPropertyChangeListener(this); 397 398 // get notified if return to staging option changes 399 Setup.getDefault().addPropertyChangeListener(this); 400 401 initMinimumSize(new Dimension(Control.panelWidth600, Control.panelHeight600)); 402 } 403 404 // Save 405 @Override 406 public void buttonActionPerformed(java.awt.event.ActionEvent ae) { 407 if (_train != null) { 408 if (ae.getSource() == saveTrainButton) { 409 log.debug("train save button activated"); 410 saveTrain(); 411 } 412 if (ae.getSource() == addOwnerButton) { 413 if (_train.addOwnerName((String) ownerBox.getSelectedItem())) { 414 updateOwnerNames(); 415 } 416 selectNextItemComboBox(ownerBox); 417 } 418 if (ae.getSource() == deleteOwnerButton) { 419 if (_train.deleteOwnerName((String) ownerBox.getSelectedItem())) { 420 updateOwnerNames(); 421 } 422 selectNextItemComboBox(ownerBox); 423 } 424 } 425 } 426 427 @Override 428 public void radioButtonActionPerformed(java.awt.event.ActionEvent ae) { 429 log.debug("radio button activated"); 430 if (_train != null) { 431 if (ae.getSource() == ownerNameAll) { 432 _train.setOwnerOption(Train.ALL_OWNERS); 433 updateOwnerNames(); 434 } 435 if (ae.getSource() == ownerNameInclude) { 436 _train.setOwnerOption(Train.INCLUDE_OWNERS); 437 updateOwnerNames(); 438 } 439 if (ae.getSource() == ownerNameExclude) { 440 _train.setOwnerOption(Train.EXCLUDE_OWNERS); 441 updateOwnerNames(); 442 } 443 if (ae.getSource() == builtDateAll || 444 ae.getSource() == builtDateAfter || 445 ae.getSource() == builtDateBefore || 446 ae.getSource() == builtDateRange) { 447 updateBuilt(); 448 } 449 if (ae.getSource() == none1) { 450 _train.setSecondLegOptions(Train.NO_CABOOSE_OR_FRED); 451 updateTrainRequires1Option(); 452 updateTrainRequires2Option(); 453 } 454 if (ae.getSource() == change1Engine) { 455 _train.setSecondLegOptions(Train.CHANGE_ENGINES); 456 updateTrainRequires1Option(); 457 updateTrainRequires2Option(); 458 } 459 if (ae.getSource() == modify1Caboose) { 460 _train.setSecondLegOptions(Train.ADD_CABOOSE); 461 updateTrainRequires1Option(); 462 updateTrainRequires2Option(); 463 } 464 if (ae.getSource() == helper1Service) { 465 _train.setSecondLegOptions(Train.HELPER_ENGINES); 466 updateTrainRequires1Option(); 467 } 468 if (ae.getSource() == keep1Caboose || 469 ae.getSource() == change1Caboose || 470 ae.getSource() == remove1Caboose) { 471 roadCaboose1Box.setEnabled(change1Caboose.isSelected()); 472 updateTrainRequires2Option(); 473 } 474 if (ae.getSource() == none2) { 475 _train.setThirdLegOptions(Train.NO_CABOOSE_OR_FRED); 476 updateTrainRequires2Option(); 477 } 478 if (ae.getSource() == change2Engine) { 479 _train.setThirdLegOptions(Train.CHANGE_ENGINES); 480 updateTrainRequires2Option(); 481 } 482 if (ae.getSource() == modify2Caboose) { 483 _train.setThirdLegOptions(Train.ADD_CABOOSE); 484 updateTrainRequires2Option(); 485 } 486 if (ae.getSource() == helper2Service) { 487 _train.setThirdLegOptions(Train.HELPER_ENGINES); 488 updateTrainRequires2Option(); 489 } 490 if (ae.getSource() == keep2Caboose || 491 ae.getSource() == change2Caboose || 492 ae.getSource() == remove2Caboose) { 493 roadCaboose2Box.setEnabled(change2Caboose.isSelected()); 494 } 495 } 496 } 497 498 // Car type combo box has been changed, show loads associated with this car type 499 @Override 500 public void comboBoxActionPerformed(java.awt.event.ActionEvent ae) { 501 if (ae.getSource() == numEngines1Box) { 502 modelEngine1Box.setEnabled(!numEngines1Box.getSelectedItem().equals("0")); 503 roadEngine1Box.setEnabled(!numEngines1Box.getSelectedItem().equals("0")); 504 } 505 if (ae.getSource() == modelEngine1Box) { 506 updateEngineRoadComboBox(roadEngine1Box, (String) modelEngine1Box.getSelectedItem()); 507 if (_train != null) { 508 roadEngine1Box.setSelectedItem(_train.getSecondLegEngineRoad()); 509 } 510 } 511 if (ae.getSource() == numEngines2Box) { 512 modelEngine2Box.setEnabled(!numEngines2Box.getSelectedItem().equals("0")); 513 roadEngine2Box.setEnabled(!numEngines2Box.getSelectedItem().equals("0")); 514 } 515 if (ae.getSource() == modelEngine2Box) { 516 updateEngineRoadComboBox(roadEngine2Box, (String) modelEngine2Box.getSelectedItem()); 517 if (_train != null) { 518 roadEngine2Box.setSelectedItem(_train.getThirdLegEngineRoad()); 519 } 520 } 521 } 522 523 private void updateOwnerNames() { 524 panelOwnerNames.removeAll(); 525 526 JPanel p = new JPanel(); 527 p.setLayout(new GridBagLayout()); 528 p.add(ownerNameAll, 0); 529 p.add(ownerNameInclude, 1); 530 p.add(ownerNameExclude, 2); 531 GridBagConstraints gc = new GridBagConstraints(); 532 gc.gridwidth = 6; 533 panelOwnerNames.add(p, gc); 534 535 int y = 1; // vertical position in panel 536 537 if (_train != null) { 538 // set radio button 539 ownerNameAll.setSelected(_train.getOwnerOption().equals(Train.ALL_OWNERS)); 540 ownerNameInclude.setSelected(_train.getOwnerOption().equals(Train.INCLUDE_OWNERS)); 541 ownerNameExclude.setSelected(_train.getOwnerOption().equals(Train.EXCLUDE_OWNERS)); 542 543 if (!ownerNameAll.isSelected()) { 544 p = new JPanel(); 545 p.setLayout(new FlowLayout()); 546 p.add(ownerBox); 547 p.add(addOwnerButton); 548 p.add(deleteOwnerButton); 549 gc.gridy = y++; 550 panelOwnerNames.add(p, gc); 551 552 int x = 0; 553 for (String ownerName : _train.getOwnerNames()) { 554 JLabel owner = new JLabel(); 555 owner.setText(ownerName); 556 addItem(panelOwnerNames, owner, x++, y); 557 if (x > 6) { 558 y++; 559 x = 0; 560 } 561 } 562 } 563 } else { 564 ownerNameAll.setSelected(true); 565 } 566 panelOwnerNames.revalidate(); 567 panelOwnerNames.repaint(); 568 revalidate(); 569 } 570 571 private void setBuiltRadioButton() { 572 if (_train.getBuiltStartYear().equals(Train.NONE) && _train.getBuiltEndYear().equals(Train.NONE)) { 573 builtDateAll.setSelected(true); 574 } else if (!_train.getBuiltStartYear().equals(Train.NONE) && !_train.getBuiltEndYear().equals(Train.NONE)) { 575 builtDateRange.setSelected(true); 576 } else if (!_train.getBuiltStartYear().equals(Train.NONE)) { 577 builtDateAfter.setSelected(true); 578 } else if (!_train.getBuiltEndYear().equals(Train.NONE)) { 579 builtDateBefore.setSelected(true); 580 } 581 } 582 583 private void updateBuilt() { 584 builtAfterTextField.setVisible(false); 585 builtBeforeTextField.setVisible(false); 586 after.setVisible(false); 587 before.setVisible(false); 588 if (builtDateAll.isSelected()) { 589 builtAfterTextField.setText(""); 590 builtBeforeTextField.setText(""); 591 } else if (builtDateAfter.isSelected()) { 592 builtBeforeTextField.setText(""); 593 builtAfterTextField.setVisible(true); 594 after.setVisible(true); 595 } else if (builtDateBefore.isSelected()) { 596 builtAfterTextField.setText(""); 597 builtBeforeTextField.setVisible(true); 598 before.setVisible(true); 599 } else if (builtDateRange.isSelected()) { 600 after.setVisible(true); 601 before.setVisible(true); 602 builtAfterTextField.setVisible(true); 603 builtBeforeTextField.setVisible(true); 604 } 605 revalidate(); 606 } 607 608 private void updateTrainRequires1Option() { 609 none1.setSelected(true); 610 if (_train != null) { 611 612 updateCabooseRoadComboBox(roadCaboose1Box); 613 updateEngineRoadComboBox(roadEngine1Box, (String) modelEngine1Box.getSelectedItem()); 614 if (_train.getRoute() != null) { 615 _train.getRoute().updateComboBox(routePickup1Box); 616 _train.getRoute().updateComboBox(routeDrop1Box); 617 } 618 619 change1Engine.setSelected((_train.getSecondLegOptions() & Train.CHANGE_ENGINES) == Train.CHANGE_ENGINES); 620 helper1Service.setSelected((_train.getSecondLegOptions() & Train.HELPER_ENGINES) == Train.HELPER_ENGINES); 621 if (!change1Engine.isSelected() && !helper1Service.isSelected()) { 622 modify1Caboose.setSelected((_train.getSecondLegOptions() & Train.ADD_CABOOSE) == Train.ADD_CABOOSE || 623 (_train.getSecondLegOptions() & Train.REMOVE_CABOOSE) == Train.REMOVE_CABOOSE); 624 } 625 numEngines1Box.setSelectedItem(_train.getSecondLegNumberEngines()); 626 modelEngine1Box.setSelectedItem(_train.getSecondLegEngineModel()); 627 routePickup1Box.setSelectedItem(_train.getSecondLegStartRouteLocation()); 628 routeDrop1Box.setSelectedItem(_train.getSecondLegEndRouteLocation()); 629 roadEngine1Box.setSelectedItem(_train.getSecondLegEngineRoad()); 630 keep1Caboose.setSelected(true); 631 remove1Caboose.setSelected((_train.getSecondLegOptions() & Train.REMOVE_CABOOSE) == Train.REMOVE_CABOOSE); 632 change1Caboose.setSelected((_train.getSecondLegOptions() & Train.ADD_CABOOSE) == Train.ADD_CABOOSE); 633 roadCaboose1Box.setEnabled(change1Caboose.isSelected()); 634 roadCaboose1Box.setSelectedItem(_train.getSecondLegCabooseRoad()); 635 // adjust radio button text 636 if (_train.isCabooseNeeded()) { 637 change1Caboose.setText(Bundle.getMessage("ChangeCaboose")); 638 remove1Caboose.setEnabled(true); 639 } else { 640 change1Caboose.setText(Bundle.getMessage("AddCaboose")); 641 remove1Caboose.setEnabled(false); 642 } 643 } 644 engine1Option.setVisible(change1Engine.isSelected() || helper1Service.isSelected()); 645 engine1caboose.setVisible(change1Engine.isSelected() || modify1Caboose.isSelected()); 646 engine1DropOption.setVisible(helper1Service.isSelected()); 647 engine1Option.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("EngineChange"))); 648 if (change1Engine.isSelected() || helper1Service.isSelected()) { 649 createEngine1Panel(); 650 } 651 if (change1Engine.isSelected() || modify1Caboose.isSelected()) { 652 createCaboose1Panel(modify1Caboose.isSelected()); 653 } 654 if (helper1Service.isSelected()) { 655 engine1Option.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("AddHelpers"))); 656 } 657 revalidate(); 658 } 659 660 private void updateTrainRequires2Option() { 661 none2.setSelected(true); 662 if (_train != null) { 663 664 updateCabooseRoadComboBox(roadCaboose2Box); 665 updateEngineRoadComboBox(roadEngine2Box, (String) modelEngine2Box.getSelectedItem()); 666 if (_train.getRoute() != null) { 667 _train.getRoute().updateComboBox(routePickup2Box); 668 _train.getRoute().updateComboBox(routeDrop2Box); 669 } 670 671 change2Engine.setSelected((_train.getThirdLegOptions() & Train.CHANGE_ENGINES) == Train.CHANGE_ENGINES); 672 helper2Service.setSelected((_train.getThirdLegOptions() & Train.HELPER_ENGINES) == Train.HELPER_ENGINES); 673 if (!change2Engine.isSelected() && !helper2Service.isSelected()) { 674 modify2Caboose.setSelected((_train.getThirdLegOptions() & Train.ADD_CABOOSE) == Train.ADD_CABOOSE || 675 (_train.getThirdLegOptions() & Train.REMOVE_CABOOSE) == Train.REMOVE_CABOOSE); 676 } 677 numEngines2Box.setSelectedItem(_train.getThirdLegNumberEngines()); 678 modelEngine2Box.setSelectedItem(_train.getThirdLegEngineModel()); 679 routePickup2Box.setSelectedItem(_train.getThirdLegStartRouteLocation()); 680 routeDrop2Box.setSelectedItem(_train.getThirdLegEndRouteLocation()); 681 roadEngine2Box.setSelectedItem(_train.getThirdLegEngineRoad()); 682 keep2Caboose.setSelected(true); 683 remove2Caboose.setSelected((_train.getThirdLegOptions() & Train.REMOVE_CABOOSE) == Train.REMOVE_CABOOSE); 684 change2Caboose.setSelected((_train.getThirdLegOptions() & Train.ADD_CABOOSE) == Train.ADD_CABOOSE); 685 roadCaboose2Box.setEnabled(change2Caboose.isSelected()); 686 roadCaboose2Box.setSelectedItem(_train.getThirdLegCabooseRoad()); 687 // adjust radio button text 688 if ((_train.isCabooseNeeded() || change1Caboose.isSelected()) && 689 !remove1Caboose.isSelected()) { 690 change2Caboose.setText(Bundle.getMessage("ChangeCaboose")); 691 remove2Caboose.setEnabled(true); 692 } else { 693 change2Caboose.setText(Bundle.getMessage("AddCaboose")); 694 remove2Caboose.setEnabled(false); 695 } 696 } 697 engine2Option.setVisible(change2Engine.isSelected() || helper2Service.isSelected()); 698 engine2caboose.setVisible(change2Engine.isSelected() || modify2Caboose.isSelected()); 699 engine2DropOption.setVisible(helper2Service.isSelected()); 700 engine2Option.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("EngineChange"))); 701 if (change2Engine.isSelected() || helper2Service.isSelected()) { 702 createEngine2Panel(); 703 } 704 if (change2Engine.isSelected() || modify2Caboose.isSelected()) { 705 createCaboose2Panel(modify2Caboose.isSelected()); 706 } 707 if (helper2Service.isSelected()) { 708 engine2Option.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("AddHelpers"))); 709 } 710 revalidate(); 711 } 712 713 private void saveTrain() { 714 if (!checkInput()) { 715 return; 716 } 717 _train.setBuildTrainNormalEnabled(buildNormalCheckBox.isSelected()); 718 _train.setSendCarsToTerminalEnabled(sendToTerminalCheckBox.isSelected()); 719 if (returnStagingCheckBox.isEnabled()) { 720 _train.setAllowReturnToStagingEnabled(returnStagingCheckBox.isSelected()); 721 } 722 _train.setAllowLocalMovesEnabled(allowLocalMovesCheckBox.isSelected()); 723 _train.setAllowThroughCarsEnabled(allowThroughCarsCheckBox.isSelected()); 724 _train.setServiceAllCarsWithFinalDestinationsEnabled(serviceAllCarsCheckBox.isSelected()); 725 _train.setSendCarsWithCustomLoadsToStagingEnabled(sendCustomStagngCheckBox.isSelected()); 726 _train.setBuildConsistEnabled(buildConsistCheckBox.isSelected()); 727 _train.setBuiltStartYear(builtAfterTextField.getText().trim()); 728 _train.setBuiltEndYear(builtBeforeTextField.getText().trim()); 729 730 int options1 = Train.NO_CABOOSE_OR_FRED; 731 if (change1Engine.isSelected()) { 732 options1 = options1 | Train.CHANGE_ENGINES; 733 } 734 if (remove1Caboose.isSelected()) { 735 options1 = options1 | Train.REMOVE_CABOOSE; 736 } else if (change1Caboose.isSelected()) { 737 options1 = options1 | Train.ADD_CABOOSE | Train.REMOVE_CABOOSE; 738 } 739 if (helper1Service.isSelected()) { 740 options1 = options1 | Train.HELPER_ENGINES; 741 } 742 _train.setSecondLegOptions(options1); 743 if (routePickup1Box.getSelectedItem() != null) { 744 _train.setSecondLegStartRouteLocation((RouteLocation) routePickup1Box.getSelectedItem()); 745 } else { 746 _train.setSecondLegStartRouteLocation(null); 747 } 748 if (routeDrop1Box.getSelectedItem() != null) { 749 _train.setSecondLegEndRouteLocation((RouteLocation) routeDrop1Box.getSelectedItem()); 750 } else { 751 _train.setSecondLegEndRouteLocation(null); 752 } 753 _train.setSecondLegNumberEngines((String) numEngines1Box.getSelectedItem()); 754 _train.setSecondLegEngineModel((String) modelEngine1Box.getSelectedItem()); 755 _train.setSecondLegEngineRoad((String) roadEngine1Box.getSelectedItem()); 756 _train.setSecondLegCabooseRoad((String) roadCaboose1Box.getSelectedItem()); 757 758 int options2 = Train.NO_CABOOSE_OR_FRED; 759 if (change2Engine.isSelected()) { 760 options2 = options2 | Train.CHANGE_ENGINES; 761 } 762 if (remove2Caboose.isSelected()) { 763 options2 = options2 | Train.REMOVE_CABOOSE; 764 } else if (change2Caboose.isSelected()) { 765 options2 = options2 | Train.ADD_CABOOSE | Train.REMOVE_CABOOSE; 766 } 767 if (helper2Service.isSelected()) { 768 options2 = options2 | Train.HELPER_ENGINES; 769 } 770 _train.setThirdLegOptions(options2); 771 if (routePickup2Box.getSelectedItem() != null) { 772 _train.setThirdLegStartRouteLocation((RouteLocation) routePickup2Box.getSelectedItem()); 773 } else { 774 _train.setThirdLegStartRouteLocation(null); 775 } 776 if (routeDrop2Box.getSelectedItem() != null) { 777 _train.setThirdLegEndRouteLocation((RouteLocation) routeDrop2Box.getSelectedItem()); 778 } else { 779 _train.setThirdLegEndRouteLocation(null); 780 } 781 _train.setThirdLegNumberEngines((String) numEngines2Box.getSelectedItem()); 782 _train.setThirdLegEngineModel((String) modelEngine2Box.getSelectedItem()); 783 _train.setThirdLegEngineRoad((String) roadEngine2Box.getSelectedItem()); 784 _train.setThirdLegCabooseRoad((String) roadCaboose2Box.getSelectedItem()); 785 786 OperationsXml.save(); 787 if (Setup.isCloseWindowOnSaveEnabled()) { 788 dispose(); 789 } 790 } 791 792 private boolean checkInput() { 793 if ((!none1.isSelected() && routePickup1Box.getSelectedItem() == null) || 794 (!none2.isSelected() && routePickup2Box.getSelectedItem() == null)) { 795 JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("SelectLocationEngChange"), Bundle 796 .getMessage("CanNotSave"), JmriJOptionPane.ERROR_MESSAGE); 797 return false; 798 } 799 if ((helper1Service.isSelected() && routeDrop1Box.getSelectedItem() == null) || 800 (helper2Service.isSelected() && routeDrop2Box.getSelectedItem() == null)) { 801 JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("SelectLocationEndHelper"), Bundle 802 .getMessage("CanNotSave"), JmriJOptionPane.ERROR_MESSAGE); 803 return false; 804 } 805 try { 806 if (!builtAfterTextField.getText().trim().isEmpty()) { 807 Integer.parseInt(builtAfterTextField.getText().trim()); 808 } 809 if (!builtBeforeTextField.getText().trim().isEmpty()) { 810 Integer.parseInt(builtBeforeTextField.getText().trim()); 811 } 812 } catch (NumberFormatException e) { 813 JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("EnterFourDigitYear"), Bundle 814 .getMessage("CanNotSave"), JmriJOptionPane.ERROR_MESSAGE); 815 return false; 816 } 817 if ((change1Engine.isSelected() && !checkModel(modelEngine1Box, numEngines1Box, roadEngine1Box)) || 818 (change2Engine.isSelected() && !checkModel(modelEngine2Box, numEngines2Box, roadEngine2Box))) { 819 return false; 820 } 821 return true; 822 } 823 824 private boolean checkModel(JComboBox<String> modelEngineBox, JComboBox<String> numEnginesBox, 825 JComboBox<String> roadEngineBox) { 826 String model = (String) modelEngineBox.getSelectedItem(); 827 if (numEnginesBox.getSelectedItem().equals("0") || model.equals(NONE)) { 828 return true; 829 } 830 String type = InstanceManager.getDefault(EngineModels.class).getModelType(model); 831 if (!_train.isTypeNameAccepted(type)) { 832 JmriJOptionPane.showMessageDialog(this, 833 Bundle.getMessage("TrainModelService", model, type), 834 Bundle.getMessage("CanNot", Bundle.getMessage("save")), 835 JmriJOptionPane.ERROR_MESSAGE); 836 return false; 837 } 838 if (roadEngineBox.getItemCount() == 1) { 839 log.debug("No locos available that match the model selected!"); 840 JmriJOptionPane.showMessageDialog(this, 841 Bundle.getMessage("NoLocosModel", model), 842 Bundle.getMessage("TrainWillNotBuild", _train.getName()), 843 JmriJOptionPane.WARNING_MESSAGE); 844 } 845 return true; 846 } 847 848 private void enableButtons(boolean enabled) { 849 ownerNameAll.setEnabled(enabled); 850 ownerNameInclude.setEnabled(enabled); 851 ownerNameExclude.setEnabled(enabled); 852 853 builtDateAll.setEnabled(enabled); 854 builtDateAfter.setEnabled(enabled); 855 builtDateBefore.setEnabled(enabled); 856 builtDateRange.setEnabled(enabled); 857 858 none1.setEnabled(enabled); 859 change1Engine.setEnabled(enabled); 860 modify1Caboose.setEnabled(enabled); 861 helper1Service.setEnabled(enabled); 862 863 none2.setEnabled(enabled); 864 change2Engine.setEnabled(enabled); 865 modify2Caboose.setEnabled(enabled); 866 helper2Service.setEnabled(enabled); 867 868 saveTrainButton.setEnabled(enabled); 869 } 870 871 private void updateModelComboBoxes() { 872 InstanceManager.getDefault(EngineModels.class).updateComboBox(modelEngine1Box); 873 InstanceManager.getDefault(EngineModels.class).updateComboBox(modelEngine2Box); 874 modelEngine1Box.insertItemAt("", 0); 875 modelEngine2Box.insertItemAt("", 0); 876 if (_train != null) { 877 modelEngine1Box.setSelectedItem(_train.getSecondLegEngineModel()); 878 modelEngine2Box.setSelectedItem(_train.getThirdLegEngineModel()); 879 } 880 } 881 882 private void updateOwnerComboBoxes() { 883 InstanceManager.getDefault(CarOwners.class).updateComboBox(ownerBox); 884 } 885 886 // update caboose road box based on radio selection 887 private void updateCabooseRoadComboBox(JComboBox<String> box) { 888 box.removeAllItems(); 889 box.addItem(NONE); 890 List<String> roads = InstanceManager.getDefault(CarManager.class).getCabooseRoadNames(); 891 for (String road : roads) { 892 box.addItem(road); 893 } 894 } 895 896 private void updateEngineRoadComboBox(JComboBox<String> box, String engineModel) { 897 if (engineModel == null) { 898 return; 899 } 900 box.removeAllItems(); 901 box.addItem(NONE); 902 List<String> roads = InstanceManager.getDefault(EngineManager.class).getEngineRoadNames(engineModel); 903 for (String road : roads) { 904 box.addItem(road); 905 } 906 } 907 908 private void updateReturnToStagingCheckbox() { 909 if (_train != null && 910 _train.getTrainDepartsRouteLocation() != null && 911 _train.getTrainTerminatesRouteLocation() != null && 912 _train.getTrainTerminatesRouteLocation().getLocation() != null && 913 _train.getTrainTerminatesRouteLocation().getLocation().isStaging() && 914 _train.getTrainDepartsRouteLocation().getName().equals( 915 _train.getTrainTerminatesRouteLocation().getName())) { 916 allowThroughCarsCheckBox.setEnabled(false); 917 if (Setup.isStagingAllowReturnEnabled()) { 918 returnStagingCheckBox.setEnabled(false); 919 returnStagingCheckBox.setSelected(true); 920 returnStagingCheckBox.setToolTipText(Bundle.getMessage("TipReturnToStaging")); 921 } else { 922 returnStagingCheckBox.setEnabled(true); 923 returnStagingCheckBox.setSelected(_train.isAllowReturnToStagingEnabled()); 924 returnStagingCheckBox.setToolTipText(NONE); 925 } 926 } 927 } 928 929 private void createEngine1Panel() { 930 engine1Option.removeAll(); 931 addItem(engine1Option, new JLabel(Bundle.getMessage("ChangeEnginesAt")), 0, 0); 932 addItem(engine1Option, routePickup1Box, 1, 0); 933 addItem(engine1Option, new JLabel(Bundle.getMessage("Engines")), 2, 0); 934 addItem(engine1Option, numEngines1Box, 3, 0); 935 addItem(engine1Option, new JLabel(Bundle.getMessage("Model")), 4, 0); 936 addItem(engine1Option, modelEngine1Box, 5, 0); 937 addItem(engine1Option, new JLabel(Bundle.getMessage("Road")), 6, 0); 938 addItem(engine1Option, roadEngine1Box, 7, 0); 939 } 940 941 private void createEngine2Panel() { 942 engine2Option.removeAll(); 943 addItem(engine2Option, new JLabel(Bundle.getMessage("ChangeEnginesAt")), 0, 0); 944 addItem(engine2Option, routePickup2Box, 1, 0); 945 addItem(engine2Option, new JLabel(Bundle.getMessage("Engines")), 2, 0); 946 addItem(engine2Option, numEngines2Box, 3, 0); 947 addItem(engine2Option, new JLabel(Bundle.getMessage("Model")), 4, 0); 948 addItem(engine2Option, modelEngine2Box, 5, 0); 949 addItem(engine2Option, new JLabel(Bundle.getMessage("Road")), 6, 0); 950 addItem(engine2Option, roadEngine2Box, 7, 0); 951 } 952 953 private void createCaboose1Panel(boolean withCombox) { 954 engine1caboose.removeAll(); 955 addItem(engine1caboose, remove1Caboose, 2, 6); 956 addItem(engine1caboose, change1Caboose, 4, 6); 957 addItem(engine1caboose, new JLabel(Bundle.getMessage("Road")), 5, 6); 958 addItem(engine1caboose, roadCaboose1Box, 6, 6); 959 if (withCombox) { 960 addItem(engine1caboose, new JLabel(Bundle.getMessage("ChangeEnginesAt")), 0, 6); 961 addItem(engine1caboose, routePickup1Box, 1, 6); 962 } else { 963 addItem(engine1caboose, keep1Caboose, 3, 6); 964 } 965 } 966 967 private void createCaboose2Panel(boolean withCombox) { 968 engine2caboose.removeAll(); 969 addItem(engine2caboose, remove2Caboose, 2, 6); 970 addItem(engine2caboose, change2Caboose, 4, 6); 971 addItem(engine2caboose, new JLabel(Bundle.getMessage("Road")), 5, 6); 972 addItem(engine2caboose, roadCaboose2Box, 6, 6); 973 if (withCombox) { 974 addItem(engine2caboose, new JLabel(Bundle.getMessage("ChangeEnginesAt")), 0, 6); 975 addItem(engine2caboose, routePickup2Box, 1, 6); 976 } else { 977 addItem(engine2caboose, keep2Caboose, 3, 6); 978 } 979 } 980 981 @Override 982 public void dispose() { 983 InstanceManager.getDefault(CarOwners.class).removePropertyChangeListener(this); 984 InstanceManager.getDefault(EngineModels.class).removePropertyChangeListener(this); 985 Setup.getDefault().removePropertyChangeListener(this); 986 if (_train != null) { 987 _train.removePropertyChangeListener(this); 988 } 989 super.dispose(); 990 } 991 992 @Override 993 public void propertyChange(java.beans.PropertyChangeEvent e) { 994 if (Control.SHOW_PROPERTY) { 995 log.debug("Property change: ({}) old: ({}) new: ({})", e.getPropertyName(), e.getOldValue(), e 996 .getNewValue()); 997 } 998 if (e.getPropertyName().equals(CarOwners.CAROWNERS_CHANGED_PROPERTY)) { 999 updateOwnerComboBoxes(); 1000 updateOwnerNames(); 1001 } 1002 if (e.getPropertyName().equals(EngineModels.ENGINEMODELS_CHANGED_PROPERTY) || 1003 e.getPropertyName().equals(Train.TYPES_CHANGED_PROPERTY)) { 1004 updateModelComboBoxes(); 1005 } 1006 if (e.getPropertyName().equals(Train.TRAIN_REQUIREMENTS_CHANGED_PROPERTY)) { 1007 updateTrainRequires1Option(); 1008 updateTrainRequires2Option(); 1009 } 1010 if (e.getPropertyName().equals(Setup.ALLOW_CARS_TO_RETURN_PROPERTY_CHANGE)) { 1011 updateReturnToStagingCheckbox(); 1012 } 1013 } 1014 1015 private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TrainEditBuildOptionsFrame.class); 1016}