package magic.ui.widget.deck.stats; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; 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.CardStatistics; import magic.data.GeneralConfig; import magic.data.MagicIcon; import magic.model.DuelPlayerConfig; import magic.model.MagicDeck; import magic.translate.MText; import magic.ui.FontsAndBorders; import magic.ui.MagicImages; import magic.ui.screen.widget.ActionBarButton; import magic.ui.widget.ActionButtonTitleBar; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public class DeckStatisticsViewer extends JPanel implements ChangeListener { public static final String CP_LAYOUT_CHANGED = "47395590-0c6a-4837-9dff-44a4ce19bb3c"; // translatable strings private static final String _S1 = "Deck Statistics"; private static final String _S2 = "%d card deck"; private final ActionButtonTitleBar titleBar; private final ManaCurvePanel manaCurvePanel; private final ActionBarButton titlebarButton; private final StatsTable statsTable; private String pwl = ""; private CardStatistics statistics; private MagicDeck thisDeck; public DeckStatisticsViewer() { setOpaque(false); titlebarButton = getLogViewActionButton(); titleBar = new ActionButtonTitleBar(MText.get(_S1), getLogActionButtons()); statsTable = new StatsTable(); manaCurvePanel = new ManaCurvePanel(); setStatsVisible(GeneralConfig.getInstance().isStatsVisible()); setDeck(new MagicDeck()); setLayout(new MigLayout( "flowy, insets 0, gap 0", "[center]" )); refreshLayout(); } private void refreshLayout() { removeAll(); add(titleBar, "w 100%"); add(statsTable, "hidemode 3"); add(manaCurvePanel, "gaptop 2, gapbottom 4, hidemode 3"); revalidate(); } private void setStatsVisible(boolean b) { statsTable.setVisible(b); manaCurvePanel.setVisible(b); titlebarButton.setIcon(b ? MagicImages.getIcon(MagicIcon.ARROW_DOWN) : MagicImages.getIcon(MagicIcon.ARROW_UP) ); } private void switchStatsVisibility() { GeneralConfig config = GeneralConfig.getInstance(); config.setStatsVisible(!config.isStatsVisible()); setStatsVisible(config.isStatsVisible()); refreshLayout(); firePropertyChange(CP_LAYOUT_CHANGED, true, false); } private ActionBarButton getLogViewActionButton() { return new ActionBarButton( new AbstractAction() { @Override public void actionPerformed(ActionEvent e) { switchStatsVisibility(); } } ); } private List<JButton> getLogActionButtons() { final List<JButton> btns = new ArrayList<>(); btns.add(titlebarButton); for (JButton btn : btns) { btn.setFocusable(false); } return btns; } private boolean isNewDeck(MagicDeck aDeck) { return thisDeck == null || !thisDeck.getName().equals(aDeck.getName()) || thisDeck.getDeckFileChecksum() != aDeck.getDeckFileChecksum() || thisDeck.getDeckType() != aDeck.getDeckType(); } public void setDeck(MagicDeck aDeck) { statistics = new CardStatistics( aDeck == null || !aDeck.isValid() ? new MagicDeck() : aDeck ); statsTable.setStats(statistics); manaCurvePanel.setStats(statistics); if (isNewDeck(aDeck)) { this.thisDeck = aDeck; } setPlayedWonLost(pwl); } public void setPlayedWonLost(String newPWL) { pwl = newPWL; titleBar.setText(MText.get(_S2, statistics.totalCards) + (!newPWL.isEmpty() ? " • " + newPWL : "") ); } @Override public void stateChanged(final ChangeEvent event) { setDeck(((DuelPlayerConfig)event.getSource()).getDeck()); } static JLabel getCaptionLabel(String text) { JLabel lbl = new JLabel(text); lbl.setFont(FontsAndBorders.FONT0); lbl.setHorizontalAlignment(SwingConstants.CENTER); return lbl; } }