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.JTextField;
import javax.swing.SwingUtilities;
class TechnologyDefinitionsRow extends DynamicRow {
private JTextField textFieldTechnologyName;
private JComboBox<String> comboBoxPlayerName;
private JComboBox<String> comboBoxAlreadyEnabled;
public static String[] selectionTrueFalse = {"false", "true"};
public TechnologyDefinitionsRow(final DynamicRowsPanel parentRowPanel, final JPanel stepActionPanel,
final String technologyName, final String playerName, final String[] playerNames, final String alreadyEnabled) {
super(technologyName + "_" + playerName, parentRowPanel, stepActionPanel);
textFieldTechnologyName = new JTextField(technologyName);
comboBoxPlayerName = new JComboBox<>(playerNames);
comboBoxAlreadyEnabled = new JComboBox<>(selectionTrueFalse);
Dimension dimension = textFieldTechnologyName.getPreferredSize();
dimension.width = INPUT_FIELD_SIZE_LARGE;
textFieldTechnologyName.setPreferredSize(dimension);
MapXmlUIHelper.addNewFocusListenerForTextField(textFieldTechnologyName, () -> {
final String inputText = textFieldTechnologyName.getText().trim();
final String curr_playerName = (String) comboBoxPlayerName.getSelectedItem();
if (currentRowName.startsWith(inputText + "_")) {
return;
}
final String newRowName = inputText + "_" + curr_playerName;
if (MapXmlHelper.getTechnologyDefinitionsMap().containsKey(newRowName)) {
JOptionPane.showMessageDialog(stepActionPanel,
"Technology '" + inputText + "' already exists for player '" + curr_playerName + "'.", "Input error",
JOptionPane.ERROR_MESSAGE);
parentRowPanel.setDataIsConsistent(false);
SwingUtilities.invokeLater(() -> {
textFieldTechnologyName.requestFocus();
textFieldTechnologyName.selectAll();
});
return;
}
// everything is okay with the new technology name, lets rename everything
final List<String> newValues = MapXmlHelper.getTechnologyDefinitionsMap().get(currentRowName);
MapXmlHelper.getTechnologyDefinitionsMap().remove(currentRowName);
MapXmlHelper.getTechnologyDefinitionsMap().put(newRowName, newValues);
currentRowName = newRowName;
parentRowPanel.setDataIsConsistent(true);
});
dimension = comboBoxPlayerName.getPreferredSize();
dimension.width = INPUT_FIELD_SIZE_MEDIUM;
comboBoxPlayerName.setPreferredSize(dimension);
comboBoxPlayerName.setSelectedIndex(Arrays.binarySearch(playerNames, playerName));
comboBoxPlayerName.addFocusListener(new FocusListenerFocusLost() {
int prevSelectedIndex = comboBoxPlayerName.getSelectedIndex();
@Override
public void focusLost(final FocusEvent arg0) {
if (prevSelectedIndex == comboBoxPlayerName.getSelectedIndex()) {
return;
}
final String techInputText = textFieldTechnologyName.getText().trim();
final String curr_playerName = (String) comboBoxPlayerName.getSelectedItem();
if (currentRowName.endsWith("_" + curr_playerName)) {
return;
}
final String newRowName = techInputText + "_" + curr_playerName;
if (MapXmlHelper.getTechnologyDefinitionsMap().containsKey(newRowName)) {
JOptionPane.showMessageDialog(stepActionPanel,
"Technology '" + techInputText + "' already exists for player '" + curr_playerName + "'.", "Input error",
JOptionPane.ERROR_MESSAGE);
SwingUtilities.invokeLater(() -> {
comboBoxPlayerName.setSelectedIndex(prevSelectedIndex);
comboBoxPlayerName.requestFocus();
});
return;
}
// everything is okay with the new technology name, lets rename everything
final List<String> newValues = MapXmlHelper.getTechnologyDefinitionsMap().get(currentRowName);
MapXmlHelper.getTechnologyDefinitionsMap().remove(currentRowName);
MapXmlHelper.getTechnologyDefinitionsMap().put(newRowName, newValues);
currentRowName = newRowName;
prevSelectedIndex = comboBoxPlayerName.getSelectedIndex();
}
});
dimension = comboBoxAlreadyEnabled.getPreferredSize();
dimension.width = INPUT_FIELD_SIZE_SMALL;
comboBoxAlreadyEnabled.setPreferredSize(dimension);
comboBoxAlreadyEnabled.setSelectedIndex(Arrays.binarySearch(selectionTrueFalse, alreadyEnabled));
comboBoxAlreadyEnabled.addFocusListener(FocusListenerFocusLost.withAction(() ->
// everything is okay with the new technology name, lets rename everything
MapXmlHelper.getTechnologyDefinitionsMap().get(currentRowName).set(1,
(String) comboBoxAlreadyEnabled.getSelectedItem())));
}
@Override
protected ArrayList<JComponent> getComponentList() {
final ArrayList<JComponent> componentList = new ArrayList<>();
componentList.add(textFieldTechnologyName);
componentList.add(comboBoxPlayerName);
componentList.add(comboBoxAlreadyEnabled);
return componentList;
}
@Override
public void addToParentComponent(final JComponent parent, final GridBagConstraints gbcTemplate) {
parent.add(textFieldTechnologyName, gbcTemplate);
final GridBagConstraints gbc_tClassName = (GridBagConstraints) gbcTemplate.clone();
gbc_tClassName.gridx = 1;
parent.add(comboBoxPlayerName, gbc_tClassName);
final GridBagConstraints gbc_tDisplayName = (GridBagConstraints) gbcTemplate.clone();
gbc_tDisplayName.gridx = 2;
parent.add(comboBoxAlreadyEnabled, gbc_tDisplayName);
final GridBagConstraints gridBadConstButtonRemove = (GridBagConstraints) gbcTemplate.clone();
gridBadConstButtonRemove.gridx = 3;
parent.add(buttonRemovePerRow, gridBadConstButtonRemove);
}
@Override
protected void adaptRowSpecifics(final DynamicRow newRow) {
final TechnologyDefinitionsRow newTechnologyDefinitionsRow = (TechnologyDefinitionsRow) newRow;
this.textFieldTechnologyName.setText(newTechnologyDefinitionsRow.textFieldTechnologyName.getText());
this.comboBoxPlayerName.setSelectedIndex(newTechnologyDefinitionsRow.comboBoxPlayerName.getSelectedIndex());
this.comboBoxAlreadyEnabled.setSelectedIndex(newTechnologyDefinitionsRow.comboBoxAlreadyEnabled.getSelectedIndex());
}
@Override
protected void removeRowAction() {
MapXmlHelper.getTechnologyDefinitionsMap().remove(currentRowName);
}
}