package magic.ui.widget.duel.player;
import java.awt.Component;
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.swing.ButtonGroup;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import magic.model.MagicPlayerZone;
import magic.translate.MText;
import magic.ui.duel.viewerinfo.PlayerViewerInfo;
import magic.ui.screen.duel.game.SwingGameController;
import net.miginfocom.swing.MigLayout;
@SuppressWarnings("serial")
public class PlayerZoneButtonsPanel extends JPanel {
// translatable strings
private static final String _S1 = "Library";
private static ButtonGroup buttonGroup = new ButtonGroup();
private final Map<MagicPlayerZone, ZoneToggleButton> zoneButtons;
private final SwingGameController controller;
private final PlayerViewerInfo playerInfo;
public PlayerZoneButtonsPanel(final PlayerViewerInfo playerInfo, final SwingGameController controller) {
this.playerInfo = playerInfo;
this.controller = controller;
// LinkedHashMap so insertion order is retained.
zoneButtons = new LinkedHashMap<>();
zoneButtons.put(MagicPlayerZone.LIBRARY, getZoneToggleButton(
MagicPlayerZone.LIBRARY, playerInfo.library.size(), false)
);
zoneButtons.get(MagicPlayerZone.LIBRARY).setToolTipText(
String.format("<html><b>%s</b><br>%s</html>",
MText.get(_S1),
playerInfo.getQualifiedDeckName())
);
zoneButtons.put(MagicPlayerZone.HAND, getZoneToggleButton(
MagicPlayerZone.HAND, playerInfo.hand.size(), true)
);
zoneButtons.put(MagicPlayerZone.GRAVEYARD, getZoneToggleButton(
MagicPlayerZone.GRAVEYARD, playerInfo.graveyard.size(), true)
);
zoneButtons.put(MagicPlayerZone.EXILE, getZoneToggleButton(
MagicPlayerZone.EXILE, playerInfo.exile.size(), true)
);
setLayout(new MigLayout("insets 0 2 0 0"));
for (ZoneToggleButton button : zoneButtons.values()) {
add(button);
}
setOpaque(false);
}
private ZoneToggleButton getZoneToggleButton(final MagicPlayerZone zone, final int cardCount, final boolean isActive) {
final ZoneToggleButton btn = new ZoneToggleButton(zone, cardCount, isActive);
btn.addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (btn.isActive() && SwingUtilities.isLeftMouseButton(e)) {
controller.getPlayerZoneViewer().setPlayerZone(playerInfo, zone);
}
}
@Override
public void mouseEntered(MouseEvent ev) {
if (btn.isActive()) {
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}
}
@Override
public void mouseExited(MouseEvent e) {
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}
});
buttonGroup.add(btn);
return btn;
}
void updateDisplay(final PlayerViewerInfo playerInfo) {
if (playerInfo != null) {
zoneButtons.get(MagicPlayerZone.HAND).setNumberOfCardsInZone(playerInfo.hand.size());
zoneButtons.get(MagicPlayerZone.LIBRARY).setNumberOfCardsInZone(playerInfo.library.size());
zoneButtons.get(MagicPlayerZone.GRAVEYARD).setNumberOfCardsInZone(playerInfo.graveyard.size());
zoneButtons.get(MagicPlayerZone.EXILE).setNumberOfCardsInZone(playerInfo.exile.size());
}
}
public static void clearButtonGroup() {
buttonGroup = new ButtonGroup();
}
void setActiveZone(MagicPlayerZone zone) {
final ZoneToggleButton btn = zoneButtons.get(zone);
btn.setSelected(true);
if (zone == MagicPlayerZone.LIBRARY) {
btn.doAlertAnimation();
}
}
Rectangle getZoneButtonRectangle(MagicPlayerZone zone, Component canvas) {
final ZoneToggleButton btn = zoneButtons.get(zone);
final Point pointOnCanvas = SwingUtilities.convertPoint(this, btn.getLocation(), canvas);
return new Rectangle(pointOnCanvas.x, pointOnCanvas.y, btn.getWidth(), btn.getHeight());
}
void doFlashPlayerHandZoneButton() {
zoneButtons.get(MagicPlayerZone.HAND).doAlertAnimation();
}
void doFlashLibraryZoneButton() {
zoneButtons.get(MagicPlayerZone.LIBRARY).doAlertAnimation();
}
void doHighlightPlayerZone(MagicPlayerZone zone, boolean b) {
zoneButtons.get(zone).doHighlight(b);
}
}