/**
* CardDetailPanel.java
*
* Created on 17.02.2010
*/
package forge.gui.game;
import forge.*;
import javax.swing.*;
import javax.swing.border.EtchedBorder;
import java.awt.Color;
import java.awt.*;
import java.util.Iterator;
/**
* The class CardDetailPanel. Shows the details of a card.
*
* @author Clemens Koza
* @version V0.0 17.02.2010
*/
public class CardDetailPanel extends JPanel implements CardContainer {
/** Constant <code>serialVersionUID=-8461473263764812323L</code> */
private static final long serialVersionUID = -8461473263764812323L;
private static Color PURPLE = new Color(14381203);
private Card card;
private JLabel nameCostLabel;
private JLabel typeLabel;
private JLabel powerToughnessLabel;
private JLabel damageLabel;
private JLabel idLabel;
private JLabel setInfoLabel;
private JTextArea cdArea;
/**
* <p>Constructor for CardDetailPanel.</p>
*
* @param card a {@link forge.Card} object.
*/
public CardDetailPanel(Card card) {
setLayout(new GridLayout(2, 0, 0, 5));
setBorder(new EtchedBorder());
JPanel cdLabels = new JPanel(new GridLayout(0, 1, 0, 5));
cdLabels.add(nameCostLabel = new JLabel());
cdLabels.add(typeLabel = new JLabel());
cdLabels.add(powerToughnessLabel = new JLabel());
cdLabels.add(damageLabel = new JLabel());
JPanel IDR = new JPanel(new GridBagLayout());
GridBagConstraints c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.gridwidth = 2;
c.weightx = 1.0;
IDR.add(idLabel = new JLabel(), c);
c.gridwidth = 1;
c.weightx = 0.3;
IDR.add(setInfoLabel = new JLabel(), c);
cdLabels.add(IDR);
add(cdLabels);
nameCostLabel.setHorizontalAlignment(SwingConstants.CENTER);
typeLabel.setHorizontalAlignment(SwingConstants.CENTER);
powerToughnessLabel.setHorizontalAlignment(SwingConstants.CENTER);
//cdLabel7.setSize(100, cdLabel7.getHeight());
setInfoLabel.setHorizontalAlignment(SwingConstants.CENTER);
add(new JScrollPane(cdArea = new JTextArea(4, 12)));
cdArea.setLineWrap(true);
cdArea.setWrapStyleWord(true);
if (!Gui_NewGame.useLAFFonts.isSelected()) {
nameCostLabel.setFont(new java.awt.Font("Dialog", 0, 14));
typeLabel.setFont(new java.awt.Font("Dialog", 0, 14));
powerToughnessLabel.setFont(new java.awt.Font("Dialog", 0, 14));
damageLabel.setFont(new java.awt.Font("Dialog", 0, 14));
idLabel.setFont(new java.awt.Font("Dialog", 0, 14));
java.awt.Font f = new java.awt.Font("Dialog", 0, 14);
f = f.deriveFont(java.awt.Font.BOLD);
setInfoLabel.setFont(f);
cdArea.setFont(new java.awt.Font("Dialog", 0, 14));
}
setCard(card);
}
/** {@inheritDoc} */
public void setCard(Card card) {
nameCostLabel.setText("");
typeLabel.setText("");
powerToughnessLabel.setText("");
damageLabel.setText("");
idLabel.setText("");
setInfoLabel.setText("");
setInfoLabel.setOpaque(false);
setInfoLabel.setBorder(null);
cdArea.setText("");
setBorder(GuiDisplayUtil.getBorder(card));
this.card = card;
if (card == null) return;
boolean faceDown = card.isFaceDown() && card.getController() != AllZone.getHumanPlayer();
if (!faceDown) {
if (card.getManaCost().equals("") || card.isLand()) nameCostLabel.setText(card.getName());
else nameCostLabel.setText(card.getName() + " - " + card.getManaCost());
} else nameCostLabel.setText("Morph");
if (!faceDown) typeLabel.setText(GuiDisplayUtil.formatCardType(card));
else typeLabel.setText("Creature");
if (card.isCreature()) {
powerToughnessLabel.setText(card.getNetAttack() + " / " + card.getNetDefense());
damageLabel.setText("Damage: " + card.getDamage() + " Assigned Damage: " + card.getTotalAssignedDamage());
}
if (card.isPlaneswalker()) damageLabel.setText("Assigned Damage: " + card.getTotalAssignedDamage());
idLabel.setText("Card ID " + card.getUniqueNumber());
//rarity and set of a face down card should not be visible to the opponent
if (!card.isFaceDown() || card.getController().isHuman()) setInfoLabel.setText(card.getCurSetCode());
if (!setInfoLabel.getText().equals("")) {
setInfoLabel.setOpaque(true);
String csr = card.getCurSetRarity();
if (csr.equals("Common") || csr.equals("Land")) {
setInfoLabel.setBackground(Color.BLACK);
setInfoLabel.setForeground(Color.WHITE);
setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.WHITE));
} else if (csr.equals("Uncommon")) {
setInfoLabel.setBackground(Color.LIGHT_GRAY);
setInfoLabel.setForeground(Color.BLACK);
setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
} else if (csr.equals("Rare")) {
setInfoLabel.setBackground(Color.YELLOW);
setInfoLabel.setForeground(Color.BLACK);
setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
} else if (csr.equals("Mythic")) {
setInfoLabel.setBackground(Color.RED);
setInfoLabel.setForeground(Color.BLACK);
setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
} else if (csr.equals("Special")) {
// "Timeshifted" or other Special Rarity Cards
setInfoLabel.setBackground(PURPLE);
setInfoLabel.setForeground(Color.BLACK);
setInfoLabel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
}
//cdLabel7.setText(card.getCurSetCode());
}
//fill the card text
StringBuilder area = new StringBuilder();
//Token
if (card.isToken()) area.append("Token");
if (!faceDown) {
//card text
if (area.length() != 0) area.append("\n");
String text = card.getText();
//LEVEL [0-9]+-[0-9]+
//LEVEL [0-9]+\+
String regex = "LEVEL [0-9]+-[0-9]+ ";
text = text.replaceAll(regex, "$0\r\n");
regex = "LEVEL [0-9]+\\+ ";
text = text.replaceAll(regex, "\r\n$0\r\n");
//displays keywords that have dots in them a little better:
regex = "\\., ";
text = text.replaceAll(regex, ".\r\n");
area.append(text);
}
//counter text
Counters[] counters = Counters.values();
for (Counters counter : counters) {
if (card.getCounters(counter) != 0) {
if (area.length() != 0) area.append("\n");
area.append(counter.getName() + " counters: ");
area.append(card.getCounters(counter));
}
}
// Regeneration Shields
int regenShields = card.getShield();
if (regenShields > 0) {
if (area.length() != 0) area.append("\n");
area.append("Regeneration Shield(s): ").append(regenShields);
}
// Damage Prevention
int preventNextDamage = card.getPreventNextDamage();
if (preventNextDamage > 0) {
area.append("\n");
area.append("Prevent the next ").append(preventNextDamage).append(" damage that would be dealt to ");
area.append(card.getName()).append(" it this turn.");
}
//top revealed
if (card.hasKeyword("Play with the top card of your library revealed.")
&& !AllZoneUtil.getPlayerCardsInLibrary(card.getController()).isEmpty()) {
area.append("\r\nTop card: ");
area.append(AllZoneUtil.getPlayerCardsInLibrary(card.getController(), 1));
}
//chosen type
if (card.getChosenType() != "") {
if (area.length() != 0) area.append("\n");
area.append("(chosen type: ");
area.append(card.getChosenType());
area.append(")");
}
//chosen color
if (card.getChosenColor() != "") {
if (area.length() != 0) area.append("\n");
area.append("(chosen color: ");
area.append(card.getChosenColor());
area.append(")");
}
//named card
if (card.getNamedCard() != "") {
if (area.length() != 0) area.append("\n");
area.append("(named card: ");
area.append(card.getNamedCard());
area.append(")");
}
//equipping
if (card.getEquipping().size() > 0) {
if (area.length() != 0) area.append("\n");
area.append("=Equipping ");
area.append(card.getEquipping().get(0));
area.append("=");
}
//equipped by
if (card.getEquippedBy().size() > 0) {
if (area.length() != 0) area.append("\n");
area.append("=Equipped by ");
for (Iterator<Card> it = card.getEquippedBy().iterator(); it.hasNext(); ) {
area.append(it.next());
if (it.hasNext()) area.append(", ");
}
area.append("=");
}
//enchanting
if (card.getEnchanting().size() > 0) {
if (area.length() != 0) area.append("\n");
area.append("*Enchanting ");
if (card.getEnchanting().get(0).isFaceDown()
&& card.getEnchanting().get(0).getController().isComputer()) {
area.append("Morph (");
area.append(card.getEnchanting().get(0).getUniqueNumber());
area.append(")");
} else {
area.append(card.getEnchanting().get(0));
}
area.append("*");
}
//enchanted by
if (card.getEnchantedBy().size() > 0) {
if (area.length() != 0) area.append("\n");
area.append("*Enchanted by ");
for (Iterator<Card> it = card.getEnchantedBy().iterator(); it.hasNext(); ) {
area.append(it.next());
if (it.hasNext()) area.append(", ");
}
area.append("*");
}
//controlling
if (card.getGainControlTargets().size() > 0) {
if (area.length() != 0) area.append("\n");
area.append("+Controlling: ");
for (Iterator<Card> it = card.getGainControlTargets().iterator(); it.hasNext(); ) {
area.append(it.next());
if (it.hasNext()) area.append(", ");
}
area.append("+");
}
//cloned via
if (card.getCloneOrigin() != null) {
if (area.length() != 0) area.append("\n");
area.append("^Cloned via: ");
area.append(card.getCloneOrigin().getName());
area.append("^");
}
//Imprint
if (!card.getImprinted().isEmpty()) {
if (area.length() != 0) area.append("\n");
area.append("^Imprinting: ");
for (Iterator<Card> it = card.getImprinted().iterator(); it.hasNext(); ) {
area.append(it.next());
if (it.hasNext()) area.append(", ");
}
area.append("^");
}
//uncastable
if (card.isUnCastable()) {
if (area.length() != 0) area.append("\n");
area.append("This card can't be cast.");
}
if (card.hasAttachedCards()) {
if (area.length() != 0) area.append("\n");
Card[] cards = card.getAttachedCards();
area.append("=Attached: ");
for (Card c : cards) {
area.append(c.getName());
area.append(" ");
}
area.append("=");
}
cdArea.setText(area.toString());
}
/**
* <p>Getter for the field <code>card</code>.</p>
*
* @return a {@link forge.Card} object.
*/
public Card getCard() {
return card;
}
}