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}