package magic.ui.widget.duel.player; import java.awt.Color; import java.awt.Component; import java.awt.Dimension; import java.awt.Font; import java.awt.Rectangle; import java.util.Set; import javax.swing.JLabel; import javax.swing.JPanel; import magic.data.GeneralConfig; import magic.model.MagicPlayerZone; import magic.ui.FontsAndBorders; import magic.ui.IChoiceViewer; import magic.ui.duel.viewerinfo.PlayerViewerInfo; import magic.ui.screen.duel.game.SwingGameController; import magic.ui.theme.ThemeFactory; import magic.ui.widget.PanelButton; import magic.ui.widget.TexturedPanel; import net.miginfocom.swing.MigLayout; @SuppressWarnings("serial") public class GamePlayerPanel extends TexturedPanel implements IChoiceViewer { private static final int PANEL_HEIGHT = 82; private PlayerViewerInfo playerInfo; private PlayerZoneButtonsPanel zoneButtonsPanel; private PlayerImagePanel avatarPanel; private final PanelButton avatarButton; private final PlayerCountersPanel countersPanel; public GamePlayerPanel(final SwingGameController controller, final PlayerViewerInfo playerInfo) { this.playerInfo = playerInfo; setBorder(FontsAndBorders.BLACK_BORDER); setPreferredSize(new Dimension(0, PANEL_HEIGHT)); setMinimumSize(getPreferredSize()); zoneButtonsPanel = new PlayerZoneButtonsPanel(playerInfo, controller); avatarPanel = new PlayerImagePanel(playerInfo); avatarPanel.setOpaque(false); avatarButton = new PanelButton() { @Override public Color getValidColor() { return ThemeFactory.getInstance().getCurrentTheme().getChoiceColor(); } @Override public void mouseClicked() { controller.processClick(playerInfo.player); } }; avatarButton.setComponent(avatarPanel); JPanel panel1 = new JPanel(new MigLayout("flowy, insets 0, gap 4 1, wrap 2")); panel1.setOpaque(false); panel1.add(avatarButton, "w 80!, h 80!, spany 2"); panel1.add(getPlayerLabel(), "gaptop 3"); panel1.add(zoneButtonsPanel, "w 100%, h 100%"); countersPanel = new PlayerCountersPanel(); panel1.add(countersPanel, "w 100%, h 100%, spany 2"); setLayout(new MigLayout("insets 0, gap 0")); add(panel1, "w 100%, h 100%"); if (controller != null) { controller.registerChoiceViewer(this); } } private JLabel getPlayerLabel() { final JLabel lbl = new JLabel(playerInfo.playerLabel); lbl.setFont(new Font("dialog", Font.PLAIN, 9)); return lbl; } private boolean isThisPlayerValidChoice(Set<?> validChoices) { return !validChoices.isEmpty() && validChoices.contains(playerInfo.player); } @Override public void showValidChoices(Set<?> validChoices) { final boolean isValid = isThisPlayerValidChoice(validChoices); if (GeneralConfig.getInstance().showGameplayAnimations()) { avatarPanel.doPulsingBorderAnimation(isValid); avatarButton.setValidNoOverlay(isValid); } else { avatarButton.setValid(isValid); } } public void updateDisplay(final PlayerViewerInfo playerInfo) { this.playerInfo = playerInfo; avatarPanel.updateDisplay(playerInfo); zoneButtonsPanel.updateDisplay(playerInfo); countersPanel.updateDisplay(playerInfo); } public void setActiveZone(MagicPlayerZone zone) { zoneButtonsPanel.setActiveZone(zone); } public PlayerViewerInfo getPlayerInfo() { return playerInfo; } public void doFlashPlayerHandZoneButton() { zoneButtonsPanel.doFlashPlayerHandZoneButton(); } public void doFlashLibraryZoneButton() { zoneButtonsPanel.doFlashLibraryZoneButton(); } public void doHighlightPlayerZone(MagicPlayerZone zone, boolean b) { zoneButtonsPanel.doHighlightPlayerZone(zone, b); } public Rectangle getLibraryButtonLayout(Component canvas) { return zoneButtonsPanel.getZoneButtonRectangle(MagicPlayerZone.LIBRARY, canvas); } public Rectangle getHandButtonLayout(Component canvas) { return zoneButtonsPanel.getZoneButtonRectangle(MagicPlayerZone.HAND, canvas); } }