/*
* UnitViewPanel
*
* Created on April 28, 2011, 11:32 PM
*/
package mekhq.gui.view;
import java.awt.Color;
import java.awt.Component;
import java.awt.Font;
import java.awt.Image;
import java.text.DecimalFormat;
import java.util.ResourceBundle;
import javax.swing.BorderFactory;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JTextArea;
import megamek.client.ui.swing.MechTileset;
import megamek.client.ui.swing.util.FluffImageHelper;
import megamek.client.ui.swing.util.PlayerColors;
import megamek.common.Entity;
import megamek.common.MechView;
import megamek.common.TechConstants;
import megamek.common.UnitType;
import megamek.common.util.DirectoryItems;
import megamek.common.util.EncodeControl;
import mekhq.campaign.Campaign;
import mekhq.campaign.unit.Unit;
import mekhq.gui.EntityImage;
/**
* A custom panel that gets filled in with goodies from a unit record
* @author Jay Lawson <jaylawson39 at yahoo.com>
*/
public class UnitViewPanel extends javax.swing.JPanel {
/**
*
*/
private static final long serialVersionUID = 7004741688464105277L;
private Unit unit;
private Entity entity;
private Campaign campaign;
private MechTileset mt;
private DirectoryItems camos;
private javax.swing.JLabel lblImage;
//private javax.swing.JPanel pnlStats;
private javax.swing.JTextPane txtReadout;
private JTextArea txtFluff;
private javax.swing.JPanel pnlStats;
private javax.swing.JLabel lblType;
private javax.swing.JLabel lblTech;
private javax.swing.JTextArea txtTech;
private javax.swing.JLabel lblTonnage;
private javax.swing.JTextArea txtTonnage;
private javax.swing.JLabel lblBV;
private javax.swing.JTextArea txtBV;
private javax.swing.JLabel lblCost;
private javax.swing.JTextArea txtCost;
private javax.swing.JLabel lblQuirk;
private javax.swing.JTextArea txtQuirk;
public UnitViewPanel(Unit u, Campaign c, DirectoryItems camos, MechTileset mt) {
unit = u;
entity = u.getEntity();
campaign = c;
this.camos = camos;
this.mt = mt;
initComponents();
//setMinimumSize(new Dimension(400, 200));
}
private void initComponents() {
java.awt.GridBagConstraints gridBagConstraints;
lblImage = new javax.swing.JLabel();
txtReadout = new javax.swing.JTextPane();
txtFluff = new javax.swing.JTextArea();
pnlStats = new javax.swing.JPanel();
ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.UnitViewPanel", new EncodeControl()); //$NON-NLS-1$
setLayout(new java.awt.GridBagLayout());
setBackground(Color.WHITE);
lblImage.setName("lblImage"); // NOI18N
lblImage.setBackground(Color.WHITE);
Image image = FluffImageHelper.getFluffImage(entity);
if(null == image) {
image = getImageFor(unit, lblImage);
}
Icon icon = null;
if(null != image) {
if(image.getWidth(lblImage) > 200) {
image = image.getScaledInstance(200, -1, Image.SCALE_DEFAULT);
}
icon = new ImageIcon(image);
lblImage.setIcon(icon);
}
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.CENTER;
add(lblImage, gridBagConstraints);
pnlStats.setName("pnlBasic");
pnlStats.setBorder(BorderFactory.createTitledBorder(unit.getName()));
pnlStats.setBackground(Color.WHITE);
fillStats(resourceMap);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 0;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(pnlStats, gridBagConstraints);
MechView mview = new MechView(entity, false, true);
txtReadout.setName("txtReadout");
txtReadout.setContentType(resourceMap.getString("txtReadout.contentType")); // NOI18N
txtReadout.setEditable(false);
txtReadout.setFont(Font.decode(resourceMap.getString("txtReadout.font"))); // NOI18N
txtReadout.setText("<div style='font: 12pt monospaced'>" + mview.getMechReadoutBasic() + "<br>" + mview.getMechReadoutLoadout() + "</div>");
txtReadout.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Technical Readout"),
BorderFactory.createEmptyBorder(5,5,5,5)));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
if(unit.getHistory().length() == 0) {
gridBagConstraints.weighty = 1.0;
}
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(txtReadout, gridBagConstraints);
if(unit.getHistory().length() > 0) {
txtFluff.setName("txtFluff");
txtFluff.setEditable(false);
txtFluff.setLineWrap(true);
txtFluff.setWrapStyleWord(true);
txtFluff.setText(unit.getHistory());
txtFluff.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder("Unit History"),
BorderFactory.createEmptyBorder(5,5,5,5)));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(5, 5, 5, 5);
gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
add(txtFluff, gridBagConstraints);
}
}
private void fillStats(ResourceBundle resourceMap) {
lblType = new javax.swing.JLabel();
lblTech = new javax.swing.JLabel();
txtTech = new javax.swing.JTextArea();
lblTonnage = new javax.swing.JLabel();
txtTonnage = new javax.swing.JTextArea();
lblBV = new javax.swing.JLabel();
txtBV = new javax.swing.JTextArea();
lblCost = new javax.swing.JLabel();
txtCost = new javax.swing.JTextArea();
lblQuirk = new javax.swing.JLabel();
txtQuirk = new javax.swing.JTextArea();
java.awt.GridBagConstraints gridBagConstraints;
pnlStats.setLayout(new java.awt.GridBagLayout());
lblType.setName("lblType"); // NOI18N
lblType.setText("<html><i>" + UnitType.getTypeDisplayableName(UnitType.determineUnitTypeCode(entity)) + "</i></html>");
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 0;
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 0.0;
gridBagConstraints.insets = new java.awt.Insets(0, 0, 5, 0);
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(lblType, gridBagConstraints);
lblTech.setName("lblTech1"); // NOI18N
lblTech.setText(resourceMap.getString("lblTech1.text"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 1;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(lblTech, gridBagConstraints);
txtTech.setName("lblTech2"); // NOI18N
txtTech.setText(TechConstants.getLevelDisplayableName(entity.getTechLevel()));
txtTech.setEditable(false);
txtTech.setLineWrap(true);
txtTech.setWrapStyleWord(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 1;
gridBagConstraints.weightx = 0.5;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(txtTech, gridBagConstraints);
lblTonnage.setName("lblTonnage1"); // NOI18N
lblTonnage.setText(resourceMap.getString("lblTonnage1.text"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 2;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(lblTonnage, gridBagConstraints);
txtTonnage.setName("lblTonnage2"); // NOI18N
txtTonnage.setText(Double.toString(entity.getWeight()));
txtTonnage.setEditable(false);
txtTonnage.setLineWrap(true);
txtTonnage.setWrapStyleWord(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 2;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(txtTonnage, gridBagConstraints);
lblBV.setName("lblBV1"); // NOI18N
lblBV.setText(resourceMap.getString("lblBV1.text"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 3;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(lblBV, gridBagConstraints);
txtBV.setName("lblBV2"); // NOI18N
txtBV.setText(Integer.toString(entity.calculateBattleValue(true, true)));
txtBV.setEditable(false);
txtBV.setLineWrap(true);
txtBV.setWrapStyleWord(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 3;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(txtBV, gridBagConstraints);
double weight = 1.0;
if(campaign.getCampaignOptions().useQuirks() && entity.countQuirks() > 0) {
weight = 0.0;
}
lblCost.setName("lblCost1"); // NOI18N
lblCost.setText(resourceMap.getString("lblCost1.text"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 4;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(lblCost, gridBagConstraints);
txtCost.setName("lblCost2"); // NOI18N
DecimalFormat format = new DecimalFormat();
txtCost.setText(format.format(unit.getSellValue()));
txtCost.setEditable(false);
txtCost.setLineWrap(true);
txtCost.setWrapStyleWord(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 4;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = weight;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(txtCost, gridBagConstraints);
if(campaign.getCampaignOptions().useQuirks() && entity.countQuirks() > 0) {
lblQuirk.setName("lblQuirk1"); // NOI18N
lblQuirk.setText(resourceMap.getString("lblQuirk1.text"));
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 0;
gridBagConstraints.gridy = 5;
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(lblQuirk, gridBagConstraints);
txtQuirk.setName("lblQuirk2"); // NOI18N
txtQuirk.setText(unit.getQuirksList());
txtQuirk.setEditable(false);
txtQuirk.setLineWrap(true);
txtQuirk.setWrapStyleWord(true);
gridBagConstraints = new java.awt.GridBagConstraints();
gridBagConstraints.gridx = 1;
gridBagConstraints.gridy = 5;
gridBagConstraints.weightx = 1.0;
gridBagConstraints.weighty = 1.0;
gridBagConstraints.insets = new java.awt.Insets(0, 10, 0, 0);
gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTHWEST;
pnlStats.add(txtQuirk, gridBagConstraints);
}
}
private Image getImageFor(Unit u, Component c) {
if(null == mt) {
return null;
}
Image base = mt.imageFor(u.getEntity(), c, -1);
int tint = PlayerColors.getColorRGB(u.campaign.getColorIndex());
EntityImage entityImage = new EntityImage(base, tint, getCamo(u), c);
return entityImage.loadPreviewImage();
}
private Image getCamo(Unit unit) {
// Try to get the player's camo file.
Image camo = null;
try {
camo = (Image) camos.getItem(unit.getCamoCategory(), unit.getCamoFileName());
} catch (Exception err) {
err.printStackTrace();
}
return camo;
}
}