/* * 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.BattleArmor.tabs; 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.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import javax.swing.BorderFactory; import javax.swing.Box; import javax.swing.BoxLayout; import javax.swing.DefaultComboBoxModel; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JComponent; import javax.swing.JLabel; 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.swing.MechViewPanel; import megamek.common.BattleArmor; import megamek.common.EntityMovementMode; import megamek.common.EntityWeightClass; import megamek.common.EquipmentType; import megamek.common.LocationFullException; import megamek.common.MechView; import megamek.common.MiscType; import megamek.common.Mounted; import megamek.common.TechConstants; import megamek.common.verifier.TestBattleArmor; import megamek.common.verifier.TestBattleArmor.BAManipulator; import megameklab.com.ui.EntitySource; import megameklab.com.util.ITab; import megameklab.com.util.RefreshListener; import megameklab.com.util.UnitUtil; public class StructureTab extends ITab implements ActionListener, KeyListener, ChangeListener { /** * */ private static final long serialVersionUID = -7985608549543235815L; private RefreshListener refresh; private static final String MOVE_UMU = "UMU"; private static final String MOVE_VTOL = "VTOL"; private String[] techTypes = { "Inner Sphere", "Clan", "Mixed Inner Sphere", "Mixed Clan" }; private String[] isTechLevels = { "Standard", "Advanced", "Experimental", "Unoffical" }; private String[] clanTechLevels = { "Standard", "Advanced", "Experimental", "Unoffical" }; private String[] chassisTypeArray = { "Humanoid", "Quad"}; private String[] jumpTypeArray = { "Jump",MOVE_VTOL,MOVE_UMU}; Dimension labelSize = new Dimension(110, 25); Dimension enhanceLabelSz = new Dimension(200,25); // 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 JSpinner numTroopers; // Chassis Panel private JComboBox<String> chassisType = new JComboBox<String>(chassisTypeArray); private JComboBox<String> weightClass; private JLabel lblExoskeleton = createLabel("Exoskeleton:", labelSize); private JCheckBox chkExoskeleton = new JCheckBox(); private JLabel lblClanHarjel = createLabel("Harjel:", labelSize); private JCheckBox chkClanHarjel = new JCheckBox(); private JSpinner walkMP; private JSpinner jumpMP; private JComboBox<String> jumpType = new JComboBox<String>(jumpTypeArray); // Armor Panel private JComboBox<String> armorType; private JSpinner armorPoints; // Manipulator Panel private JComboBox<String> leftManipSelect = new JComboBox<String>(); private JComboBox<String> rightManipSelect = new JComboBox<String>(); // Enhancement Panel private JLabel lblJumpBooster = createLabel("Jump Booster:",enhanceLabelSz); private JLabel lblMechJumpBooster = createLabel("Mechanical Jump Booster:",enhanceLabelSz); private JLabel lblMyomerBooster = createLabel("Myomer Booster:",enhanceLabelSz); private JLabel lblPartialWing = createLabel("Partial Wing:",enhanceLabelSz); private JCheckBox chkJumpBooster = new JCheckBox(); private JCheckBox chkMechJumpBooster = new JCheckBox(); private JCheckBox chkMyomerBooster = new JCheckBox(); private JCheckBox chkPartialWing = new JCheckBox(); private JTextField txtPrimary = new JTextField("None"); private JTextField txtSecondary = new JTextField("None"); private MechViewPanel panelMekView; public StructureTab(EntitySource eSource) { super(eSource); setUpPanels(); refresh(); } public void setUpPanels() { JPanel previewPanel = new JPanel(); previewPanel.setLayout(new BoxLayout(previewPanel, BoxLayout.Y_AXIS)); panelMekView = new MechViewPanel(450, 480,false); //mekViewScrollPane.setMinimumSize(new java.awt.Dimension(450, 550)); //mekViewScrollPane.setMaximumSize(new java.awt.Dimension(450, 550)); //mekViewScrollPane.setPreferredSize(new java.awt.Dimension(450, 550)); previewPanel.add(panelMekView); JPanel leftPanel = new JPanel(); leftPanel.setLayout(new BoxLayout(leftPanel, BoxLayout.Y_AXIS)); JPanel rightPanel = new JPanel(); rightPanel.setLayout(new BoxLayout(rightPanel, BoxLayout.Y_AXIS)); JPanel basicPanel = new JPanel(new GridBagLayout()); JPanel chassisPanel = new JPanel(new GridBagLayout()); JPanel armorPanel = new JPanel(new GridBagLayout()); JPanel manipPanel = new JPanel(new GridBagLayout()); JPanel enhancePanel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); Dimension comboSize = new Dimension(250, 25); Dimension spinnerSize = new Dimension(55, 25); // General IS BA squads are sized 4, Clan 5, and some IS squads 6 (WOB) // I found no rules for min or max sizes, so I'm going to allow // selection of 4, 5 and 6 numTroopers = new JSpinner(new SpinnerNumberModel(4, 4, 6, 1)); ((JSpinner.DefaultEditor) numTroopers.getEditor()).setSize(spinnerSize); ((JSpinner.DefaultEditor) numTroopers.getEditor()) .setMaximumSize(spinnerSize); ((JSpinner.DefaultEditor) numTroopers.getEditor()) .setPreferredSize(spinnerSize); ((JSpinner.DefaultEditor) numTroopers.getEditor()) .setMinimumSize(spinnerSize); ((JSpinner.DefaultEditor) numTroopers.getEditor()).getTextField() .setEditable(false); txtPrimary.setEditable(false); txtSecondary.setEditable(false); chassis.setText(getBattleArmor().getChassis()); model.setText(getBattleArmor().getModel()); gbc.gridx = 0; gbc.gridy = 0; gbc.fill = java.awt.GridBagConstraints.HORIZONTAL; gbc.anchor = GridBagConstraints.WEST; gbc.insets = new Insets(0,0,1,2); basicPanel.add(createLabel("Chassis:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(chassis, gbc); gbc.gridx = 0; gbc.gridy = 1; basicPanel.add(createLabel("Model:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(model, gbc); gbc.gridx = 0; gbc.gridy = 2; basicPanel.add(createLabel("Year:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(era, gbc); gbc.gridx = 0; gbc.gridy = 3; basicPanel.add(createLabel("Source/Era:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(source, gbc); gbc.gridx = 0; gbc.gridy = 4; basicPanel.add(createLabel("Tech:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(techType, gbc); gbc.gridx = 0; gbc.gridy = 5; basicPanel.add(createLabel("Tech Level:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(techLevel, gbc); gbc.gridx = 0; gbc.gridy = 6; basicPanel.add(createLabel("Squad Size:", labelSize), gbc); gbc.gridx = 1; basicPanel.add(numTroopers, gbc); walkMP = new JSpinner(new SpinnerNumberModel( getBattleArmor().getMinimumWalkMP(), getBattleArmor().getMinimumWalkMP(), getBattleArmor().getMaximumWalkMP(), 1)); ((JSpinner.DefaultEditor) walkMP.getEditor()).setSize(spinnerSize); ((JSpinner.DefaultEditor) walkMP.getEditor()) .setMaximumSize(spinnerSize); ((JSpinner.DefaultEditor) walkMP.getEditor()) .setPreferredSize(spinnerSize); ((JSpinner.DefaultEditor) walkMP.getEditor()) .setMinimumSize(spinnerSize); ((JSpinner.DefaultEditor) walkMP.getEditor()).getTextField() .setEditable(false); jumpMP = new JSpinner(new SpinnerNumberModel(0, 0, getBattleArmor().getMaximumJumpMP(true), 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); ((JSpinner.DefaultEditor) jumpMP.getEditor()).getTextField() .setEditable(false); DefaultComboBoxModel<String> modelWeightClass = new DefaultComboBoxModel<String>(); for(int i = EntityWeightClass.WEIGHT_ULTRA_LIGHT; i <= EntityWeightClass.WEIGHT_ASSAULT; i++) { modelWeightClass.addElement(EntityWeightClass.getClassName(i, getBattleArmor())); } weightClass = new JComboBox<String>(modelWeightClass); JPanel chassisOptions = new JPanel(); chassisOptions.add(lblExoskeleton); chassisOptions.add(chkExoskeleton); chassisOptions.add(lblClanHarjel); chassisOptions.add(chkClanHarjel); gbc.gridx = 0; gbc.gridy = 0; chassisPanel.add(createLabel("Body Type:", labelSize), gbc); gbc.gridx = 1; chassisPanel.add(chassisType, gbc); gbc.gridx = 0; gbc.gridy++; chassisPanel.add(createLabel("Weight Class:", labelSize), gbc); gbc.gridx = 1; chassisPanel.add(weightClass, gbc); gbc.gridx = 0; gbc.gridy++; gbc.gridwidth = 2; chassisPanel.add(chassisOptions, gbc); gbc.gridwidth = 1; gbc.gridx = 0; gbc.gridy++; chassisPanel.add(createLabel("Ground MP:", labelSize), gbc); gbc.gridx = 1; chassisPanel.add(walkMP, gbc); gbc.gridx = 0; gbc.gridy++; chassisPanel.add(createLabel("Jump MP:", labelSize), gbc); gbc.gridx = 1; chassisPanel.add(jumpMP, gbc); gbc.gridx = 0; gbc.gridy++; chassisPanel.add(createLabel("Move Mode:", labelSize), gbc); gbc.gridx = 1; chassisPanel.add(jumpType, gbc); armorType = new JComboBox<String>(); armorPoints = new JSpinner(new SpinnerNumberModel(0, 0, getBattleArmor().getMaximumArmorPoints(), 1)); ((JSpinner.DefaultEditor) armorPoints.getEditor()).setSize(spinnerSize); ((JSpinner.DefaultEditor) armorPoints.getEditor()) .setMaximumSize(spinnerSize); ((JSpinner.DefaultEditor) armorPoints.getEditor()) .setPreferredSize(spinnerSize); ((JSpinner.DefaultEditor) armorPoints.getEditor()) .setMinimumSize(spinnerSize); ((JSpinner.DefaultEditor) armorPoints.getEditor()).getTextField() .setEditable(false); gbc.gridx = 0; gbc.gridy = 0; armorPanel.add(createLabel("Armor Type:", labelSize), gbc); gbc.gridx = 1; armorPanel.add(armorType, gbc); gbc.gridx = 0; gbc.gridy = 1; armorPanel.add(createLabel("Amount:", labelSize), gbc); gbc.gridx = 1; armorPanel.add(armorPoints, gbc); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.NORTHWEST; gbc.fill = GridBagConstraints.NONE; manipPanel.add(createLabel("Left Arm:", labelSize), gbc); gbc.gridy = 1; manipPanel.add(createLabel("Right Arm:", labelSize), gbc); gbc.fill = GridBagConstraints.HORIZONTAL; gbc.gridx = 1; gbc.gridy = 0; manipPanel.add(leftManipSelect, gbc); gbc.gridy = 1; manipPanel.add(rightManipSelect, gbc); gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.NORTHWEST; enhancePanel.add(lblPartialWing,gbc); gbc.gridx++; gbc.anchor = GridBagConstraints.NORTHEAST; enhancePanel.add(chkPartialWing,gbc); gbc.gridx++; gbc.anchor = GridBagConstraints.NORTHWEST; enhancePanel.add(lblJumpBooster,gbc); gbc.gridx++; gbc.anchor = GridBagConstraints.NORTHEAST; enhancePanel.add(chkJumpBooster,gbc); gbc.gridx = 0; gbc.gridy++; gbc.anchor = GridBagConstraints.NORTHWEST; enhancePanel.add(lblMechJumpBooster,gbc); gbc.gridx++; gbc.anchor = GridBagConstraints.NORTHEAST; enhancePanel.add(chkMechJumpBooster,gbc); gbc.gridx++; gbc.anchor = GridBagConstraints.NORTHWEST; enhancePanel.add(lblMyomerBooster,gbc); gbc.gridx++; gbc.anchor = GridBagConstraints.NORTHEAST; enhancePanel.add(chkMyomerBooster,gbc); setFieldSize(chassisType, comboSize); setFieldSize(armorType, comboSize); setFieldSize(weightClass, comboSize); setFieldSize(jumpType, comboSize); setFieldSize(era, comboSize); setFieldSize(source, comboSize); setFieldSize(chassis, comboSize); setFieldSize(model, comboSize); setFieldSize(techType, comboSize); setFieldSize(techLevel, comboSize); setFieldSize(txtPrimary, comboSize); setFieldSize(txtSecondary, comboSize); setFieldSize(leftManipSelect, comboSize); setFieldSize(rightManipSelect, comboSize); basicPanel.setBorder(BorderFactory.createTitledBorder("Basic Information")); chassisPanel.setBorder(BorderFactory.createTitledBorder("Chassis")); armorPanel.setBorder(BorderFactory.createTitledBorder("Armor")); //weaponView.setBorder(BorderFactory.createTitledBorder("Weapon Selection")); manipPanel.setBorder(BorderFactory.createTitledBorder("Manipulators")); enhancePanel.setBorder(BorderFactory.createTitledBorder("Enhancements")); leftPanel.add(basicPanel); leftPanel.add(chassisPanel); leftPanel.add(armorPanel); leftPanel.add(manipPanel); //leftPanel.add(Box.createVerticalGlue()); rightPanel.add(Box.createVerticalStrut(5)); rightPanel.add(previewPanel); rightPanel.add(enhancePanel); setLayout(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.insets = new Insets(0,30,0,30); gbc.gridx = 0; gbc.gridy = 0; gbc.anchor = GridBagConstraints.NORTH; gbc.fill = java.awt.GridBagConstraints.NONE; gbc.weightx = 0.0; gbc.weighty = 0; add(leftPanel, gbc); gbc.gridx = 1; add(rightPanel,gbc); } public JLabel createLeftLabel(String text, Dimension maxSize) { JLabel label = new JLabel(text, SwingConstants.LEFT); setFieldSize(label, maxSize); return label; } 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 refresh() { removeAllActionListeners(); boolean isClan = getBattleArmor().isClan(); boolean isMixed = getBattleArmor().isMixedTech(); boolean isExperimental = (getBattleArmor().getTechLevel() == TechConstants.T_IS_EXPERIMENTAL) || (getBattleArmor().getTechLevel() == TechConstants.T_CLAN_EXPERIMENTAL) || (getBattleArmor().getTechLevel() == TechConstants.T_IS_UNOFFICIAL) || (getBattleArmor().getTechLevel() == TechConstants.T_CLAN_UNOFFICIAL); era.setText(Integer.toString(getInfantry().getYear())); source.setText(getBattleArmor().getSource()); if (getInfantry().isClan()) { techLevel.removeAllItems(); for (String item : clanTechLevels) { techLevel.addItem(item); } } else { techLevel.removeAllItems(); for (String item : isTechLevels) { techLevel.addItem(item); } } if (isMixed) { if (isClan) { techType.setSelectedIndex(3); if (getBattleArmor().getTechLevel() >= TechConstants.T_CLAN_UNOFFICIAL) { techLevel.setSelectedIndex(3); } else if (getBattleArmor().getTechLevel() >= TechConstants.T_CLAN_EXPERIMENTAL) { techLevel.setSelectedIndex(2); } else { techLevel.setSelectedIndex(1); } } else { techType.setSelectedIndex(2); if (getBattleArmor().getTechLevel() >= TechConstants.T_IS_UNOFFICIAL) { techLevel.setSelectedIndex(3); } else if (getBattleArmor().getTechLevel() >= TechConstants.T_IS_EXPERIMENTAL) { techLevel.setSelectedIndex(2); } else { techLevel.setSelectedIndex(1); } } } else if (isClan) { techType.setSelectedIndex(1); if (getBattleArmor().getTechLevel() >= TechConstants.T_CLAN_UNOFFICIAL) { techLevel.setSelectedIndex(3); } else if (getBattleArmor().getTechLevel() >= TechConstants.T_CLAN_EXPERIMENTAL) { techLevel.setSelectedIndex(2); } else if (getBattleArmor().getTechLevel() >= TechConstants.T_CLAN_ADVANCED) { techLevel.setSelectedIndex(1); } else { techLevel.setSelectedIndex(0); } } else { // Innersphere techType.setSelectedIndex(0); if (getBattleArmor().getTechLevel() >= TechConstants.T_IS_UNOFFICIAL) { techLevel.setSelectedIndex(3); } else if (getBattleArmor().getTechLevel() >= TechConstants.T_IS_EXPERIMENTAL) { techLevel.setSelectedIndex(2); } else if (getBattleArmor().getTechLevel() >= TechConstants.T_IS_ADVANCED) { techLevel.setSelectedIndex(1); } else { techLevel.setSelectedIndex(0); } } chassisType.removeAllItems(); if(getBattleArmor().getWeightClass() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) { // PA(L) can only be Biped chassisType.addItem(chassisTypeArray[0]); chassisType.setSelectedIndex(0); } else { for(String c : chassisTypeArray) { chassisType.addItem(c); } chassisType.setSelectedIndex(getBattleArmor().getChassisType()); } if (getBattleArmor().getChassisType() == BattleArmor.CHASSIS_TYPE_QUAD){ // Quad's can't use any form of jump MP jumpType.setEnabled(false); jumpType.setSelectedIndex(0); jumpMP.setEnabled(false); jumpMP.getModel().setValue(0); } else { jumpType.setEnabled(true); jumpMP.setEnabled(true); jumpType.removeAllItems(); if(getBattleArmor().isClan()) { for(String j : jumpTypeArray) { jumpType.addItem(j); } if (getBattleArmor().getMovementMode() == EntityMovementMode.INF_UMU){ jumpType.setSelectedItem(MOVE_UMU); } else if (getBattleArmor().getMovementMode() == EntityMovementMode.VTOL){ jumpType.setSelectedItem(MOVE_VTOL); } else { jumpType.setSelectedItem("Jump"); } } else { jumpType.addItem(jumpTypeArray[0]); jumpType.setSelectedIndex(0); } } weightClass.setSelectedIndex(getBattleArmor().getWeightClass()); if (getBattleArmor().getWeightClass() != EntityWeightClass.WEIGHT_ULTRA_LIGHT){ chkExoskeleton.setEnabled(false); lblExoskeleton.setEnabled(false); chkExoskeleton.setSelected(false); getBattleArmor().setIsExoskeleton(false); } else { chkExoskeleton.setEnabled(true); lblExoskeleton.setEnabled(true); getBattleArmor().setIsExoskeleton(chkExoskeleton.isSelected()); } if (getBattleArmor().isClan()){ if (getBattleArmor().isClan() && chkExoskeleton.isSelected()){ lblClanHarjel.setEnabled(true); chkClanHarjel.setEnabled(true); getBattleArmor().setClanExoWithoutHarjel( chkClanHarjel.isSelected()); } else { // Clan BA have Harjel by default chkClanHarjel.setSelected(true); // Only industrial exoskeletons can't have Harjel lblClanHarjel.setEnabled(false); chkClanHarjel.setEnabled(false); getBattleArmor().setClanExoWithoutHarjel(false); } } else { lblClanHarjel.setEnabled(false); chkClanHarjel.setEnabled(false); chkClanHarjel.setSelected(false); getBattleArmor().setClanExoWithoutHarjel(false); } walkMP.setValue(getBattleArmor().getOriginalWalkMP()); ((SpinnerNumberModel) walkMP.getModel()).setMinimum(getBattleArmor().getMinimumWalkMP()); ((SpinnerNumberModel) walkMP.getModel()).setMaximum(getBattleArmor().getMaximumWalkMP()); jumpMP.setValue(getBattleArmor().getOriginalJumpMP()); ((SpinnerNumberModel) jumpMP.getModel()).setMaximum(getBattleArmor().getMaximumJumpMP(true)); armorType.removeAllItems(); for (TestBattleArmor.BAArmor armor : TestBattleArmor.BAArmor.values()){ int type = armor.type; EquipmentType et; if (!isMixed) { boolean techMatch = (armor.isClan && getBattleArmor().isClan()) || (!armor.isClan && !getBattleArmor().isClan()); et = EquipmentType.get( EquipmentType.getArmorTypeName(type, armor.isClan)); boolean legalTechLvl = (et != null) && (TechConstants.isLegal(getBattleArmor().getTechLevel(), et.getTechLevel(getBattleArmor().getYear()), isMixed)); if (techMatch && (isExperimental || legalTechLvl)) { armorType.addItem(EquipmentType.armorNames[type]); } } else { String armorName = EquipmentType.getArmorTypeName(type, armor.isClan); et = EquipmentType.get(armorName); if (et != null && TechConstants.isLegal(getBattleArmor().getTechLevel(), et.getTechLevel(getBattleArmor().getYear()), isMixed)) { armorType.addItem(armorName); } } } String armorName = ""; if (isMixed){ boolean isClanArmor = TechConstants.isClan( getBattleArmor().getArmorTechLevel(BattleArmor.LOC_SQUAD)); if (isClanArmor){ armorName = "Clan "; } else { armorName = "IS "; } } armorName += EquipmentType.getArmorTypeName( getBattleArmor().getArmorType(BattleArmor.LOC_SQUAD)); armorType.setSelectedItem(armorName); // We have to use a LOC_TROOPER as getOArmor has a special case for LOC_SQUAD... armorPoints.setValue(getBattleArmor().getOArmor(BattleArmor.LOC_TROOPER_1)); ((SpinnerNumberModel) armorPoints.getModel()).setMaximum(getBattleArmor().getMaximumArmorPoints()); numTroopers.setValue(getBattleArmor().getTroopers()); // Manipulators leftManipSelect.removeAllItems(); rightManipSelect.removeAllItems(); leftManipSelect.addItem(BattleArmor.MANIPULATOR_TYPE_STRINGS[BattleArmor.MANIPULATOR_NONE]); rightManipSelect.addItem(BattleArmor.MANIPULATOR_TYPE_STRINGS[BattleArmor.MANIPULATOR_NONE]); for (BAManipulator manip : BAManipulator.values()){ EquipmentType et = EquipmentType.get(manip.internalName); boolean legalTechLvl = (et != null) && (TechConstants.isLegal(getBattleArmor().getTechLevel(), et.getTechLevel(getBattleArmor().getYear()), isMixed)); if (legalTechLvl){ leftManipSelect.addItem(et.getName()); rightManipSelect.addItem(et.getName()); } } int manipType = BAManipulator.getManipulator( getBattleArmor().getLeftManipulatorName()).type; leftManipSelect.setSelectedItem( BattleArmor.MANIPULATOR_NAME_STRINGS[manipType]); manipType = BAManipulator.getManipulator( getBattleArmor().getRightManipulatorName()).type; rightManipSelect.setSelectedItem( BattleArmor.MANIPULATOR_NAME_STRINGS[manipType]); // Enhancements EquipmentType eType; boolean legalTech; // Jump Booster if (isClan){ eType = EquipmentType.get("CLBAJumpBooster"); } else { eType = EquipmentType.get("ISBAJumpBooster"); } legalTech = TechConstants.isLegal(getBattleArmor().getTechLevel(), eType.getTechLevel(getBattleArmor().getYear()), isMixed); if (legalTech && getBattleArmor().getMovementMode() == EntityMovementMode.INF_JUMP && getBattleArmor().getJumpMP() > 0 && !getBattleArmor().hasWorkingMisc(MiscType.F_PARTIAL_WING)){ chkJumpBooster.setEnabled(true); lblJumpBooster.setEnabled(true); } else { chkJumpBooster.setEnabled(false); lblJumpBooster.setEnabled(false); } if (getBattleArmor().hasWorkingMisc(MiscType.F_JUMP_BOOSTER)){ chkJumpBooster.setSelected(true); } // Partial Wing eType = EquipmentType.get("BAPartialWing"); legalTech = TechConstants.isLegal(getBattleArmor().getTechLevel(), eType.getTechLevel(getBattleArmor().getYear()), isMixed); if (legalTech && getBattleArmor().getMovementMode() == EntityMovementMode.INF_JUMP && getBattleArmor().getJumpMP() > 0 && !getBattleArmor().hasWorkingMisc(MiscType.F_JUMP_BOOSTER)){ chkPartialWing.setEnabled(true); lblPartialWing.setEnabled(true); } else { chkPartialWing.setEnabled(false); lblPartialWing.setEnabled(false); } if (getBattleArmor().hasWorkingMisc(MiscType.F_PARTIAL_WING)){ chkPartialWing.setSelected(true); } // Myomer Booster eType = EquipmentType.get("CLBAMyomerBooster"); legalTech = TechConstants.isLegal(getBattleArmor().getTechLevel(), eType.getTechLevel(getBattleArmor().getYear()), isMixed) && isClan; if (legalTech && !getBattleArmor().hasWorkingMisc(MiscType.F_STEALTH) && !getBattleArmor().hasWorkingMisc(MiscType.F_MECHANICAL_JUMP_BOOSTER) && getBattleArmor().getWeightClass() != EntityWeightClass.WEIGHT_ULTRA_LIGHT){ chkMyomerBooster.setEnabled(true); lblMyomerBooster.setEnabled(true); } else { chkMyomerBooster.setEnabled(false); lblMyomerBooster.setEnabled(false); } if (getBattleArmor().hasWorkingMisc(MiscType.F_MASC)){ chkMyomerBooster.setSelected(true); } // Mechanical Jump Booster if (isClan){ eType = EquipmentType.get("CLMechanicalJumpBooster"); } else { eType = EquipmentType.get("ISMechanicalJumpBooster"); } legalTech = TechConstants.isLegal(getBattleArmor().getTechLevel(), eType.getTechLevel(getBattleArmor().getYear()), isMixed); if (legalTech && !getBattleArmor().hasWorkingMisc(MiscType.F_MASC)){ chkMechJumpBooster.setEnabled(true); lblMechJumpBooster.setEnabled(true); } else { chkMechJumpBooster.setEnabled(false); lblMechJumpBooster.setEnabled(false); } if (getBattleArmor().hasWorkingMisc(MiscType.F_MECHANICAL_JUMP_BOOSTER)){ chkMechJumpBooster.setSelected(true); } refreshPreview(); addAllActionListeners(); } public void addAllActionListeners() { chassisType.addActionListener(this); weightClass.addActionListener(this); armorType.addActionListener(this); jumpType.addActionListener(this); techLevel.addActionListener(this); techType.addActionListener(this); leftManipSelect.addActionListener(this); rightManipSelect.addActionListener(this); chkJumpBooster.addActionListener(this); chkMechJumpBooster.addActionListener(this); chkExoskeleton.addActionListener(this); chkClanHarjel.addActionListener(this); chkMyomerBooster.addActionListener(this); chkPartialWing.addActionListener(this); chassis.addKeyListener(this); model.addKeyListener(this); era.addKeyListener(this); source.addKeyListener(this); walkMP.addChangeListener(this); jumpMP.addChangeListener(this); numTroopers.addChangeListener(this); armorPoints.addChangeListener(this); } public void removeAllActionListeners() { chassisType.removeActionListener(this); weightClass.removeActionListener(this); armorType.removeActionListener(this); jumpType.removeActionListener(this); techLevel.removeActionListener(this); techType.removeActionListener(this); leftManipSelect.removeActionListener(this); rightManipSelect.removeActionListener(this); chkJumpBooster.removeActionListener(this); chkMechJumpBooster.removeActionListener(this); chkMyomerBooster.removeActionListener(this); chkPartialWing.removeActionListener(this); chkExoskeleton.removeActionListener(this); chkClanHarjel.removeActionListener(this); chassis.removeKeyListener(this); model.removeKeyListener(this); era.removeKeyListener(this); source.removeKeyListener(this); walkMP.removeChangeListener(this); jumpMP.removeChangeListener(this); numTroopers.removeChangeListener(this); armorPoints.removeChangeListener(this); } public void addRefreshedListener(RefreshListener l) { refresh = l; //weaponView.addRefreshedListener(refresh); } @Override public void actionPerformed(ActionEvent e) { removeAllActionListeners(); if (e.getSource() instanceof JComboBox) { @SuppressWarnings("unchecked") JComboBox<String> combo = (JComboBox<String>) e.getSource(); if (combo.equals(techLevel)) { int unitTechLevel = techLevel.getSelectedIndex(); if (getBattleArmor().isClan()) { switch (unitTechLevel) { case 0: getBattleArmor().setTechLevel(TechConstants.T_CLAN_TW); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_TW); techType.setSelectedIndex(1); break; case 1: getBattleArmor().setTechLevel(TechConstants.T_CLAN_ADVANCED); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_ADVANCED); break; case 2: getBattleArmor().setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_EXPERIMENTAL); break; case 3: getBattleArmor().setTechLevel(TechConstants.T_CLAN_UNOFFICIAL); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_UNOFFICIAL); break; default: getBattleArmor().setTechLevel(TechConstants.T_CLAN_TW); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_TW); break; } } else { switch (unitTechLevel) { case 0: getBattleArmor().setTechLevel(TechConstants.T_IS_TW_NON_BOX); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_TW_NON_BOX); techType.setSelectedIndex(0); break; case 1: getBattleArmor().setTechLevel(TechConstants.T_IS_ADVANCED); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_ADVANCED); break; case 2: getBattleArmor().setTechLevel(TechConstants.T_IS_EXPERIMENTAL); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_EXPERIMENTAL); break; default: getBattleArmor().setTechLevel(TechConstants.T_IS_UNOFFICIAL); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_UNOFFICIAL); break; } } UnitUtil.checkEquipmentByTechLevel(getBattleArmor()); } else if (combo.equals(techType)) { if ((techType.getSelectedIndex() == 1) && (!getBattleArmor().isClan() || getBattleArmor().isMixedTech())) { techLevel.removeAllItems(); for (String item : clanTechLevels) { techLevel.addItem(item); } if(!getBattleArmor().isClan()) { int level = TechConstants.getOppositeTechLevel(getBattleArmor().getTechLevel()); getBattleArmor().setTechLevel(level); getBattleArmor().setArmorTechLevel(level); getBattleArmor().setTroopers(5); getBattleArmor().autoSetInternal(); numTroopers.setValue(5); } getBattleArmor().setMixedTech(false); } else if ((techType.getSelectedIndex() == 0) && (getBattleArmor().isClan() || getBattleArmor().isMixedTech())) { techLevel.removeAllItems(); for (String item : isTechLevels) { techLevel.addItem(item); } if(getBattleArmor().isClan()) { int level = TechConstants.getOppositeTechLevel(getInfantry().getTechLevel()); getBattleArmor().setTechLevel(level); getBattleArmor().setArmorTechLevel(level); getBattleArmor().setTroopers(4); getBattleArmor().autoSetInternal(); numTroopers.setValue(4); } getBattleArmor().setMixedTech(false); } else if ((techType.getSelectedIndex() == 2) && (!getBattleArmor().isMixedTech() || getBattleArmor().isClan())) { techLevel.removeAllItems(); for (String item : isTechLevels) { techLevel.addItem(item); } if (getBattleArmor().getYear() < 3090) { //before 3090, mixed tech is experimental if ((getBattleArmor().getTechLevel() != TechConstants.T_IS_UNOFFICIAL)) { getBattleArmor().setTechLevel(TechConstants.T_IS_EXPERIMENTAL); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_EXPERIMENTAL); } } else if (getBattleArmor().getYear() < 3145) { // between 3090 and 3145, mixed tech is advanced if ((getBattleArmor().getTechLevel() != TechConstants.T_IS_UNOFFICIAL) && (getBattleArmor().getTechLevel() != TechConstants.T_IS_EXPERIMENTAL)) { getBattleArmor().setTechLevel(TechConstants.T_IS_ADVANCED); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_ADVANCED); } } else { // from 3145 on, mixed tech is tourney legal if ((getBattleArmor().getTechLevel() != TechConstants.T_IS_UNOFFICIAL) && (getBattleArmor().getTechLevel() != TechConstants.T_IS_EXPERIMENTAL) && (getBattleArmor().getTechLevel() != TechConstants.T_IS_TW_NON_BOX)) { getBattleArmor().setTechLevel(TechConstants.T_IS_TW_NON_BOX); getBattleArmor().setArmorTechLevel(TechConstants.T_IS_TW_NON_BOX); } } getBattleArmor().setTroopers(4); getBattleArmor().autoSetInternal(); numTroopers.setValue(4); getBattleArmor().setMixedTech(true); } else if ((techType.getSelectedIndex() == 3) && (!getBattleArmor().isMixedTech() || !getBattleArmor().isClan())) { techLevel.removeAllItems(); for (String item : clanTechLevels) { techLevel.addItem(item); } if (getBattleArmor().getYear() < 3090) { //before 3090, mixed tech is experimental if ((getBattleArmor().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL)) { getBattleArmor().setTechLevel(TechConstants.T_CLAN_EXPERIMENTAL); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_EXPERIMENTAL); } } else if (getBattleArmor().getYear() < 3145) { // between 3090 and 3145, mixed tech is advanced if ((getBattleArmor().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL) && (getBattleArmor().getTechLevel() != TechConstants.T_CLAN_EXPERIMENTAL)) { getBattleArmor().setTechLevel(TechConstants.T_CLAN_ADVANCED); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_ADVANCED); } } else { // from 3145 on, mixed tech is tourney legal if ((getBattleArmor().getTechLevel() != TechConstants.T_CLAN_UNOFFICIAL) && (getBattleArmor().getTechLevel() != TechConstants.T_CLAN_EXPERIMENTAL) && (getBattleArmor().getTechLevel() != TechConstants.T_CLAN_TW)) { getBattleArmor().setTechLevel(TechConstants.T_CLAN_TW); getBattleArmor().setArmorTechLevel(TechConstants.T_CLAN_TW); } } getBattleArmor().setTroopers(5); getBattleArmor().autoSetInternal(); numTroopers.setValue(5); getBattleArmor().setMixedTech(true); } else { addAllActionListeners(); return; } resetJumpType(); UnitUtil.checkEquipmentByTechLevel(getBattleArmor()); } else if (combo.equals(chassisType)) { getBattleArmor().setChassisType(chassisType.getSelectedIndex()); resetMovementMinMax(); } else if (combo.equals(weightClass)) { getBattleArmor().setWeightClass(combo.getSelectedIndex()); if((getBattleArmor().getWeightClass() == EntityWeightClass.WEIGHT_ULTRA_LIGHT) && (getBattleArmor().getChassisType() == BattleArmor.CHASSIS_TYPE_QUAD)) { getBattleArmor().setChassisType(BattleArmor.CHASSIS_TYPE_BIPED); } resetMovementMinMax(); resetArmorMax(); } else if (combo.equals(jumpType)) { resetMovementMode(); } else if (combo.equals(armorType)) { UnitUtil.removeISorArmorMounts(getBattleArmor(), false); String armorName; if (getBattleArmor().isMixedTech()){ armorName = (String)armorType.getSelectedItem(); } else if (getBattleArmor().isClan()){ armorName = "Clan " + (String)armorType.getSelectedItem(); } else { armorName = "IS " + (String)armorType.getSelectedItem(); } EquipmentType aType = EquipmentType.get(armorName); int armorCount = aType.getCriticals(getBattleArmor()); getBattleArmor().setArmorType(armorName); getBattleArmor().setArmorTechLevel( aType.getTechLevel(getBattleArmor().getYear())); for (; armorCount > 0; armorCount--) { try { getBattleArmor().addEquipment(new Mounted(getBattleArmor(), aType), BattleArmor.LOC_SQUAD, false); } catch (Exception ex) { ex.printStackTrace(); } } } else if (combo.equals(leftManipSelect)){ // If the BA already had a manipulator here, we'll need to // remove it Mounted leftManip = getBattleArmor().getLeftManipulator(); BAManipulator manipType; if (leftManip != null){ UnitUtil.removeMounted(getBattleArmor(), leftManip); manipType = BAManipulator.getManipulator( leftManip.getType().getInternalName()); // If this manipulator was mounted as a pair, // remove the paired manipulator if (manipType.pairMounted){ Mounted rightManip = getBattleArmor().getRightManipulator(); if (rightManip != null){ UnitUtil.removeMounted(getBattleArmor(), rightManip); rightManipSelect.setSelectedIndex(0); } } } // If we selected something other than "None", mount it if (leftManipSelect.getSelectedIndex() != 0){ String manipName = (String)leftManipSelect.getSelectedItem(); manipType = BAManipulator.getManipulator(manipName); EquipmentType et = EquipmentType.get(manipType.internalName); leftManip = new Mounted(getBattleArmor(), et); leftManip.setBaMountLoc(BattleArmor.MOUNT_LOC_LARM); try { // Add the manipulator getBattleArmor().addEquipment(leftManip, BattleArmor.LOC_SQUAD, false); // Check to see if we need to add its mate manipType = BAManipulator.getManipulator( leftManip.getType().getInternalName()); // If this manipulator was mounted as a pair, // remove the paired manipulator if (manipType.pairMounted){ Mounted rightManip = new Mounted(getBattleArmor(), et); rightManip.setBaMountLoc( BattleArmor.MOUNT_LOC_RARM); getBattleArmor().addEquipment(rightManip, BattleArmor.LOC_SQUAD, false); } } catch (LocationFullException ex){ // This shouldn't happen ex.printStackTrace(); } } } else if (combo.equals(rightManipSelect)){ // If the BA already had a manipulator here, we'll need to // remove it Mounted rightManip = getBattleArmor().getRightManipulator(); BAManipulator manipType; if (rightManip != null){ UnitUtil.removeMounted(getBattleArmor(), rightManip); manipType = BAManipulator.getManipulator( rightManip.getType().getInternalName()); // If this manipulator was mounted as a pair, // remove the paired manipulator if (manipType.pairMounted){ Mounted leftManip = getBattleArmor().getLeftManipulator(); if (leftManip != null){ UnitUtil.removeMounted(getBattleArmor(), leftManip); leftManipSelect.setSelectedIndex(0); } } } // If we selected something other than "None", mount it if (rightManipSelect.getSelectedIndex() != 0){ String manipName = (String)rightManipSelect.getSelectedItem(); manipType = BAManipulator.getManipulator(manipName); EquipmentType et = EquipmentType.get(manipType.internalName); rightManip = new Mounted(getBattleArmor(), et); rightManip.setBaMountLoc(BattleArmor.MOUNT_LOC_RARM); try { // Add the manipulator getBattleArmor().addEquipment(rightManip, BattleArmor.LOC_SQUAD, false); // Check to see if we need to add its mate manipType = BAManipulator.getManipulator( rightManip.getType().getInternalName()); // If this manipulator was mounted as a pair, // remove the paired manipulator if (manipType.pairMounted){ Mounted leftManip = new Mounted(getBattleArmor(), et); leftManip.setBaMountLoc( BattleArmor.MOUNT_LOC_LARM); getBattleArmor().addEquipment(leftManip, BattleArmor.LOC_SQUAD, false); } } catch (LocationFullException ex){ // This shouldn't happen ex.printStackTrace(); } } } } else if (e.getSource() instanceof JCheckBox){ JCheckBox chkBox = (JCheckBox) e.getSource(); if (chkBox.isSelected()){ EquipmentType eType = null; int baMountLoc = BattleArmor.MOUNT_LOC_NONE; if (chkBox.equals(chkJumpBooster)){ if (getBattleArmor().isClan()){ eType = EquipmentType.get("CLBAJumpBooster"); } else { eType = EquipmentType.get("ISBAJumpBooster"); } baMountLoc = BattleArmor.MOUNT_LOC_BODY; } else if (chkBox.equals(chkMechJumpBooster)){ if (getBattleArmor().isClan()){ eType = EquipmentType.get("CLMechanicalJumpBooster"); } else { eType = EquipmentType.get("ISMechanicalJumpBooster"); } baMountLoc = BattleArmor.MOUNT_LOC_BODY; } else if (chkBox.equals(chkMyomerBooster)){ eType = EquipmentType.get("CLBAMyomerBooster"); baMountLoc = BattleArmor.MOUNT_LOC_NONE; } else if (chkBox.equals(chkPartialWing)){ eType = EquipmentType.get("BAPartialWing"); baMountLoc = BattleArmor.MOUNT_LOC_BODY; } try { if (eType != null){ int numTimesToAdd = 1; // Spreadable equipment needs to have a Mounted entry // for each critical if (eType.isSpreadable()) { numTimesToAdd = eType.getCriticals(getBattleArmor()); } for (int i = 0; i < numTimesToAdd; i++) { Mounted newMount = new Mounted(getBattleArmor(), eType); newMount.setBaMountLoc(baMountLoc); getBattleArmor().addEquipment(newMount, BattleArmor.LOC_SQUAD, false); } } } catch (LocationFullException exc){ // Shouldn't happen with BA exc.printStackTrace(); } } else { ArrayList<Mounted> mounts = new ArrayList<Mounted>(); for (Mounted m : getBattleArmor().getMisc()){ if (chkBox.equals(chkJumpBooster) && m.getType().hasFlag(MiscType.F_JUMP_BOOSTER)){ mounts.add(m); } else if (chkBox.equals(chkMechJumpBooster) && m.getType().hasFlag( MiscType.F_MECHANICAL_JUMP_BOOSTER)){ mounts.add(m); } else if (chkBox.equals(chkMyomerBooster) && m.getType().hasFlag(MiscType.F_MASC)){ mounts.add(m); } else if (chkBox.equals(chkPartialWing) && m.getType().hasFlag(MiscType.F_PARTIAL_WING)){ mounts.add(m); } } for (Mounted mount : mounts) { UnitUtil.removeMounted(getBattleArmor(), mount); } } } refresh.refreshAll(); } public void keyPressed(KeyEvent e) { } public void keyReleased(KeyEvent e) { if (e.getSource().equals(era)) { try { getBattleArmor().setYear(Integer.parseInt(era.getText())); } catch (Exception ex) { getBattleArmor().setYear(3145); } } else if (e.getSource().equals(source)) { getBattleArmor().setSource(source.getText()); } else if (e.getSource().equals(chassis)) { getBattleArmor().setChassis(chassis.getText().trim()); } else if (e.getSource().equals(model)) { getBattleArmor().setModel(model.getText().trim()); } refresh.refreshPreview(); refresh.refreshHeader(); } @Override public void keyTyped(KeyEvent arg0) { } public void setAsCustomization() { chassis.setEditable(false); chassis.setEnabled(false); era.setEditable(false); era.setEnabled(false); } public void stateChanged(ChangeEvent e) { removeAllActionListeners(); if (e.getSource() instanceof JSpinner) { JSpinner spinner = (JSpinner) e.getSource(); if (spinner.equals(walkMP)) { getBattleArmor().setOriginalWalkMP((Integer) walkMP.getValue()); } else if (spinner.equals(jumpMP)) { getBattleArmor().setOriginalJumpMP((Integer) jumpMP.getValue()); resetMovementMode(); } else if (spinner.equals(armorPoints)) { int value = (Integer) armorPoints.getValue(); for(int i = 0; i < getBattleArmor().locations(); i++) { getBattleArmor().initializeArmor(value, i); } } else if (spinner.equals(numTroopers)){ int value = (Integer) numTroopers.getValue(); if (value != getBattleArmor().getTroopers()){ getBattleArmor().setTroopers(value); getBattleArmor().autoSetInternal(); } } } addAllActionListeners(); refresh.refreshAll(); } public void resetMovementMinMax() { if(getBattleArmor().getOriginalWalkMP() > getBattleArmor().getMaximumWalkMP()) { getBattleArmor().setOriginalWalkMP(getBattleArmor().getMaximumWalkMP()); } else if(getBattleArmor().getOriginalWalkMP() < getBattleArmor().getMinimumWalkMP()) { getBattleArmor().setOriginalWalkMP(getBattleArmor().getMinimumWalkMP()); } if(getBattleArmor().getOriginalJumpMP() > getBattleArmor().getMaximumJumpMP(true)) { getBattleArmor().setOriginalJumpMP(getBattleArmor().getMaximumJumpMP(true)); } } public void resetArmorMax() { for(int i = 0; i < getBattleArmor().locations(); i++) { if(getBattleArmor().getOArmor(i) > getBattleArmor().getMaximumArmorPoints()) { getBattleArmor().initializeArmor(getBattleArmor().getMaximumArmorPoints(), i); } } } public void resetMovementMode() { EntityMovementMode nMotion = EntityMovementMode.INF_LEG; if(getBattleArmor().getOriginalJumpMP() > 0) { if(jumpType.getSelectedItem().equals(MOVE_VTOL)) { nMotion = EntityMovementMode.VTOL; } else if(jumpType.getSelectedItem().equals(MOVE_UMU)) { nMotion = EntityMovementMode.INF_UMU; } else { nMotion = EntityMovementMode.INF_JUMP; } getBattleArmor().setMovementMode(nMotion); } } public void resetJumpType() { if(!getBattleArmor().isClan()) { if(getBattleArmor().getOriginalJumpMP() > 0) { getBattleArmor().setMovementMode(EntityMovementMode.INF_JUMP); } else { getBattleArmor().setMovementMode(EntityMovementMode.INF_LEG); } resetMovementMinMax(); } } public void refreshPreview(){ boolean populateTextFields = true; MechView mechView = null; try { mechView = new MechView(getBattleArmor(), false); } catch (Exception e) { e.printStackTrace(); // error unit didn't load right. this is bad news. populateTextFields = false; } if (populateTextFields && (mechView != null)) { panelMekView.setMech(getBattleArmor()); } else { panelMekView.reset(); } } }