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.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Optional;
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;
public class UnitDefinitionsPanel extends DynamicRowsPanel {
public UnitDefinitionsPanel(final JPanel stepActionPanel) {
super(stepActionPanel);
}
public static void layout(final MapXmlCreator mapXmlCreator) {
if (!DynamicRowsPanel.me.isPresent() || !(me.get() instanceof UnitDefinitionsPanel)) {
me = Optional.of(new UnitDefinitionsPanel(mapXmlCreator.getStepActionPanel()));
}
DynamicRowsPanel.layout(mapXmlCreator);
}
@Override
protected ActionListener getAutoFillAction() {
return null;
}
@Override
protected void layoutComponents() {
final JLabel labelUnitName = new JLabel("Unit Name");
Dimension dimension = labelUnitName.getPreferredSize();
dimension.width = 140;
labelUnitName.setPreferredSize(dimension);
final JLabel labelBuyCost = new JLabel("Buy Cost");
dimension = (Dimension) dimension.clone();
dimension.width = 80;
labelBuyCost.setPreferredSize(dimension);
final JLabel labelBuyQuantity = new JLabel("Buy Quantity");
labelBuyQuantity.setPreferredSize(dimension);
// <1> Set panel layout
final GridBagLayout gbl_stepActionPanel = new GridBagLayout();
setColumns(gbl_stepActionPanel);
setRows(gbl_stepActionPanel, MapXmlHelper.getUnitDefinitionsMap().size());
getOwnPanel().setLayout(gbl_stepActionPanel);
// <2> Add Row Labels: Player Name, Alliance Name, Buy Quantity
final GridBagConstraints gridBadConstLabelUnitName = new GridBagConstraints();
gridBadConstLabelUnitName.insets = new Insets(0, 0, 5, 5);
gridBadConstLabelUnitName.gridy = 0;
gridBadConstLabelUnitName.gridx = 0;
gridBadConstLabelUnitName.anchor = GridBagConstraints.WEST;
getOwnPanel().add(labelUnitName, gridBadConstLabelUnitName);
final GridBagConstraints gridBadConstLabelBuyCost = (GridBagConstraints) gridBadConstLabelUnitName.clone();
gridBadConstLabelBuyCost.gridx = 1;
getOwnPanel().add(labelBuyCost, gridBadConstLabelBuyCost);
final GridBagConstraints gridBadConstLabelBuyQuantity = (GridBagConstraints) gridBadConstLabelUnitName.clone();
gridBadConstLabelBuyQuantity.gridx = 2;
getOwnPanel().add(labelBuyQuantity, gridBadConstLabelBuyQuantity);
// <3> Add Main Input Rows
int rowIndex = 1;
for (final Entry<String, List<Integer>> unitDefinition : MapXmlHelper.getUnitDefinitionsMap().entrySet()) {
final GridBagConstraints gbc_tUnitName = (GridBagConstraints) gridBadConstLabelUnitName.clone();
gbc_tUnitName.gridx = 0;
gridBadConstLabelUnitName.gridy = rowIndex;
final List<Integer> defintionValues = unitDefinition.getValue();
final UnitDefinitionsRow newRow = new UnitDefinitionsRow(this, getOwnPanel(), unitDefinition.getKey(),
defintionValues.get(0), defintionValues.get(1));
newRow.addToParentComponentWithGbc(getOwnPanel(), rowIndex, gbc_tUnitName);
rows.add(newRow);
++rowIndex;
}
// <4> Add Final Button Row
final JButton buttonAddUnit = new JButton("Add Unit");
buttonAddUnit.setFont(MapXmlUIHelper.defaultMapXMLCreatorFont);
buttonAddUnit.addActionListener(SwingAction.of("Add Unit", e -> {
String newUnitName = JOptionPane.showInputDialog(getOwnPanel(), "Enter a new unit name:",
"Unit" + (MapXmlHelper.getUnitDefinitionsMap().size() + 1));
if (newUnitName == null || newUnitName.isEmpty()) {
return;
}
if (MapXmlHelper.getUnitDefinitionsMap().containsKey(newUnitName)) {
JOptionPane.showMessageDialog(getOwnPanel(), "Unit '" + newUnitName + "' already exists.", "Input error",
JOptionPane.ERROR_MESSAGE);
return;
}
newUnitName = newUnitName.trim();
final ArrayList<Integer> newValue = new ArrayList<>();
newValue.add(0);
newValue.add(1);
MapXmlHelper.putUnitDefinitions(newUnitName, newValue);
// UI Update
setRows((GridBagLayout) getOwnPanel().getLayout(), MapXmlHelper.getUnitDefinitionsMap().size());
addRowWith(newUnitName, 0, 1);
SwingUtilities.invokeLater(() -> {
getOwnPanel().revalidate();
getOwnPanel().repaint();
});
}));
addButton(buttonAddUnit);
final GridBagConstraints gridBadConstButtonAddUnit = (GridBagConstraints) gridBadConstLabelUnitName.clone();
gridBadConstButtonAddUnit.gridx = 0;
gridBadConstButtonAddUnit.gridy = rowIndex;
addFinalButtonRow(gridBadConstButtonAddUnit);
}
private DynamicRow addRowWith(final String newUnitName, final int buyCost, final int buyQuantity) {
final UnitDefinitionsRow newRow = new UnitDefinitionsRow(this, getOwnPanel(), newUnitName, buyCost, buyQuantity);
addRow(newRow);
return newRow;
}
@Override
protected void initializeSpecifics() {}
@Override
protected void setColumns(final GridBagLayout gblPanel) {
gblPanel.columnWidths = new int[] {50, 60, 50, 30};
gblPanel.columnWeights = new double[] {0.0, 0.0, 0.0, 0.0};
}
}