/*
* MegaMekLab - Copyright (C) 2008
*
* Original author - jtighe (torren@users.sourceforge.net)
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
package megameklab.com.ui.Vehicle.views;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.io.File;
import java.util.Vector;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import megamek.common.Engine;
import megamek.common.EquipmentType;
import megamek.common.MiscType;
import megamek.common.Mounted;
import megamek.common.TechConstants;
import megamek.common.verifier.EntityVerifier;
import megamek.common.verifier.TestTank;
import megameklab.com.ui.EntitySource;
import megameklab.com.util.IView;
import megameklab.com.util.UnitUtil;
public class SummaryView extends IView{
/**
*
*/
private static final long serialVersionUID = -8492419359401770037L;
private JTextField txtStructTon = new JTextField("?");
private JTextField txtEngineTon = new JTextField("?");
private JTextField txtLiftTon = new JTextField("?");
private JTextField txtControlsTon = new JTextField("?");
private JTextField txtJumpTon = new JTextField("?");
private JTextField txtHeatTon = new JTextField("?");
private JTextField txtArmorTon = new JTextField("?");
private JTextField txtTurretTon = new JTextField("?");
private JTextField txtRearTurretTon = new JTextField("?");
private JTextField txtSponsonTon = new JTextField("?");
private JTextField txtPowerAmpTon = new JTextField("?");
private JTextField txtEquipTon = new JTextField("?");
private JTextField txtEngineCrit = new JTextField("?");
private JTextField txtJumpCrit = new JTextField("?");
private JTextField txtArmorCrit = new JTextField("?");
private JTextField txtStructAvail = new JTextField("?");
private JTextField txtEngineAvail = new JTextField("?");
private JTextField txtLiftAvail = new JTextField("?");
private JTextField txtControlsAvail = new JTextField("?");
private JTextField txtJumpAvail = new JTextField("?");
private JTextField txtHeatAvail = new JTextField("?");
private JTextField txtArmorAvail = new JTextField("?");
private JTextField txtTurretAvail = new JTextField("?");
private JTextField txtRearTurretAvail = new JTextField("?");
private JTextField txtSponsonAvail = new JTextField("?");
private JTextField txtPowerAmpAvail = new JTextField("?");
private JTextField txtEquipAvail = new JTextField("?");
private EntityVerifier entityVerifier = EntityVerifier.getInstance(new File("data/mechfiles/UnitVerifierOptions.xml"));
public SummaryView(EntitySource eSource) {
super(eSource);
Vector<JTextField> valueFields = new Vector<JTextField>();
valueFields.add(txtStructTon);
valueFields.add(txtEngineTon);
valueFields.add(txtLiftTon);
valueFields.add(txtControlsTon);
valueFields.add(txtHeatTon);
valueFields.add(txtJumpTon);
valueFields.add(txtArmorTon);
valueFields.add(txtTurretTon);
valueFields.add(txtRearTurretTon);
valueFields.add(txtSponsonTon);
valueFields.add(txtPowerAmpTon);
valueFields.add(txtEquipTon);
valueFields.add(txtEngineCrit);
valueFields.add(txtArmorCrit);
valueFields.add(txtJumpCrit);
Dimension size = new Dimension(45,25);
for(JTextField field : valueFields) {
field.setEditable(false);
field.setSize(size);
field.setPreferredSize(size);
field.setMinimumSize(size);
field.setMaximumSize(size);
field.setHorizontalAlignment(SwingConstants.RIGHT);
}
valueFields.removeAllElements();
valueFields.add(txtStructAvail);
valueFields.add(txtEngineAvail);
valueFields.add(txtLiftAvail);
valueFields.add(txtControlsAvail);
valueFields.add(txtJumpAvail);
valueFields.add(txtHeatAvail);
valueFields.add(txtArmorAvail);
valueFields.add(txtTurretAvail);
valueFields.add(txtRearTurretAvail);
valueFields.add(txtSponsonAvail);
valueFields.add(txtPowerAmpAvail);
valueFields.add(txtEquipAvail);
size = new Dimension(80,25);
for(JTextField field : valueFields) {
field.setEditable(false);
field.setSize(size);
field.setPreferredSize(size);
field.setMinimumSize(size);
field.setMaximumSize(size);
}
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
size = new Dimension(120,25);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(0,0,0,5);
this.add(createLabel("Category", size, SwingConstants.CENTER), gbc);
gbc.gridy++;
this.add(createLabel("Internal Structure:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Engine:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Lift/Dive/Rotor:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Controls:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Jump Jets:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Heat Sinks:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Armor:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Turret:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Rear Turret:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Sponsons", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Power Amplifiers:", size, SwingConstants.RIGHT), gbc);
gbc.gridy++;
this.add(createLabel("Equipment:", size, SwingConstants.RIGHT), gbc);
size = new Dimension(45,25);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.insets = new Insets(0,0,0,1);
this.add(createLabel("Ton", size, SwingConstants.CENTER), gbc);
gbc.gridy++;
this.add(txtStructTon, gbc);
gbc.gridy++;
this.add(txtEngineTon, gbc);
gbc.gridy++;
this.add(txtLiftTon, gbc);
gbc.gridy++;
this.add(txtControlsTon, gbc);
gbc.gridy++;
this.add(txtJumpTon, gbc);
gbc.gridy++;
this.add(txtHeatTon, gbc);
gbc.gridy++;
this.add(txtArmorTon, gbc);
gbc.gridy++;
this.add(txtTurretTon, gbc);
gbc.gridy++;
this.add(txtRearTurretTon, gbc);
gbc.gridy++;
this.add(txtSponsonTon, gbc);
gbc.gridy++;
this.add(txtPowerAmpTon, gbc);
gbc.gridy++;
this.add(txtEquipTon, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
this.add(createLabel("Crit", size, SwingConstants.CENTER), gbc);
gbc.gridy++;
// Structure
gbc.gridy++;
this.add(txtEngineCrit, gbc);
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Lift
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Controls
gbc.gridy++;
this.add(txtJumpCrit, gbc);
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Heat sinks
gbc.gridy++;
this.add(txtArmorCrit, gbc);
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Turret
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Rear Turret
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Sponsons
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Power Amps
gbc.gridy++;
this.add(Box.createGlue(), gbc);
// Equipment
gbc.gridy++;
this.add(Box.createGlue(), gbc);
size = new Dimension(80,25);
gbc.gridx = 3;
gbc.gridy = 0;
this.add(createLabel("Availability", size, SwingConstants.CENTER), gbc);
gbc.gridy++;
this.add(txtStructAvail, gbc);
gbc.gridy++;
this.add(txtEngineAvail, gbc);
gbc.gridy++;
this.add(txtLiftAvail, gbc);
gbc.gridy++;
this.add(txtControlsAvail, gbc);
gbc.gridy++;
this.add(txtJumpAvail, gbc);
gbc.gridy++;
this.add(txtHeatAvail, gbc);
gbc.gridy++;
this.add(txtArmorAvail, gbc);
gbc.gridy++;
this.add(txtTurretAvail, gbc);
gbc.gridy++;
this.add(txtRearTurretAvail, gbc);
gbc.gridy++;
this.add(txtSponsonAvail, gbc);
gbc.gridy++;
this.add(txtPowerAmpAvail, gbc);
gbc.gridy++;
this.add(txtEquipAvail, gbc);
setBorder(BorderFactory.createTitledBorder("Summary"));
}
private JLabel createLabel(String text, Dimension size, int align) {
JLabel label = new JLabel(text, SwingConstants.TRAILING);
setFieldSize(label, size);
label.setHorizontalAlignment(align);
return label;
}
public void setFieldSize(JComponent box, Dimension maxSize) {
box.setPreferredSize(maxSize);
box.setMaximumSize(maxSize);
box.setMinimumSize(maxSize);
}
public void refresh() {
TestTank testTank = new TestTank(getTank(), entityVerifier.mechOption, null);
txtStructTon.setText(Double.toString(testTank.getWeightStructure()));
txtEngineTon.setText(Double.toString(testTank.getWeightEngine()));
txtLiftTon.setText(Double.toString(testTank.getTankWeightLifting()));
txtControlsTon.setText(Double.toString(testTank.getWeightControls()));
txtHeatTon.setText(Double.toString(testTank.getWeightHeatSinks()));
txtArmorTon.setText(Double.toString(testTank.getWeightArmor()));
txtTurretTon.setText(Double.toString(testTank.getTankWeightTurret()));
txtRearTurretTon.setText(Double.toString(testTank.getTankWeightDualTurret()));
// Sponsons?
txtPowerAmpTon.setText(Double.toString(testTank.getWeightPowerAmp()));
txtEngineCrit.setText(Integer.toString(getEngineCrits()));
txtArmorCrit.setText(Integer.toString(getArmorCrits()));
txtJumpCrit.setText(Integer.toString(0));
runThroughEquipment(testTank);
}
private void runThroughEquipment(TestTank testTank) {
double weightJJ = 0.0f;
double weightEquip = 0.0f;
double weightSponson = 0.0f;
for (Mounted m : getTank().getMisc()) {
MiscType mt = (MiscType) m.getType();
if(UnitUtil.isArmorOrStructure(mt)) {
continue;
}
else if (mt.hasFlag(MiscType.F_SPONSON_TURRET)) {
weightSponson = mt.getTonnage(getTank());
} else if (mt.hasFlag(MiscType.F_JUMP_JET)) {
weightJJ += mt.getTonnage(getTank(), m.getLocation());
} else if (mt.hasFlag(MiscType.F_HEAT_SINK)
|| mt.hasFlag(MiscType.F_DOUBLE_HEAT_SINK)) {
continue;
}
else {
weightEquip += mt.getTonnage(getTank(), m.getLocation());
}
}
for (Mounted m : getTank().getWeaponList()) {
EquipmentType et = m.getType();
weightEquip += et.getTonnage(getTank());
}
for (Mounted m : getTank().getAmmo()) {
EquipmentType et = m.getType();
weightEquip += et.getTonnage(getTank());
}
txtJumpTon.setText(Double.toString(weightJJ));
txtEquipTon.setText(Double.toString(weightEquip));
txtSponsonTon.setText(Double.toString(weightSponson));
if (weightJJ > 0) {
txtJumpCrit.setText(Integer.toString(1));
} else {
txtJumpCrit.setText(Integer.toString(0));
}
}
private int getEngineCrits() {
Engine engine = getTank().getEngine();
int usedSlots = 0;
if (engine.isFusion()) {
if (engine.getEngineType() == Engine.LIGHT_ENGINE) {
usedSlots++;
}
if (engine.getEngineType() == Engine.XL_ENGINE) {
if (engine.hasFlag(Engine.CLAN_ENGINE)) {
usedSlots++;
} else {
usedSlots += 2;
}
}
if (engine.getEngineType() == Engine.XXL_ENGINE) {
if (engine.hasFlag(Engine.CLAN_ENGINE)) {
usedSlots += 2;
} else {
usedSlots += 4;
}
}
}
if (engine.hasFlag(Engine.LARGE_ENGINE)) {
usedSlots++;
}
if (engine.getEngineType() == Engine.COMPACT_ENGINE) {
usedSlots--;
}
return usedSlots;
}
private int getArmorCrits() {
// different armor types take different amount of slots
int usedSlots = 0;
if (!getTank().hasPatchworkArmor()) {
int type = getTank().getArmorType(1);
switch (type) {
case EquipmentType.T_ARMOR_FERRO_FIBROUS:
if (TechConstants.isClan(getTank().getArmorTechLevel(1))) {
usedSlots++;
} else {
usedSlots += 2;
}
break;
case EquipmentType.T_ARMOR_HEAVY_FERRO:
usedSlots += 3;
break;
case EquipmentType.T_ARMOR_LIGHT_FERRO:
case EquipmentType.T_ARMOR_FERRO_LAMELLOR:
case EquipmentType.T_ARMOR_REFLECTIVE:
case EquipmentType.T_ARMOR_HARDENED:
usedSlots++;
break;
case EquipmentType.T_ARMOR_STEALTH:
usedSlots += 2;
break;
case EquipmentType.T_ARMOR_REACTIVE:
if (TechConstants.isClan(getTank().getArmorTechLevel(1))) {
usedSlots++;
} else {
usedSlots += 2;
}
break;
default:
break;
}
}
return usedSlots;
}
}