package magic.ui.screen.deck.editor;
import java.awt.event.ActionEvent;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;
import javax.swing.AbstractAction;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import magic.data.MagicIcon;
import magic.model.MagicCardDefinition;
import magic.model.MagicDeck;
import magic.translate.MText;
import magic.ui.MagicImages;
import magic.ui.MagicSound;
import magic.ui.ScreenController;
import magic.ui.screen.widget.ActionBarButton;
import magic.ui.widget.cards.table.CardsJTable;
import magic.ui.widget.cards.table.DeckTablePanel;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
class DeckPanel extends JPanel implements IDeckEditorView {
// translatable string
private static final String _S1 = "Clear deck";
private static final String _S2 = "Remove all cards from deck. Confirmation required.";
private static final String _S3 = "Remove all cards from deck?";
private static final String _S4 = "This action cannot be undone.";
private static final String _S5 = "Clear Deck?";
private static final String _S6 = "Yes";
private static final String _S7 = "No";
// fired when card selection changes
public static final String CP_CARD_SELECTED = "99aa7f10-b4ca-4917-9f1f-fa8de1f7ee80";
// fired on add card to deck action.
public static final String CP_ADD_TO_DECK = "8f5d8209-b274-4384-b7da-0c239bf7d92b";
// fired on remove card from deck action.
public static final String CP_REMOVE_FROM_DECK = "33e31608-cf6b-45a2-9fde-bafaaf66f2d2";
private final DeckEditorController controller = DeckEditorController.instance;
private final CardQuantityActionPanel quantityPanel;
private final DeckTablePanel deckTablePanel;
private final MigLayout miglayout = new MigLayout();
private final IDeckEditorListener listener;
private final List<ActionBarButton> actionButtons = new ArrayList<>();
DeckPanel(IDeckEditorListener aListener, final CardQuantityActionPanel aPanel) {
this.quantityPanel = aPanel;
this.listener = aListener;
actionButtons.add(getClearDeckActionButton());
deckTablePanel = new DeckTablePanel(controller.getDeck());
deckTablePanel.showCardCount(true);
setDeckTablePropChangeListeners();
setLookAndFeel();
refreshLayout();
if (!controller.getDeck().isEmpty()) {
deckTablePanel.selectFirstRow();
}
}
private ActionBarButton getClearDeckActionButton() {
return new ActionBarButton(
MagicImages.getIcon(MagicIcon.CLEAR),
MText.get(_S1),
MText.get(_S2),
new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
doClearDeck();
}
});
}
private void setDeckTablePropChangeListeners() {
deckTablePanel.addPropertyChangeListener(
DeckTablePanel.CP_CARD_SELECTED,
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
firePropertyChange(CP_CARD_SELECTED, false, true);
}
});
deckTablePanel.addPropertyChangeListener(
DeckTablePanel.CP_CARD_LCLICKED,
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
addSelectedCardToDeck();
}
});
deckTablePanel.addPropertyChangeListener(
DeckTablePanel.CP_CARD_RCLICKED,
new PropertyChangeListener() {
@Override
public void propertyChange(PropertyChangeEvent evt) {
removeSelectedCardFromDeck(true);
}
});
}
private void setLookAndFeel() {
setOpaque(false);
setLayout(miglayout);
}
private void refreshLayout() {
removeAll();
miglayout.setLayoutConstraints("insets 0, gap 0, wrap 2, flowy");
add(deckTablePanel, "w 100%, h 100%");
revalidate();
}
private void doClearDeck() {
if (!controller.getDeck().isEmpty()) {
final int userResponse = JOptionPane.showOptionDialog(ScreenController.getFrame(),
String.format("<html>%s<br><br><b>%s</b></html>", MText.get(_S3), MText.get(_S4)),
MText.get(_S5),
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE,
null,
new String[] {MText.get(_S6), MText.get(_S7)}, MText.get(_S7));
if (userResponse == JOptionPane.YES_OPTION) {
controller.setDeck(new MagicDeck());
}
} else {
MagicSound.BEEP.play();
}
}
void doRefreshView() {
deckTablePanel.setDeck(controller.getDeck());
listener.deckUpdated(controller.getDeck());
}
@Override
public MagicCardDefinition getSelectedCard() {
if (deckTablePanel.getSelectedCards().size() > 0) {
return deckTablePanel.getSelectedCards().get(0);
} else {
return MagicCardDefinition.UNKNOWN;
}
}
private void addSelectedCardToDeck() {
for (int i = 0; i < quantityPanel.getQuantity(); i++) {
firePropertyChange(CP_ADD_TO_DECK, false, true);
}
}
private void removeSelectedCardFromDeck(final boolean isMouseClick) {
final int cardCount = controller.getDeck().getCardCount(getSelectedCard());
int quantity = Math.min(cardCount, quantityPanel.getQuantity());
if (cardCount - quantity < 1 && isMouseClick) {
quantity = cardCount - 1;
MagicSound.BEEP.play();
}
for (int i = 0; i < quantity; i++) {
firePropertyChange(CP_REMOVE_FROM_DECK, false, true);
}
}
void addCardToDeck(final MagicCardDefinition card) {
controller.getDeck().add(card);
deckTablePanel.setCards(controller.getDeck());
deckTablePanel.setSelectedCard(card);
listener.deckUpdated(controller.getDeck());
}
void removeCardFromDeck(MagicCardDefinition card) {
controller.getDeck().remove(card);
deckTablePanel.setCards(controller.getDeck());
deckTablePanel.setSelectedCard(card);
listener.deckUpdated(controller.getDeck());
}
@Override
public boolean requestFocusInWindow() {
if (deckTablePanel.getSelectedCards().isEmpty()) {
deckTablePanel.selectFirstRow();
}
return super.requestFocusInWindow();
}
void setSelectedCard(MagicCardDefinition selectedCard) {
deckTablePanel.setSelectedCard(selectedCard);
}
CardsJTable getDeckTable() {
return deckTablePanel.getDeckTable();
}
void setDeckTable(CardsJTable aDeckTable) {
deckTablePanel.setDeckTable(aDeckTable);
}
@Override
public void doPlusButtonAction() {
addSelectedCardToDeck();
}
@Override
public void doMinusButtonAction() {
removeSelectedCardFromDeck(false);
}
@Override
public List<ActionBarButton> getActionButtons() {
return actionButtons;
}
@Override
public void notifyShowing() {
// not applicable
}
}