/*
* 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.Aero.tabs;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
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 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.common.Aero;
import megamek.common.CriticalSlot;
import megamek.common.Engine;
import megamek.common.EquipmentType;
import megamek.common.TechConstants;
import megamek.common.verifier.TestAero;
import megamek.common.verifier.TestEntity;
import megameklab.com.ui.EntitySource;
import megameklab.com.ui.Aero.views.ArmorView;
import megameklab.com.ui.Aero.views.SummaryView;
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 ENGINEXXL = "XXL";
private static final String ENGINELIGHT = "Light";
private static final String ENGINECOMPACT = "Compact";
String[] isEngineTypes = { ENGINESTANDARD, ENGINEXL, ENGINEXXL, ENGINELIGHT,
ENGINECOMPACT};
String[] isIndustrialEngineTypes = { ENGINESTANDARD};
String[] clanEngineTypes = { ENGINESTANDARD, ENGINEXL, ENGINEXXL};
String[] clanIndustrialEngineTypes = { ENGINESTANDARD};
private int clanEngineFlag = 0;
String[] heatSinkTypes = { "Single", "Double"};
String[] techTypes = { "Inner Sphere", "Clan", "Mixed Inner Sphere",
"Mixed Clan" };
String[] isTechLevels = { "Introductory", "Standard", "Advanced",
"Experimental", "Unoffical" };
String[] clanTechLevels = { "Standard", "Advanced", "Experimental",
"Unoffical" };
String[] craftTypes = {"Aerospace Fighter"};
private JPanel masterPanel;
private JPanel panInfo;
private JPanel panChassis;
private JPanel panArmor;
private JPanel panMovement;
private JPanel panFuel;
private JPanel panHeat;
private SummaryView panSummary;
private ArmorView armorView;
RefreshListener refresh = null;
// Basic Info Panel
private JTextField chassis = new JTextField(5);
private JTextField model = new JTextField(5);
private JTextField era = new JTextField(3);
private JTextField source = new JTextField(3);
private JComboBox<String> techType = new JComboBox<String>(techTypes);
private JComboBox<String> techLevel = new JComboBox<String>(isTechLevels);
private JTextField manualBV = new JTextField(3);
// Chassis Panel
private JSpinner weightClass;
private JSpinner structuralIntegrity;
private JCheckBox hasVSTOL = new JCheckBox("VSTOL");
private JComboBox<String> unitType = new JComboBox<String>(craftTypes);
private JComboBox<String> engineType = new JComboBox<String>(isEngineTypes);
private JComboBox<String> cockpitType =
new JComboBox<String>(Aero.COCKPIT_SHORT_STRING);
private JCheckBox omniCB = new JCheckBox("Omni");
private JButton resetChassisButton = new JButton("Reset Chassis (Omni)");
// Movement Panel
private JSpinner safeThrust;
private JTextField maxThrust;
// Fuel Panel
private JSpinner fuel;
private JLabel fuelPoints;
private JLabel turnsAtSafe;
private JLabel turnsAtMax;
//private JLabel burnDays1G;
//private JLabel burnDaysMax;
// Heat Sinks Panel
private JComboBox<String> heatSinkType =
new JComboBox<String>(heatSinkTypes);
private JSpinner heatSinkNumber;
private JSpinner baseChassisHeatSinks;
// Armor Panel
private JComboBox<String> armorCombo = new JComboBox<String>();
private JSpinner armorTonnage;
private JButton maximizeArmorButton = new JButton("Maximize Armor");
private JButton unusedTonnageArmorButton = new JButton("Use Remaining Tonnage");
public StructureTab(EntitySource eSource) {
super(eSource);
armorView = new ArmorView(eSource);
setLayout(new BorderLayout());
setUpPanels();
this.add(masterPanel, BorderLayout.CENTER);
populateChoices(false);
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());
panFuel = new JPanel(new GridBagLayout());
panHeat = new JPanel(new GridBagLayout());
panSummary = new SummaryView(eSource);
GridBagConstraints gbc;
Dimension spinnerSize = new Dimension(55, 25);
safeThrust = new JSpinner(new SpinnerNumberModel(1, 1, 25, 1));
((JSpinner.DefaultEditor) safeThrust.getEditor()).setSize(spinnerSize);
((JSpinner.DefaultEditor) safeThrust.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) safeThrust.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) safeThrust.getEditor())
.setMinimumSize(spinnerSize);
maxThrust = new JTextField();
maxThrust.setEditable(false);
setFieldSize(maxThrust, spinnerSize);
maxThrust.setHorizontalAlignment(SwingConstants.RIGHT);
weightClass = new JSpinner(new SpinnerNumberModel(20, 10, 100, 5));
structuralIntegrity = new JSpinner(new SpinnerNumberModel(3, 1, 100, 1));
((JSpinner.DefaultEditor) structuralIntegrity.getEditor())
.getTextField().setEditable(false);
structuralIntegrity.setEnabled(false);
hasVSTOL.setToolTipText("Very short take-off and landing");
hasVSTOL.setSelected(true);
hasVSTOL.setEnabled(false);
fuel = new JSpinner(new SpinnerNumberModel(1.0, 0.0,
((Integer)weightClass.getValue()).doubleValue(), 0.5));
((JSpinner.DefaultEditor) fuel.getEditor()).setSize(spinnerSize);
((JSpinner.DefaultEditor) fuel.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) fuel.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) fuel.getEditor())
.setMinimumSize(spinnerSize);
fuelPoints = new JLabel("0");
turnsAtSafe = new JLabel("0", JLabel.CENTER);
turnsAtMax = new JLabel("0", JLabel.CENTER);
//burnDays1G = new JLabel("0", JLabel.CENTER);
//burnDaysMax = new JLabel("0", JLabel.CENTER);
heatSinkNumber = new JSpinner(new SpinnerNumberModel(0, 0, 100, 1));
spinnerSize = new Dimension(40, 25);
((JSpinner.DefaultEditor) heatSinkNumber.getEditor())
.setSize(spinnerSize);
((JSpinner.DefaultEditor) heatSinkNumber.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) heatSinkNumber.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) heatSinkNumber.getEditor())
.setMinimumSize(spinnerSize);
baseChassisHeatSinks = new JSpinner(new SpinnerNumberModel(0, 0, 50, 1));
((JSpinner.DefaultEditor) baseChassisHeatSinks.getEditor())
.setSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisHeatSinks.getEditor())
.setMaximumSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisHeatSinks.getEditor())
.setPreferredSize(spinnerSize);
((JSpinner.DefaultEditor) baseChassisHeatSinks.getEditor())
.setMinimumSize(spinnerSize);
armorTonnage = new JSpinner(new SpinnerNumberModel(
getAero().getArmorWeight(), 0.0, UnitUtil.getMaximumArmorTonnage(getAero()), 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);
chassis.setText(getAero().getChassis());
model.setText(getAero().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(weightClass, gbc);
gbc.gridx = 2;
gbc.gridy = 0;
gbc.anchor = GridBagConstraints.EAST;
panChassis.add(omniCB, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
gbc.anchor = GridBagConstraints.WEST;
panChassis.add(createLabel("SI:", labelSize),gbc);
gbc.gridx = 1;
panChassis.add(structuralIntegrity, gbc);
gbc.gridx = 2;
gbc.anchor = GridBagConstraints.EAST;
panChassis.add(hasVSTOL,gbc);
gbc.gridx = 0;
gbc.gridy = 2;
gbc.anchor = GridBagConstraints.WEST;
panChassis.add(createLabel("Unit Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridwidth = 2;
panChassis.add(unitType, gbc);
gbc.gridx = 0;
gbc.gridy = 3;
gbc.gridwidth = 1;
panChassis.add(createLabel("Engine Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 3;
gbc.gridwidth = 3;
panChassis.add(engineType, gbc);
gbc.gridx = 0;
gbc.gridy = 4;
gbc.gridwidth = 1;
gbc.gridx = 0;
gbc.gridy = 5;
gbc.gridwidth = 1;
panChassis.add(createLabel("Cockpit Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 5;
gbc.gridwidth = 3;
panChassis.add(cockpitType, gbc);
gbc.gridx = 1;
gbc.gridy = 6;
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("Safe Thrust:", labelSize), gbc);
gbc.gridx = 1;
gbc.fill = java.awt.GridBagConstraints.NONE;
panMovement.add(safeThrust, gbc);
gbc.gridx = 0;
gbc.gridy++;
panMovement.add(createLabel("Max Thrust:", labelSize), gbc);
gbc.gridx = 1;
panMovement.add(maxThrust, gbc);
gbc.insets = new Insets(0,0,0,0);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.gridwidth = 1;
panFuel.add(createLabel("Fuel Tons:", labelSize), gbc);
gbc.gridx = 1;
gbc.fill = GridBagConstraints.NONE;
panFuel.add(fuel, gbc);
gbc.gridx = 2;
gbc.fill = GridBagConstraints.BOTH;
panFuel.add(createLabel("Fuel Points:", labelSize), gbc);
gbc.gridx = 3;
fuelPoints.setSize(labelSize);
gbc.insets = new Insets(0,10,0,20);
panFuel.add(fuelPoints, gbc);
gbc.insets = new Insets(0,0,0,0);
JPanel fuelInfoPanel = new JPanel(new GridLayout(0,2));
JLabel lblTurnsAtSafe =
new JLabel("Turns at Safe", JLabel.CENTER);
JLabel lblTurnsAtMax =
new JLabel("Turns at Max", JLabel.CENTER);
fuelInfoPanel.add(lblTurnsAtSafe);
fuelInfoPanel.add(lblTurnsAtMax);
fuelInfoPanel.add(turnsAtSafe);
fuelInfoPanel.add(turnsAtMax);
/*
JLabel lbl1GBurnDays =
new JLabel("1G Burn Days", JLabel.CENTER);
JLabel lblMaxBurnDays =
new JLabel("Max Burn Days", JLabel.CENTER);
fuelInfoPanel.add(lbl1GBurnDays);
fuelInfoPanel.add(lblMaxBurnDays);
fuelInfoPanel.add(burnDays1G);
fuelInfoPanel.add(burnDaysMax);
*/
gbc.gridx = 0;
gbc.gridwidth = 4;
gbc.gridy = 1;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.insets = new Insets(10,10,10,10);
panFuel.add(fuelInfoPanel, gbc);
gbc.gridx = 0;
gbc.gridy = 0;
gbc.insets = new Insets(0,0,0,0);
gbc.fill = java.awt.GridBagConstraints.NONE;
panHeat.add(createLabel("Sink Type:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 0;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = GridBagConstraints.WEST;
panHeat.add(heatSinkType, gbc);
gbc.gridx = 0;
gbc.gridy = 1;
gbc.gridwidth = 1;
panHeat.add(createLabel("Number:", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 1;
gbc.fill = java.awt.GridBagConstraints.NONE;
panHeat.add(heatSinkNumber, gbc);
gbc.gridx = 0;
gbc.gridy = 2;
panHeat.add(createLabel("Base (Omni):", labelSize), gbc);
gbc.gridx = 1;
gbc.gridy = 2;
panHeat.add(baseChassisHeatSinks, gbc);
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(heatSinkType, comboSize);
setFieldSize(engineType, comboSize);
setFieldSize(unitType, comboSize);
setFieldSize(cockpitType, comboSize);
setFieldSize(model, comboSize);
setFieldSize(chassis, comboSize);
JPanel leftPanel = new JPanel();
JPanel midPanel = new JPanel();
JPanel rightPanel = new JPanel();
leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS));
midPanel.setLayout(new BoxLayout(midPanel, BoxLayout.Y_AXIS));
rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS));
leftPanel.add(panInfo);
leftPanel.add(panChassis);
leftPanel.add(panHeat);
//leftPanel.add(Box.createGlue());
//leftPanel.add(Box.createVerticalGlue());
midPanel.add(panMovement);
midPanel.add(panFuel);
midPanel.add(panSummary);
midPanel.add(Box.createHorizontalStrut(300));
rightPanel.add(panArmor);
rightPanel.add(armorView);
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(midPanel, gbc);
gbc.gridx = 2;
masterPanel.add(rightPanel, gbc);
panInfo.setBorder(BorderFactory.createTitledBorder("Basic Information"));
panChassis.setBorder(BorderFactory.createTitledBorder("Chassis"));
panMovement.setBorder(BorderFactory.createTitledBorder("Movement"));
panFuel.setBorder(BorderFactory.createTitledBorder("Fuel"));
panHeat.setBorder(BorderFactory.createTitledBorder("Heat Sinks"));
panArmor.setBorder(BorderFactory.createTitledBorder("Armor"));
panSummary.setBorder(BorderFactory.createTitledBorder("Summary"));
armorView.setBorder(BorderFactory.createTitledBorder("Armor Allocation"));
}
public void refresh() {
removeAllListeners();
if (getAero().isPrimitive()) {
getAero().setOmni(false);
omniCB.setEnabled(false);
} else {
omniCB.setEnabled(true);
}
omniCB.setSelected(getAero().isOmni());
resetChassisButton.setEnabled(getAero().isOmni());
fuelPoints.setText(getAero().getFuel()+"");
turnsAtSafe.setText(String.format(
"%1$.2f", TestAero.calculateMaxTurnsAtSafe(getAero())));
turnsAtMax.setText(String.format(
"%1$.2f", TestAero.calculateMaxTurnsAtMax(getAero())));
era.setText(Integer.toString(getAero().getYear()));
source.setText(getAero().getSource());
manualBV.setText(Integer.toString(Math.max(0, getAero().getManualBV())));
weightClass.setValue((int) (getAero().getWeight()));
int totalSinks = getAero().getHeatSinks();
int freeSinks = getAero().getEngine().getWeightFreeEngineHeatSinks();
((SpinnerNumberModel) heatSinkNumber.getModel()).setMinimum(freeSinks);
heatSinkNumber.setValue(totalSinks);
((SpinnerNumberModel) baseChassisHeatSinks.getModel()).setMinimum(freeSinks);
((SpinnerNumberModel) baseChassisHeatSinks.getModel())
.setMaximum(totalSinks);
baseChassisHeatSinks.setValue(Math.max(0, totalSinks - getAero().getPodHeatSinks()));
if (getAero().isOmni()) {
baseChassisHeatSinks.setEnabled(true);
getAero().getEngine().setBaseChassisHeatSinks(
Math.max(0, (Integer) baseChassisHeatSinks.getValue()));
} else {
baseChassisHeatSinks.setEnabled(false);
getAero().getEngine().setBaseChassisHeatSinks(-1);
}
if (getAero().isClan()) {
techLevel.removeAllItems();
for (String item : clanTechLevels) {
techLevel.addItem(item);
}
} else {
techLevel.removeAllItems();
for (String item : isTechLevels) {
techLevel.addItem(item);
}
}
engineType.setSelectedIndex(convertEngineType(getAero().getEngine()
.getEngineType()));
if (getAero().hasPatchworkArmor()) {
setArmorCombo(EquipmentType.T_ARMOR_PATCHWORK);
} else {
setArmorCombo(getAero().getArmorType(0));
}
cockpitType.setSelectedItem(Aero.COCKPIT_SHORT_STRING[getAero()
.getCockpitType()]);
if (getAero().isMixedTech()) {
if (getAero().isClan()) {
techType.setSelectedIndex(3);
if (getAero().getTechLevel() >= TechConstants.T_CLAN_UNOFFICIAL) {
techLevel.setSelectedIndex(3);
} else if (getAero().getTechLevel() >= TechConstants.T_CLAN_EXPERIMENTAL) {
techLevel.setSelectedIndex(2);
} else {
techLevel.setSelectedIndex(1);
}
} else {
techType.setSelectedIndex(2);
if (getAero().getTechLevel() >= TechConstants.T_IS_UNOFFICIAL) {
techLevel.setSelectedIndex(4);
} else if (getAero().getTechLevel() >= TechConstants.T_IS_EXPERIMENTAL) {
techLevel.setSelectedIndex(3);
} else {
techLevel.setSelectedIndex(2);
}
}
} else if (getAero().isClan()) {
techType.setSelectedIndex(1);
if (getAero().getTechLevel() >= TechConstants.T_CLAN_UNOFFICIAL) {
techLevel.setSelectedIndex(3);
} else if (getAero().getTechLevel() >= TechConstants.T_CLAN_EXPERIMENTAL) {
techLevel.setSelectedIndex(2);
} else if (getAero().getTechLevel() >= TechConstants.T_CLAN_ADVANCED) {
techLevel.setSelectedIndex(1);
} else {
techLevel.setSelectedIndex(0);
}
} else {
techType.setSelectedIndex(0);
if (getAero().getTechLevel() >= TechConstants.T_IS_UNOFFICIAL) {
techLevel.setSelectedIndex(4);
} else if (getAero().getTechLevel() >= TechConstants.T_IS_EXPERIMENTAL) {
techLevel.setSelectedIndex(3);
} else if (getAero().getTechLevel() >= TechConstants.T_IS_ADVANCED) {
techLevel.setSelectedIndex(2);
} else if (getAero().getTechLevel() >= TechConstants.T_IS_TW_NON_BOX) {
techLevel.setSelectedIndex(1);
} else {
techLevel.setSelectedIndex(0);
}
}
setHeatSinkCombo();
fuel.setValue((double)getAero().getFuelTonnage());
safeThrust.setValue(getAero().getOriginalWalkMP());
maxThrust.setText(getAero().getRunMPasString());
setAeroStructuralIntegrity();
((SpinnerNumberModel) armorTonnage.getModel()).setMaximum(UnitUtil
.getMaximumArmorTonnage(getAero()));
((SpinnerNumberModel) armorTonnage.getModel()).setValue(Math.min(UnitUtil
.getMaximumArmorTonnage(getAero()), getAero().getLabArmorTonnage()));
armorTonnage.setEnabled(true);
maximizeArmorButton.setEnabled(true);
unusedTonnageArmorButton.setEnabled(true);
armorView.refresh();
panSummary.refresh();
addAllListeners();
}
public JLabel createLabel(String text, Dimension maxSize) {
JLabel label = new JLabel(text, SwingConstants.RIGHT);
setFieldSize(label, maxSize);
return label;
}
public void setFieldSize(JComponent box, Dimension maxSize) {
box.setPreferredSize(maxSize);
box.setMaximumSize(maxSize);
box.setMinimumSize(maxSize);
}
public void itemStateChanged(ItemEvent e) {
if (e.getStateChange() == ItemEvent.SELECTED) {
removeAllListeners();
@SuppressWarnings("unchecked")
JComboBox<String> combo = (JComboBox<String>) e.getSource();
// we need to do cockpit also here, because cockpitType
// determines
// if a mech is primitive and thus needs a larger engine
if (combo.equals(engineType) || combo.equals(cockpitType)) {
if (combo.equals(cockpitType)) {
getAero().setCockpitType(combo.getSelectedIndex());
if (getAero().getCockpitType() == Aero.COCKPIT_PRIMITIVE){
getAero().setArmorType(EquipmentType.T_ARMOR_PRIMITIVE);
}
armorView.resetArmorPoints();
}
int rating = TestAero.calculateEngineRating(
getAero(),
(Integer) weightClass.getValue(),
(Integer) safeThrust.getValue());
if (rating > TestAero.MAX_ENGINE_RATING) {
JOptionPane
.showMessageDialog(
this,
"That speed would create an engine " +
"with a rating over the max rating, " +
TestAero.MAX_ENGINE_RATING + ".",
"Bad Engine Rating",
JOptionPane.ERROR_MESSAGE);
} else {
setNewEngine(rating, convertEngineType(engineType
.getSelectedItem().toString()));
}
} else if (combo.equals(armorCombo)) {
UnitUtil.removeISorArmorMounts(getAero(), false);
createArmorMountsAndSetArmorType();
armorView.resetArmorPoints();
} else if (combo.equals(heatSinkType)) {
getAero().setHeatType((Integer) heatSinkType.getSelectedIndex());
} else if (combo.equals(techLevel)) {
int unitTechLevel = techLevel.getSelectedIndex();
if (getAero().isClan()) {
switch (unitTechLevel) {
case 0:
getAero().setTechLevel(TechConstants.T_CLAN_TW);
techType.setSelectedIndex(1);
break;
case 1:
getAero().setTechLevel(
TechConstants.T_CLAN_ADVANCED);
break;
case 2:
getAero().setTechLevel(
TechConstants.T_CLAN_EXPERIMENTAL);
break;
case 3:
getAero().setTechLevel(
TechConstants.T_CLAN_UNOFFICIAL);
break;
default:
getAero().setTechLevel(TechConstants.T_CLAN_TW);
break;
}
} else {
switch (unitTechLevel) {
case 0:
getAero()
.setTechLevel(TechConstants.T_INTRO_BOXSET);
techType.setSelectedIndex(0);
break;
case 1:
getAero().setTechLevel(
TechConstants.T_IS_TW_NON_BOX);
techType.setSelectedIndex(0);
break;
case 2:
getAero().setTechLevel(TechConstants.T_IS_ADVANCED);
break;
case 3:
getAero().setTechLevel(
TechConstants.T_IS_EXPERIMENTAL);
break;
default:
getAero().setTechLevel(
TechConstants.T_IS_UNOFFICIAL);
break;
}
}
populateChoices(true);
armorView.resetArmorPoints();
UnitUtil.checkEquipmentByTechLevel(getAero());
} else if (combo.equals(techType)) {
if ((techType.getSelectedIndex() == 1)
&& (!getAero().isClan() || getAero().isMixedTech())) {
techLevel.removeAllItems();
for (String item : clanTechLevels) {
techLevel.addItem(item);
}
getAero().setMixedTech(false);
if (!getAero().isClan()) {
int level = TechConstants
.getOppositeTechLevel(getAero().getTechLevel());
getAero().setTechLevel(level);
getAero().setStructureTechLevel(level);
}
} else if ((techType.getSelectedIndex() == 0)
&& (getAero().isClan() || getAero().isMixedTech())) {
techLevel.removeAllItems();
for (String item : isTechLevels) {
techLevel.addItem(item);
}
getAero().setMixedTech(false);
if (getAero().isClan()) {
int level = TechConstants
.getOppositeTechLevel(getAero().getTechLevel());
getAero().setTechLevel(level);
getAero().setStructureTechLevel(level);
}
} else if ((techType.getSelectedIndex() == 2)
&& (!getAero().isMixedTech() || getAero().isClan())) {
techLevel.removeAllItems();
for (String item : isTechLevels) {
techLevel.addItem(item);
}
if (getAero().getYear() < 3090) {
//before 3090, mixed tech is experimental
if ((getAero().getTechLevel() != TechConstants.T_IS_UNOFFICIAL)) {
getAero().setTechLevel(TechConstants.T_IS_EXPERIMENTAL);
}
} else if (getAero().getYear() < 3145) {
// between 3090 and 3145, mixed tech is advanced
if ((getAero().getTechLevel() != TechConstants.T_IS_UNOFFICIAL) && (getAero().getTechLevel() != TechConstants.T_IS_EXPERIMENTAL)) {
getAero().setTechLevel(TechConstants.T_IS_ADVANCED);
}
} else {
// from 3145 on, mixed tech is tourney legal
if ((getAero().getTechLevel() != TechConstants.T_IS_UNOFFICIAL) && (getAero().getTechLevel() != TechConstants.T_IS_EXPERIMENTAL) && (getAero().getTechLevel() != TechConstants.T_IS_TW_NON_BOX)) {
getAero().setTechLevel(TechConstants.T_IS_TW_NON_BOX);
}
}
getAero().setMixedTech(true);
} else if ((techType.getSelectedIndex() == 3)
&& (!getAero().isMixedTech() || !getAero().isClan())) {
techLevel.removeAllItems();
for (String item : clanTechLevels) {
techLevel.addItem(item);
}
if (getAero().getYear() < 3090) {
//before 3090, mixed tech is experimental
if ((getAero().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL)) {
getAero().setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL);
}
} else if (getAero().getYear() < 3145) {
// between 3090 and 3145, mixed tech is advanced
if ((getAero().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL) && (getAero().getTechLevel() != TechConstants.T_CLAN_EXPERIMENTAL)) {
getAero().setTechLevel(TechConstants.T_CLAN_ADVANCED);
}
} else {
// from 3145 on, mixed tech is tourney legal
if ((getAero().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL) && (getAero().getTechLevel() != TechConstants.T_CLAN_EXPERIMENTAL) && (getAero().getTechLevel() != TechConstants.T_CLAN_TW)) {
getAero().setTechLevel(TechConstants.T_CLAN_TW);
}
}
getAero().setMixedTech(true);
}
if (!getAero().hasPatchworkArmor()) {
UnitUtil.removeISorArmorMounts(getAero(), false);
}
createArmorMountsAndSetArmorType();
populateChoices(true);
armorView.resetArmorPoints();
UnitUtil.checkEquipmentByTechLevel(getAero());
}
addAllListeners();
refresh.refreshAll();
}
}
public void actionPerformed(ActionEvent e) {
removeAllListeners();
if (e.getSource() instanceof JCheckBox) {
JCheckBox check = (JCheckBox) e.getSource();
if (check.equals(omniCB)) {
getAero().setOmni(omniCB.isSelected());
if (getAero().isOmni()) {
baseChassisHeatSinks.setEnabled(true);
getAero().getEngine().setBaseChassisHeatSinks((Integer)baseChassisHeatSinks.getValue());
getAero().setPodHeatSinks((Integer)heatSinkNumber.getValue()
- (Integer)baseChassisHeatSinks.getValue());
} else {
baseChassisHeatSinks.setEnabled(false);
getAero().getEngine().setBaseChassisHeatSinks(-1);
getAero().setPodHeatSinks(0);
}
resetChassisButton.setEnabled(omniCB.isSelected());
}
} 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(getAero());
}
}
addAllListeners();
refresh.refreshAll();
}
public void removeSystemCrits(int systemType) {
for (int loc = 0; loc < getAero().locations(); loc++) {
for (int slot = 0; slot < getAero().getNumberOfCriticals(loc); slot++) {
CriticalSlot cs = getAero().getCritical(loc, slot);
if ((cs == null) || (cs.getType() != CriticalSlot.TYPE_SYSTEM)) {
continue;
}
if (cs.getIndex() == systemType) {
getAero().setCritical(loc, slot, null);
}
}
}
}
public void removeAllListeners() {
maximizeArmorButton.removeActionListener(this);
unusedTonnageArmorButton.removeActionListener(this);
armorCombo.removeItemListener(this);
engineType.removeItemListener(this);
unitType.removeItemListener(this);
weightClass.removeChangeListener(this);
cockpitType.removeItemListener(this);
resetChassisButton.removeActionListener(this);
heatSinkNumber.removeChangeListener(this);
heatSinkType.removeItemListener(this);
safeThrust.removeChangeListener(this);
fuel.removeChangeListener(this);
techLevel.removeItemListener(this);
techType.removeItemListener(this);
era.removeKeyListener(this);
source.removeKeyListener(this);
manualBV.removeKeyListener(this);
omniCB.removeActionListener(this);
baseChassisHeatSinks.removeChangeListener(this);
chassis.removeKeyListener(this);
model.removeKeyListener(this);
armorTonnage.removeChangeListener(this);
}
public void addAllListeners() {
maximizeArmorButton.addActionListener(this);
unusedTonnageArmorButton.addActionListener(this);
armorCombo.addItemListener(this);
engineType.addItemListener(this);
unitType.addItemListener(this);
weightClass.addChangeListener(this);
cockpitType.addItemListener(this);
resetChassisButton.addActionListener(this);
heatSinkNumber.addChangeListener(this);
heatSinkType.addItemListener(this);
safeThrust.addChangeListener(this);
fuel.addChangeListener(this);
techLevel.addItemListener(this);
techType.addItemListener(this);
era.addKeyListener(this);
source.addKeyListener(this);
manualBV.addKeyListener(this);
omniCB.addActionListener(this);
baseChassisHeatSinks.addChangeListener(this);
chassis.addKeyListener(this);
model.addKeyListener(this);
armorTonnage.addChangeListener(this);
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
removeAllListeners();
if (e.getSource().equals(era)) {
try {
int year = Integer.parseInt(era.getText());
if (year < 1950) {
addAllListeners();
return;
}
getAero().setYear(Integer.parseInt(era.getText()));
} catch (Exception ex) {
getAero().setYear(3145);
}
refresh.refreshEquipment();
populateChoices(true);
armorView.resetArmorPoints();
UnitUtil.checkEquipmentByTechLevel(getAero());
} else if (e.getSource().equals(source)) {
getAero().setSource(source.getText());
} else if (e.getSource().equals(manualBV)) {
if (!manualBV.getText().equals("-")) {
int bv = Integer.parseInt(manualBV.getText());
if (bv == 0) {
getAero().setUseManualBV(false);
getAero().setManualBV(0);
} else {
getAero().setUseManualBV(true);
getAero().setManualBV(bv);
}
}
} else if (e.getSource().equals(chassis)) {
getAero().setChassis(chassis.getText().trim());
} else if (e.getSource().equals(model)) {
getAero().setModel(model.getText().trim());
}
addAllListeners();
refresh.refreshPreview();
refresh.refreshHeader();
}
public void keyTyped(KeyEvent e) {
}
public void addRefreshedListener(RefreshListener l) {
refresh = l;
armorView.addRefreshedListener(l);
}
private int convertEngineType(int engineType) {
if (getAero().isMixedTech()) {
// Clan Chassis with Clan Engine
if (getAero().isClan()
&& getAero().getEngine().hasFlag(Engine.CLAN_ENGINE)) {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
case Engine.XL_ENGINE:
return 2;
case Engine.XXL_ENGINE:
return 4;
}
}// Clan Chassis with IS Engine
else if (getAero().isClan()
&& !getAero().getEngine().hasFlag(Engine.CLAN_ENGINE)) {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 1;
case Engine.XL_ENGINE:
return 3;
case Engine.LIGHT_ENGINE:
return 6;
case Engine.COMPACT_ENGINE:
return 7;
case Engine.XXL_ENGINE:
return 5;
}
}// IS Chassis with Clan Engine
else if (!getAero().isClan()
&& getAero().getEngine().hasFlag(Engine.CLAN_ENGINE)) {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 1;
case Engine.XL_ENGINE:
return 3;
case Engine.XXL_ENGINE:
return 5;
}
}// IS Chassis with IS Engine
else {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
case Engine.XL_ENGINE:
return 2;
case Engine.LIGHT_ENGINE:
return 6;
case Engine.COMPACT_ENGINE:
return 7;
case Engine.XXL_ENGINE:
return 4;
}
}
} else if (getAero().getEngine().hasFlag(Engine.CLAN_ENGINE)) {
if (getAero().isPrimitive()) {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
}
} else {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
case Engine.XL_ENGINE:
return 1;
case Engine.XXL_ENGINE:
return 2;
}
}
} else {
if (getAero().isPrimitive()) {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
}
} else {
switch (engineType) {
case Engine.NORMAL_ENGINE:
return 0;
case Engine.XL_ENGINE:
return 1;
case Engine.LIGHT_ENGINE:
return 3;
case Engine.COMPACT_ENGINE:
return 4;
case Engine.XXL_ENGINE:
return 2;
}
}
}
return 0;
}
private int convertEngineType(String engineType) {
if (getAero().isMixedTech()) {
if (engineType.startsWith("(")) {
if (engineType.startsWith("(Clan")) {
clanEngineFlag = Engine.CLAN_ENGINE;
} else {
clanEngineFlag = 0;
}
engineType = engineType.substring(
engineType.lastIndexOf(")") + 1).trim();
} else {
if (getAero().isClan()) {
clanEngineFlag = Engine.CLAN_ENGINE;
} else {
clanEngineFlag = 0;
}
}
}
if (engineType.equals(ENGINESTANDARD)) {
return Engine.NORMAL_ENGINE;
}
if (engineType.equals(ENGINEXL)) {
return Engine.XL_ENGINE;
}
if (engineType.equals(ENGINECOMPACT)) {
return Engine.COMPACT_ENGINE;
}
if (engineType.equals(ENGINELIGHT)) {
return Engine.LIGHT_ENGINE;
}
if (engineType.equals(ENGINEXXL)) {
return Engine.XXL_ENGINE;
}
return Engine.NORMAL_ENGINE;
}
/**
* resets all the various combo boxes with appropriate options based on the
* tech base and tech level of the unit. This should NEVER be run when
* listeners are turned on. If the updateUnit boolean is set to true, then
* this method will check that the values of the current unit are available
* as choices after populating the choices and if not it will reset them to
* default values on the unit itself.
*
* @param updateUnit
*/
private void populateChoices(boolean updateUnit) {
boolean isClan = getAero().isClan();
boolean isMixed = getAero().isMixedTech();
boolean isExperimental = (getAero().getTechLevel() == TechConstants.T_IS_EXPERIMENTAL)
|| (getAero().getTechLevel() == TechConstants.T_CLAN_EXPERIMENTAL)
|| (getAero().getTechLevel() == TechConstants.T_IS_UNOFFICIAL)
|| (getAero().getTechLevel() == TechConstants.T_CLAN_UNOFFICIAL);
/* ARMOR */
armorCombo.removeAllItems();
for (TestAero.AeroArmor armor : TestAero.AeroArmor.values()) {
int type = armor.type;
EquipmentType et;
if (!isMixed) {
boolean techMatch = (armor.isClan && getAero().isClan()) ||
(!armor.isClan && !getAero().isClan());
et = EquipmentType.get(
EquipmentType.getArmorTypeName(type, armor.isClan));
boolean isPatchwork = type == EquipmentType.T_ARMOR_PATCHWORK;
boolean legalTechLvl = (et != null) &&
(TechConstants.isLegal(getAero().getTechLevel(),
et.getTechLevel(getAero().getYear()),
isMixed));
if (techMatch && ((isPatchwork && isExperimental) ||
legalTechLvl)) {
armorCombo.addItem(EquipmentType.armorNames[type]);
}
} else {
et = EquipmentType.get(EquipmentType.getArmorTypeName(type, true));
if (et != null && TechConstants.isLegal(getAero().getTechLevel(), et
.getTechLevel(getAero().getYear()),
true)) {
armorCombo.addItem(EquipmentType.getArmorTypeName(type, true));
}
et = EquipmentType.get(EquipmentType.getArmorTypeName(type, false));
if (et != null && TechConstants.isLegal(getAero().getTechLevel(), et
.getTechLevel(getAero().getYear()),
true)) {
armorCombo.addItem(EquipmentType.getArmorTypeName(type, false));
}
if (type == EquipmentType.T_ARMOR_PATCHWORK) {
armorCombo.addItem(EquipmentType.getArmorTypeName(type));
}
}
}
/* ENGINE */
int engineCount = 1;
String[] engineList = new String[0];
engineType.removeAllItems();
if (isMixed) {
if (isClan) {
engineCount = clanEngineTypes.length + isEngineTypes.length;
engineList = new String[engineCount];
int clanPos = 0;
int enginePos = 0;
for (String isEngine : isEngineTypes) {
if (clanPos < clanEngineTypes.length &&
clanEngineTypes[clanPos].equals(isEngine)) {
engineList[enginePos] = clanEngineTypes[clanPos];
clanPos++;
enginePos++;
}
engineList[enginePos] = String
.format("(IS) %1$s", isEngine);
enginePos++;
}
} else {
engineCount = clanEngineTypes.length + isEngineTypes.length;
engineList = new String[engineCount];
int clanPos = 0;
int enginePos = 0;
for (String isEngine : isEngineTypes) {
engineList[enginePos] = isEngine;
enginePos++;
if (clanPos < clanEngineTypes.length &&
clanEngineTypes[clanPos].equals(isEngine)) {
engineList[enginePos] = String.format("(Clan) %1$s",
clanEngineTypes[clanPos]);
clanPos++;
enginePos++;
}
}
}
} else {
if (isClan) {
clanEngineFlag = Engine.CLAN_ENGINE;
if (getAero().isPrimitive()) {
engineList = clanIndustrialEngineTypes;
engineCount = clanIndustrialEngineTypes.length;
} else {
engineList = clanEngineTypes;
switch (getAero().getTechLevel()) {
case TechConstants.T_INTRO_BOXSET:
engineCount = 1;
break;
case TechConstants.T_CLAN_TW:
case TechConstants.T_CLAN_ADVANCED:
case TechConstants.T_CLAN_EXPERIMENTAL:
case TechConstants.T_CLAN_UNOFFICIAL:
engineCount = 3;
break;
case TechConstants.T_IS_TW_NON_BOX:
engineCount = 2;
break;
case TechConstants.T_IS_ADVANCED:
case TechConstants.T_IS_EXPERIMENTAL:
case TechConstants.T_IS_UNOFFICIAL:
engineCount = 3;
break;
}
}
} else {
clanEngineFlag = 0;
if (getAero().isPrimitive()) {
engineList = isIndustrialEngineTypes;
engineCount = isIndustrialEngineTypes.length;
} else {
engineList = isEngineTypes;
switch (getAero().getTechLevel()) {
case TechConstants.T_INTRO_BOXSET:
engineCount = 1;
break;
case TechConstants.T_CLAN_TW:
case TechConstants.T_CLAN_ADVANCED:
case TechConstants.T_CLAN_EXPERIMENTAL:
case TechConstants.T_CLAN_UNOFFICIAL:
engineCount = 3;
break;
case TechConstants.T_IS_TW_NON_BOX:
engineCount = 2;
break;
case TechConstants.T_IS_ADVANCED:
case TechConstants.T_IS_EXPERIMENTAL:
case TechConstants.T_IS_UNOFFICIAL:
engineCount = 5;
break;
}
}
}
}
for (int index = 0; index < engineCount; index++) {
engineType.addItem(engineList[index]);
}
/* COCKPIT */
cockpitType.removeAllItems();
switch (getAero().getTechLevel()) {
case TechConstants.T_INTRO_BOXSET:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
break;
case TechConstants.T_CLAN_TW:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
break;
case TechConstants.T_IS_TW_NON_BOX:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
break;
case TechConstants.T_CLAN_ADVANCED:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_COMMAND_CONSOLE]);
break;
case TechConstants.T_IS_ADVANCED:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_COMMAND_CONSOLE]);
break;
case TechConstants.T_CLAN_EXPERIMENTAL:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_COMMAND_CONSOLE]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_PRIMITIVE]);
break;
case TechConstants.T_IS_EXPERIMENTAL:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_COMMAND_CONSOLE]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_PRIMITIVE]);
break;
case TechConstants.T_CLAN_UNOFFICIAL:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_COMMAND_CONSOLE]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_PRIMITIVE]);
break;
case TechConstants.T_IS_UNOFFICIAL:
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_STANDARD]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_SMALL]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_COMMAND_CONSOLE]);
cockpitType
.addItem(Aero.COCKPIT_SHORT_STRING[Aero.COCKPIT_PRIMITIVE]);
break;
}
/* HEAT SINKS */
heatSinkType.removeAllItems();
for (int index = 0; index < heatSinkTypes.length; index++) {
heatSinkType.addItem(heatSinkTypes[index]);
}
((SpinnerNumberModel)fuel.getModel()).setMaximum(
((Integer)weightClass.getValue()).doubleValue());
/* UNIT UPDATING */
if (updateUnit) {
setArmorCombo(getAero().getArmorType(0));
if (armorCombo.getSelectedIndex() == -1) {
armorCombo.setSelectedIndex(0);
UnitUtil.removeISorArmorMounts(getAero(), false);
createArmorMountsAndSetArmorType();
armorView.resetArmorPoints();
}
int selEngine = convertEngineType(getAero().getEngine()
.getEngineType());
if (engineType.getItemCount() <= selEngine) {
selEngine = -1;
}
engineType.setSelectedIndex(selEngine);
if (engineType.getSelectedIndex() == -1) {
engineType.setSelectedIndex(0);
setNewEngine(getAero().getEngine().getRating(),
convertEngineType(engineType.getSelectedItem()
.toString()));
}
cockpitType.setSelectedIndex(-1);
String selItem = Aero.COCKPIT_SHORT_STRING[getAero()
.getCockpitType()];
for (int i = 0; i < cockpitType.getItemCount(); i++) {
if (cockpitType.getItemAt(i).equals(selItem)) {
cockpitType.setSelectedIndex(i);
break;
}
}
if (cockpitType.getSelectedIndex() == -1) {
cockpitType.setSelectedIndex(0);
}
setHeatSinkCombo();
if (heatSinkType.getSelectedIndex() == -1) {
heatSinkType.setSelectedIndex(0);
getAero().setHeatType(heatSinkType.getSelectedIndex());
}
}
}
@Override
public void stateChanged(ChangeEvent e) {
if (e.getSource() instanceof JSpinner) {
JSpinner spinner = (JSpinner) e.getSource();
removeAllListeners();
if (spinner.equals(weightClass)) {
setAeroStructuralIntegrity();
if (refreshEngine(false)) {
getAero().setWeight((Integer) weightClass.getValue());
getAero().autoSetInternal();
refreshEngine(true);
engineType.setSelectedIndex(engineType.getSelectedIndex());
}
populateChoices(true);
} else if (spinner.equals(safeThrust)) {
setAeroStructuralIntegrity();
refreshEngine(true);
} else if (spinner.equals(fuel)) {
double fuelTons = Math.round(((Double) fuel.getValue()) * 2) / 2.0;
getAero().setFuelTonnage(fuelTons);
} else if (spinner.equals(armorTonnage)) {
setArmorTonnage();
} else if (spinner.equals(heatSinkNumber)) {
getAero().setHeatSinks((Integer) heatSinkNumber.getValue());
((SpinnerNumberModel) baseChassisHeatSinks.getModel())
.setMaximum((Integer)heatSinkNumber.getValue());
getAero().setPodHeatSinks(Math.max(0, (Integer)heatSinkNumber.getValue()
- (Integer)baseChassisHeatSinks.getValue()));
} else if (spinner.equals(baseChassisHeatSinks)) {
getAero().getEngine().setBaseChassisHeatSinks(
Math.max(0, (Integer) baseChassisHeatSinks.getValue()));
getAero().setPodHeatSinks((Integer)heatSinkNumber.getValue()
- (Integer)baseChassisHeatSinks.getValue());
}
addAllListeners();
refresh.refreshAll();
}
}
/**
* Calculate the engine rating for the currently selected weight and safe
* thrust value and return whether that engine is valid. If the setEngine
* flag is turned on, it will also set the engine for the unit.
*
* @param setEngine Determines whether the new engine is set or not.
* @return
*/
private boolean refreshEngine(boolean setEngine) {
boolean retVal = true;
int rating = TestAero.calculateEngineRating(
getAero(),
(Integer) weightClass.getValue(),
(Integer) safeThrust.getValue());
if (rating > TestAero.MAX_ENGINE_RATING) {
JOptionPane
.showMessageDialog(
this,
"That speed would create an engine " +
"with a rating over the max rating, " +
TestAero.MAX_ENGINE_RATING + ".",
"Bad Engine Rating",
JOptionPane.ERROR_MESSAGE);
retVal = false;
} else if (setEngine){
System.out.println("Setting new engine rating.");
getAero().setEngine(
new Engine(rating, convertEngineType(engineType
.getSelectedItem().toString()),
clanEngineFlag));
}
return retVal;
}
private void maximizeArmor() {
double maxArmor = UnitUtil.getMaximumArmorTonnage(getAero());
armorTonnage.setValue(maxArmor);
getAero().setArmorTonnage(maxArmor);
armorView.resetArmorPoints();
}
private void useRemainingTonnageArmor() {
double currentTonnage = UnitUtil.getEntityVerifier(getAero())
.calculateWeight();
currentTonnage += UnitUtil.getUnallocatedAmmoTonnage(getAero());
double totalTonnage = getAero().getWeight();
double remainingTonnage = TestEntity.floor(
totalTonnage - currentTonnage, TestEntity.Ceil.HALFTON);
double maxArmor = Math.min(remainingTonnage,
UnitUtil.getMaximumArmorTonnage(getAero()));
armorTonnage.setValue(maxArmor);
getAero().setArmorTonnage(maxArmor);
armorView.resetArmorPoints();
}
private void createArmorMountsAndSetArmorType() {
getAero().setArmorTechLevel(EquipmentType.get(
getArmorType(armorCombo)).getTechLevel(getAero().getYear()));
getAero().setArmorType(getArmorType(armorCombo));
}
private void setArmorCombo(int type) {
armorCombo.setSelectedIndex(-1);
for (int index = 0; index < armorCombo.getItemCount(); index++) {
if (getAero().isMixedTech()) {
if (EquipmentType.getArmorTypeName(type,TechConstants.isClan(getAero().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 (!getAero().isMixedTech()) {
String prefix = getAero().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, getAero().isClan());
}
public void setAsCustomization() {
chassis.setEditable(false);
chassis.setEnabled(false);
weightClass.setEnabled(false);
era.setEditable(false);
era.setEnabled(false);
}
private void setArmorTonnage() {
double armorTons = Math.round(((Double) armorTonnage.getValue()) * 2) / 2.0;
getAero().setArmorTonnage(armorTons);
armorView.resetArmorPoints();
}
private void setNewEngine(int rating, int type) {
getAero().setEngine(new Engine(rating, type, clanEngineFlag));
}
private void setHeatSinkCombo() {
int selIndex = -1;
if (getAero().getHeatType() == Aero.HEAT_DOUBLE) {
selIndex = 1;
} else {
selIndex = 0;
}
if (heatSinkType.getItemCount() <= selIndex) {
selIndex = -1;
}
heatSinkType.setSelectedIndex(selIndex);
}
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);
}
/**
* Sets the structural integrity for Aerospace and Conventional fighters.
* For these units, the SI is equal to the safe thrust rating or 10% of the
* units tonnage, whichever is greater. The SI for fighters does not take
* up any tonnage.
*/
public void setAeroStructuralIntegrity(){
int si = (int)Math.max(
(Integer)weightClass.getValue() * 0.1,
(Integer)safeThrust.getValue());
getAero().setSI(si);
structuralIntegrity.setValue(si);
}
}