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}