package magic.ui.dialog; import java.awt.Cursor; import java.awt.Dimension; import java.awt.event.ActionEvent; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import magic.data.DeckGenerator; import magic.translate.MText; import magic.ui.dialog.button.CancelButton; import magic.ui.dialog.button.SaveButton; import magic.ui.FontsAndBorders; import magic.ui.widget.SliderPanel; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public class RandomDeckGeneratorDialog extends MagicDialog implements ChangeListener { // translatable strings private static final String _S1 = "Create Deck"; private static final String _S2 = "Percentage of deck size allocated to non-land cards."; private static final String _S3 = "Maximum percentage of spells allocated to creature cards."; private static final String _S4 = "Maximum number of colors to use in deck."; private static final String _S5 = "Random Deck Generator"; private static final String _S6 = "Card Pool:"; private static final String _S7 = "Deck size:"; private static final String _S8 = "Spells (%):"; private static final String _S9 = "Max. Creatures (%):"; private static final String _S10 = "Max. Colors:"; private static final String _S11 = "Spells:"; private static final String _S12 = "Max Creatures:"; private static final String _S13 = "Lands:"; private boolean isCancelled = false; private final JButton saveButton = new SaveButton(MText.get(_S1)); private final int cardPoolSize; private DeckGenerator deckGenerator = new DeckGenerator(); // deck size. private final SliderPanel deckSizeSlider; // percentage of deck size allocated to non-land cards. private final SliderPanel spellsSlider; private final JLabel spellsLabel = new JLabel(); // maximum percentage of spells allocated to creature cards. private final SliderPanel creaturesSlider; private final JLabel creaturesLabel = new JLabel(); private final JLabel landsLabel = new JLabel(); // max colors private final SliderPanel maxColorsSlider; // CTR public RandomDeckGeneratorDialog(final int cardPoolSize, final int defaultDeckSize) { super(MText.get(_S5), new Dimension(460, 340)); this.cardPoolSize = cardPoolSize; deckSizeSlider = new SliderPanel("", 40, 100, 10, defaultDeckSize, false); deckSizeSlider.addChangeListener(this); spellsSlider = new SliderPanel("", 0, 100, 1, 60, false); spellsSlider.setToolTipText(MText.get(_S2)); spellsSlider.addChangeListener(this); creaturesSlider = new SliderPanel("", 0, 100, 1, 66, false); creaturesSlider.setToolTipText(MText.get(_S3)); creaturesSlider.addChangeListener(this); maxColorsSlider = new SliderPanel("", 1, 3, 1, 2, true); maxColorsSlider.setToolTipText(MText.get(_S4)); maxColorsSlider.addChangeListener(this); refreshLayout(); setListeners(); recalculate(); setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } private void setDeckGenerator() { deckGenerator = new DeckGenerator(); deckGenerator.deckSize = deckSizeSlider.getValue(); deckGenerator.spellsPercent = spellsSlider.getValue(); deckGenerator.maxCreaturesPercent = creaturesSlider.getValue(); deckGenerator.maxColors = maxColorsSlider.getValue(); } private void recalculate() { setDeckGenerator(); spellsLabel.setText(Integer.toString(deckGenerator.getSpellsCount())); creaturesLabel.setText(Integer.toString(deckGenerator.getMaxCreaturesCount())); landsLabel.setText(Integer.toString(deckGenerator.getLandsCount())); } private void setListeners() { // save button saveButton.addActionListener(new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { setDeckGenerator(); dispose(); } }); } private void refreshLayout() { final JPanel panel = getDialogContentPanel(); panel.setLayout(new MigLayout("flowx, wrap 2")); panel.add(getFilterCaptionLabel(MText.get(_S6)), "alignx right"); panel.add(new JLabel(Integer.toString(cardPoolSize)), "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S7)), "alignx right"); panel.add(deckSizeSlider, "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S8)), "alignx right"); panel.add(spellsSlider, "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S9)), "alignx right"); panel.add(creaturesSlider, "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S10)), "alignx right"); panel.add(maxColorsSlider, "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S11)), "alignx right, gaptop 10"); panel.add(spellsLabel, "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S12)), "alignx right"); panel.add(creaturesLabel, "w 100%"); panel.add(getFilterCaptionLabel(MText.get(_S13)), "alignx right"); panel.add(landsLabel, "w 100%"); panel.add(getButtonPanel(), "w 100%, h 30!, pushy, aligny bottom, spanx"); } private JLabel getFilterCaptionLabel(final String text) { final JLabel lbl = new JLabel(text); lbl.setHorizontalAlignment(SwingConstants.RIGHT); lbl.setFont(FontsAndBorders.FONT1); return lbl; } private JPanel getButtonPanel() { final JPanel buttonPanel = new JPanel(new MigLayout("insets 0, alignx right, aligny bottom")); buttonPanel.add(getCancelButton(), "w 120"); buttonPanel.add(saveButton, "w 120"); return buttonPanel; } private JButton getCancelButton() { final JButton btn = new CancelButton(); btn.addActionListener(getCancelAction()); return btn; } public boolean isCancelled() { return isCancelled; } @Override public void stateChanged(ChangeEvent e) { recalculate(); } public DeckGenerator getDeckGenerator() { return deckGenerator; } @Override protected AbstractAction getCancelAction() { return new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { isCancelled = true; dispose(); } }; } }