package magic.ui.screen.deck.editor;
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.AbstractAction;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.SwingUtilities;
import magic.data.GeneralConfig;
import magic.model.MagicCardDefinition;
import magic.model.MagicDeck;
import magic.translate.MText;
import magic.ui.MagicSound;
import magic.ui.ScreenController;
import magic.ui.deck.games.DeckGamesPanel;
import magic.ui.helpers.MouseHelper;
import magic.ui.widget.cards.table.CardsJTable;
import magic.ui.widget.deck.legality.LegalityPanel;
import magic.ui.widget.deck.stats.IPwlWorkerListener;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
class MainViewsPanel extends JPanel
implements IDeckEditorListener, IPwlWorkerListener {
// translatable strings
private static final String _S1 = "Deck";
private static final String _S2 = "Card Pool";
private static final String _S3 = "Card Recall";
private static final String _S4 = "Legality";
public static final int DECK_ACTION_PANEL_WIDTH = 40;
private final DeckEditorController controller = DeckEditorController.instance;
private final MigLayout miglayout = new MigLayout();
private final ToggleButtonsPanel toggleButtonsPanel = new ToggleButtonsPanel();
private final DeckActionPanel deckActionPanel;
private final DeckPanel deckPanel;
private final CardPoolViewPanel cardPoolPanel;
private final CardRecallPanel recallPanel;
private final LegalityPanel legalityPanel;
private final DeckGamesPanel statsPanel;
private IDeckEditorView activeView;
private final CardsJTable deckTable;
private final ContentPanel container;
private JToggleButton statsToggleButton;
MainViewsPanel(ContentPanel container) {
this.container = container;
deckActionPanel = new DeckActionPanel(getPlusButtonAction(), getMinusButtonAction());
deckPanel = new DeckPanel(this, deckActionPanel.getQuantityPanel());
cardPoolPanel = new CardPoolViewPanel(this, deckActionPanel.getQuantityPanel());
recallPanel = new CardRecallPanel(this, deckActionPanel.getQuantityPanel());
legalityPanel = new LegalityPanel();
statsPanel = new DeckGamesPanel(controller.getDeck());
this.deckTable = deckPanel.getDeckTable();
cardPoolPanel.setVisible(false);
recallPanel.setVisible(false);
legalityPanel.setVisible(false);
statsPanel.setVisible(false);
setLookAndFeel();
refreshLayout();
setView(deckPanel);
addPropertyChangeListeners();
addToggleButtons();
}
private AbstractAction getPlusButtonAction() {
return new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
activeView.doPlusButtonAction();
}
};
}
private AbstractAction getMinusButtonAction() {
return new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
activeView.doMinusButtonAction();
}
};
}
private void setOpenDecksScreenOnClick(JToggleButton btn) {
btn.addMouseListener(new MouseAdapter() {
private boolean isSelected;
@Override
public void mousePressed(MouseEvent e) {
isSelected = btn.isSelected();
}
@Override
public void mouseReleased(MouseEvent e) {
if (isSelected && SwingUtilities.isLeftMouseButton(e)) {
container.showDecksScreen();
}
}
});
}
private void addToggleButtons() {
JToggleButton btn = toggleButtonsPanel.addToggleButton(MText.get(_S1), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MouseHelper.showBusyCursor((Component) e.getSource());
deckPanel.setDeckTable(deckTable);
setView(deckPanel);
MouseHelper.showHandCursor((Component) e.getSource());
}
});
setOpenDecksScreenOnClick(btn);
toggleButtonsPanel.addToggleButton(MText.get(_S2), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MouseHelper.showBusyCursor((Component) e.getSource());
cardPoolPanel.setDeckTable(deckTable);
setView(cardPoolPanel);
MouseHelper.showHandCursor((Component) e.getSource());
}
});
toggleButtonsPanel.addToggleButton(MText.get(_S3), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MouseHelper.showBusyCursor((Component) e.getSource());
recallPanel.setDeckTable(deckTable);
setView(recallPanel);
MouseHelper.showHandCursor((Component) e.getSource());
}
});
if (ScreenController.isDuelActive() == false) {
toggleButtonsPanel.addToggleButton(MText.get(_S4), new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MouseHelper.showBusyCursor((Component) e.getSource());
setView(legalityPanel);
MouseHelper.showHandCursor((Component) e.getSource());
}
});
}
statsToggleButton = toggleButtonsPanel.addToggleButton("", new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
MouseHelper.showBusyCursor((Component) e.getSource());
setView(statsPanel);
MouseHelper.showHandCursor((Component) e.getSource());
}
});
statsToggleButton.setVisible(GeneralConfig.getInstance().isGameStatsEnabled());
toggleButtonsPanel.setSelectedToggleButton(MText.get(_S1));
toggleButtonsPanel.refreshLayout();
}
private void addPropertyChangeListeners() {
// DeckPanel
deckPanel.addPropertyChangeListener(
DeckPanel.CP_REMOVE_FROM_DECK,
evt -> doRemoveCardFromDeck(deckPanel.getSelectedCard())
);
deckPanel.addPropertyChangeListener(
DeckPanel.CP_ADD_TO_DECK,
evt -> doAddCardToDeck(deckPanel.getSelectedCard())
);
deckPanel.addPropertyChangeListener(
DeckPanel.CP_CARD_SELECTED,
evt -> container.cardSelected(getSelectedCard())
);
// CardRecallPanel
recallPanel.addPropertyChangeListener(
CardRecallPanel.CP_CARD_SELECTED,
evt -> container.cardSelected(getSelectedCard())
);
// LegalityPanel
legalityPanel.addPropertyChangeListener(
LegalityPanel.CP_CARD_SELECTED,
evt -> deckPanel.setSelectedCard(legalityPanel.getSelectedCard())
);
}
private void doAddCardToDeck(final MagicCardDefinition card) {
if (card != null && card != MagicCardDefinition.UNKNOWN) {
deckPanel.addCardToDeck(card);
recallPanel.addCardToRecall(card);
container.cardSelected(getSelectedCard());
MagicSound.ADD_CARD.play();
}
}
private void doRemoveCardFromDeck(final MagicCardDefinition card) {
if (card != null && card != MagicCardDefinition.UNKNOWN) {
deckPanel.removeCardFromDeck(card);
recallPanel.addCardToRecall(card);
container.cardSelected(getSelectedCard());
MagicSound.REMOVE_CARD.play();
}
}
private void refreshLayout() {
removeAll();
miglayout.setLayoutConstraints("insets 0, gap 0, flowx, wrap 2");
add(toggleButtonsPanel, "w 100%, h 34!, spanx 2");
add(deckActionPanel, "w " + DECK_ACTION_PANEL_WIDTH + "!, h 100%, hidemode 3");
add(deckPanel, "w 100%, h 100%, hidemode 3");
add(cardPoolPanel, "w 100%, h 100%, hidemode 3");
add(recallPanel, "w 100%, h 100%, hidemode 3");
add(legalityPanel, "w 100%, h 100%, hidemode 3");
add(statsPanel, "w 100%, h 100%, hidemode 3");
revalidate();
}
private void setView(IDeckEditorView aView) {
aView.notifyShowing();
deckActionPanel.setView(aView);
if (activeView != null) {
activeView.setVisible(false);
}
aView.setVisible(true);
deckActionPanel.setVisible(aView instanceof LegalityPanel == false
&& aView instanceof DeckGamesPanel == false
);
activeView = aView;
refreshLayout();
}
private void setLookAndFeel() {
setOpaque(false);
setLayout(miglayout);
}
MagicCardDefinition getSelectedCard() {
return activeView.getSelectedCard();
}
void doRefreshViews() {
deckPanel.doRefreshView();
legalityPanel.setDeck(controller.getDeck());
statsPanel.setDeck(controller.getDeck());
activeView.notifyShowing();
}
@Override
public void deckUpdated(MagicDeck deck) {
legalityPanel.setDeck(deck);
container.deckUpdated(deck);
}
@Override
public void cardSelected(MagicCardDefinition card) {
container.cardSelected(card);
}
@Override
public void addCardToRecall(MagicCardDefinition card) {
recallPanel.addCardToRecall(card);
}
@Override
public void setDeck(MagicDeck deck) {
doRefreshViews();
}
@Override
public void setPlayedWonLost(String pwl) {
statsToggleButton.setText(pwl);
}
}