package tools.map.xml.creator;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import com.google.common.collect.Maps;
import games.strategy.util.Triple;
class GameSequenceRow extends DynamicRow {
private JTextField textFieldSequenceName;
private JTextField textFieldClassName;
private JTextField textFieldDisplayName;
public GameSequenceRow(final DynamicRowsPanel parentRowPanel, final JPanel stepActionPanel, final String sequenceName,
final String className, final String displayName) {
super(sequenceName, parentRowPanel, stepActionPanel);
textFieldSequenceName = new JTextField(sequenceName);
textFieldClassName = new JTextField(className);
textFieldDisplayName = new JTextField(displayName);
Dimension dimension = textFieldSequenceName.getPreferredSize();
dimension.width = INPUT_FIELD_SIZE_MEDIUM;
textFieldSequenceName.setPreferredSize(dimension);
MapXmlUIHelper.addNewFocusListenerForTextField(textFieldSequenceName, () -> {
final String inputText = textFieldSequenceName.getText().trim();
if (currentRowName.equals(inputText)) {
return;
}
if (MapXmlHelper.getGamePlaySequenceMap().containsKey(inputText)) {
textFieldSequenceName.selectAll();
JOptionPane.showMessageDialog(stepActionPanel, "Sequence '" + inputText + "' already exists.", "Input error",
JOptionPane.ERROR_MESSAGE);
parentRowPanel.setDataIsConsistent(false);
SwingUtilities.invokeLater(() -> textFieldSequenceName.requestFocus());
return;
}
// everything is okay with the new player namer, lets rename everything
final List<String> values = MapXmlHelper.getGamePlaySequenceMap().get(currentRowName);
MapXmlHelper.getGamePlaySequenceMap().put(inputText, values);
if (!MapXmlHelper.getPlayerSequenceMap().isEmpty()) {
// Replace Game Sequence for Player Sequence
final Map<String, Triple<String, String, Integer>> updatesPlayerSequence =
Maps.newLinkedHashMap();
for (final Entry<String, Triple<String, String, Integer>> playerSequence : MapXmlHelper.getPlayerSequenceMap()
.entrySet()) {
final Triple<String, String, Integer> oldTriple = playerSequence.getValue();
if (currentRowName.equals(oldTriple.getFirst())) {
updatesPlayerSequence.put(playerSequence.getKey(),
Triple.of(inputText, oldTriple.getSecond(), oldTriple.getThird()));
}
}
for (final Entry<String, Triple<String, String, Integer>> playerSequence : updatesPlayerSequence.entrySet()) {
MapXmlHelper.getPlayerSequenceMap().put(playerSequence.getKey(), playerSequence.getValue());
}
}
currentRowName = inputText;
parentRowPanel.setDataIsConsistent(true);
});
dimension = textFieldClassName.getPreferredSize();
dimension.width = INPUT_FIELD_SIZE_LARGE;
textFieldClassName.setPreferredSize(dimension);
MapXmlUIHelper.addNewFocusListenerForTextField(textFieldClassName, () -> {
final String inputText = textFieldClassName.getText().trim();
MapXmlHelper.getGamePlaySequenceMap().get(sequenceName).set(0, inputText);
});
dimension = textFieldDisplayName.getPreferredSize();
dimension.width = INPUT_FIELD_SIZE_LARGE;
textFieldDisplayName.setPreferredSize(dimension);
MapXmlUIHelper.addNewFocusListenerForTextField(textFieldDisplayName, () -> {
final String inputText = textFieldDisplayName.getText().trim();
MapXmlHelper.getGamePlaySequenceMap().get(sequenceName).set(1, inputText);
});
}
@Override
protected ArrayList<JComponent> getComponentList() {
final ArrayList<JComponent> componentList = new ArrayList<>();
componentList.add(textFieldSequenceName);
componentList.add(textFieldClassName);
componentList.add(textFieldDisplayName);
return componentList;
}
@Override
public void addToParentComponent(final JComponent parent, final GridBagConstraints gbcTemplate) {
parent.add(textFieldSequenceName, gbcTemplate);
final GridBagConstraints gbc_tClassName = (GridBagConstraints) gbcTemplate.clone();
gbc_tClassName.gridx = 1;
parent.add(textFieldClassName, gbc_tClassName);
final GridBagConstraints gbc_tDisplayName = (GridBagConstraints) gbcTemplate.clone();
gbc_tDisplayName.gridx = 2;
parent.add(textFieldDisplayName, gbc_tDisplayName);
final GridBagConstraints gridBadConstButtonRemove = (GridBagConstraints) gbcTemplate.clone();
gridBadConstButtonRemove.gridx = 3;
parent.add(buttonRemovePerRow, gridBadConstButtonRemove);
}
@Override
protected void adaptRowSpecifics(final DynamicRow newRow) {
final GameSequenceRow newRowPlayerAndAlliancesRow = (GameSequenceRow) newRow;
this.textFieldSequenceName.setText(newRowPlayerAndAlliancesRow.textFieldSequenceName.getText());
this.textFieldClassName.setText(newRowPlayerAndAlliancesRow.textFieldClassName.getText());
this.textFieldDisplayName.setText(newRowPlayerAndAlliancesRow.textFieldDisplayName.getText());
}
@Override
protected void removeRowAction() {
MapXmlHelper.getGamePlaySequenceMap().remove(currentRowName);
if (!MapXmlHelper.getPlayerSequenceMap().isEmpty()) {
// Replace Player Sequences using the deleted Game Sequence
final ArrayList<String> deleteKeys = new ArrayList<>();
for (final Entry<String, Triple<String, String, Integer>> playerSequence : MapXmlHelper.getPlayerSequenceMap()
.entrySet()) {
final Triple<String, String, Integer> oldTriple = playerSequence.getValue();
if (currentRowName.equals(oldTriple.getFirst())) {
deleteKeys.add(playerSequence.getKey());
}
}
for (final String deleteKey : deleteKeys) {
MapXmlHelper.getPlayerSequenceMap().remove(deleteKey);
}
}
}
}