package magic.ui.dialog;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.AbstractAction;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import magic.data.DeckType;
import magic.firemind.FiremindJsonReader;
import magic.translate.MText;
import magic.ui.FontsAndBorders;
import magic.ui.dialog.button.CancelButton;
import magic.ui.dialog.button.SaveButton;
import magic.ui.widget.deck.CustomDecksComboxBox;
import magic.ui.widget.deck.FiremindDecksComboxBox;
import magic.ui.widget.deck.PrebuiltDecksComboxBox;
import magic.ui.widget.deck.RandomDecksComboBox;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
public class DeckChooserDialog extends MagicDialog {
// translatable strings
private static final String _S2 = "Select Deck";
private final JComboBox<DeckType> deckTypeCombo;
private JComboBox<String> deckNameCombo;
private final DecksPanel decksPanel;
private boolean isCancelled = false;
private final JButton saveButton = new SaveButton();
public DeckChooserDialog(final DeckType aDeckType, final String aDeckName) {
super(MText.get(_S2), new Dimension(300, 180));
deckTypeCombo = getDeckTypeComboBox();
deckTypeCombo.setSelectedItem(aDeckType);
addDeckTypeComboBoxListener();
decksPanel = new DecksPanel(aDeckName);
decksPanel.setDeckType(aDeckType);
setSaveButtonAction();
refreshLayout();
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
setVisible(true);
}
private void refreshLayout() {
final JPanel panel = getDialogContentPanel();
panel.setLayout(new MigLayout("flowy, gap 0"));
panel.add(deckTypeCombo, "w 100%");
panel.add(decksPanel, "w 100%");
panel.add(getButtonPanel(), "w 100%, h 30!, pushy, aligny bottom");
}
private JComboBox<DeckType> getDeckTypeComboBox() {
final JComboBox<DeckType> cbo = new JComboBox<>();
cbo.setModel(new DefaultComboBoxModel<>(DeckType.getDuelDeckTypes()));
cbo.setLightWeightPopupEnabled(false);
cbo.setFocusable(false);
cbo.setFont(FontsAndBorders.FONT2);
((JLabel)cbo.getRenderer()).setHorizontalAlignment(SwingConstants.CENTER);
return cbo;
}
private void addDeckTypeComboBoxListener() {
deckTypeCombo.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(final ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
decksPanel.setDeckType((DeckType) e.getItem());
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});
}
}
});
}
private void setSaveButtonAction() {
saveButton.addActionListener(new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if (getDeckName().trim().length() > 0) {
dispose();
}
}
});
}
private JPanel getButtonPanel() {
final JPanel buttonPanel = new JPanel(new MigLayout("insets 0, alignx right"));
buttonPanel.add(getCancelButton());
buttonPanel.add(saveButton);
return buttonPanel;
}
private JButton getCancelButton() {
final JButton btn = new CancelButton();
btn.addActionListener(getCancelAction());
return btn;
}
public boolean isCancelled() {
return isCancelled;
}
@Override
protected AbstractAction getCancelAction() {
return new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
isCancelled = true;
dispose();
}
};
}
private class DecksPanel extends JPanel {
private String defaultDeckName;
public DecksPanel(final String aDefaultDeckName) {
this.defaultDeckName = aDefaultDeckName;
setLayout(new MigLayout("insets 0"));
}
public void setDeckType(final DeckType deckType) {
removeAll();
// NB! "w 100%" works more like "w 100%!" when applied to
// a JComboBox hence the need for the min value so that it
// fits to the container width instead of exceeding it.
add(getDecksCombo(deckType), "w 10:100%");
revalidate();
repaint();
}
private JComboBox<String> getDecksCombo(final DeckType deckType) {
switch (deckType) {
case Random:
deckNameCombo = new RandomDecksComboBox("");
break;
case Preconstructed:
deckNameCombo = new PrebuiltDecksComboxBox();
break;
case Custom:
deckNameCombo = new CustomDecksComboxBox();
break;
case Firemind:
FiremindJsonReader.refreshTopDecks();
deckNameCombo = new FiremindDecksComboxBox();
break;
}
deckNameCombo.setSelectedItem(defaultDeckName);
defaultDeckName = "";
saveButton.setEnabled(deckNameCombo.getItemCount() > 0);
return deckNameCombo;
}
}
public DeckType getDeckType() {
return deckTypeCombo.getItemAt(deckTypeCombo.getSelectedIndex());
}
public String getDeckName() {
return (String)deckNameCombo.getSelectedItem();
}
}