001package jmri.jmrit.operations.trains.tools;
002
003import java.awt.Dimension;
004import java.awt.GridBagLayout;
005
006import javax.swing.*;
007
008import jmri.InstanceManager;
009import jmri.jmrit.operations.OperationsFrame;
010import jmri.jmrit.operations.setup.Control;
011import jmri.jmrit.operations.trains.*;
012import jmri.jmrit.operations.trains.gui.TrainEditFrame;
013import jmri.util.swing.JmriJOptionPane;
014
015/**
016 * Frame for making a new copy of a train.
017 *
018 * @author Bob Jacobsen Copyright (C) 2001
019 * @author Daniel Boudreau Copyright (C) 2011, 2013
020 */
021public class TrainCopyFrame extends OperationsFrame {
022
023    TrainManager trainManager = InstanceManager.getDefault(TrainManager.class);
024
025    // labels
026    // text field
027    javax.swing.JTextField trainNameTextField = new javax.swing.JTextField(Control.max_len_string_train_name);
028
029    // major buttons
030    javax.swing.JButton copyButton = new javax.swing.JButton(Bundle.getMessage("ButtonCopy"));
031
032    // combo boxes
033    JComboBox<Train> trainBox = InstanceManager.getDefault(TrainManager.class).getTrainComboBox();
034
035    public TrainCopyFrame(Train train) {
036        // general GUI config
037
038        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
039
040        // Set up the panels
041        // Layout the panel by rows
042        // row 1
043        JPanel pName = new JPanel();
044        pName.setLayout(new GridBagLayout());
045        pName.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Name")));
046        addItem(pName, trainNameTextField, 0, 0);
047
048        // row 2
049        JPanel pCopy = new JPanel();
050        pCopy.setLayout(new GridBagLayout());
051        pCopy.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("SelectTrain")));
052        addItem(pCopy, trainBox, 0, 0);
053
054        trainBox.setSelectedItem(train);
055
056        // row 4
057        JPanel pButton = new JPanel();
058        pButton.add(copyButton);
059
060        getContentPane().add(pName);
061        getContentPane().add(pCopy);
062        getContentPane().add(pButton);
063
064        // add help menu to window
065        addHelpMenu("package.jmri.jmrit.operations.Operations_CopyTrain", true); // NOI18N
066
067        pack();
068        setMinimumSize(new Dimension(Control.panelWidth400, Control.panelHeight200));
069
070        setTitle(Bundle.getMessage("TitleTrainCopy"));
071
072        // setup buttons
073        addButtonAction(copyButton);
074    }
075
076    @Override
077    public void buttonActionPerformed(java.awt.event.ActionEvent ae) {
078        if (ae.getSource() == copyButton) {
079            log.debug("copy train button activated");
080            if (!checkName()) {
081                return;
082            }
083
084            Train newTrain = trainManager.getTrainByName(trainNameTextField.getText());
085            if (newTrain != null) {
086                reportTrainExists();
087                return;
088            }
089            if (trainBox.getSelectedItem() == null) {
090                reportTrainDoesNotExist();
091                return;
092            }
093            Train oldTrain = (Train) trainBox.getSelectedItem();
094            if (oldTrain == null) {
095                reportTrainDoesNotExist();
096                return;
097            }
098
099            // now copy
100            newTrain = trainManager.copyTrain(oldTrain, trainNameTextField.getText());
101            new TrainEditFrame(newTrain);
102        }
103    }
104
105    private void reportTrainExists() {
106        JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("TrainNameExists"), Bundle
107                .getMessage("CanNotTrain", Bundle.getMessage("copy")), JmriJOptionPane.ERROR_MESSAGE);
108    }
109
110    private void reportTrainDoesNotExist() {
111        JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("SelectTrain"), Bundle
112                .getMessage("CanNotTrain", Bundle.getMessage("copy")), JmriJOptionPane.ERROR_MESSAGE);
113    }
114
115    /**
116     *
117     * @return true if name isn't too long
118     */
119    private boolean checkName() {
120        if (trainNameTextField.getText().trim().isEmpty()) {
121            JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("EnterTrainName"), Bundle
122                    .getMessage("CanNotTrain", Bundle.getMessage("copy")), JmriJOptionPane.ERROR_MESSAGE);
123            return false;
124        }
125        if (trainNameTextField.getText().length() > Control.max_len_string_train_name) {
126            JmriJOptionPane.showMessageDialog(this, Bundle.getMessage("TrainNameLess",
127                    Control.max_len_string_train_name + 1), Bundle
128                            .getMessage("CanNot", Bundle.getMessage("copy")), JmriJOptionPane.ERROR_MESSAGE);
129            return false;
130        }
131        return true;
132    }
133
134    @Override
135    public void dispose() {
136        super.dispose();
137    }
138
139    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TrainCopyFrame.class);
140}