package tools.map.xml.creator;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionListener;
import java.util.Map.Entry;
import java.util.Optional;
import java.util.TreeSet;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import games.strategy.ui.SwingAction;
import games.strategy.util.Triple;
public class PlayerSequencePanel extends DynamicRowsPanel {
private final TreeSet<String> gameSequenceNames = new TreeSet<>();
private final TreeSet<String> playerNames = new TreeSet<>();
public PlayerSequencePanel(final JPanel stepActionPanel) {
super(stepActionPanel);
}
public static void layout(final MapXmlCreator mapXmlCreator) {
if (!DynamicRowsPanel.me.isPresent() || !(me.get() instanceof PlayerSequencePanel)) {
me = Optional.of(new PlayerSequencePanel(mapXmlCreator.getStepActionPanel()));
}
DynamicRowsPanel.layout(mapXmlCreator);
}
@Override
protected ActionListener getAutoFillAction() {
return null;
}
@Override
protected void layoutComponents() {
final JLabel labelSequenceName = new JLabel("Sequence Name");
Dimension dimension = labelSequenceName.getPreferredSize();
dimension.width = DynamicRow.INPUT_FIELD_SIZE_MEDIUM;
labelSequenceName.setPreferredSize(dimension);
final JLabel labelGameSequenceName = new JLabel("Game Sequence");
labelGameSequenceName.setPreferredSize(dimension);
final JLabel labelPlayerName = new JLabel("Player Name");
labelPlayerName.setPreferredSize(dimension);
final JLabel labelMaxRunCount = new JLabel("Max Run Count");
dimension = (Dimension) dimension.clone();
dimension.width = 90;
labelMaxRunCount.setPreferredSize(dimension);
// <1> Set panel layout
final GridBagLayout gbl_stepActionPanel = new GridBagLayout();
setColumns(gbl_stepActionPanel);
setRows(gbl_stepActionPanel, MapXmlHelper.getPlayerSequenceMap().size());
getOwnPanel().setLayout(gbl_stepActionPanel);
// <2> Add Row Labels: Player Name, Alliance Name, Buy Quantity
final GridBagConstraints gridBadConstLabelSequenceName = new GridBagConstraints();
gridBadConstLabelSequenceName.insets = new Insets(0, 0, 5, 5);
gridBadConstLabelSequenceName.gridy = 0;
gridBadConstLabelSequenceName.gridx = 0;
gridBadConstLabelSequenceName.anchor = GridBagConstraints.WEST;
getOwnPanel().add(labelSequenceName, gridBadConstLabelSequenceName);
final GridBagConstraints gridBadConstLabelGameSequenceName =
(GridBagConstraints) gridBadConstLabelSequenceName.clone();
gridBadConstLabelGameSequenceName.gridx = 1;
getOwnPanel().add(labelGameSequenceName, gridBadConstLabelGameSequenceName);
final GridBagConstraints gridBadConstLabelPlayerName = (GridBagConstraints) gridBadConstLabelSequenceName.clone();
gridBadConstLabelPlayerName.gridx = 2;
getOwnPanel().add(labelPlayerName, gridBadConstLabelPlayerName);
final GridBagConstraints gridBadConstLabelMaxRunCount = (GridBagConstraints) gridBadConstLabelSequenceName.clone();
gridBadConstLabelMaxRunCount.gridx = 3;
getOwnPanel().add(labelMaxRunCount, gridBadConstLabelMaxRunCount);
// <3> Add Main Input Rows
int rowIndex = 1;
final String[] gameSequenceNamesArray = gameSequenceNames.toArray(new String[gameSequenceNames.size()]);
final String[] playerNamesArray = playerNames.toArray(new String[playerNames.size()]);
for (final Entry<String, Triple<String, String, Integer>> playerSequence : MapXmlHelper.getPlayerSequenceMap()
.entrySet()) {
final GridBagConstraints gbc_tSequenceName = (GridBagConstraints) gridBadConstLabelSequenceName.clone();
gbc_tSequenceName.gridx = 0;
gridBadConstLabelSequenceName.gridy = rowIndex;
final Triple<String, String, Integer> defintionValues = playerSequence.getValue();
final PlayerSequenceRow newRow =
new PlayerSequenceRow(this, getOwnPanel(), playerSequence.getKey(), defintionValues.getFirst(),
gameSequenceNamesArray, defintionValues.getSecond(), playerNamesArray, defintionValues.getThird());
newRow.addToParentComponentWithGbc(getOwnPanel(), rowIndex, gbc_tSequenceName);
rows.add(newRow);
++rowIndex;
}
// <4> Add Final Button Row
final JButton buttonAddSequence = new JButton("Add Sequence");
buttonAddSequence.setFont(MapXmlUIHelper.defaultMapXMLCreatorFont);
buttonAddSequence.addActionListener(SwingAction.of("Add Sequence", e -> {
String newSequenceName = JOptionPane.showInputDialog(getOwnPanel(), "Enter a new sequence name:",
"Sequence" + (MapXmlHelper.getPlayerSequenceMap().size() + 1));
if (newSequenceName == null || newSequenceName.isEmpty()) {
return;
}
if (MapXmlHelper.getPlayerSequenceMap().containsKey(newSequenceName)) {
JOptionPane.showMessageDialog(getOwnPanel(), "Sequence '" + newSequenceName + "' already exists.",
"Input error",
JOptionPane.ERROR_MESSAGE);
return;
}
newSequenceName = newSequenceName.trim();
final Triple<String, String, Integer> newValue =
Triple.of(gameSequenceNames.iterator().next(), playerNames.iterator().next(), 0);
MapXmlHelper.putPlayerSequence(newSequenceName, newValue);
// UI Update
setRows((GridBagLayout) getOwnPanel().getLayout(), MapXmlHelper.getPlayerSequenceMap().size());
addRowWith(newSequenceName, gameSequenceNames.iterator().next(), playerNames.iterator().next(), 0);
SwingUtilities.invokeLater(() -> {
getOwnPanel().revalidate();
getOwnPanel().repaint();
});
}));
addButton(buttonAddSequence);
final GridBagConstraints gridBadConstButtonAddUnit = (GridBagConstraints) gridBadConstLabelSequenceName.clone();
gridBadConstButtonAddUnit.gridx = 0;
gridBadConstButtonAddUnit.gridy = rowIndex;
addFinalButtonRow(gridBadConstButtonAddUnit);
}
private DynamicRow addRowWith(final String newSequenceName, final String gameSequenceName, final String playerName,
final int maxCount) {
final PlayerSequenceRow newRow = new PlayerSequenceRow(this, getOwnPanel(), newSequenceName, gameSequenceName,
gameSequenceNames.toArray(new String[gameSequenceNames.size()]), playerName,
playerNames.toArray(new String[playerNames.size()]), maxCount);
addRow(newRow);
return newRow;
}
@Override
protected void initializeSpecifics() {
gameSequenceNames.clear();
playerNames.clear();
gameSequenceNames.addAll(MapXmlHelper.getGamePlaySequenceMap().keySet());
playerNames.add("");
playerNames.addAll(MapXmlHelper.getPlayerNames());
}
@Override
protected void setColumns(final GridBagLayout gblPanel) {
gblPanel.columnWidths = new int[] {50, 60, 50, 30, 30};
gblPanel.columnWeights = new double[] {0.0, 0.0, 0.0, 0.0, 0.0};
}
}