package tools.map.xml.creator; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.event.FocusEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; class ProductionFrontiersRow extends DynamicRow { private final JComboBox<String> comboBoxUnitName; private final String playerName; public ProductionFrontiersRow(final DynamicRowsPanel parentRowPanel, final JPanel stepActionPanel, final String playerName, final String unitName, final String[] unitNames) { super(unitName, parentRowPanel, stepActionPanel); this.playerName = playerName; comboBoxUnitName = new JComboBox<>(unitNames); final Dimension dimension = comboBoxUnitName.getPreferredSize(); dimension.width = INPUT_FIELD_SIZE_MEDIUM; comboBoxUnitName.setPreferredSize(dimension); comboBoxUnitName.setSelectedIndex(Arrays.binarySearch(unitNames, unitName)); comboBoxUnitName.addFocusListener(new FocusListenerFocusLost() { String currentValue = unitName; @Override public void focusLost(final FocusEvent e) { final String newUnitValue = (String) comboBoxUnitName.getSelectedItem(); if (!currentValue.equals(newUnitValue)) { final List<String> playerUnitNames = MapXmlHelper.getProductionFrontiersMap().get(playerName); if (playerUnitNames.contains(newUnitValue)) { JOptionPane.showMessageDialog(stepActionPanel, "Unit '" + newUnitValue + "' already selected fpr player '" + playerName + "'.", "Input error", JOptionPane.ERROR_MESSAGE); comboBoxUnitName.setSelectedItem(currentValue); // UI Update SwingUtilities.invokeLater(() -> { stepActionPanel.revalidate(); stepActionPanel.repaint(); }); } else { playerUnitNames.add(newUnitValue); currentValue = newUnitValue; currentRowName = unitName; } } } }); } @Override protected ArrayList<JComponent> getComponentList() { final ArrayList<JComponent> componentList = new ArrayList<>(); componentList.add(comboBoxUnitName); return componentList; } @Override public void addToParentComponent(final JComponent parent, final GridBagConstraints gbcTemplate) { parent.add(comboBoxUnitName, gbcTemplate); final GridBagConstraints gridBadConstButtonRemove = (GridBagConstraints) gbcTemplate.clone(); gridBadConstButtonRemove.gridx = 1; parent.add(buttonRemovePerRow, gridBadConstButtonRemove); } @Override protected void adaptRowSpecifics(final DynamicRow newRow) { final ProductionFrontiersRow newRowPlayerAndAlliancesRow = (ProductionFrontiersRow) newRow; this.comboBoxUnitName.setSelectedIndex(newRowPlayerAndAlliancesRow.comboBoxUnitName.getSelectedIndex()); } @Override protected void removeRowAction() { MapXmlHelper.getProductionFrontiersMap().get(playerName).remove(currentRowName); } }