/*
* MegaMekLab - Copyright (C) 2009
*
* 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.tabs;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.SwingConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import megamek.client.ui.GBC;
import megamek.common.Engine;
import megamek.common.EntityMovementMode;
import megamek.common.EquipmentType;
import megamek.common.LocationFullException;
import megamek.common.MiscType;
import megamek.common.Mounted;
import megamek.common.SuperHeavyTank;
import megamek.common.Tank;
import megamek.common.TechConstants;
import megamek.common.TroopSpace;
import megamek.common.VTOL;
import megamek.common.WeaponType;
import megamek.common.verifier.EntityVerifier;
import megamek.common.verifier.TestEntity;
import megamek.common.verifier.TestTank;
import megameklab.com.ui.EntitySource;
import megameklab.com.ui.Vehicle.views.SummaryView;
import megameklab.com.ui.Vehicle.views.ArmorView;
import megameklab.com.util.ITab;
import megameklab.com.util.RefreshListener;
import megameklab.com.util.UnitUtil;
public class StructureTab extends ITab implements ActionListener, KeyListener,
ChangeListener, ItemListener {
/**
*
*/
private static final long serialVersionUID = -6756011847500605874L;
private static final String ENGINESTANDARD = "Standard";
private static final String ENGINEXL = "XL";
private static final String ENGINELIGHT = "Light";
private static final String ENGINECOMPACT = "Compact";
private static final String ENGINEFISSION = "Fission";
private static final String ENGINEFUELCELL = "Fuel Cell";
private static final String ENGINEXXL = "XXL";
private static final String ENGINEICE = "I.C.E";
String[] isEngineTypes = { ENGINESTANDARD, ENGINEICE, ENGINEXL,
ENGINELIGHT, ENGINECOMPACT, ENGINEFISSION, ENGINEFUELCELL,
ENGINEXXL };
String[] clanEngineTypes = { ENGINESTANDARD, ENGINEICE, ENGINEXL,
ENGINEFUELCELL, ENGINEXXL };
JComboBox<String> engineType = new JComboBox<String>(isEngineTypes);
JSpinner cruiseMP;
JSpinner jumpMP;
JTextField flankMP;
JSpinner weight;
JSpinner armorTonnage;
private JButton maximizeArmorButton = new JButton("Maximize Armor");
private JButton unusedTonnageArmorButton = new JButton("Use Remaining Tonnage");
private JTextField chassis = new JTextField(5);
private JTextField model = new JTextField(5);
String[] techTypes = { "I.S.", "Clan", "Mixed I.S.", "Mixed Clan" };
JComboBox<String> techType = new JComboBox<String>(techTypes);
String[] isTechLevels = { "Intro", "Standard", "Advanced", "Experimental",
"Unoffical" };
String[] clanTechLevels = { "Standard", "Advanced", "Experimental",
"Unoffical" };
JComboBox<String> techLevel;
String[] tankMotiveTypes = { "Hover", "Wheeled", "Tracked", "WiGE", "VTOL",
"Naval (Displacement)", "Hydrofoil", "Submarine"};
JComboBox<String> tankMotiveType = new JComboBox<String>(tankMotiveTypes);
JTextField era = new JTextField(3);
JTextField source = new JTextField(3);
RefreshListener refresh = null;
JCheckBox omniCB = new JCheckBox("Omni");
JCheckBox superHeavyCB = new JCheckBox("Super-Heavy");
String[] turretTypes = { "None", "Single", "Dual" };
JComboBox<String> turretCombo = new JComboBox<String>(turretTypes);
JSpinner baseChassisTurretWeight;
JSpinner baseChassisTurret2Weight;
Dimension maxSize = new Dimension();
JLabel baseChassisHeatSinksLabel = new JLabel("Base Heat Sinks:",
SwingConstants.TRAILING);
JPanel masterPanel;
JPanel panInfo;
JPanel panChassis;
JPanel panArmor;
JPanel panMovement;
SummaryView panSummary;
JSpinner fixedTroopStorage = null;
JSpinner podTroopStorage = null;
JLabel podTroopStorageLabel;
JButton resetChassisButton = new JButton("Reset Chassis (Omni)");
int maxTonnage = 50;
int minTonnage = 1;
JTextField manualBV = new JTextField(3);
private ArmorView armor;
private JComboBox<String> armorCombo = new JComboBox<String>();
public StructureTab(EntitySource eSource) {
super(eSource);
armor = new ArmorView(eSource);
setLayout(new BorderLayout());
setUpPanels();
this.add(masterPanel, BorderLayout.CENTER);
refresh();
}
private void setUpPanels() {
masterPanel = new JPanel(new GridBagLayout());
panInfo = new JPanel(new GridBagLayout());
panChassis = new JPanel(new GridBagLayout());
panArmor = new JPanel(new GridBagLayout());
panMovement = new JPanel(new GridBagLayout());
panSummary = new SummaryView(eSource);
if (getTank().isClan()){
techLevel = new JComboBox<String>(clanTechLevels);
} else {
techLevel = new JComboBox<String>(isTechLevels);
}
GridBagConstraints gbc;
Dimension spinnerSize = new Dimension(55, 25);
cruiseMP = new JSpinner(new SpinnerNumberModel(3, 0, 25, 1));
((JSpinner.DefaultEditor) cruiseMP.getEditor()).setSize(spinnerSize);
((JSpinner.DefaultEditor) cruiseMP.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) cruiseMP.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) cruiseMP.getEditor())
.setMinimumSize(spinnerSize);
flankMP = new JTextField();
flankMP.setEditable(false);
setFieldSize(flankMP, spinnerSize);
flankMP.setHorizontalAlignment(SwingConstants.RIGHT);
jumpMP = new JSpinner(new SpinnerNumberModel(0, 0, 25, 1));
((JSpinner.DefaultEditor) jumpMP.getEditor()).setSize(spinnerSize);
((JSpinner.DefaultEditor) jumpMP.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) jumpMP.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) jumpMP.getEditor())
.setMinimumSize(spinnerSize);
disableJump();
weight = new JSpinner(new SpinnerNumberModel(20, 1, 100, 1));
armorTonnage = new JSpinner(new SpinnerNumberModel(
getTank().getArmorWeight(), 0.0, ((getTank().getWeight()*3.5)+40)/8, 0.5));
spinnerSize = new Dimension(45, 25);
((JSpinner.DefaultEditor) armorTonnage.getEditor())
.setSize(spinnerSize);
((JSpinner.DefaultEditor) armorTonnage.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) armorTonnage.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) armorTonnage.getEditor())
.setMinimumSize(spinnerSize);
baseChassisTurretWeight = new JSpinner(new SpinnerNumberModel(0, 0.0,
getTank().getWeight(), 0.5));
spinnerSize = new Dimension(45, 25);
((JSpinner.DefaultEditor) baseChassisTurretWeight.getEditor())
.setSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisTurretWeight.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisTurretWeight.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisTurretWeight.getEditor())
.setMinimumSize(spinnerSize);
baseChassisTurret2Weight = new JSpinner(new SpinnerNumberModel(0, 0.0,
getTank().getWeight(), 0.5));
spinnerSize = new Dimension(45, 25);
((JSpinner.DefaultEditor) baseChassisTurret2Weight.getEditor())
.setSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisTurret2Weight.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisTurret2Weight.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisTurret2Weight.getEditor())
.setMinimumSize(spinnerSize);
updateArmor();
fixedTroopStorage = new JSpinner(new SpinnerNumberModel(0, 0, 0, 0.5));
podTroopStorage = new JSpinner(new SpinnerNumberModel(0, 0, 0, 0.5));
chassis.setText(getTank().getChassis());
model.setText(getTank().getModel());
Dimension labelSize = new Dimension(110, 25);
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 0, 1, 2);
panInfo.add(createLabel("Chassis:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
panInfo.add(chassis, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
panInfo.add(createLabel("Model:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
panInfo.add(model, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
panInfo.add(createLabel("Year:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 2;
panInfo.add(era, gbc);
gbc.gridx = 0;
gbc.gridy = 3;
panInfo.add(createLabel("Source/Era:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 3;
panInfo.add(source, gbc);
gbc.gridx = 0;
gbc.gridy = 4;
panInfo.add(createLabel("Tech:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 4;
panInfo.add(techType, gbc);
gbc.gridx = 0;
gbc.gridy = 5;
panInfo.add(createLabel("Tech Level:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 5;
panInfo.add(techLevel, gbc);
gbc.gridx = 0;
gbc.gridy = 6;
panInfo.add(createLabel("Manual BV:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 6;
panInfo.add(manualBV, gbc);
gbc.gridx = 0;
gbc.gridy = 0;
panChassis.add(createLabel("Tonnage:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
panChassis.add(weight, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
panChassis.add(omniCB, gbc);
gbc.gridx = 3;
gbc.gridy = 0;
panChassis.add(superHeavyCB, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
panChassis.add(createLabel("Motive Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.gridwidth = 3;
panChassis.add(tankMotiveType, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 1;
panChassis.add(createLabel("Engine Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 2;
gbc.gridwidth = 3;
panChassis.add(engineType, gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 1;
panChassis.add(createLabel("Turret:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridwidth = 3;
panChassis.add(turretCombo, gbc);
gbc.gridx = 0;
gbc.gridy = 4;
gbc.gridwidth = 2;
panChassis.add(createLabel("Base Chassis Turret Weight:", labelSize), gbc);
gbc.gridx = 2;
gbc.gridy = 4;
gbc.gridwidth = 2;
panChassis.add(baseChassisTurretWeight, gbc);
gbc.gridx = 0;
gbc.gridy = 5;
gbc.gridwidth = 2;
panChassis.add(createLabel("Base Chassis Second Turret Weight:", labelSize), gbc);
gbc.gridx = 2;
gbc.gridy = 5;
gbc.gridwidth = 2;
panChassis.add(baseChassisTurret2Weight, gbc);
gbc.gridx = 0;
gbc.gridy = 6;
gbc.gridwidth = 2;
panChassis.add(createLabel("Fixed Troop Storage:", labelSize), gbc);
gbc.gridx = 2;
gbc.gridy = 6;
gbc.gridwidth = 2;
panChassis.add(fixedTroopStorage, gbc);
podTroopStorageLabel = createLabel("Pod Troop Storage:", labelSize);
gbc.gridx = 0;
gbc.gridy = 7;
gbc.gridwidth = 2;
panChassis.add(podTroopStorageLabel, gbc);
gbc.gridx = 2;
gbc.gridy = 7;
gbc.gridwidth = 2;
panChassis.add(podTroopStorage, gbc);
gbc.gridx = 1;
gbc.gridy = 8;
gbc.gridwidth = 3;
panChassis.add(resetChassisButton, gbc);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
panArmor.add(createLabel("Armor Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 2;
panArmor.add(armorCombo, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
panArmor.add(createLabel("Armor Tonnage:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
panArmor.add(armorTonnage, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.gridwidth = 3;
panArmor.add(maximizeArmorButton, gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 3;
panArmor.add(unusedTonnageArmorButton, gbc);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
panMovement.add(createLabel("Cruise MP:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.fill = java.awt.GridBagConstraints.NONE;
panMovement.add(cruiseMP, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
panMovement.add(createLabel("Flank MP:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
panMovement.add(flankMP, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
panMovement.add(createLabel("Jumping MP:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 2;
panMovement.add(jumpMP, gbc);
gbc.gridx = 0;
gbc.gridy = 3;
Dimension comboSize = new Dimension(180, 25);
setFieldSize(era, comboSize);
setFieldSize(manualBV, comboSize);
setFieldSize(source, comboSize);
setFieldSize(techType, comboSize);
setFieldSize(armorCombo, comboSize);
setFieldSize(techLevel, comboSize);
setFieldSize(turretCombo, comboSize);
setFieldSize(engineType, comboSize);
setFieldSize(model, comboSize);
setFieldSize(chassis, comboSize);
JPanel leftPanel = new JPanel();
JPanel rightPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
leftPanel.add(panInfo);
leftPanel.add(Box.createVerticalStrut(6));
leftPanel.add(panChassis);
leftPanel.add(Box.createVerticalStrut(6));
leftPanel.add(panMovement);
leftPanel.add(Box.createGlue());
rightPanel.add(panArmor);
rightPanel.add(panSummary);
rightPanel.add(Box.createVerticalGlue());
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 0;
gbc.fill = java.awt.GridBagConstraints.NONE;
gbc.weightx = 0.0;
gbc.weighty = 1.0;
gbc.anchor = GridBagConstraints.NORTHWEST;
masterPanel.add(leftPanel, gbc);
gbc.gridx = 1;
masterPanel.add(rightPanel, gbc);
gbc.gridx = 2;
masterPanel.add(armor, gbc);
panInfo.setBorder(BorderFactory.createTitledBorder("Basic Information"));
panChassis.setBorder(BorderFactory.createTitledBorder("Chassis"));
panMovement.setBorder(BorderFactory.createTitledBorder("Movement"));
panArmor.setBorder(BorderFactory.createTitledBorder("Armor"));
panSummary.setBorder(BorderFactory.createTitledBorder("Summary"));
armor.setBorder(BorderFactory.createTitledBorder("Armor Allocation"));
}
public void refresh() {
removeAllListeners();
omniCB.setSelected(getTank().isOmni());
superHeavyCB.setSelected((getTank()).isSuperHeavy());
resetChassisButton.setEnabled(getTank().isOmni());
podTroopStorageLabel.setEnabled(getTank().isOmni());
podTroopStorage.setEnabled(getTank().isOmni());
if (!getTank().hasNoDualTurret()) {
turretCombo.setSelectedIndex(2);
} else if (!getTank().hasNoTurret()) {
turretCombo.setSelectedIndex(1);
} else {
turretCombo.setSelectedIndex(0);
}
era.setText(Integer.toString(getTank().getYear()));
source.setText(getTank().getSource());
manualBV.setText(Integer.toString(Math.max(0, getTank().getManualBV())));
if (getTank().isMixedTech()) {
if (getTank().isClan()) {
techType.setSelectedIndex(3);
if (getTank().getTechLevel() >= TechConstants.T_CLAN_UNOFFICIAL) {
techLevel.setSelectedIndex(3);
} else if (getTank().getTechLevel() >= TechConstants.T_CLAN_EXPERIMENTAL) {
techLevel.setSelectedIndex(2);
} else {
techLevel.setSelectedIndex(1);
}
} else {
techType.setSelectedIndex(2);
if (getTank().getTechLevel() >= TechConstants.T_IS_UNOFFICIAL) {
techLevel.setSelectedIndex(4);
} else if (getTank().getTechLevel() >= TechConstants.T_IS_EXPERIMENTAL) {
techLevel.setSelectedIndex(3);
} else {
techLevel.setSelectedIndex(2);
}
}
} else if (getTank().isClan()) {
techType.setSelectedIndex(1);
if (getTank().getTechLevel() >= TechConstants.T_CLAN_UNOFFICIAL) {
techLevel.setSelectedIndex(3);
} else if (getTank().getTechLevel() >= TechConstants.T_CLAN_EXPERIMENTAL) {
techLevel.setSelectedIndex(2);
} else if (getTank().getTechLevel() >= TechConstants.T_CLAN_ADVANCED) {
techLevel.setSelectedIndex(1);
} else {
techLevel.setSelectedIndex(0);
}
} else {
techType.setSelectedIndex(0);
if (getTank().getTechLevel() >= TechConstants.T_IS_UNOFFICIAL) {
techLevel.setSelectedIndex(4);
} else if (getTank().getTechLevel() >= TechConstants.T_IS_EXPERIMENTAL) {
techLevel.setSelectedIndex(3);
} else if (getTank().getTechLevel() >= TechConstants.T_IS_ADVANCED) {
techLevel.setSelectedIndex(2);
} else if (getTank().getTechLevel() >= TechConstants.T_IS_TW_NON_BOX) {
techLevel.setSelectedIndex(1);
} else {
techLevel.setSelectedIndex(0);
}
}
switch (getTank().getMovementMode()) {
case HOVER:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(0);
break;
case WHEELED:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(1);
break;
case TRACKED:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(2);
break;
case WIGE:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(3);
break;
case VTOL:
tankMotiveType.setSelectedIndex(4);
if ((getTank().getTechLevel() == TechConstants.T_IS_EXPERIMENTAL) || (getTank().getTechLevel() == TechConstants.T_IS_UNOFFICIAL) || (getTank().getTechLevel() == TechConstants.T_CLAN_EXPERIMENTAL) || (getTank().getTechLevel() == TechConstants.T_CLAN_UNOFFICIAL)) {
turretCombo.setEnabled(true);
turretCombo.removeAllItems();
turretCombo.addItem("None");
turretCombo.addItem("Chin");
turretCombo.setSelectedIndex(getTank().hasNoTurret()?0:1);
} else {
turretCombo.setEnabled(false);
}
updateTurrets(turretCombo);
break;
case NAVAL:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(5);
break;
case HYDROFOIL:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(6);
break;
case SUBMARINE:
turretCombo.setEnabled(true);
tankMotiveType.setSelectedIndex(7);
break;
default:
break;
}
setAvailableWeights((int) getTank().getWeight());
cruiseMP.getModel().setValue(getTank().getWalkMP());
flankMP.setText(getTank().getRunMPasString());
updateEngineTypes(getTank().isClan());
updateTroopSpaceAllowed();
engineType.setSelectedIndex(convertEngineType(getTank().getEngine()
.getEngineType()));
if (getTank().hasPatchworkArmor()) {
setArmorCombo(EquipmentType.T_ARMOR_PATCHWORK);
} else {
setArmorCombo(getTank().getArmorType(1));
}
double maxArmorTonnage = UnitUtil.getMaximumArmorTonnage(getTank());
((SpinnerNumberModel) armorTonnage.getModel()).setMaximum(maxArmorTonnage);
((SpinnerNumberModel) armorTonnage.getModel()).setValue(Math.min(
UnitUtil.getMaximumArmorTonnage(getTank()),
getTank().getLabArmorTonnage()));
if (getTank().hasPatchworkArmor()) {
TestTank testTank = new TestTank(
getTank(),
EntityVerifier.getInstance(new File(
"data/mechfiles/UnitVerifierOptions.xml")).tankOption,
null);
armorTonnage.setEnabled(false);
armorTonnage.getModel()
.setValue(testTank.getWeightAllocatedArmor());
getTank().setArmorTonnage(testTank.getWeightAllocatedArmor());
maximizeArmorButton.setEnabled(false);
unusedTonnageArmorButton.setEnabled(false);
} else {
if (Double.parseDouble(armorTonnage.getValue().toString()) > maxArmorTonnage) {
armorTonnage.setValue(maxArmorTonnage);
}
setArmorTonnage();
armorTonnage.setEnabled(true);
maximizeArmorButton.setEnabled(true);
unusedTonnageArmorButton.setEnabled(true);
}
armor.refresh();
panSummary.refresh();
updateBCTurretWeightSpinners();
addAllListeners();
}
private void updateBCTurretWeightSpinners() {
if (getTank().isOmni() && hasDualTurret()) {
baseChassisTurretWeight.setEnabled(true);
if (getTank().getBaseChassisTurretWeight() >= 0) {
baseChassisTurretWeight.setValue((double)getTank()
.getBaseChassisTurretWeight());
} else {
baseChassisTurretWeight.setValue(0.0);
}
baseChassisTurret2Weight.setEnabled(true);
if (getTank().getBaseChassisTurret2Weight() >= 0) {
baseChassisTurret2Weight.setValue((double)getTank()
.getBaseChassisTurret2Weight());
} else {
baseChassisTurret2Weight.setValue(0.0);
}
} else if (getTank().isOmni() && hasTurret()) {
baseChassisTurretWeight.setEnabled(true);
if (getTank().getBaseChassisTurretWeight() >= 0) {
baseChassisTurretWeight.setValue((double)getTank()
.getBaseChassisTurretWeight());
} else {
baseChassisTurretWeight.setValue(0.0);
}
baseChassisTurret2Weight.setEnabled(false);
baseChassisTurret2Weight.setValue(0.0);
} else {
baseChassisTurretWeight.setEnabled(false);
baseChassisTurret2Weight.setEnabled(false);
baseChassisTurretWeight.setValue(0.0);
baseChassisTurret2Weight.setValue(0.0);
}
}
public JLabel createLabel(String text, Dimension maxSize) {
JLabel label = new JLabel(text, SwingConstants.TRAILING);
setFieldSize(label, maxSize);
return label;
}
public void setFieldSize(JComponent box, Dimension maxSize) {
box.setPreferredSize(maxSize);
box.setMaximumSize(maxSize);
box.setMinimumSize(maxSize);
}
public void actionPerformed(ActionEvent e) {
if (refresh == null) {
return;
}
removeAllListeners();
if (e.getSource() instanceof JCheckBox) {
JCheckBox check = (JCheckBox) e.getSource();
if (check.equals(omniCB)) {
getTank().setOmni(omniCB.isSelected());
if (getTank().isOmni()) {
} else {
getTank().getEngine().setBaseChassisHeatSinks(-1);
fixedTroopStorage.setValue(getTank().getTroopCarryingSpace());
podTroopStorage.setValue(0.0);
updateTroopSpaceAllotted();
}
resetChassisButton.setEnabled(getTank().isOmni());
podTroopStorageLabel.setEnabled(getTank().isOmni());
podTroopStorage.setEnabled(getTank().isOmni());
}
}
else if (e.getSource() instanceof JButton) {
if (e.getSource().equals(maximizeArmorButton)) {
maximizeArmor();
} else if (e.getSource().equals(unusedTonnageArmorButton)) {
useRemainingTonnageArmor();
} else if (e.getSource().equals(resetChassisButton)) {
UnitUtil.resetBaseChassis(getTank());
podTroopStorage.setValue(0.0);
updateTroopSpaceAllotted();
}
}
addAllListeners();
refresh.refreshAll();
}
public void removeAllListeners() {
engineType.removeItemListener(this);
weight.removeChangeListener(this);
cruiseMP.removeChangeListener(this);
techLevel.removeItemListener(this);
techType.removeItemListener(this);
era.removeKeyListener(this);
source.removeKeyListener(this);
manualBV.removeKeyListener(this);
omniCB.removeActionListener(this);
superHeavyCB.removeActionListener(this);
turretCombo.removeItemListener(this);
tankMotiveType.removeItemListener(this);
fixedTroopStorage.removeChangeListener(this);
podTroopStorage.removeChangeListener(this);
resetChassisButton.removeActionListener(this);
maximizeArmorButton.removeActionListener(this);
unusedTonnageArmorButton.removeActionListener(this);
armorTonnage.removeChangeListener(this);
baseChassisTurretWeight.removeChangeListener(this);
baseChassisTurret2Weight.removeChangeListener(this);
armorCombo.removeItemListener(this);
jumpMP.removeChangeListener(this);
chassis.removeKeyListener(this);
model.removeKeyListener(this);
}
public void addAllListeners() {
engineType.addItemListener(this);
weight.addChangeListener(this);
cruiseMP.addChangeListener(this);
techLevel.addItemListener(this);
techType.addItemListener(this);
era.addKeyListener(this);
source.addKeyListener(this);
manualBV.addKeyListener(this);
omniCB.addActionListener(this);
superHeavyCB.addActionListener(this);
turretCombo.addItemListener(this);
tankMotiveType.addItemListener(this);
fixedTroopStorage.addChangeListener(this);
podTroopStorage.addChangeListener(this);
resetChassisButton.addActionListener(this);
maximizeArmorButton.addActionListener(this);
unusedTonnageArmorButton.addActionListener(this);
armorTonnage.addChangeListener(this);
baseChassisTurretWeight.addChangeListener(this);
baseChassisTurret2Weight.addChangeListener(this);
armorCombo.addItemListener(this);
jumpMP.addChangeListener(this);
chassis.addKeyListener(this);
model.addKeyListener(this);
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
if (e.getSource().equals(era)) {
try {
int year = Integer.parseInt(era.getText());
if (year < 1950) {
return;
}
getTank().setYear(Integer.parseInt(era.getText()));
} catch (Exception ex) {
getTank().setYear(3145);
}
removeAllListeners();
updateArmor();
addAllListeners();
refresh.refreshEquipment();
} else if (e.getSource().equals(source)) {
getTank().setSource(source.getText());
} else if (e.getSource().equals(manualBV)) {
int bv = Integer.parseInt(manualBV.getText());
if (bv <= 0) {
getTank().setUseManualBV(false);
getTank().setManualBV(0);
} else {
getTank().setUseManualBV(true);
getTank().setManualBV(bv);
}
} else if (e.getSource().equals(chassis)) {
getTank().setChassis(chassis.getText().trim());
refresh.refreshPreview();
refresh.refreshHeader();
} else if (e.getSource().equals(model)) {
getTank().setModel(model.getText().trim());
refresh.refreshPreview();
refresh.refreshHeader();
}
}
public void keyTyped(KeyEvent e) {
}
public void addRefreshedListener(RefreshListener l) {
refresh = l;
armor.addRefreshedListener(l);
}
public boolean hasTurret() {
return turretCombo.getSelectedIndex() > 0;
}
public boolean hasDualTurret() {
return turretCombo.getSelectedIndex() > 1;
}
private void updateTroopSpaceAllowed() {
double troops = getTank().getTroopCarryingSpace();
double pod = getTank().getPodMountedTroopCarryingSpace();
if (troops > (int) getTank().getWeight()) {
getTank().removeAllTransporters();
((SpinnerNumberModel) fixedTroopStorage.getModel()).setValue(0.0);
((SpinnerNumberModel) podTroopStorage.getModel()).setValue(0.0);
} else {
fixedTroopStorage.setValue(troops - pod);
podTroopStorage.setValue(pod);
}
}
private void setAvailableWeights(int currentTonnage) {
if (!isSuperHeavy()) {
switch (tankMotiveType.getSelectedIndex()) {
case 0:
maxTonnage = 50;
getTank().setMovementMode(EntityMovementMode.HOVER);
break;
case 1:
maxTonnage = 80;
getTank().setMovementMode(EntityMovementMode.WHEELED);
break;
case 2:
maxTonnage = 100;
getTank().setMovementMode(EntityMovementMode.TRACKED);
break;
case 3:
maxTonnage = 80;
getTank().setMovementMode(EntityMovementMode.WIGE);
break;
case 4:
maxTonnage = 30;
getTank().setMovementMode(EntityMovementMode.VTOL);
disableJump();
break;
case 5:
maxTonnage = 300;
getTank().setMovementMode(EntityMovementMode.NAVAL);
disableJump();
break;
case 6:
maxTonnage = 100;
getTank().setMovementMode(EntityMovementMode.HYDROFOIL);
disableJump();
break;
case 7:
maxTonnage = 300;
getTank().setMovementMode(EntityMovementMode.SUBMARINE);
disableJump();
break;
}
minTonnage = 1;
} else {
switch (tankMotiveType.getSelectedIndex()) {
case 0:
minTonnage = 51;
maxTonnage = 100;
getTank().setMovementMode(EntityMovementMode.HOVER);
break;
case 1:
minTonnage = 81;
maxTonnage = 160;
getTank().setMovementMode(EntityMovementMode.WHEELED);
break;
case 2:
minTonnage = 101;
maxTonnage = 200;
getTank().setMovementMode(EntityMovementMode.TRACKED);
break;
case 3:
minTonnage = 81;
maxTonnage = 160;
getTank().setMovementMode(EntityMovementMode.WIGE);
break;
case 4:
minTonnage = 31;
maxTonnage = 60;
getTank().setMovementMode(EntityMovementMode.VTOL);
disableJump();
break;
case 5:
minTonnage = 301;
maxTonnage = 555;
getTank().setMovementMode(EntityMovementMode.NAVAL);
disableJump();
break;
case 7:
minTonnage = 301;
maxTonnage = 555;
getTank().setMovementMode(EntityMovementMode.SUBMARINE);
disableJump();
break;
}
}
currentTonnage = Math.max(minTonnage,
Math.min(currentTonnage, maxTonnage));
getTank().setWeight(currentTonnage);
((SpinnerNumberModel) fixedTroopStorage.getModel())
.setMaximum((double) currentTonnage);
((SpinnerNumberModel) podTroopStorage.getModel())
.setMaximum((double) currentTonnage);
((SpinnerNumberModel) weight.getModel()).setMaximum(maxTonnage);
((SpinnerNumberModel) weight.getModel()).setMinimum(minTonnage);
weight.getModel().setValue((int)getTank().getWeight());
}
private int convertEngineType(String engineType) {
if (engineType.equals(ENGINESTANDARD)) {
return Engine.NORMAL_ENGINE;
}
if (engineType.equals(ENGINEXL)) {
return Engine.XL_ENGINE;
}
if (engineType.equals(ENGINEXXL)) {
return Engine.XXL_ENGINE;
}
if (engineType.equals(ENGINEICE)) {
return Engine.COMBUSTION_ENGINE;
}
if (engineType.equals(ENGINECOMPACT)) {
return Engine.COMPACT_ENGINE;
}
if (engineType.equals(ENGINEFISSION)) {
return Engine.FISSION;
}
if (engineType.equals(ENGINEFUELCELL)) {
return Engine.FUEL_CELL;
}
if (engineType.equals(ENGINELIGHT)) {
return Engine.LIGHT_ENGINE;
}
return Engine.NORMAL_ENGINE;
}
private void updateEngineTypes(boolean isClan) {
int engineCount = 1;
String[] engineList;
engineType.removeAllItems();
if (isClan) {
engineList = clanEngineTypes;
switch (getTank().getTechLevel()) {
case TechConstants.T_CLAN_TW:
engineCount = 3;
break;
case TechConstants.T_CLAN_ADVANCED:
engineCount = 4;
break;
case TechConstants.T_CLAN_EXPERIMENTAL:
case TechConstants.T_CLAN_UNOFFICIAL:
engineCount = 5;
break;
}
} else {
engineList = isEngineTypes;
switch (getTank().getTechLevel()) {
case TechConstants.T_INTRO_BOXSET:
engineCount = 2;
break;
case TechConstants.T_IS_TW_NON_BOX:
engineCount = 5;
break;
case TechConstants.T_IS_ADVANCED:
engineCount = 7;
break;
case TechConstants.T_IS_EXPERIMENTAL:
case TechConstants.T_IS_UNOFFICIAL:
engineCount = 8;
break;
}
}
for (int index = 0; index < engineCount; index++) {
engineType.addItem(engineList[index]);
}
}
private int convertEngineType(int engineType) {
if (getTank().getEngine().hasFlag(Engine.CLAN_ENGINE)) {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
case Engine.COMBUSTION_ENGINE:
return 1;
case Engine.XL_ENGINE:
return 2;
case Engine.FUEL_CELL:
return 3;
case Engine.XXL_ENGINE:
return 4;
}
} else {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
case Engine.COMBUSTION_ENGINE:
return 1;
case Engine.XL_ENGINE:
return 2;
case Engine.LIGHT_ENGINE:
return 3;
case Engine.COMPACT_ENGINE:
return 4;
case Engine.FISSION:
return 5;
case Engine.FUEL_CELL:
return 6;
case Engine.XXL_ENGINE:
return 7;
}
}
return 0;
}
@Override
public void stateChanged(ChangeEvent e) {
removeAllListeners();
if (e.getSource().equals(cruiseMP) || e.getSource().equals(weight)) {
updateWeightEngineMovement();
}
if (e.getSource().equals(fixedTroopStorage) || e.getSource().equals(podTroopStorage)) {
updateTroopSpaceAllotted();
} else if (e.getSource().equals(armorTonnage)) {
setArmorTonnage();
} else if (e.getSource().equals(jumpMP)) {
setJumpMP();
} else if (e.getSource().equals(baseChassisTurretWeight)) {
getTank().setBaseChassisTurretWeight(
((Double) baseChassisTurretWeight.getValue()).floatValue());
} else if (e.getSource().equals(baseChassisTurret2Weight)) {
getTank()
.setBaseChassisTurret2Weight(
((Double) baseChassisTurret2Weight.getValue())
.floatValue());
}
addAllListeners();
refresh.refreshAll();
}
private void updateTroopSpaceAllotted() {
getTank().removeAllTransporters();
double fixedStorage = (Double)fixedTroopStorage.getValue();
double podStorage = + (Double)podTroopStorage.getValue();
if (fixedStorage + podStorage > 0) {
double troopTons = Math
.round((fixedStorage) * 2) / 2.0;
getTank().addTransporter(new TroopSpace(troopTons), false);
if (podStorage > 0) {
troopTons = Math.round(podStorage * 2) / 2.0;
getTank().addTransporter(new TroopSpace(troopTons), true);
}
}
}
public boolean isSuperHeavy() {
return superHeavyCB.isSelected();
}
public boolean isVTOL() {
return tankMotiveType.getSelectedIndex() == 4;
}
private void updateTurrets(JComboBox<String> combo) {
if ((combo.getSelectedIndex() == 0) || (combo.getSelectedIndex() == 1)) {
int turretLoc = getTank().getLocTurret();
List<Mounted> toRemove = new ArrayList<Mounted>();
List<Mounted> toRemoveMisc = new ArrayList<Mounted>();
List<Mounted> toRemoveWeapons = new ArrayList<Mounted>();
if (!getTank().hasNoDualTurret()) {
for (int slot = 0; slot < getTank().getNumberOfCriticals(
getTank().getLocTurret2()); slot++) {
getTank().setCritical(getTank().getLocTurret2(), slot, null);
}
for (Mounted mount : getTank().getEquipment()) {
if (mount.getLocation() == getTank().getLocTurret2()) {
toRemove.add(mount);
if (mount.getType() instanceof WeaponType) {
toRemoveWeapons.add(mount);
} else if (mount.getType() instanceof MiscType) {
toRemoveMisc.add(mount);
}
}
}
getTank().setHasNoDualTurret(true);
getTank().setBaseChassisTurret2Weight(-1);
}
if (getTank().hasNoTurret() && (combo.getSelectedIndex() == 1)) {
// add turret
getTank().setHasNoTurret(false);
getTank().autoSetInternal();
getTank().initializeArmor(0, turretLoc);
getTank().setArmorTechLevel(
getTank().getArmorTechLevel(Tank.LOC_FRONT),
turretLoc);
getTank().setArmorType(getTank().getArmorType(Tank.LOC_FRONT),
turretLoc);
} else if (!getTank().hasNoTurret()
&& (combo.getSelectedIndex() == 0)) {
for (int slot = 0; slot < getTank().getNumberOfCriticals(
turretLoc); slot++) {
getTank().setCritical(turretLoc, slot, null);
}
for (Mounted mount : getTank().getEquipment()) {
if (mount.getLocation() == turretLoc) {
toRemove.add(mount);
if (mount.getType() instanceof WeaponType) {
toRemoveWeapons.add(mount);
} else if (mount.getType() instanceof MiscType) {
toRemoveMisc.add(mount);
}
}
}
getTank().setHasNoTurret(true);
getTank().setBaseChassisTurretWeight(-1);
}
getTank().getEquipment().removeAll(toRemove);
getTank().getMisc().removeAll(toRemoveMisc);
getTank().getWeaponList().removeAll(toRemoveWeapons);
} else if (combo.getSelectedIndex() == 2) {
// add second turret
getTank().setHasNoDualTurret(false);
// if no first turret, add that
if (getTank().hasNoTurret()) {
int turretLoc = getTank().getLocTurret2();
getTank().setHasNoTurret(false);
getTank().initializeArmor(0, turretLoc);
getTank().setArmorTechLevel(
getTank().getArmorTechLevel(Tank.LOC_FRONT),
turretLoc);
getTank().setArmorType(getTank().getArmorType(Tank.LOC_FRONT),
turretLoc);
}
getTank().autoSetInternal();
getTank().initializeArmor(0, getTank().getLocTurret2());
getTank().setArmorTechLevel(
getTank().getArmorTechLevel(Tank.LOC_FRONT),
getTank().getLocTurret2());
getTank().setArmorType(getTank().getArmorType(getTank().getLocTurret()),
getTank().getLocTurret2());
}
armor.refresh();
}
private void setArmorCombo(int type) {
armorCombo.setSelectedIndex(-1);
for (int index = 0; index < armorCombo.getItemCount(); index++) {
if (getTank().isMixedTech()) {
if (EquipmentType.getArmorTypeName(type,TechConstants.isClan(getTank().getArmorTechLevel(0))).equals(armorCombo.getItemAt(index))) {
armorCombo.setSelectedIndex(index);
}
} else {
if (EquipmentType.getArmorTypeName(type).equals(armorCombo.getItemAt(index))) {
armorCombo.setSelectedIndex(index);
}
}
}
}
private String getArmorType(JComboBox<String> combo) {
String armorType = combo.getSelectedItem().toString();
if (armorType.equals(EquipmentType.getArmorTypeName(EquipmentType.T_ARMOR_PATCHWORK))) {
return armorType;
}
if (!getTank().isMixedTech()) {
String prefix = getTank().isClan() ? "Clan " : "IS ";
for (int pos = 0; pos < EquipmentType.armorNames.length; pos++) {
if (armorType.equals(EquipmentType.armorNames[pos])) {
return prefix+armorType;
}
}
} else {
for (int pos = 0; pos < EquipmentType.armorNames.length; pos++) {
if (armorType.equals(EquipmentType.getArmorTypeName(pos, true))) {
return armorType;
}
if (armorType.equals(EquipmentType.getArmorTypeName(pos, false))) {
return armorType;
}
}
}
return EquipmentType.getArmorTypeName(EquipmentType.T_ARMOR_STANDARD, getTank().isClan());
}
private void updateWeightEngineMovement() {
// we first need to set the weight, because the tank's
// suspension factor
// depends on the weight, and is needed for the engine
// rating
double oldWeight = getTank().getWeight();
getTank().setWeight(Double.parseDouble(weight.getModel().getValue().toString()));
int rating = Math
.max(10,
(Integer.parseInt(cruiseMP.getModel().getValue()
.toString()) * Integer.parseInt(weight
.getModel().getValue().toString()))
- (getTank()).getSuspensionFactor());
if (rating > 500) {
// if we changed weight, reset the weight if the rating is too high
if (oldWeight < getTank().getWeight()) {
getTank().setWeight(oldWeight);
weight.getModel().setValue((int)oldWeight);
} else {
// otherwise, set the cruiseMP spinner to the old value
cruiseMP.getModel().setValue(getTank().getOriginalWalkMP());
}
JOptionPane
.showMessageDialog(
this,
"That speed/weight combination would create an engine with a rating over 500.",
"Bad Engine Rating", JOptionPane.ERROR_MESSAGE);
} else {
getTank().setWeight(Double.parseDouble(weight.getModel().getValue().toString()));
((SpinnerNumberModel) fixedTroopStorage.getModel()).setMaximum(Double
.parseDouble(weight.getModel().getValue().toString()));
((SpinnerNumberModel) podTroopStorage.getModel()).setMaximum(Double
.parseDouble(weight.getModel().getValue().toString()));
getTank().autoSetInternal();
int type = convertEngineType(engineType.getSelectedItem()
.toString());
if (getTank().isClan()) {
getTank().setEngine(
new Engine(rating, type, Engine.CLAN_ENGINE
| Engine.TANK_ENGINE));
} else {
getTank().setEngine(
new Engine(rating, type, Engine.TANK_ENGINE));
}
getTank().setOriginalWalkMP(
(Integer) cruiseMP.getModel().getValue());
}
}
private void maximizeArmor() {
double maxArmor = UnitUtil.getMaximumArmorTonnage(getTank());
armorTonnage.setValue(maxArmor);
getTank().setArmorTonnage(maxArmor);
armor.resetArmorPoints();
}
private void useRemainingTonnageArmor() {
double currentTonnage = UnitUtil.getEntityVerifier(getTank())
.calculateWeight();
currentTonnage += UnitUtil.getUnallocatedAmmoTonnage(getTank());
double totalTonnage = getTank().getWeight();
double remainingTonnage = TestEntity.floor(
totalTonnage - currentTonnage, TestEntity.Ceil.HALFTON);
double maxArmor = Math.min(remainingTonnage,
UnitUtil.getMaximumArmorTonnage(getTank()));
armorTonnage.setValue(maxArmor);
getTank().setArmorTonnage(maxArmor);
armor.resetArmorPoints();
}
private void setArmorTonnage() {
double armorTons = Math.round(((Double) armorTonnage.getValue()) * 2) / 2.0;
getTank().setArmorTonnage(armorTons);
armor.resetArmorPoints();
}
private void setArmorType() {
UnitUtil.removeISorArmorMounts(getTank(), false);
if (getArmorType(armorCombo) == EquipmentType.getArmorTypeName(EquipmentType.T_ARMOR_PATCHWORK)) {
JComboBox<String> frontArmor = new JComboBox<String>();
frontArmor.setName("FR");
JComboBox<String> leftArmor = new JComboBox<String>();
leftArmor.setName((getTank() instanceof SuperHeavyTank?"FRLS":"LS"));
JComboBox<String> rightArmor = new JComboBox<String>();
rightArmor.setName((getTank() instanceof SuperHeavyTank?"FRRS":"RS"));
JComboBox<String> rearArmor = new JComboBox<String>();
rearArmor.setName("RR");
JComboBox<String> turretArmor = new JComboBox<String>();
turretArmor.setName("TU");
JComboBox<String> turret2Armor = new JComboBox<String>();
turret2Armor.setName("TU2");
JComboBox<String> rearLeftArmor = new JComboBox<String>();
rearLeftArmor.setName("RRLS");
JComboBox<String> rearRightArmor = new JComboBox<String>();
rearRightArmor.setName("RRRS");
JComboBox<String> rotorArmor = new JComboBox<String>();
rotorArmor.setName("RO");
boolean isMixed = getTank().isMixedTech();
boolean isClan = getTank().isClan();
for (int index = 0; index < (EquipmentType.armorNames.length); index++) {
EquipmentType et;
if (!isMixed) {
et = EquipmentType.get(EquipmentType.getArmorTypeName(index, isClan));
if ((et != null) && et.hasFlag(MiscType.F_TANK_EQUIPMENT) && (TechConstants.isLegal(getTank().getTechLevel(), et.getTechLevel(getTank().getYear()), isMixed))) {
if (et.hasFlag(MiscType.F_HARDENED_ARMOR)
&& ((getTank().getMovementMode() == EntityMovementMode.HOVER)
|| (getTank().getMovementMode() == EntityMovementMode.WIGE)
|| (getTank().getMovementMode() == EntityMovementMode.VTOL))) {
continue;
}
frontArmor.addItem(EquipmentType.armorNames[index]);
leftArmor.addItem(EquipmentType.armorNames[index]);
rightArmor.addItem(EquipmentType.armorNames[index]);
rearArmor.addItem(EquipmentType.armorNames[index]);
turretArmor.addItem(EquipmentType.armorNames[index]);
turret2Armor.addItem(EquipmentType.armorNames[index]);
rearLeftArmor.addItem(EquipmentType.armorNames[index]);
rearRightArmor.addItem(EquipmentType.armorNames[index]);
rotorArmor.addItem(EquipmentType.armorNames[index]);
}
} else {
et = EquipmentType.get(EquipmentType.getArmorTypeName(index, true));
if (et != null) {
if (et.hasFlag(MiscType.F_HARDENED_ARMOR)
&& ((getTank().getMovementMode() == EntityMovementMode.HOVER)
|| (getTank().getMovementMode() == EntityMovementMode.WIGE)
|| (getTank().getMovementMode() == EntityMovementMode.VTOL))) {
continue;
}
frontArmor.addItem(EquipmentType.getArmorTypeName(index, true));
leftArmor.addItem(EquipmentType.getArmorTypeName(index, true));
rightArmor.addItem(EquipmentType.getArmorTypeName(index, true));
rearArmor.addItem(EquipmentType.getArmorTypeName(index, true));
turretArmor.addItem(EquipmentType.getArmorTypeName(index, true));
turret2Armor.addItem(EquipmentType.getArmorTypeName(index, true));
rearLeftArmor.addItem(EquipmentType.getArmorTypeName(index, true));
rearRightArmor.addItem(EquipmentType.getArmorTypeName(index, true));
rotorArmor.addItem(EquipmentType.getArmorTypeName(index, true));
}
et = EquipmentType.get(EquipmentType.getArmorTypeName(index, false));
if (et != null) {
if (et.hasFlag(MiscType.F_HARDENED_ARMOR)
&& ((getTank().getMovementMode() == EntityMovementMode.HOVER)
|| (getTank().getMovementMode() == EntityMovementMode.WIGE)
|| (getTank().getMovementMode() == EntityMovementMode.VTOL))) {
continue;
}
frontArmor.addItem(EquipmentType.getArmorTypeName(index, false));
leftArmor.addItem(EquipmentType.getArmorTypeName(index, false));
rightArmor.addItem(EquipmentType.getArmorTypeName(index, false));
rearArmor.addItem(EquipmentType.getArmorTypeName(index, false));
turretArmor.addItem(EquipmentType.getArmorTypeName(index, false));
turret2Armor.addItem(EquipmentType.getArmorTypeName(index, false));
rearLeftArmor.addItem(EquipmentType.getArmorTypeName(index, false));
rearRightArmor.addItem(EquipmentType.getArmorTypeName(index, false));
rotorArmor.addItem(EquipmentType.getArmorTypeName(index, false));
}
}
}
setArmorType(frontArmor, getTank().getArmorType(Tank.LOC_FRONT), false);
setArmorType(leftArmor, getTank().getArmorType(getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_FRONTLEFT:Tank.LOC_LEFT), false);
setArmorType(rightArmor, getTank().getArmorType(getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_FRONTRIGHT:Tank.LOC_RIGHT), false);
setArmorType(rearArmor, getTank().getArmorType(getTank() instanceof SuperHeavyTank?Tank.LOC_REAR:Tank.LOC_REAR), false);
if (!getTank().hasNoTurret()) {
setArmorType(turretArmor, getTank().getLocTurret(), false);
}
if (!getTank().hasNoDualTurret()) {
setArmorType(turret2Armor, getTank().getArmorType(getTank().getLocTurret2()), false);
}
if (getTank() instanceof SuperHeavyTank) {
setArmorType(rearLeftArmor, getTank().getArmorType(SuperHeavyTank.LOC_REARLEFT), false);
setArmorType(rearRightArmor, getTank().getArmorType(SuperHeavyTank.LOC_REARRIGHT), false);
}
if (getTank() instanceof VTOL) {
setArmorType(rotorArmor, getTank().getArmorType(VTOL.LOC_ROTOR), false);
}
JLabel frontLabel = new JLabel("Front:");
JLabel leftLabel = new JLabel(getTank() instanceof SuperHeavyTank ? "Front Left:"
: "Left:");
JLabel righttLabel = new JLabel(getTank() instanceof SuperHeavyTank ? "Front Right:"
: "Right:");
JLabel rearLabel = new JLabel("Rear:");
JLabel turretLabel = new JLabel("Turret:");
JLabel turret2Label = new JLabel("Front Turret:");
JLabel rearLeftLabel = new JLabel("Rear Left:");
JLabel rearRightLabel = new JLabel("Rear Right:");
JLabel rotorLabel = new JLabel("Rotor:");
JPanel panel = new JPanel(new GridBagLayout());
panel.add(frontLabel, GBC.std());
panel.add(frontArmor, GBC.eol());
panel.add(leftLabel, GBC.std());
panel.add(leftArmor, GBC.eol());
panel.add(righttLabel, GBC.std());
panel.add(rightArmor, GBC.eol());
panel.add(rearLabel, GBC.std());
panel.add(rearArmor, GBC.eol());
if (!getTank().hasNoTurret()) {
panel.add(turretLabel, GBC.std());
panel.add(turretArmor, GBC.eol());
}
if (!getTank().hasNoDualTurret()) {
panel.add(turret2Label, GBC.std());
panel.add(turret2Armor, GBC.eol());
}
if (getTank() instanceof SuperHeavyTank) {
panel.add(rearLeftLabel, GBC.std());
panel.add(rearLeftArmor, GBC.eol());
panel.add(rearRightLabel, GBC.std());
panel.add(rearRightArmor, GBC.eol());
}
if (getTank() instanceof VTOL) {
panel.add(rotorLabel, GBC.std());
panel.add(rotorArmor, GBC.eol());
}
JOptionPane.showMessageDialog(this, panel,
"Please choose the armor types",
JOptionPane.QUESTION_MESSAGE);
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(frontArmor)).getTechLevel(getTank().getYear()), Tank.LOC_FRONT);
getTank().setArmorType(getArmorType(frontArmor), Tank.LOC_FRONT);
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(leftArmor)).getTechLevel(getTank().getYear()), getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_FRONTLEFT:Tank.LOC_LEFT);
getTank().setArmorType(getArmorType(leftArmor), getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_FRONTLEFT:Tank.LOC_LEFT);
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(rightArmor)).getTechLevel(getTank().getYear()), getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_FRONTRIGHT:Tank.LOC_RIGHT);
getTank().setArmorType(getArmorType(rightArmor), getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_FRONTRIGHT:Tank.LOC_RIGHT);
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(rearArmor)).getTechLevel(getTank().getYear()), getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_REAR:Tank.LOC_REAR);
getTank().setArmorType(getArmorType(rearArmor), getTank() instanceof SuperHeavyTank?SuperHeavyTank.LOC_REAR:Tank.LOC_REAR);
if (!getTank().hasNoTurret()) {
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(turretArmor)).getTechLevel(getTank().getYear()), getTank().getLocTurret());
getTank().setArmorType(getArmorType(turretArmor), getTank().getLocTurret());
}
if (!getTank().hasNoDualTurret()) {
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(turret2Armor)).getTechLevel(getTank().getYear()), getTank().getLocTurret2());
getTank().setArmorType(getArmorType(turret2Armor), getTank().getLocTurret2());
}
if (getTank() instanceof SuperHeavyTank) {
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(rearLeftArmor)).getTechLevel(getTank().getYear()), SuperHeavyTank.LOC_REARLEFT);
getTank().setArmorType(getArmorType(rearLeftArmor), SuperHeavyTank.LOC_REARLEFT);
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(rearRightArmor)).getTechLevel(getTank().getYear()), SuperHeavyTank.LOC_REARRIGHT);
getTank().setArmorType(getArmorType(rearRightArmor), SuperHeavyTank.LOC_REARRIGHT);
}
if (getTank() instanceof VTOL) {
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(rotorArmor)).getTechLevel(getTank().getYear()), VTOL.LOC_ROTOR);
getTank().setArmorType(getArmorType(rotorArmor), VTOL.LOC_ROTOR);
}
if (!getTank().hasPatchworkArmor()) {
setArmorType(armorCombo, EquipmentType.T_ARMOR_STANDARD, false);
}
} else {
getTank().setArmorTechLevel(EquipmentType.get(getArmorType(armorCombo))
.getTechLevel(getTank().getYear()));
getTank().setArmorType(getArmorType(armorCombo));
}
}
@SuppressWarnings("unused")
private void TEMP() {
int oldIndex = armorCombo.getSelectedIndex();
setArmorCombo(oldIndex);
}
private void setArmorType(JComboBox<String> combo, int type, boolean removeListeners) {
if (removeListeners) {
removeAllListeners();
}
for (int index = 0; index < combo.getItemCount(); index++) {
if (EquipmentType.getArmorTypeName(type).equals(combo.getItemAt(index))) {
armorCombo.setSelectedIndex(index);
}
}
if (removeListeners) {
addAllListeners();
}
}
public void setArmorType(int type) {
setArmorType(armorCombo, type, true);
}
private void updateArmor() {
boolean isClan = getTank().isClan();
boolean isMixed = getTank().isMixedTech();
boolean isExperimental = (getTank().getTechLevel() == TechConstants.T_IS_EXPERIMENTAL)
|| (getTank().getTechLevel() == TechConstants.T_CLAN_EXPERIMENTAL)
|| (getTank().getTechLevel() == TechConstants.T_IS_UNOFFICIAL)
|| (getTank().getTechLevel() == TechConstants.T_CLAN_UNOFFICIAL);
/* ARMOR */
armorCombo.removeAllItems();
for (int index = 0; index < (EquipmentType.armorNames.length); index++) {
EquipmentType et;
if (!isMixed) {
et = EquipmentType.get(EquipmentType.getArmorTypeName(index, isClan));
if (((index == EquipmentType.T_ARMOR_PATCHWORK) && isExperimental) || ((et != null) && et.hasFlag(MiscType.F_TANK_EQUIPMENT) && (TechConstants.isLegal(getTank().getTechLevel(), et.getTechLevel(getTank().getYear()), isMixed)))) {
if ((et != null) && et.hasFlag(MiscType.F_HARDENED_ARMOR)
&& ((getTank().getMovementMode() == EntityMovementMode.HOVER)
|| (getTank().getMovementMode() == EntityMovementMode.WIGE)
|| (getTank().getMovementMode() == EntityMovementMode.VTOL))) {
continue;
}
armorCombo.addItem(EquipmentType.armorNames[index]);
}
} else {
et = EquipmentType.get(EquipmentType.getArmorTypeName(index, true));
if (et != null && et.hasFlag(MiscType.F_TANK_EQUIPMENT) && TechConstants
.isLegal(getTank().getTechLevel(), et
.getTechLevel(getTank().getYear()),
isMixed)) {
if (et.hasFlag(MiscType.F_HARDENED_ARMOR)
&& ((getTank().getMovementMode() == EntityMovementMode.HOVER)
|| (getTank().getMovementMode() == EntityMovementMode.WIGE)
|| (getTank().getMovementMode() == EntityMovementMode.VTOL))) {
continue;
}
armorCombo.addItem(EquipmentType.getArmorTypeName(index, true));
}
et = EquipmentType.get(EquipmentType.getArmorTypeName(index, false));
if (et != null && et.hasFlag(MiscType.F_TANK_EQUIPMENT) && TechConstants
.isLegal(getTank().getTechLevel(), et
.getTechLevel(getTank().getYear()),
isMixed)) {
if (et.hasFlag(MiscType.F_HARDENED_ARMOR)
&& ((getTank().getMovementMode() == EntityMovementMode.HOVER)
|| (getTank().getMovementMode() == EntityMovementMode.WIGE)
|| (getTank().getMovementMode() == EntityMovementMode.VTOL))) {
continue;
}
armorCombo.addItem(EquipmentType.getArmorTypeName(index, false));
}
if (index == EquipmentType.T_ARMOR_PATCHWORK) {
armorCombo.addItem(EquipmentType.getArmorTypeName(index));
}
}
}
}
private void setJumpMP() {
int jump = Integer.parseInt(jumpMP.getModel().getValue().toString());
UnitUtil.removeAllMiscMounteds(getTank(), MiscType.F_JUMP_JET);
getTank().setOriginalJumpMP(0);
for (int i = 0; i < jump; i++) {
try {
getTank().addEquipment(EquipmentType.get("JumpJet"), Tank.LOC_BODY);
} catch (LocationFullException e) {
e.printStackTrace();
}
}
}
private void disableJump() {
jumpMP.setEnabled(false);
jumpMP.getModel().setValue(0);
setJumpMP();
}
@Override
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
removeAllListeners();
@SuppressWarnings("unchecked")
JComboBox<String> combo = (JComboBox<String>) e.getSource();
try {
// if a Tank is primitive and thus needs a larger engine
if (combo.equals(engineType)) {
updateWeightEngineMovement();
} else if (combo.equals(techLevel)) {
int unitTechLevel = techLevel.getSelectedIndex();
if (getTank().isClan()) {
switch (unitTechLevel) {
case 0:
getTank().setTechLevel(TechConstants.T_CLAN_TW);
getTank().setArmorTechLevel(TechConstants.T_CLAN_TW);
disableJump();
addAllListeners();
techType.setSelectedIndex(1);
removeAllListeners();
break;
case 1:
getTank().setTechLevel(TechConstants.T_CLAN_ADVANCED);
getTank().setArmorTechLevel(TechConstants.T_CLAN_ADVANCED);
disableJump();
break;
case 2:
getTank().setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
getTank().setArmorTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
jumpMP.setEnabled(true);
break;
case 3:
getTank().setTechLevel(TechConstants.T_CLAN_UNOFFICIAL);
getTank().setArmorTechLevel(TechConstants.T_CLAN_UNOFFICIAL);
jumpMP.setEnabled(true);
break;
default:
getTank().setTechLevel(TechConstants.T_CLAN_TW);
getTank().setArmorTechLevel(TechConstants.T_CLAN_TW);
disableJump();
break;
}
} else {
switch (unitTechLevel) {
case 0:
getTank().setTechLevel(TechConstants.T_INTRO_BOXSET);
getTank().setArmorTechLevel(TechConstants.T_INTRO_BOXSET);
disableJump();
addAllListeners();
techType.setSelectedIndex(0);
removeAllListeners();
break;
case 1:
getTank().setTechLevel(TechConstants.T_IS_TW_NON_BOX);
getTank().setArmorTechLevel(TechConstants.T_IS_TW_NON_BOX);
disableJump();
addAllListeners();
techType.setSelectedIndex(0);
removeAllListeners();
break;
case 2:
getTank().setTechLevel(TechConstants.T_IS_ADVANCED);
getTank().setArmorTechLevel(TechConstants.T_IS_ADVANCED);
disableJump();
break;
case 3:
getTank().setTechLevel(TechConstants.T_IS_EXPERIMENTAL);
getTank().setArmorTechLevel(TechConstants.T_IS_EXPERIMENTAL);
jumpMP.setEnabled(true);
break;
default:
getTank().setTechLevel(TechConstants.T_IS_UNOFFICIAL);
getTank().setArmorTechLevel(TechConstants.T_IS_UNOFFICIAL);
jumpMP.setEnabled(true);
break;
}
}
int engineNumber = engineType.getSelectedIndex();
updateEngineTypes(getTank().isClan());
// Reset the engine
if (engineNumber >= engineType.getItemCount()) {
engineType.setSelectedIndex(0);
} else {
engineType.setSelectedIndex(engineNumber);
}
updateArmor();
} else if (combo.equals(techType)) {
if ((techType.getSelectedIndex() == 1)
&& (!getTank().isClan() || getTank().isMixedTech())) {
techLevel.removeAllItems();
for (String item : clanTechLevels) {
techLevel.addItem(item);
}
if (!(getTank()).isSuperHeavy()) {
getTank().setTechLevel(TechConstants.T_CLAN_TW);
} else {
if (getTank().getTechLevel() == TechConstants.T_IS_ADVANCED) {
getTank().setTechLevel(TechConstants.T_CLAN_ADVANCED);
} else if (getTank().getTechLevel() == TechConstants.T_IS_EXPERIMENTAL) {
getTank().setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
} else if (getTank().getTechLevel() == TechConstants.T_IS_UNOFFICIAL) {
getTank().setTechLevel(TechConstants.T_CLAN_UNOFFICIAL);
}
}
getTank().setArmorTechLevel(TechConstants.T_CLAN_TW);
getTank().setMixedTech(false);
} else if ((techType.getSelectedIndex() == 0)
&& (getTank().isClan() || getTank().isMixedTech())) {
techLevel.removeAllItems();
for (String item : isTechLevels) {
techLevel.addItem(item);
}
if (!(getTank()).isSuperHeavy()) {
getTank().setTechLevel(TechConstants.T_INTRO_BOXSET);
} else {
if (getTank().getTechLevel() == TechConstants.T_CLAN_ADVANCED) {
getTank().setTechLevel(TechConstants.T_IS_ADVANCED);
} else if (getTank().getTechLevel() == TechConstants.T_CLAN_EXPERIMENTAL) {
getTank().setTechLevel(TechConstants.T_IS_EXPERIMENTAL);
} else if (getTank().getTechLevel() == TechConstants.T_CLAN_UNOFFICIAL) {
getTank().setTechLevel(TechConstants.T_IS_UNOFFICIAL);
}
}
getTank().setArmorTechLevel(TechConstants.T_INTRO_BOXSET);
getTank().setMixedTech(false);
} else if ((techType.getSelectedIndex() == 2)
&& (!getTank().isMixedTech() || getTank().isClan())) {
techLevel.removeAllItems();
for (String item : isTechLevels) {
techLevel.addItem(item);
}
if (getTank().getYear() < 3090) {
//before 3090, mixed tech is experimental
if ((getTank().getTechLevel() != TechConstants.T_IS_UNOFFICIAL)) {
getTank().setTechLevel(TechConstants.T_IS_EXPERIMENTAL);
}
} else if (getTank().getYear() < 3145) {
// between 3090 and 3145, mixed tech is advanced
if ((getTank().getTechLevel() != TechConstants.T_IS_UNOFFICIAL) && (getTank().getTechLevel() != TechConstants.T_IS_EXPERIMENTAL)) {
getTank().setTechLevel(TechConstants.T_IS_ADVANCED);
}
} else {
// from 3145 on, mixed tech is tourney legal
if ((getTank().getTechLevel() != TechConstants.T_IS_UNOFFICIAL) && (getTank().getTechLevel() != TechConstants.T_IS_EXPERIMENTAL) && (getTank().getTechLevel() != TechConstants.T_IS_TW_NON_BOX)) {
getTank().setTechLevel(TechConstants.T_IS_TW_NON_BOX);
}
}
getTank().setMixedTech(true);
} else if ((techType.getSelectedIndex() == 3)
&& (!getTank().isMixedTech() || !getTank().isClan())) {
techLevel.removeAllItems();
for (String item : clanTechLevels) {
techLevel.addItem(item);
}
if (getTank().getYear() < 3090) {
//before 3090, mixed tech is experimental
if ((getTank().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL)) {
getTank().setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
}
} else if (getTank().getYear() < 3145) {
// between 3090 and 3145, mixed tech is advanced
if ((getTank().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL) && (getTank().getTechLevel() != TechConstants.T_CLAN_EXPERIMENTAL)) {
getTank().setTechLevel(TechConstants.T_CLAN_ADVANCED);
}
} else {
// from 3145 on, mixed tech is tourney legal
if ((getTank().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL) && (getTank().getTechLevel() != TechConstants.T_CLAN_EXPERIMENTAL) && (getTank().getTechLevel() != TechConstants.T_CLAN_TW)) {
getTank().setTechLevel(TechConstants.T_CLAN_TW);
}
}
getTank().setMixedTech(true);
}
int engineNumber = engineType.getSelectedIndex();
updateEngineTypes(getTank().isClan());
// Reset the engine
if (engineNumber >= engineType.getItemCount()) {
engineType.setSelectedIndex(0);
} else {
engineType.setSelectedIndex(engineNumber);
}
updateArmor();
} else if (combo.equals(tankMotiveType)) {
int currentTonnage = (Integer) weight.getModel().getValue();
setAvailableWeights(currentTonnage);
updateArmor();
updateWeightEngineMovement();
} else if (combo.equals(turretCombo)) {
updateTurrets(combo);
} else if (combo.equals(armorCombo)) {
if (!getTank().hasPatchworkArmor()) {
armor.resetArmorPoints();
}
setArmorType();
}
} catch (Exception ex) {
ex.printStackTrace();
}
addAllListeners();
refresh.refreshAll();
}
}
}