001package jmri.jmrit.operations.trains.manualtrainbuilder.gui;
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.OperationsXml;
011import jmri.jmrit.operations.setup.Control;
012import jmri.jmrit.operations.setup.Setup;
013import jmri.jmrit.operations.trains.manualtrainbuilder.TrainManualBuild;
014import jmri.jmrit.operations.trains.manualtrainbuilder.TrainManualBuildManager;
015import jmri.swing.JTablePersistenceManager;
016import jmri.util.swing.JmriJOptionPane;
017
018/**
019 * Frame for user edit of a manual build
020 *
021 * @author Dan Boudreau Copyright (C) 2026
022 */
023public class TrainManualBuildEditFrame extends OperationsFrame {
024
025    TrainManualBuildTableModel manualBuildModel = new TrainManualBuildTableModel();
026    JTable manualBuildTable = new JTable(manualBuildModel);
027
028    TrainManualBuildManager manualBuildManager;
029    TrainManualBuild _manualBuild = null;
030
031    // major buttons
032    JButton addButton = new JButton(Bundle.getMessage("AddCar"));
033    JButton saveManualBuildButton = new JButton(Bundle.getMessage("SaveManualBuild"));
034    JButton deleteManualBuildButton = new JButton(Bundle.getMessage("DeleteManualBuild"));
035
036    // radio buttons
037    JRadioButton addLocAtTop = new JRadioButton(Bundle.getMessage("Top"));
038    JRadioButton addLocAtMiddle = new JRadioButton(Bundle.getMessage("Middle"));
039    JRadioButton addLocAtBottom = new JRadioButton(Bundle.getMessage("Bottom"));
040
041    // text field
042    JTextField commentTextField = new JTextField(45);
043
044    public TrainManualBuildEditFrame(String trainId) {
045        super(Bundle.getMessage("TitleManualBuild"));
046
047        // load managers
048        manualBuildManager = InstanceManager.getDefault(TrainManualBuildManager.class);
049
050        // creates a new one or returns one that already exists
051        _manualBuild = manualBuildManager.newManualBuild(trainId);
052
053        // Set up the jtable in a Scroll Pane..
054        JScrollPane manualBuildPane = new JScrollPane(manualBuildTable);
055        manualBuildPane.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED);
056
057        manualBuildModel.initTable(this, manualBuildTable, _manualBuild);
058        commentTextField.setText(_manualBuild.getComment());
059
060        getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.Y_AXIS));
061
062        // Layout the panel by rows
063        JPanel p1 = new JPanel();
064        p1.setLayout(new BoxLayout(p1, BoxLayout.X_AXIS));
065
066        JScrollPane p1Pane = new JScrollPane(p1);
067        p1Pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_NEVER);
068
069        p1Pane.setMaximumSize(new Dimension(2000, 200));
070        p1Pane.setMinimumSize(new Dimension(200, 40));
071
072        // row 1a name
073        JPanel pName = new JPanel();
074        pName.setLayout(new GridBagLayout());
075        pName.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Name")));
076        addItem(pName, new JLabel(_manualBuild.getTrainName()), 0, 0);
077
078        // row 1b comment
079        JPanel pC = new JPanel();
080        pC.setLayout(new GridBagLayout());
081        pC.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("Comment")));
082        addItem(pC, commentTextField, 0, 0);
083
084        p1.add(pName);
085        p1.add(pC);
086
087        // row 2
088        JPanel p2 = new JPanel();
089        p2.setLayout(new GridBagLayout());
090        p2.setBorder(BorderFactory.createTitledBorder(Bundle.getMessage("AddCar")));
091        addItem(p2, addButton, 1, 1);
092        addItem(p2, addLocAtTop, 2, 1);
093        addItem(p2, addLocAtMiddle, 3, 1);
094        addItem(p2, addLocAtBottom, 4, 1);
095        ButtonGroup group = new ButtonGroup();
096        group.add(addLocAtTop);
097        group.add(addLocAtMiddle);
098        group.add(addLocAtBottom);
099        addLocAtBottom.setSelected(true);
100
101        p2.setMaximumSize(new Dimension(2000, 200));
102
103        // row 3 buttons
104        JPanel pB = new JPanel();
105        pB.setLayout(new GridBagLayout());
106        pB.setBorder(BorderFactory.createTitledBorder(""));
107        pB.setMaximumSize(new Dimension(2000, 200));
108
109        addItem(pB, deleteManualBuildButton, 0, 0);
110        addItem(pB, saveManualBuildButton, 1, 0);
111
112        getContentPane().add(p1Pane);
113        getContentPane().add(manualBuildPane);
114        getContentPane().add(p2);
115        getContentPane().add(pB);
116
117        // set up buttons
118        addButtonAction(addButton);
119        addButtonAction(deleteManualBuildButton);
120        addButtonAction(saveManualBuildButton);
121
122        // build menu
123        JMenuBar menuBar = new JMenuBar();
124        JMenu toolMenu = new JMenu(Bundle.getMessage("MenuTools"));
125        menuBar.add(toolMenu);
126        setJMenuBar(menuBar);
127        addHelpMenu("package.jmri.jmrit.operations.Operations_ManualBuilds", true); // NOI18N
128
129        // set frame size
130        initMinimumSize(new Dimension(Control.panelWidth700, Control.panelHeight400));
131    }
132
133    // Save, Delete, Add
134    @Override
135    public void buttonActionPerformed(java.awt.event.ActionEvent ae) {
136        if (ae.getSource() == addButton) {
137            addNewManualBuildItem();
138        }
139        if (ae.getSource() == saveManualBuildButton) {
140            log.debug("manualBuild save button activated");
141            saveManualBuild();
142            if (Setup.isCloseWindowOnSaveEnabled()) {
143                dispose();
144            }
145        }
146        if (ae.getSource() == deleteManualBuildButton) {
147            log.debug("manualBuild delete button activated");
148            if (JmriJOptionPane.showConfirmDialog(this,
149                    Bundle.getMessage("DoYouWantToDeleteManualBuild"),
150                    Bundle.getMessage("DeleteManualBuild?"),
151                    JmriJOptionPane.YES_NO_OPTION) != JmriJOptionPane.YES_OPTION) {
152                return;
153            }
154            manualBuildManager.deregister(_manualBuild);
155            _manualBuild = null;
156            
157            OperationsXml.save();
158            dispose();
159        }
160    }
161
162    private void addNewManualBuildItem() {
163        // add item to this manual build
164        if (addLocAtTop.isSelected()) {
165            _manualBuild.addItem(0);
166        } else if (addLocAtMiddle.isSelected()) {
167            if (manualBuildTable.getSelectedRow() >= 0) {
168                int row = manualBuildTable.getSelectedRow();
169                log.debug("Selected row: {}", row);
170                _manualBuild.addItem(row);
171                // we need to reselect the table since the content has changed
172                manualBuildTable.getSelectionModel().setSelectionInterval(row, row);
173            } else {
174                _manualBuild.addItem(_manualBuild.getSize() / 2);
175            }
176        } else {
177            _manualBuild.addItem();
178        }
179    }
180
181    private void saveManualBuild() {
182        _manualBuild.setComment(commentTextField.getText());
183
184        if (manualBuildTable.isEditing()) {
185            log.debug("manualBuild table edit true");
186            manualBuildTable.getCellEditor().stopCellEditing();
187            manualBuildTable.clearSelection();
188        }
189        // save manual build
190        OperationsXml.save();
191    }
192
193    @Override
194    public void dispose() {
195        InstanceManager.getOptionalDefault(JTablePersistenceManager.class).ifPresent(tpm -> {
196            tpm.stopPersisting(manualBuildTable);
197        });
198        manualBuildModel.dispose();
199        super.dispose();
200    }
201
202    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(TrainManualBuildEditFrame.class);
203}