001package jmri.jmrit.operations.locations.tools;
002
003import java.awt.Dimension;
004import java.awt.GridBagLayout;
005
006import javax.swing.*;
007
008import jmri.jmrit.operations.OperationsFrame;
009import jmri.jmrit.operations.OperationsXml;
010import jmri.jmrit.operations.locations.Location;
011import jmri.jmrit.operations.locations.Track;
012import jmri.jmrit.operations.locations.gui.TrackEditFrame;
013import jmri.jmrit.operations.setup.Control;
014import jmri.jmrit.operations.setup.Setup;
015import jmri.util.swing.JmriJOptionPane;
016
017/**
018 * Frame that allows user to select alternate track and options.
019 *
020 * @author Daniel Boudreau Copyright (C) 2011, 2015
021 */
022class AlternateTrackFrame extends OperationsFrame implements java.beans.PropertyChangeListener {
023
024    // combo boxes
025    JComboBox<Track> trackBox = new JComboBox<>();
026
027    // radio buttons
028    // major buttons
029    JButton saveButton = new JButton(Bundle.getMessage("ButtonSave"));
030
031    Track _track;
032
033    public AlternateTrackFrame(TrackEditFrame tef) {
034        super(Bundle.getMessage("AlternateTrack"));
035
036        // the following code sets the frame's initial state
037        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
038
039        _track = tef._track;
040
041        // load the panel
042        // row 2
043        JPanel pAlternate = new JPanel();
044        pAlternate.setLayout(new GridBagLayout());
045        pAlternate.setBorder(BorderFactory.createTitledBorder(""));
046        addItem(pAlternate, trackBox, 0, 0);
047
048        if (_track != null) {
049            updateTrackCombobox();
050            _track.addPropertyChangeListener(this);
051            _track.getLocation().addPropertyChangeListener(this);
052        }
053
054        JPanel pControls = new JPanel();
055        pControls.add(saveButton);
056        saveButton.setEnabled(_track != null);
057
058        // button action
059        addButtonAction(saveButton);
060
061        getContentPane().add(pAlternate);
062        getContentPane().add(pControls);
063
064        addHelpMenu("package.jmri.jmrit.operations.Operations_AlternateTrack", true); // NOI18N
065
066        initMinimumSize(new Dimension(Control.panelWidth400, Control.panelHeight200));
067    }
068
069    private void updateTrackCombobox() {
070        _track.getLocation().updateComboBox(trackBox);
071        trackBox.removeItem(_track); // remove this track from consideration
072        trackBox.setSelectedItem(_track.getAlternateTrack());
073    }
074
075    @Override
076    public void buttonActionPerformed(java.awt.event.ActionEvent ae) {
077        if (ae.getSource() == saveButton) {
078            // warn user that planned pickups and alternate track don't work
079            // together
080            if (trackBox.getSelectedItem() != null && _track.getIgnoreUsedLengthPercentage() > Track.IGNORE_0) {
081                JmriJOptionPane.showMessageDialog(null, Bundle.getMessage("PPWarningAlternate"),
082                        Bundle.getMessage("PPWarningConfiguration"),
083                        JmriJOptionPane.ERROR_MESSAGE);
084            }
085            _track.setAlternateTrack((Track) trackBox.getSelectedItem());
086            OperationsXml.save();
087            if (Setup.isCloseWindowOnSaveEnabled()) {
088                dispose();
089            }
090        }
091    }
092
093    @Override
094    public void dispose() {
095        if (_track != null) {
096            _track.removePropertyChangeListener(this);
097            _track.getLocation().removePropertyChangeListener(this);
098        }
099        super.dispose();
100    }
101
102    @Override
103    public void propertyChange(java.beans.PropertyChangeEvent e) {
104        if (Control.SHOW_PROPERTY) {
105            log.debug("Property change: ({}) old: ({}) new: ({})", e.getPropertyName(), e.getOldValue(), e
106                    .getNewValue());
107        }
108        if (e.getPropertyName().equals(Track.ALTERNATE_TRACK_CHANGED_PROPERTY) ||
109                e.getPropertyName().equals(Location.TRACK_LISTLENGTH_CHANGED_PROPERTY)) {
110            updateTrackCombobox();
111        }
112    }
113
114    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AlternateTrackFrame.class);
115}