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.HashSet;
import java.util.List;
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;
public class ProductionFrontiersPanel extends DynamicRowsPanel {
private final String playerName;
private final TreeSet<String> allUnitNames;
public ProductionFrontiersPanel(final JPanel stepActionPanel, final String playerName) {
super(stepActionPanel);
this.playerName = playerName;
allUnitNames = new TreeSet<>(MapXmlHelper.getUnitDefinitionsMap().keySet());
}
public static void layout(final MapXmlCreator mapXmlCreator, final JPanel stepActionPanel, final String playerName) {
if (!DynamicRowsPanel.me.isPresent() || !(me.get() instanceof ProductionFrontiersPanel)
|| !((ProductionFrontiersPanel) me.get()).playerName.equals(playerName)) {
me = Optional.of(new ProductionFrontiersPanel(stepActionPanel, playerName));
}
DynamicRowsPanel.layout(mapXmlCreator);
}
@Override
protected ActionListener getAutoFillAction() {
return e -> {
if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog(getOwnPanel(),
"Are you sure you want to use the Auto-Fill feature?\r"
+ "It will remove any information you have entered in this step and propose commonly used choices.",
"Auto-Fill Overwrite Warning", JOptionPane.YES_NO_OPTION, JOptionPane.WARNING_MESSAGE)) {
MapXmlHelper.clearProductionFrontiers();
for (final String playerName1 : MapXmlHelper.getPlayerNames()) {
MapXmlHelper.putProductionFrontiers(playerName1, new ArrayList<>(allUnitNames));
}
// Update UI
repaintOwnPanel();
}
};
}
@Override
protected void layoutComponents() {
final List<String> playersUnitNames = MapXmlHelper.getProductionFrontiersMap().get(playerName);
if (playersUnitNames == null) {
return;
}
final JLabel labelUnitName = new JLabel("Unit Name");
final Dimension dimension = labelUnitName.getPreferredSize();
dimension.width = 140;
labelUnitName.setPreferredSize(dimension);
// <1> Set panel layout
final GridBagLayout gbl_stepActionPanel = new GridBagLayout();
setColumns(gbl_stepActionPanel);
setRows(gbl_stepActionPanel, playersUnitNames.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);
// <3> Add Main Input Rows
int rowIndex = 1;
final String[] allUnitNamesArray = allUnitNames.toArray(new String[allUnitNames.size()]);
for (final String unitName : playersUnitNames) {
final GridBagConstraints gbc_tUnitName = (GridBagConstraints) gridBadConstLabelUnitName.clone();
gbc_tUnitName.gridx = 0;
gridBadConstLabelUnitName.gridy = rowIndex;
final ProductionFrontiersRow newRow =
new ProductionFrontiersRow(this, getOwnPanel(), playerName, unitName, allUnitNamesArray);
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 -> {
final List<String> curr_playersUnitNames = MapXmlHelper.getProductionFrontiersMap().get(playerName);
// UI Update
setRows((GridBagLayout) getOwnPanel().getLayout(), MapXmlHelper.getUnitDefinitionsMap().size());
final String[] allUnitNamesArray2 = allUnitNames.toArray(new String[allUnitNames.size()]);
final HashSet<String> freeUnitNames = new HashSet<>(allUnitNames);
freeUnitNames.removeAll(curr_playersUnitNames);
final String newUnitName = freeUnitNames.iterator().next();
if (newUnitName == null) {
JOptionPane.showMessageDialog(getOwnPanel(), "All units already selected.", "Input error",
JOptionPane.ERROR_MESSAGE);
} else {
curr_playersUnitNames.add(newUnitName);
addRowWith(newUnitName, allUnitNamesArray2);
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 String[] unitNames) {
final ProductionFrontiersRow newRow =
new ProductionFrontiersRow(this, getOwnPanel(), playerName, newUnitName, unitNames);
addRow(newRow);
return newRow;
}
@Override
protected void initializeSpecifics() {}
@Override
protected void setColumns(final GridBagLayout gblPanel) {
gblPanel.columnWidths = new int[] {50, 30};
gblPanel.columnWeights = new double[] {0.0, 0.0};
}
}