package magic.ui.widget.deck.stats; import java.awt.Color; import java.awt.Image; import java.util.HashMap; import java.util.Map; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JPanel; import magic.data.CardStatistics; import magic.data.MagicIcon; import magic.model.MagicColor; import magic.model.MagicManaType; import magic.translate.MText; import magic.ui.MagicImages; import magic.ui.helpers.ImageHelper; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") class StatsTable extends JPanel { // translatable strings private static final String _S1 = "Land"; private static final String _S2 = "Creature"; private static final String _S3 = "Artifact"; private static final String _S4 = "Enchantment"; private static final String _S5 = "Instant"; private static final String _S6 = "Sorcery"; private static final String _S7 = "Planeswalker"; private static final String _S8 = "Colorless"; private static final String _S9 = "Mono-color"; private static final String _S10 = "Multi-color"; private static final String _S11 = "Total"; private static final ImageIcon[] manaIconOn = new ImageIcon[MagicColor.values().length]; private static final ImageIcon[] manaIconOff = new ImageIcon[MagicColor.values().length]; private static final Map<MagicIcon, ImageIcon> typeIconOff = new HashMap<>(); static { setManaIcons(); setTypeOffIcons(); } StatsTable() { setOpaque(false); setLayout(new MigLayout("flowy, insets 0 2 2 2, gap 0")); } private static void setManaIcons() { for (MagicColor color : MagicColor.values()) { final ImageIcon colorIcon = MagicImages.getIcon(color.getManaType()); manaIconOn[color.ordinal()] = colorIcon; final Image gsImage = ImageHelper.getGreyScaleImage(colorIcon.getImage()); manaIconOff[color.ordinal()] = new ImageIcon(ImageHelper.getTranslucentImage(gsImage, 0.3f)); } } private static void setTypeOffIcons() { for (MagicIcon icon : MagicIcon.TYPE_ICONS) { final ImageIcon colorIcon = MagicImages.getIcon(icon); final Image fadedImage = ImageHelper.getTranslucentImage(colorIcon.getImage(), 0.2f); typeIconOff.put(icon, new ImageIcon(fadedImage)); } } private JLabel getLabel(String text, boolean isEnabled) { JLabel lbl = new JLabel(isEnabled ? text : "—"); lbl.setForeground(!isEnabled ? Color.LIGHT_GRAY : lbl.getForeground()); return lbl; } private JLabel getValueLabel(int value, boolean isEnabled) { JLabel lbl = getLabel(Integer.toString(value), isEnabled); lbl.setForeground(value == 0 && isEnabled ? Color.GRAY : lbl.getForeground()); return lbl; } private JLabel getValueLabel(int value) { return getValueLabel(value, value > 0); } private JLabel getPercentageLabel(CardStatistics stats, int total) { final int percentage = (int) Math.round(((double) total / stats.totalCards) * 100); JLabel lbl = getValueLabel(percentage, percentage > 0); lbl.setFont(lbl.getFont().deriveFont(10f)); return lbl; } private JLabel getHeadingLabel(MagicIcon icon, String tooltip, int value) { JLabel lbl = new JLabel(value == 0 ? typeIconOff.get(icon) : MagicImages.getIcon(icon)); lbl.setToolTipText(tooltip); return lbl; } private JLabel getHeadingLabel(MagicManaType mana, String tooltip) { JLabel lbl = new JLabel(MagicImages.getIcon(mana)); lbl.setToolTipText(tooltip); return lbl; } private JLabel getHeadingLabel(String text, String tooltip) { JLabel lbl = new JLabel(text); lbl.setToolTipText(tooltip); return lbl; } void setStats(CardStatistics stats) { final MigLayout mig = new MigLayout("wrap 12, gapx 5"); mig.setColumnConstraints("[center][20!, center]"); mig.setRowConstraints("[][]0[]6[][]"); final JPanel panel = new JPanel(mig); panel.setOpaque(false); // headings panel.add(new JLabel()); panel.add(getHeadingLabel("Σ", MText.get(_S11))); panel.add(getHeadingLabel(MagicIcon.LAND, MText.get(_S1), stats.totalTypes[0])); panel.add(getHeadingLabel(MagicIcon.CREATURE, MText.get(_S2), stats.totalTypes[1])); panel.add(getHeadingLabel(MagicIcon.ARTIFACT, MText.get(_S3), stats.totalTypes[2])); panel.add(getHeadingLabel(MagicIcon.ENCHANTMENT, MText.get(_S4), stats.totalTypes[3])); panel.add(getHeadingLabel(MagicIcon.INSTANT, MText.get(_S5), stats.totalTypes[4])); panel.add(getHeadingLabel(MagicIcon.SORCERY, MText.get(_S6), stats.totalTypes[5])); panel.add(getHeadingLabel(MagicIcon.PLANESWALKER, MText.get(_S7), stats.totalTypes[6])); panel.add(getHeadingLabel(MagicManaType.Colorless, MText.get(_S8))); panel.add(getHeadingLabel("=1", MText.get(_S9))); panel.add(getHeadingLabel(">1", MText.get(_S10))); // totals panel.add(new JLabel("Σ")); panel.add(getValueLabel(stats.totalCards)); panel.add(getValueLabel(stats.totalTypes[0])); panel.add(getValueLabel(stats.totalTypes[1])); panel.add(getValueLabel(stats.totalTypes[2])); panel.add(getValueLabel(stats.totalTypes[3])); panel.add(getValueLabel(stats.totalTypes[4])); panel.add(getValueLabel(stats.totalTypes[5])); panel.add(getValueLabel(stats.totalTypes[6])); panel.add(getValueLabel(stats.colorless)); panel.add(getValueLabel(stats.monoColor)); panel.add(getValueLabel(stats.multiColor)); // % panel.add(new JLabel("%")); panel.add(getPercentageLabel(stats, stats.totalCards)); panel.add(getPercentageLabel(stats, stats.totalTypes[0])); panel.add(getPercentageLabel(stats, stats.totalTypes[1])); panel.add(getPercentageLabel(stats, stats.totalTypes[2])); panel.add(getPercentageLabel(stats, stats.totalTypes[3])); panel.add(getPercentageLabel(stats, stats.totalTypes[4])); panel.add(getPercentageLabel(stats, stats.totalTypes[5])); panel.add(getPercentageLabel(stats, stats.totalTypes[6])); panel.add(getPercentageLabel(stats, stats.colorless)); panel.add(getPercentageLabel(stats, stats.monoColor)); panel.add(getPercentageLabel(stats, stats.multiColor)); for (int i = 0; i < stats.colorCount.length; i++) { final boolean hasColor = stats.colorCount[i] > 0; final JLabel label = new JLabel(); if (hasColor) { label.setIcon(manaIconOn[i]); } else { label.setIcon(manaIconOff[i]); label.setForeground(Color.GRAY); } panel.add(label); panel.add(getValueLabel(stats.colorCount[i], hasColor)); panel.add(getValueLabel(stats.colorLands[i], hasColor && stats.totalTypes[0] > 0)); panel.add(getValueLabel(stats.colorCreatures[i], hasColor && stats.totalTypes[1] > 0)); panel.add(getValueLabel(stats.colorArtifacts[i], hasColor && stats.totalTypes[2] > 0)); panel.add(getValueLabel(stats.colorEnchantments[i], hasColor && stats.totalTypes[3] > 0)); panel.add(getValueLabel(stats.colorInstants[i], hasColor && stats.totalTypes[4] > 0)); panel.add(getValueLabel(stats.colorSorcery[i], hasColor && stats.totalTypes[5] > 0)); panel.add(getValueLabel(stats.colorPlaneswalkers[i], hasColor && stats.totalTypes[6] > 0)); panel.add(getLabel("---", false)); panel.add(getValueLabel(stats.colorMono[i], hasColor)); panel.add(getLabel("---", false)); } removeAll(); add(panel); revalidate(); } }