package tools.map.xml.creator;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Arrays;
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 GameSequencePanel extends DynamicRowsPanel {
public GameSequencePanel(final JPanel stepActionPanel) {
super(stepActionPanel);
}
public static void layout(final MapXmlCreator mapXmlCreator) {
if (!DynamicRowsPanel.me.isPresent() || !(me.get() instanceof GameSequencePanel)) {
me = Optional.of(new GameSequencePanel(mapXmlCreator.getStepActionPanel()));
}
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)) {
setGamePlaySequenceMapToDefault();
// Update UI
repaintOwnPanel();
}
};
}
@Override
protected void layoutComponents() {
setOwnPanelLayout();
final GridBagConstraints gbcDefault = MapXmlUIHelper.getGbcDefaultTemplateWith(0, 0);
addLabelsRow(gbcDefault);
// Add main input rows
int rowIndex = 1;
for (final Entry<String, List<String>> entry : MapXmlHelper.getGamePlaySequenceMap().entrySet()) {
addMainInputRow(gbcDefault, rowIndex, entry);
++rowIndex;
}
addAddSequenceButton();
addFinalButtonRow(MapXmlUIHelper.getGBCCloneWith(gbcDefault, 0, rowIndex));
}
/**
* @param gridBadConstLabelSequenceName GridBagConstraints object for "Sequence Name" label and default for other
* labels.
*/
private void addLabelsRow(final GridBagConstraints gridBadConstLabelSequenceName) {
final JLabel labelSequenceName = new JLabel("Sequence Name");
final Dimension dimension = labelSequenceName.getPreferredSize();
dimension.width = 140;
labelSequenceName.setPreferredSize(dimension);
getOwnPanel().add(labelSequenceName, gridBadConstLabelSequenceName);
final JLabel labelClassName = new JLabel("Class Name");
labelClassName.setPreferredSize(dimension);
getOwnPanel().add(labelClassName, MapXmlUIHelper.getGBCCloneWith(gridBadConstLabelSequenceName, 1, 0));
final JLabel labelDisplayName = new JLabel("Display Name");
labelDisplayName.setPreferredSize(dimension);
getOwnPanel().add(labelDisplayName, MapXmlUIHelper.getGBCCloneWith(gridBadConstLabelSequenceName, 2, 0));
}
private void addMainInputRow(final GridBagConstraints gbcBase, final int rowIndex,
final Entry<String, List<String>> rowEntry) {
final List<String> defintionValues = rowEntry.getValue();
final GameSequenceRow newRow =
new GameSequenceRow(this, getOwnPanel(), rowEntry.getKey(), defintionValues.get(0),
defintionValues.get(1));
newRow.addToParentComponentWithGbc(getOwnPanel(), rowIndex, MapXmlUIHelper.getGBCCloneWith(gbcBase, 0, rowIndex));
rows.add(newRow);
}
private void addAddSequenceButton() {
final JButton buttonAddSequence = new JButton("Add Sequence");
buttonAddSequence.setFont(MapXmlUIHelper.defaultMapXMLCreatorFont);
buttonAddSequence.addActionListener(SwingAction.of("Add Sequence", e -> {
final Optional<String> newSequenceNameOptional =
Optional.of(JOptionPane.showInputDialog(getOwnPanel(), "Enter a new sequence name:",
"Sequence" + (MapXmlHelper.getGamePlaySequenceMap().size() + 1)));
if (!newSequenceNameOptional.isPresent() || newSequenceNameOptional.get().isEmpty()) {
return;
}
final String newSequenceName = newSequenceNameOptional.get().trim();
if (MapXmlHelper.getGamePlaySequenceMap().containsKey(newSequenceName)) {
JOptionPane.showMessageDialog(getOwnPanel(), "Sequence '" + newSequenceName + "' already exists.",
"Input error",
JOptionPane.ERROR_MESSAGE);
return;
}
final ArrayList<String> newValue = new ArrayList<>();
newValue.add("");
newValue.add("");
MapXmlHelper.putGamePlaySequence(newSequenceName, newValue);
// UI Update
setRows((GridBagLayout) getOwnPanel().getLayout(), MapXmlHelper.getGamePlaySequenceMap().size());
addRowWith(newSequenceName, "", "");
SwingUtilities.invokeLater(() -> {
getOwnPanel().revalidate();
getOwnPanel().repaint();
});
}));
addButton(buttonAddSequence);
}
private void setOwnPanelLayout() {
final GridBagLayout gblStepActionPanel = new GridBagLayout();
setColumns(gblStepActionPanel);
setRows(gblStepActionPanel, MapXmlHelper.getGamePlaySequenceMap().size());
getOwnPanel().setLayout(gblStepActionPanel);
}
private DynamicRow addRowWith(final String newSequenceName, final String className, final String displayName) {
final GameSequenceRow newRow = new GameSequenceRow(this, getOwnPanel(), newSequenceName, className, displayName);
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};
}
private void setGamePlaySequenceMapToDefault() {
MapXmlHelper.clearGamePlaySequence();
MapXmlHelper.getGamePlaySequenceMap().put("bid",
Arrays.asList("BidPurchaseDelegate", "Bid Purchase"));
MapXmlHelper.getGamePlaySequenceMap().put("placeBid",
Arrays.asList("BidPlaceDelegate", "Bid Placement"));
MapXmlHelper.getGamePlaySequenceMap().put("tech",
Arrays.asList("TechnologyDelegate", "Research Technology"));
MapXmlHelper.getGamePlaySequenceMap().put("tech_Activation",
Arrays.asList("TechActivationDelegate", "Activate Technology"));
MapXmlHelper.getGamePlaySequenceMap().put("purchase",
Arrays.asList("PurchaseDelegate", "Purchase Units"));
MapXmlHelper.getGamePlaySequenceMap().put("move",
Arrays.asList("MoveDelegate", "Combat Move"));
MapXmlHelper.getGamePlaySequenceMap().put("battle",
Arrays.asList("BattleDelegate", "Combat"));
MapXmlHelper.getGamePlaySequenceMap().put("place",
Arrays.asList("PlaceDelegate", "Place Units"));
MapXmlHelper.getGamePlaySequenceMap().put("endTurn",
Arrays.asList("BidPurchaseDelegate", "Turn Complete"));
}
}