/* * 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.Mek.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.JComponent; import javax.swing.JLabel; import javax.swing.JTextField; import javax.swing.SwingConstants; import megamek.common.Engine; import megamek.common.EquipmentType; import megamek.common.Mech; import megamek.common.MiscType; import megamek.common.Mounted; import megamek.common.TechConstants; import megamek.common.verifier.EntityVerifier; import megamek.common.verifier.TestMech; 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 txtGyroTon = new JTextField("?"); private JTextField txtCockpitTon = new JTextField("?"); private JTextField txtHeatTon = new JTextField("?"); private JTextField txtArmorTon = new JTextField("?"); private JTextField txtEnhanceTon = new JTextField("?"); private JTextField txtJumpTon = new JTextField("?"); private JTextField txtEquipTon = new JTextField("?"); private JTextField txtOtherTon = new JTextField("?"); private JTextField txtStructCrit = new JTextField("?"); private JTextField txtEngineCrit = new JTextField("?"); private JTextField txtGyroCrit = new JTextField("?"); private JTextField txtCockpitCrit = new JTextField("?"); private JTextField txtHeatCrit = new JTextField("?"); private JTextField txtArmorCrit = new JTextField("?"); private JTextField txtEnhanceCrit = new JTextField("?"); private JTextField txtJumpCrit = new JTextField("?"); private JTextField txtEquipCrit = new JTextField("?"); private JTextField txtOtherCrit = new JTextField("-"); private JTextField txtStructAvail = new JTextField("?"); private JTextField txtEngineAvail = new JTextField("?"); private JTextField txtGyroAvail = new JTextField("?"); private JTextField txtCockpitAvail = new JTextField("?"); private JTextField txtHeatAvail = new JTextField("?"); private JTextField txtArmorAvail = new JTextField("?"); private JTextField txtEnhanceAvail = new JTextField("?"); private JTextField txtJumpAvail = new JTextField("?"); private JTextField txtEquipAvail = new JTextField("?"); private JTextField txtOtherAvail = 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(txtGyroTon); valueFields.add(txtCockpitTon); valueFields.add(txtHeatTon); valueFields.add(txtArmorTon); valueFields.add(txtEnhanceTon); valueFields.add(txtJumpTon); valueFields.add(txtEquipTon); valueFields.add(txtOtherTon); valueFields.add(txtStructCrit); valueFields.add(txtEngineCrit); valueFields.add(txtGyroCrit); valueFields.add(txtCockpitCrit); valueFields.add(txtHeatCrit); valueFields.add(txtArmorCrit); valueFields.add(txtEnhanceCrit); valueFields.add(txtJumpCrit); valueFields.add(txtEquipCrit); valueFields.add(txtOtherCrit); 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(txtGyroAvail); valueFields.add(txtCockpitAvail); valueFields.add(txtHeatAvail); valueFields.add(txtArmorAvail); valueFields.add(txtEnhanceAvail); valueFields.add(txtJumpAvail); valueFields.add(txtEquipAvail); valueFields.add(txtOtherAvail); 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 = 1; this.add(createLabel("Internal Structure:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 2; this.add(createLabel("Engine:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 3; this.add(createLabel("Gyro:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 4; this.add(createLabel("Cockpit:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 5; this.add(createLabel("Heat Sinks:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 6; this.add(createLabel("Armor:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 7; this.add(createLabel("Enhancements:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 8; this.add(createLabel("Jump Jets:", size, SwingConstants.RIGHT), gbc); gbc.gridy = 9; this.add(createLabel("Equipment", size, SwingConstants.RIGHT), gbc); gbc.gridy = 10; this.add(createLabel("Other:", size, SwingConstants.RIGHT), gbc); size = new Dimension(45,25); gbc.gridx = 1; gbc.gridy = 0; gbc.insets = new Insets(0,0,0,0); this.add(createLabel("Ton", size, SwingConstants.CENTER), gbc); gbc.gridy = 1; this.add(txtStructTon, gbc); gbc.gridy = 2; this.add(txtEngineTon, gbc); gbc.gridy = 3; this.add(txtGyroTon, gbc); gbc.gridy = 4; this.add(txtCockpitTon, gbc); gbc.gridy = 5; this.add(txtHeatTon, gbc); gbc.gridy = 6; this.add(txtArmorTon, gbc); gbc.gridy = 7; this.add(txtEnhanceTon, gbc); gbc.gridy = 8; this.add(txtJumpTon, gbc); gbc.gridy = 9; this.add(txtEquipTon, gbc); gbc.gridy = 10; this.add(txtOtherTon, gbc); gbc.gridx = 2; gbc.gridy = 0; this.add(createLabel("Crit", size, SwingConstants.CENTER), gbc); gbc.gridy = 1; this.add(txtStructCrit, gbc); gbc.gridy = 2; this.add(txtEngineCrit, gbc); gbc.gridy = 3; this.add(txtGyroCrit, gbc); gbc.gridy = 4; this.add(txtCockpitCrit, gbc); gbc.gridy = 5; this.add(txtHeatCrit, gbc); gbc.gridy = 6; this.add(txtArmorCrit, gbc); gbc.gridy = 7; this.add(txtEnhanceCrit, gbc); gbc.gridy = 8; this.add(txtJumpCrit, gbc); gbc.gridy = 9; this.add(txtEquipCrit, gbc); gbc.gridy = 10; this.add(txtOtherCrit, gbc); size = new Dimension(80,25); gbc.gridx = 3; gbc.gridy = 0; this.add(createLabel("Availability", size, SwingConstants.CENTER), gbc); gbc.gridy = 1; this.add(txtStructAvail, gbc); gbc.gridy = 2; this.add(txtEngineAvail, gbc); gbc.gridy = 3; this.add(txtGyroAvail, gbc); gbc.gridy = 4; this.add(txtCockpitAvail, gbc); gbc.gridy = 5; this.add(txtHeatAvail, gbc); gbc.gridy = 6; this.add(txtArmorAvail, gbc); gbc.gridy = 7; this.add(txtEnhanceAvail, gbc); gbc.gridy = 8; this.add(txtJumpAvail, gbc); gbc.gridy = 9; this.add(txtEquipAvail, gbc); gbc.gridy = 10; this.add(txtOtherAvail, 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() { TestMech testMech = new TestMech(getMech(), entityVerifier.mechOption, null); txtGyroTon.setText(Double.toString(testMech.getWeightGyro())); txtEngineTon.setText(Double.toString(testMech.getWeightEngine())); txtCockpitTon.setText(Double.toString(testMech.getWeightCockpit())); txtHeatTon.setText(Double.toString(testMech.getWeightHeatSinks())); txtStructTon.setText(Double.toString(testMech.getWeightStructure())); txtArmorTon.setText(Double.toString(testMech.getWeightArmor())); txtOtherTon.setText(Double.toString(testMech.getWeightPowerAmp() + testMech.getWeightCarryingSpace() + testMech.getWeightMisc())); txtGyroCrit.setText(Integer.toString(getGyroCrits())); txtEngineCrit.setText(Integer.toString(getEngineCrits())); txtCockpitCrit.setText(Integer.toString(getCockpitCrits())); String structName = EquipmentType.getStructureTypeName(getMech().getStructureType(),TechConstants.isClan(getMech().getStructureTechLevel())); txtStructCrit.setText(Integer.toString(EquipmentType.get(structName).getCriticals(getMech()))); String armorName = EquipmentType.getArmorTypeName(getMech().getArmorType(0),TechConstants.isClan(getMech().getArmorTechLevel(0))); txtArmorCrit.setText(Integer.toString(EquipmentType.get(armorName).getCriticals(getMech()))); runThroughEquipment(testMech); int numberSinks = UnitUtil.countActualHeatSinks(getMech()); numberSinks = Math.max(0, numberSinks - UnitUtil.getCriticalFreeHeatSinks(getMech(), getMech().hasCompactHeatSinks())); int critSinks = numberSinks; if(UnitUtil.hasClanDoubleHeatSinks(getMech())) { critSinks = numberSinks * 2; } else if(getMech().hasDoubleHeatSinks()) { critSinks = numberSinks * 3; } else if(getMech().hasCompactHeatSinks()) { critSinks = (critSinks/2) + (critSinks%2); } txtHeatCrit.setText(Integer.toString(critSinks)); } private void runThroughEquipment(TestMech testMech) { double weightJJ = 0.0f; double weightEnhance = 0.0f; double weightEquip = 0.0f; int critJJ = 0; int critEquip = 0; int critEnhance = 0; for (Mounted m : getMech().getMisc()) { MiscType mt = (MiscType) m.getType(); if(UnitUtil.isArmorOrStructure(mt)) { continue; } else if (mt.hasFlag(MiscType.F_TSM) || mt.hasFlag(MiscType.F_INDUSTRIAL_TSM) || mt.hasFlag(MiscType.F_MASC)) { weightEnhance += mt.getTonnage(getMech(), m.getLocation()); critEnhance += UnitUtil.getCritsUsed(getMech(), mt); } else if (mt.hasFlag(MiscType.F_JUMP_JET) || mt.hasFlag(MiscType.F_JUMP_BOOSTER)) { weightJJ += mt.getTonnage(getMech(), m.getLocation()); critJJ += mt.getCriticals(getMech()); } else if (mt.hasFlag(MiscType.F_HEAT_SINK) || mt.hasFlag(MiscType.F_DOUBLE_HEAT_SINK)) { continue; } else { weightEquip += mt.getTonnage(getMech(), m.getLocation()); critEquip += mt.getCriticals(getMech()); } } for (Mounted m : getMech().getWeaponList()) { EquipmentType et = m.getType(); weightEquip += et.getTonnage(getMech()); critEquip += et.getCriticals(getMech()); } for (Mounted m : getMech().getAmmo()) { EquipmentType et = m.getType(); weightEquip += et.getTonnage(getMech()); critEquip += et.getCriticals(getMech()); } txtJumpTon.setText(Double.toString(weightJJ)); txtEnhanceTon.setText(Double.toString(weightEnhance)); txtEquipTon.setText(Double.toString(weightEquip)); txtJumpCrit.setText(Integer.toString(critJJ)); txtEnhanceCrit.setText(Integer.toString(critEnhance)); txtEquipCrit.setText(Integer.toString(critEquip)); } private int getGyroCrits() { switch(getMech().getGyroType()) { case Mech.GYRO_COMPACT: return 2; case Mech.GYRO_XL: return 6; default: return 4; } } private int getEngineCrits() { if (getMech().getEngine().getEngineType() == Engine.COMPACT_ENGINE) { return 3; } return 6 + (2 * getMech().getEngine().getSideTorsoCriticalSlots().length); } private int getCockpitCrits() { switch(getMech().getCockpitType()) { case Mech.COCKPIT_COMMAND_CONSOLE: return 2; default: return 1; } } }