package magic.ui.widget.deck.legality; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.DefaultListCellRenderer; import javax.swing.ImageIcon; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JPanel; import javax.swing.SwingConstants; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import magic.data.MagicFormat; import magic.data.MagicPredefinedFormat; import magic.data.MagicIcon; import magic.model.MagicDeck; import magic.ui.MagicImages; import magic.translate.MText; import magic.ui.widget.M.MScrollPane; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public class FormatsLegalityPanel extends JPanel { // translatable strings private static final String _S1 = "Formats"; // fired when selection changes. public static final String CP_FORMAT_SELECTED = "c8d61cfc-568a-488d-a0fb-f37ef1a39192"; private final MigLayout migLayout = new MigLayout(); private final MScrollPane scrollpane = new MScrollPane(); private final JList<DeckLegalityInfo> formatsJList = new JList<>(); private boolean isAdjusting = false; private int lastSelectedRow = 0; private final ListSelectionListener selectionListener; private final JLabel titleLabel; public FormatsLegalityPanel() { formatsJList.setFocusable(true); formatsJList.setCellRenderer(new FormatsListCellRenderer()); // add table to scroll pane scrollpane.setViewportView(formatsJList); scrollpane.setBackground(Color.WHITE); scrollpane.setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.DARK_GRAY)); titleLabel = new JLabel(MText.get(_S1)); titleLabel.setFont(getFont().deriveFont(Font.BOLD)); titleLabel.setHorizontalAlignment(SwingConstants.CENTER); titleLabel.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 1, Color.DARK_GRAY)); setLayout(migLayout); refreshLayout(); selectionListener = getListSelectionListener(); } private ListSelectionListener getListSelectionListener() { return new ListSelectionListener() { @Override public void valueChanged(ListSelectionEvent e) { isAdjusting = e.getValueIsAdjusting(); if (!isAdjusting) { lastSelectedRow = formatsJList.getSelectedIndex(); firePropertyChange(CP_FORMAT_SELECTED, false, true); } } }; } private void refreshLayout() { removeAll(); migLayout.setLayoutConstraints("flowy, insets 0, gap 0"); add(titleLabel, "w 100%, h 21!, hidemode 3"); add(scrollpane.component(), "w 100%, h 100%"); } void setDeck(MagicDeck aDeck) { formatsJList.removeListSelectionListener(selectionListener); formatsJList.setListData(getDeckFormatsLegality(aDeck)); formatsJList.addListSelectionListener(selectionListener); formatsJList.setSelectedIndex(lastSelectedRow); } MagicFormat getSelectedFormat() { if (formatsJList.getSelectedIndex() == -1) { return formatsJList.getModel().getElementAt(0).getFormat(); } else { return formatsJList.getModel().getElementAt(formatsJList.getSelectedIndex()).getFormat(); } } private DeckLegalityInfo[] getDeckFormatsLegality(final MagicDeck aDeck) { final List<DeckLegalityInfo> lst = new ArrayList<>(); for (MagicFormat aFormat : MagicPredefinedFormat.values()) { final DeckLegalityInfo deckLegality = new DeckLegalityInfo(aFormat); deckLegality.setIsLegal(aFormat.isDeckLegal(aDeck)); lst.add(deckLegality); } return lst.toArray(new DeckLegalityInfo[0]); } private class FormatsListCellRenderer extends DefaultListCellRenderer { private final ImageIcon LEGAL_ICON = MagicImages.getIcon(MagicIcon.LEGAL); private final ImageIcon ILLEGAL_ICON = MagicImages.getIcon(MagicIcon.ILLEGAL); private final Color ALT_BCOLOR = new Color(242, 242, 242); @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { final DeckLegalityInfo deckLegality = (DeckLegalityInfo) value; setText(" " + deckLegality.getFormat().getName()); if (deckLegality.isLegal()) { setIcon(LEGAL_ICON); setFont(getFont().deriveFont(Font.BOLD)); setForeground(isSelected ? list.getSelectionForeground() : list.getForeground()); } else { setIcon(ILLEGAL_ICON); setFont(getFont().deriveFont(Font.PLAIN)); setForeground(isSelected ? Color.LIGHT_GRAY : Color.GRAY); } setBackground(isSelected ? list.getSelectionBackground() : index % 2 == 0 ? list.getBackground() : ALT_BCOLOR ); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createMatteBorder(0, 0, 1, 0, Color.LIGHT_GRAY), BorderFactory.createEmptyBorder(0, 6, 0, 4)) ); setPreferredSize(new Dimension(getWidth(), 23)); return this; } } private class DeckLegalityInfo { private final MagicFormat magicFormat; private boolean isDeckLegal = true; DeckLegalityInfo(MagicFormat aFormat) { this.magicFormat = aFormat; } void setIsLegal(boolean b) { this.isDeckLegal = b; } boolean isLegal() { return isDeckLegal; } MagicFormat getFormat() { return magicFormat; } } }