package mekhq.gui.adapter; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.util.ArrayList; import java.util.Arrays; import java.util.ResourceBundle; import java.util.TreeSet; import java.util.UUID; import javax.swing.JCheckBoxMenuItem; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPopupMenu; import javax.swing.JTable; import javax.swing.event.MouseInputAdapter; import megamek.common.Aero; import megamek.common.BattleArmor; import megamek.common.Crew; import megamek.common.Infantry; import megamek.common.Mounted; import megamek.common.Tank; import megamek.common.options.PilotOptions; import megamek.common.util.EncodeControl; import mekhq.MekHQ; import mekhq.Utilities; import mekhq.campaign.Kill; import mekhq.campaign.LogEntry; import mekhq.campaign.event.PersonChangedEvent; import mekhq.campaign.event.PersonLogEvent; import mekhq.campaign.personnel.Injury; import mekhq.campaign.personnel.Person; import mekhq.campaign.personnel.Rank; import mekhq.campaign.personnel.Ranks; import mekhq.campaign.personnel.SkillType; import mekhq.campaign.personnel.SpecialAbility; import mekhq.campaign.unit.Unit; import mekhq.gui.CampaignGUI; import mekhq.gui.dialog.CustomizePersonDialog; import mekhq.gui.dialog.EditKillLogDialog; import mekhq.gui.dialog.EditLogEntryDialog; import mekhq.gui.dialog.EditPersonnelInjuriesDialog; import mekhq.gui.dialog.EditPersonnelLogDialog; import mekhq.gui.dialog.ImageChoiceDialog; import mekhq.gui.dialog.KillDialog; import mekhq.gui.dialog.PopupValueChoiceDialog; import mekhq.gui.dialog.RetirementDefectionDialog; import mekhq.gui.dialog.TextAreaDialog; import mekhq.gui.model.PersonnelTableModel; import mekhq.gui.utilities.MenuScroller; import mekhq.gui.utilities.StaticChecks; public class PersonnelTableMouseAdapter extends MouseInputAdapter implements ActionListener { private static final String CMD_RANKSYSTEM = "RANKSYSTEM"; //$NON-NLS-1$ private static final String CMD_RANK = "RANK"; //$NON-NLS-1$ private static final String CMD_MANEI_DOMINI_RANK = "MD_RANK"; //$NON-NLS-1$ private static final String CMD_MANEI_DOMINI_CLASS = "MD_CLASS"; //$NON-NLS-1$ private static final String CMD_PRIMARY_ROLE = "PROLE"; //$NON-NLS-1$ private static final String CMD_SECONDARY_ROLE = "SROLE"; //$NON-NLS-1$ private static final String CMD_PRIMARY_DESIGNATOR = "DESIG_PRI"; //$NON-NLS-1$ private static final String CMD_SECONDARY_DESIGNATOR = "DESIG_SEC"; //$NON-NLS-1$ private static final String CMD_REMOVE_UNIT = "REMOVE_UNIT"; //$NON-NLS-1$ private static final String CMD_ADD_PILOT = "ADD_PILOT"; //$NON-NLS-1$ private static final String CMD_ADD_SOLDIER = "ADD_SOLDIER"; //$NON-NLS-1$ private static final String CMD_ADD_DRIVER = "ADD_DRIVER"; //$NON-NLS-1$ private static final String CMD_ADD_VESSEL_PILOT = "ADD_VESSEL_PILOT"; //$NON-NLS-1$ private static final String CMD_ADD_GUNNER = "ADD_GUNNER"; //$NON-NLS-1$ private static final String CMD_ADD_CREW = "ADD_CREW"; //$NON-NLS-1$ private static final String CMD_ADD_NAVIGATOR = "ADD_NAV"; //$NON-NLS-1$ private static final String CMD_EDIT_SALARY = "SALARY"; //$NON-NLS-1$ private static final String CMD_BLOODNAME = "BLOODNAME"; //$NON-NLS-1$ private static final String CMD_EDIT_INJURIES = "EDIT_INJURIES"; //$NON-NLS-1$ private static final String CMD_REMOVE_INJURY = "REMOVE_INJURY"; //$NON-NLS-1$ private static final String CMD_CLEAR_INJURIES = "CLEAR_INJURIES"; //$NON-NLS-1$ private static final String CMD_CALLSIGN = "CALLSIGN"; //$NON-NLS-1$ private static final String CMD_DEPENDENT = "DEPENDENT"; //$NON-NLS-1$ private static final String CMD_COMMANDER = "COMMANDER"; //$NON-NLS-1$ private static final String CMD_EDIT_LOG_ENTRY = "LOG_SINGLE"; //$NON-NLS-1$ private static final String CMD_EDIT_PERSONNEL_LOG = "LOG"; //$NON-NLS-1$ private static final String CMD_EDIT_KILL_LOG = "KILL_LOG"; //$NON-NLS-1$ private static final String CMD_KILL = "KILL"; //$NON-NLS-1$ private static final String CMD_SET_EDGE = "EDGE_SET"; //$NON-NLS-1$ private static final String CMD_SET_XP = "XP_SET"; //$NON-NLS-1$ private static final String CMD_ADD_XP = "XP_ADD"; //$NON-NLS-1$ private static final String CMD_EDIT_BIOGRAPHY = "BIOGRAPHY"; //$NON-NLS-1$ private static final String CMD_EDIT_PORTRAIT = "PORTRAIT"; //$NON-NLS-1$ private static final String CMD_HEAL = "HEAL"; //$NON-NLS-1$ private static final String CMD_EDIT = "EDIT"; //$NON-NLS-1$ private static final String CMD_SACK = "SACK"; //$NON-NLS-1$ private static final String CMD_REMOVE = "REMOVE"; //$NON-NLS-1$ private static final String CMD_EDGE_TRIGGER = "EDGE"; //$NON-NLS-1$ private static final String CMD_CHANGE_PRISONER_STATUS = "PRISONER_STATUS"; //$NON-NLS-1$ private static final String CMD_CHANGE_STATUS = "STATUS"; //$NON-NLS-1$ private static final String CMD_ACQUIRE_SPECIALIST = "SPECIALIST"; //$NON-NLS-1$ private static final String CMD_ACQUIRE_WEAPON_SPECIALIST = "WSPECIALIST"; //$NON-NLS-1$ private static final String CMD_ACQUIRE_RANGEMASTER = "RANGEMASTER"; //$NON-NLS-1$ private static final String CMD_ACQUIRE_ABILITY = "ABILITY"; //$NON-NLS-1$ private static final String CMD_IMPROVE = "IMPROVE"; //$NON-NLS-1$ private static final String CMD_ADD_SPOUSE = "SPOUSE"; //$NON-NLS-1$ private static final String CMD_REMOVE_SPOUSE = "REMOVE_SPOUSE"; //$NON-NLS-1$ private static final String CMD_ADD_PREGNANCY = "ADD_PREGNANCY"; //$NON-NLS-1$ private static final String CMD_REMOVE_PREGNANCY = "PREGNANCY_SPOUSE"; //$NON-NLS-1$ private static final String CMD_ADD_TECH = "ADD_TECH"; //$NON-NLS-1$ private static final String CMD_IMPRISON = "IMPRISON"; //$NON-NLS-1$ private static final String CMD_FREE = "FREE"; //$NON-NLS-1$ private static final String CMD_RECRUIT = "RECRUIT"; //$NON-NLS-1$ private static final String SEPARATOR = "@"; //$NON-NLS-1$ private static final String SPACE = " "; //$NON-NLS-1$ private static final String HYPHEN = "-"; //$NON-NLS-1$ private static final String QUESTION_MARK = "?"; //$NON-NLS-1$ private static final String TRUE = String.valueOf(true); private static final String FALSE = String.valueOf(false); private CampaignGUI gui; private JTable personnelTable; private PersonnelTableModel personnelModel; private ResourceBundle resourceMap = null; public PersonnelTableMouseAdapter(CampaignGUI gui, JTable personnelTable, PersonnelTableModel personnelModel) { super(); this.gui = gui; this.personnelTable = personnelTable; this.personnelModel = personnelModel; resourceMap = ResourceBundle.getBundle("mekhq.resources.PersonnelTableMouseAdapter", new EncodeControl()); //$NON-NLS-1$ } private static final String OPT_SURNAME_NO_CHANGE = "no_change"; //$NON-NLS-1$ private static final String OPT_SURNAME_YOURS = "yours"; //$NON-NLS-1$ private static final String OPT_SURNAME_SPOUSE = "spouse"; //$NON-NLS-1$ private static final String OPT_SURNAME_HYP_YOURS = "hyp_yours"; //$NON-NLS-1$ private static final String OPT_SURNAME_HYP_SPOUSE = "hyp_spouse"; //$NON-NLS-1$ private static final String OPT_EDGE_MASC_FAILURE = "edge_when_masc_fails"; //$NON-NLS-1$ private static final String OPT_EDGE_EXPLOSION = "edge_when_explosion"; //$NON-NLS-1$ private static final String OPT_EDGE_KO = "edge_when_ko"; //$NON-NLS-1$ private static final String OPT_EDGE_TAC = "edge_when_tac"; //$NON-NLS-1$ private static final String OPT_EDGE_HEADHIT = "edge_when_headhit"; //$NON-NLS-1$ private static final String OPT_PRISONER_FREE = "free"; //$NON-NLS-1$ private static final String OPT_PRISONER_IMPRISONED = "imprisoned"; //$NON-NLS-1$ private static final String OPT_PRISONER_IMPRISONED_DEFECTING = "imprisoned_defecting"; //$NON-NLS-1$ private static final String OPT_PRISONER_BONDSMAN = "bondsman"; //$NON-NLS-1$ private String makeCommand(String ... parts) { return Utilities.combineString(Arrays.asList(parts), SEPARATOR); } @Override public void actionPerformed(ActionEvent action) { int row = personnelTable.getSelectedRow(); if (row < 0) { return; } Person selectedPerson = personnelModel.getPerson(personnelTable .convertRowIndexToModel(row)); int[] rows = personnelTable.getSelectedRows(); Person[] people = new Person[rows.length]; for (int i = 0; i < rows.length; i++) { people[i] = personnelModel.getPerson(personnelTable .convertRowIndexToModel(rows[i])); } String[] data = action.getActionCommand().split(SEPARATOR, -1); String command = data[0]; switch(command) { case CMD_RANKSYSTEM: int system = Integer.parseInt(data[1]); for (Person person : people) { person.setRankSystem(system); } break; case CMD_RANK: int rank = Integer.parseInt(data[1]); int level = 0; // Check to see if we added a rank level... if (data.length > 2) { level = Integer.parseInt(data[2]); } for (Person person : people) { gui.getCampaign().changeRank(person, rank, level, true); } break; case CMD_MANEI_DOMINI_RANK: int md_rank = Integer.parseInt(data[1]); for (Person person : people) { person.setManeiDominiRank(md_rank); } break; case CMD_MANEI_DOMINI_CLASS: int md_class = Integer.parseInt(data[1]); for (Person person : people) { person.setManeiDominiClass(md_class); } break; case CMD_PRIMARY_DESIGNATOR: int designation = Integer.parseInt(data[1]); for (Person person : people) { person.setPrimaryDesignator(designation); } break; case CMD_SECONDARY_DESIGNATOR: int secDesignation = Integer.parseInt(data[1]); for (Person person : people) { person.setSecondaryDesignator(secDesignation); } break; case CMD_PRIMARY_ROLE: int role = Integer.parseInt(data[1]); for (Person person : people) { person.setPrimaryRole(role); gui.getCampaign().personUpdated(person); } break; case CMD_SECONDARY_ROLE: int secRole = Integer.parseInt(data[1]); for (Person person : people) { person.setSecondaryRole(secRole); gui.getCampaign().personUpdated(person); } break; case CMD_REMOVE_UNIT: for (Person person : people) { Unit u = gui.getCampaign().getUnit(person.getUnitId()); if (null != u) { u.remove(person, true); u.resetEngineer(); u.runDiagnostic(false); } // check for tech unit assignments if (!person.getTechUnitIDs().isEmpty()) { // I need to create a new array list to avoid concurrent // problems ArrayList<UUID> temp = new ArrayList<UUID>(); for (UUID i : person.getTechUnitIDs()) { temp.add(i); } for (UUID i : temp) { u = gui.getCampaign().getUnit(i); if (null != u) { u.remove(person, true); u.resetEngineer(); u.runDiagnostic(false); } } /* * Incase there's still some assignments for this tech, * clear them out. This can happen if the target unit * above is null. The tech will still have the pointer * but to a null unit and it will never go away * otherwise. */ person.clearTechUnitIDs(); } } break; case CMD_ADD_PILOT: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); Unit oldUnit = gui.getCampaign().getUnit(selectedPerson.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(selectedPerson, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } if (null != u) { u.addPilotOrSoldier(selectedPerson, useTransfers); } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_SOLDIER: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); if (null != u) { for (Person p : people) { if (u.canTakeMoreGunners()) { Unit oldUnit = gui.getCampaign().getUnit(p.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(p, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } u.addPilotOrSoldier(p, useTransfers); } } } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_DRIVER: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); Unit oldUnit = gui.getCampaign().getUnit(selectedPerson.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(selectedPerson, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } if (null != u) { u.addDriver(selectedPerson, useTransfers); } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_VESSEL_PILOT: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); if (null != u) { for (Person p : people) { if (u.canTakeMoreDrivers()) { Unit oldUnit = gui.getCampaign().getUnit(p.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(p, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } u.addDriver(p, useTransfers); } } } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_GUNNER: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); if (null != u) { for (Person p : people) { if (u.canTakeMoreGunners()) { Unit oldUnit = gui.getCampaign().getUnit(p.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(p, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } u.addGunner(p, useTransfers); } } } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_CREW: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); if (null != u) { for (Person p : people) { if (u.canTakeMoreVesselCrew()) { Unit oldUnit = gui.getCampaign().getUnit(p.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(p, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } u.addVesselCrew(p, useTransfers); } } } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_NAVIGATOR: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); if (null != u) { for (Person p : people) { if (u.canTakeNavigator()) { Unit oldUnit = gui.getCampaign().getUnit(p.getUnitId()); boolean useTransfers = false; boolean transferLog = !gui.getCampaign().getCampaignOptions().useTransfers(); if (null != oldUnit) { oldUnit.remove(p, transferLog); useTransfers = gui.getCampaign().getCampaignOptions().useTransfers(); } u.setNavigator(p, useTransfers); } } } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_TECH: { UUID selected = UUID.fromString(data[1]); Unit u = gui.getCampaign().getUnit(selected); if (null != u) { if (u.canTakeTech()) { u.setTech(selectedPerson); } } u.resetPilotAndEntity(); u.runDiagnostic(false); break; } case CMD_ADD_PREGNANCY: { if (selectedPerson.isFemale()) { selectedPerson.addPregnancy(); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; } case CMD_REMOVE_PREGNANCY: { if (selectedPerson.isPregnant()) { selectedPerson.removePregnancy(); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; } case CMD_REMOVE_SPOUSE: { if (!selectedPerson.getSpouse().isDeadOrMIA()) { selectedPerson.getSpouse().addLogEntry(gui.getCampaign().getDate(), String.format(resourceMap.getString("divorcedFrom.format"), selectedPerson.getFullName())); //$NON-NLS-1$ selectedPerson.addLogEntry(gui.getCampaign().getDate(), String.format(resourceMap.getString("divorcedFrom.format"), selectedPerson.getSpouse().getFullName())); //$NON-NLS-1$ if (selectedPerson.getMaidenName() != null) { selectedPerson.setName(selectedPerson.getName().split(SPACE, 2)[0] + SPACE + selectedPerson.getMaidenName()); } if (selectedPerson.getSpouse().getMaidenName() != null) { Person spouse = selectedPerson.getSpouse(); spouse.setName(spouse.getName().split(SPACE, 2)[0] + SPACE + spouse.getMaidenName()); } } selectedPerson.getSpouse().setSpouseID(null); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson.getSpouse())); selectedPerson.setSpouseID(null); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); break; } case CMD_ADD_SPOUSE: { Person spouse = gui.getCampaign().getPerson(UUID.fromString(data[1])); String surnameOption = data[2]; String selectedSurname = selectedPerson.getName().split(SPACE, 2)[1]; String spouseSurname = spouse.getName().split(SPACE, 2)[1]; String selectedGivenname = selectedPerson.getName().split(SPACE, 2)[0]; String spouseGivenname = spouse.getName().split(SPACE, 2)[0]; switch (surnameOption) { case OPT_SURNAME_NO_CHANGE: break; case OPT_SURNAME_YOURS: spouse.setName(spouseGivenname + SPACE + selectedSurname); spouse.setMaidenName(spouseSurname); break; case OPT_SURNAME_SPOUSE: selectedPerson.setName(selectedGivenname + SPACE + spouseSurname); selectedPerson.setMaidenName(selectedSurname); break; case OPT_SURNAME_HYP_YOURS: selectedPerson.setName(selectedGivenname + SPACE + selectedSurname + HYPHEN + spouseSurname); selectedPerson.setMaidenName(selectedSurname); break; case OPT_SURNAME_HYP_SPOUSE: spouse.setName(spouseGivenname + SPACE + spouseSurname+ HYPHEN + selectedSurname); spouse.setMaidenName(spouseSurname); break; default: spouse.setName(spouseGivenname + SPACE + "ImaError"); //$NON-NLS-1$ MekHQ.logMessage(String.format("Unknown error in Surname chooser between \"%s\" and \"%s\"", //$NON-NLS-1$ selectedPerson.getFullName(), spouse.getFullName())); break; } spouse.setSpouseID(selectedPerson.getId()); spouse.addLogEntry(gui.getCampaign().getDate(), String.format(resourceMap.getString("marries.format"), selectedPerson.getFullName())); //$NON-NLS-1$ selectedPerson.setSpouseID(spouse.getId()); selectedPerson.addLogEntry(gui.getCampaign().getDate(), String.format(resourceMap.getString("marries.format"), spouse.getFullName())); //$NON-NLS-1$ MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); MekHQ.triggerEvent(new PersonChangedEvent(spouse)); break; } case CMD_IMPROVE: { String type = data[1]; int cost = Integer.parseInt(data[2]); int oldExpLevel = selectedPerson.getExperienceLevel(false); selectedPerson.improveSkill(type); gui.getCampaign().personUpdated(selectedPerson); selectedPerson.setXp(selectedPerson.getXp() - cost); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); gui.getCampaign().addReport(String.format(resourceMap.getString("improved.format"), selectedPerson.getHyperlinkedName(), type)); //$NON-NLS-1$ if (gui.getCampaign().getCampaignOptions().getUseAtB() && gui.getCampaign().getCampaignOptions().useAbilities()) { if (selectedPerson.getPrimaryRole() > Person.T_NONE && selectedPerson.getPrimaryRole() <= Person.T_CONV_PILOT && selectedPerson.getExperienceLevel(false) > oldExpLevel && oldExpLevel >= SkillType.EXP_REGULAR) { String spa = gui.getCampaign() .rollSPA(selectedPerson.getPrimaryRole(), selectedPerson); if (null == spa) { if (gui.getCampaign().getCampaignOptions().useEdge()) { selectedPerson.acquireAbility( PilotOptions.EDGE_ADVANTAGES, "edge", //$NON-NLS-1$ selectedPerson.getEdge() + 1); gui.getCampaign().addReport(String.format(resourceMap.getString("gainedEdge.format"), selectedPerson.getHyperlinkedName())); //$NON-NLS-1$ } } else { gui.getCampaign().addReport(String.format(resourceMap.getString("gained.format"), //$NON-NLS-1$ selectedPerson.getHyperlinkedName(), SpecialAbility.getDisplayName(spa))); } } } break; } case CMD_ACQUIRE_ABILITY: { String selected = data[1]; int cost = Integer.parseInt(data[2]); selectedPerson.acquireAbility(PilotOptions.LVL3_ADVANTAGES, selected, true); gui.getCampaign().personUpdated(selectedPerson); selectedPerson.setXp(selectedPerson.getXp() - cost); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); // TODO: add personnelTab.getCampaign() report break; } case CMD_ACQUIRE_WEAPON_SPECIALIST: { String selected = data[1]; int cost = Integer.parseInt(data[2]); selectedPerson.acquireAbility(PilotOptions.LVL3_ADVANTAGES, "weapon_specialist", selected); //$NON-NLS-1$ gui.getCampaign().personUpdated(selectedPerson); selectedPerson.setXp(selectedPerson.getXp() - cost); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); // TODO: add campaign report break; } case CMD_ACQUIRE_SPECIALIST: { String selected = data[1]; int cost = Integer.parseInt(data[2]); selectedPerson.acquireAbility(PilotOptions.LVL3_ADVANTAGES, "specialist", selected); //$NON-NLS-1$ gui.getCampaign().personUpdated(selectedPerson); selectedPerson.setXp(selectedPerson.getXp() - cost); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); // TODO: add campaign report break; } case CMD_ACQUIRE_RANGEMASTER: { String selected = data[1]; int cost = Integer.parseInt(data[2]); selectedPerson.acquireAbility(PilotOptions.LVL3_ADVANTAGES, "range_master", selected); //$NON-NLS-1$ gui.getCampaign().personUpdated(selectedPerson); selectedPerson.setXp(selectedPerson.getXp() - cost); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); // TODO: add campaign report break; } case CMD_CHANGE_STATUS: { int selected = Integer.parseInt(data[1]); for (Person person : people) { if ((selected == Person.S_ACTIVE) || (0 == JOptionPane.showConfirmDialog(null, String.format(resourceMap.getString("confirmRetireQ.format"), person.getFullTitle()), //$NON-NLS-1$ resourceMap.getString("kiaQ.text"), JOptionPane.YES_NO_OPTION))) { //$NON-NLS-1$ gui.getCampaign().changeStatus(person, selected); } } break; } case CMD_CHANGE_PRISONER_STATUS: String selected = data[1]; for (Person person : people) { switch(selected) { case OPT_PRISONER_FREE: gui.getCampaign().changePrisonerStatus(person, Person.PRISONER_NOT); break; case OPT_PRISONER_IMPRISONED: gui.getCampaign().changePrisonerStatus(person, Person.PRISONER_YES); break; case OPT_PRISONER_IMPRISONED_DEFECTING: gui.getCampaign().changePrisonerStatus(person, Person.PRISONER_YES); person.setWillingToDefect(true); break; case OPT_PRISONER_BONDSMAN: gui.getCampaign().changePrisonerStatus(person, Person.PRISONER_BONDSMAN); break; default: // U WOT M8? break; } } break; case CMD_IMPRISON: gui.getCampaign().changePrisonerStatus(selectedPerson, Person.PRISONER_YES); break; case CMD_FREE: // TODO: Warn in particular for "freeing" in deep space, leading to Geneva Conventions violation // TODO: Record the people into some NPC pool, if still alive if(0 == JOptionPane.showConfirmDialog( null, String.format(resourceMap.getString("confirmFree.format"), selectedPerson.getFullTitle()), //$NON-NLS-1$ resourceMap.getString("freeQ.text"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION)) { gui.getCampaign().removePerson(selectedPerson.getId()); } break; case CMD_RECRUIT: gui.getCampaign().changePrisonerStatus(selectedPerson, Person.PRISONER_NOT); break; case CMD_EDGE_TRIGGER: { String trigger = data[1]; if (people.length > 1) { boolean status = Boolean.parseBoolean(data[2]); for (Person person : people) { person.setEdgeTrigger(trigger, status); gui.getCampaign().personUpdated(person); } } else { selectedPerson.changeEdgeTrigger(trigger); gui.getCampaign().personUpdated(selectedPerson); } break; } case CMD_REMOVE: { String title = String.format(resourceMap.getString("numPersonnel.text"), people.length); //$NON-NLS-1$ if(people.length == 1) { title = people[0].getFullTitle(); } if (0 == JOptionPane.showConfirmDialog( null, String.format(resourceMap.getString("confirmRemove.format"), title), //$NON-NLS-1$ resourceMap.getString("removeQ.text"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION)) { for (Person person : people) { gui.getCampaign().removePerson(person.getId()); } } break; } case CMD_SACK: { boolean showDialog = false; ArrayList<UUID> toRemove = new ArrayList<UUID>(); for (Person person : people) { if (gui.getCampaign().getRetirementDefectionTracker() .removeFromCampaign( person, false, gui.getCampaign().getCampaignOptions() .getUseShareSystem() ? person .getNumShares(gui.getCampaign() .getCampaignOptions() .getSharesForAll()) : 0, gui.getCampaign(), null)) { showDialog = true; } else { toRemove.add(person.getId()); } } if (showDialog) { RetirementDefectionDialog rdd = new RetirementDefectionDialog( gui, null, false); rdd.setVisible(true); if (rdd.wasAborted() || !gui.getCampaign().applyRetirement(rdd.totalPayout(), rdd.getUnitAssignments())) { for (Person person : people) { gui.getCampaign().getRetirementDefectionTracker() .removePayout(person); } } else { for (UUID id : toRemove) { gui.getCampaign().removePerson(id); } } } else { String question; if(people.length > 1) { question = resourceMap.getString("confirmRemoveMultiple.text"); //$NON-NLS-1$ } else { question = String.format(resourceMap.getString("confirmRemove.format"), people[0].getFullTitle()); //$NON-NLS-1$ } if (JOptionPane.YES_OPTION == JOptionPane.showConfirmDialog( null, question, resourceMap.getString("removeQ.text"), //$NON-NLS-1$ JOptionPane.YES_NO_OPTION)) { for (Person person : people) { gui.getCampaign().removePerson(person.getId()); } } } break; } case CMD_EDIT: CustomizePersonDialog npd = new CustomizePersonDialog( gui.getFrame(), true, selectedPerson, gui.getCampaign()); npd.setVisible(true); gui.getCampaign().personUpdated(selectedPerson); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); break; case CMD_HEAL: for (Person person : people) { person.setHits(0); person.setDoctorId(null, gui.getCampaign().getCampaignOptions() .getNaturalHealingWaitingPeriod()); } gui.getCampaign().personUpdated(selectedPerson); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); break; case CMD_EDIT_PORTRAIT: ImageChoiceDialog pcd = new ImageChoiceDialog(gui.getFrame(), true, selectedPerson.getPortraitCategory(), selectedPerson.getPortraitFileName(), gui.getIconPackage() .getPortraits()); pcd.setVisible(true); if (pcd.isChanged()) { selectedPerson.setPortraitCategory(pcd.getCategory()); selectedPerson.setPortraitFileName(pcd.getFileName()); gui.getCampaign().personUpdated(selectedPerson); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; case CMD_EDIT_BIOGRAPHY: TextAreaDialog tad = new TextAreaDialog(gui.getFrame(), true, resourceMap.getString("editBiography.text"), selectedPerson.getBiography()); //$NON-NLS-1$ tad.setVisible(true); if (tad.wasChanged()) { selectedPerson.setBiography(tad.getText()); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; case CMD_ADD_XP: for (Person person : people) { person.setXp(person.getXp() + 1); MekHQ.triggerEvent(new PersonChangedEvent(person)); } break; case CMD_SET_XP: { PopupValueChoiceDialog pvcd = new PopupValueChoiceDialog( gui.getFrame(), true, resourceMap.getString("xp.text"), selectedPerson.getXp(), 0); //$NON-NLS-1$ pvcd.setVisible(true); if (pvcd.getValue() < 0) { return; } int i = pvcd.getValue(); for (Person person : people) { person.setXp(i); MekHQ.triggerEvent(new PersonChangedEvent(person)); } break; } case CMD_SET_EDGE: { PopupValueChoiceDialog pvcd = new PopupValueChoiceDialog( gui.getFrame(), true, resourceMap.getString("edge.text"), selectedPerson.getEdge(), 0, //$NON-NLS-1$ 10); pvcd.setVisible(true); if (pvcd.getValue() < 0) { return; } int i = pvcd.getValue(); for (Person person : people) { person.setEdge(i); gui.getCampaign().personUpdated(person); MekHQ.triggerEvent(new PersonChangedEvent(person)); } break; } case CMD_KILL: { KillDialog nkd; Unit unit = gui.getCampaign().getUnit(selectedPerson.getUnitId()); if (people.length > 1) { nkd = new KillDialog(gui.getFrame(), true, new Kill(null, QUESTION_MARK, unit != null ? unit.getName() : resourceMap.getString("bareHands.text"), gui.getCampaign().getDate()), resourceMap.getString("crew.text")); //$NON-NLS-1$ //$NON-NLS-2$ } else { nkd = new KillDialog(gui.getFrame(), true, new Kill(selectedPerson.getId(), QUESTION_MARK, unit != null ? unit.getName() : resourceMap.getString("bareHands.text"), gui.getCampaign().getDate()), selectedPerson.getFullName()); //$NON-NLS-1$ } nkd.setVisible(true); if (!nkd.wasCancelled()) { Kill kill = nkd.getKill(); if (people.length > 1) { for (Person person : people) { Kill k = kill.clone(); k.setPilotId(person.getId()); gui.getCampaign().addKill(k); } } else { gui.getCampaign().addKill(kill); } } break; } case CMD_EDIT_KILL_LOG: EditKillLogDialog ekld = new EditKillLogDialog(gui.getFrame(), true, gui.getCampaign(), selectedPerson); ekld.setVisible(true); MekHQ.triggerEvent(new PersonLogEvent(selectedPerson)); break; case CMD_EDIT_PERSONNEL_LOG: EditPersonnelLogDialog epld = new EditPersonnelLogDialog(gui.getFrame(), true, gui.getCampaign(), selectedPerson); epld.setVisible(true); MekHQ.triggerEvent(new PersonLogEvent(selectedPerson)); break; case CMD_EDIT_LOG_ENTRY: EditLogEntryDialog eeld = new EditLogEntryDialog(gui.getFrame(), true, new LogEntry(gui.getCampaign().getDate(), "")); //$NON-NLS-1$ eeld.setVisible(true); LogEntry entry = eeld.getEntry(); if (null != entry) { for (Person person : people) { person.addLogEntry(entry.clone()); MekHQ.triggerEvent(new PersonLogEvent(selectedPerson)); } } break; case CMD_COMMANDER: { selectedPerson.setCommander(!selectedPerson.isCommander()); if (selectedPerson.isCommander()) { for (Person p : gui.getCampaign().getPersonnel()) { if (p.isCommander() && !p.getId().equals(selectedPerson.getId())) { p.setCommander(false); gui.getCampaign().addReport(String.format(resourceMap.getString("removedCommander.format"), p.getHyperlinkedFullTitle())); //$NON-NLS-1$ gui.getCampaign().personUpdated(p); MekHQ.triggerEvent(new PersonChangedEvent(p)); } } gui.getCampaign().addReport(String.format(resourceMap.getString("setAsCommander.format"), selectedPerson.getHyperlinkedFullTitle())); //$NON-NLS-1$ gui.getCampaign().personUpdated(selectedPerson); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; } case CMD_DEPENDENT: { if (people.length > 1) { boolean status = Boolean.parseBoolean(data[1]); for (Person person : people) { person.setDependent(status); gui.getCampaign().personUpdated(person); MekHQ.triggerEvent(new PersonChangedEvent(person)); } } else { selectedPerson.setDependent(!selectedPerson.isDependent()); gui.getCampaign().personUpdated(selectedPerson); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); } break; } case CMD_CALLSIGN: String s = (String) JOptionPane.showInputDialog(gui.getFrame(), resourceMap.getString("enterNewCallsign.text"), resourceMap.getString("editCallsign.text"), //$NON-NLS-1$ //$NON-NLS-2$ JOptionPane.PLAIN_MESSAGE, null, null, selectedPerson.getCallsign()); if (null != s) { selectedPerson.setCallsign(s); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); gui.getCampaign().personUpdated(selectedPerson); } break; case CMD_CLEAR_INJURIES: for (Person person : people) { person.clearInjuries(); Unit u = gui.getCampaign().getUnit(person.getUnitId()); if (null != u) { u.resetPilotAndEntity(); } } break; case CMD_REMOVE_INJURY: { String sel = data[1]; Injury toRemove = null; for (Injury i : selectedPerson.getInjuries()) { if (i.getUUID().toString().equals(sel)) { toRemove = i; break; } } if (toRemove != null) { selectedPerson.removeInjury(toRemove); } Unit u = gui.getCampaign().getUnit(selectedPerson.getUnitId()); if (null != u) { u.resetPilotAndEntity(); } break; } case CMD_EDIT_INJURIES: EditPersonnelInjuriesDialog epid = new EditPersonnelInjuriesDialog( gui.getFrame(), true, gui.getCampaign(), selectedPerson); epid.setVisible(true); MekHQ.triggerEvent(new PersonChangedEvent(selectedPerson)); break; case CMD_BLOODNAME: for (Person p : people) { if (!p.isClanner()) { continue; } gui.getCampaign() .checkBloodnameAdd(p, p.getPrimaryRole(), true); } gui.getCampaign().personUpdated(selectedPerson); break; case CMD_EDIT_SALARY: { PopupValueChoiceDialog pcvd = new PopupValueChoiceDialog(gui.getFrame(), true, resourceMap.getString("changeSalary.text"), //$NON-NLS-1$ selectedPerson.getSalary(), -1, 100000); pcvd.setVisible(true); int salary = pcvd.getValue(); if (salary < -1) { return; } for (Person person : people) { person.setSalary(salary); MekHQ.triggerEvent(new PersonChangedEvent(person)); } break; } default: break; } } @Override public void mousePressed(MouseEvent e) { maybeShowPopup(e); } @Override public void mouseReleased(MouseEvent e) { maybeShowPopup(e); } private Person[] getSelectedPeople() { Person[] selected = new Person[personnelTable.getSelectedRowCount()]; int[] rows = personnelTable.getSelectedRows(); for (int i = 0; i < rows.length; i++) { Person person = personnelModel.getPerson(personnelTable.convertRowIndexToModel(rows[i])); selected[i] = person; } return selected; } private void maybeShowPopup(MouseEvent e) { JPopupMenu popup = new JPopupMenu(); if (e.isPopupTrigger()) { if (personnelTable.getSelectedRowCount() == 0) { return; } int row = personnelTable.getSelectedRow(); boolean oneSelected = personnelTable.getSelectedRowCount() == 1; Person person = personnelModel.getPerson(personnelTable .convertRowIndexToModel(row)); JMenuItem menuItem = null; JMenu menu = null; JMenu submenu = null; JCheckBoxMenuItem cbMenuItem = null; Person[] selected = getSelectedPeople(); // **lets fill the pop up menu**// if (StaticChecks.areAllEligible(selected)) { menu = new JMenu(resourceMap.getString("changeRank.text")); //$NON-NLS-1$ Ranks ranks = person.getRanks(); for (int rankOrder = 0; rankOrder < Ranks.RC_NUM; rankOrder++) { Rank rank = ranks.getAllRanks().get(rankOrder); int profession = person.getProfession(); // Empty professions need swapped before the // continuation while (ranks.isEmptyProfession(profession) && profession != Ranks.RPROF_MW) { profession = ranks .getAlternateProfession(profession); } if (rank.getName(profession).equals(HYPHEN)) { continue; } // re-route through any profession redirections, // starting with the empty profession check while (rank.getName(profession).startsWith("--") //$NON-NLS-1$ && profession != Ranks.RPROF_MW) { if (rank.getName(profession).equals("--")) { //$NON-NLS-1$ profession = ranks .getAlternateProfession(profession); } else if (rank.getName(profession) .startsWith("--")) { //$NON-NLS-1$ profession = ranks.getAlternateProfession(rank .getName(profession)); } } if (rank.getRankLevels(profession) > 0) { submenu = new JMenu(rank.getName(profession)); for (int level = 0; level <= rank .getRankLevels(profession); level++) { cbMenuItem = new JCheckBoxMenuItem( rank.getName(profession) + Utilities.getRomanNumeralsFromArabicNumber(level, true)); cbMenuItem.setActionCommand(makeCommand(CMD_RANK, String.valueOf(rankOrder), String.valueOf(level))); if (person.getRankNumeric() == rankOrder && person.getRankLevel() == level) { cbMenuItem.setSelected(true); } cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); submenu.add(cbMenuItem); } if (submenu.getItemCount() > 20) { MenuScroller.setScrollerFor(submenu, 20); } menu.add(submenu); } else { cbMenuItem = new JCheckBoxMenuItem( rank.getName(profession)); cbMenuItem.setActionCommand(makeCommand(CMD_RANK, String.valueOf(rankOrder))); if (person.getRankNumeric() == rankOrder) { cbMenuItem.setSelected(true); } cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); menu.add(cbMenuItem); } } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); } menu = new JMenu(resourceMap.getString("changeRankSystem.text")); //$NON-NLS-1$ // First allow them to revert to the campaign system cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("useCampaignRankSystem.text")); //$NON-NLS-1$ cbMenuItem.setActionCommand(makeCommand(CMD_RANKSYSTEM, "-1")); //$NON-NLS-1$ cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); menu.add(cbMenuItem); for (int system = 0; system < Ranks.RS_NUM; system++) { if (system == Ranks.RS_CUSTOM) { continue; } cbMenuItem = new JCheckBoxMenuItem( Ranks.getRankSystemName(system)); cbMenuItem.setActionCommand(makeCommand(CMD_RANKSYSTEM, String.valueOf(system))); cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); if (system == person.getRanks().getRankSystem()) { cbMenuItem.setSelected(true); } menu.add(cbMenuItem); } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); if (StaticChecks.areAllWoB(selected)) { // MD Ranks menu = new JMenu(resourceMap.getString("changeMDRank.text")); //$NON-NLS-1$ for (int i = Rank.MD_RANK_NONE; i < Rank.MD_RANK_NUM; i++) { cbMenuItem = new JCheckBoxMenuItem( Rank.getManeiDominiRankName(i)); cbMenuItem.setActionCommand(makeCommand(CMD_MANEI_DOMINI_RANK, String.valueOf(i))); cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); if (i == person.getManeiDominiRank()) { cbMenuItem.setSelected(true); } menu.add(cbMenuItem); } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); // MD Classes menu = new JMenu(resourceMap.getString("changeMDClass.text")); //$NON-NLS-1$ for (int i = Person.MD_NONE; i < Person.MD_NUM; i++) { cbMenuItem = new JCheckBoxMenuItem( Person.getManeiDominiClassNames(i, Ranks.RS_WOB)); cbMenuItem.setActionCommand(makeCommand(CMD_MANEI_DOMINI_CLASS, String.valueOf(i))); cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); if (i == person.getManeiDominiClass()) { cbMenuItem.setSelected(true); } menu.add(cbMenuItem); } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); } if (StaticChecks.areAllWoBOrComstar(selected)) { menu = new JMenu(resourceMap.getString("changePrimaryDesignation.text")); //$NON-NLS-1$ for (int i = Person.DESIG_NONE; i < Person.DESIG_NUM; i++) { cbMenuItem = new JCheckBoxMenuItem( Person.parseDesignator(i)); cbMenuItem.setActionCommand(makeCommand(CMD_PRIMARY_DESIGNATOR, String.valueOf(i))); cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); if (i == person.getPrimaryDesignator()) { cbMenuItem.setSelected(true); } menu.add(cbMenuItem); } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); menu = new JMenu(resourceMap.getString("changeSecondaryDesignation.text")); //$NON-NLS-1$ for (int i = Person.DESIG_NONE; i < Person.DESIG_NUM; i++) { cbMenuItem = new JCheckBoxMenuItem( Person.parseDesignator(i)); cbMenuItem.setActionCommand(makeCommand(CMD_SECONDARY_DESIGNATOR, String.valueOf(i))); cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); if (i == person.getSecondaryDesignator()) { cbMenuItem.setSelected(true); } menu.add(cbMenuItem); } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); } menu = new JMenu(resourceMap.getString("changeStatus.text")); //$NON-NLS-1$ for (int s = 0; s < Person.S_NUM; s++) { cbMenuItem = new JCheckBoxMenuItem(Person.getStatusName(s)); if (person.getStatus() == s) { cbMenuItem.setSelected(true); } cbMenuItem.setActionCommand(makeCommand(CMD_CHANGE_STATUS, String.valueOf(s))); cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); menu.add(cbMenuItem); } popup.add(menu); if(oneSelected) { popup.add(newMenuItem(resourceMap.getString("imprison.text"), CMD_IMPRISON, person.isFree())); //$NON-NLS-1$ popup.add(newMenuItem(resourceMap.getString("free.text"), CMD_FREE, !person.isFree())); //$NON-NLS-1$ popup.add(newMenuItem(resourceMap.getString("recruit.text"), CMD_RECRUIT, //$NON-NLS-1$ person.isBondsman() || person.isWillingToDefect())); } menu = new JMenu(resourceMap.getString("changePrimaryRole.text")); //$NON-NLS-1$ for (int i = Person.T_MECHWARRIOR; i < Person.T_NUM; i++) { if (person.canPerformRole(i) && person.getSecondaryRole() != i) { cbMenuItem = new JCheckBoxMenuItem(Person.getRoleDesc( i, gui.getCampaign().getFaction().isClan())); cbMenuItem.setActionCommand(makeCommand(CMD_PRIMARY_ROLE, String.valueOf(i))); if (person.getPrimaryRole() == i) { cbMenuItem.setSelected(true); } cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); menu.add(cbMenuItem); } } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); menu = new JMenu(resourceMap.getString("changeSecondaryRole.text")); //$NON-NLS-1$ for (int i = 0; i < Person.T_NUM; i++) { if (i == Person.T_NONE || (person.canPerformRole(i) && person .getPrimaryRole() != i)) { // you cant be an astech if you are a tech, or a medic // if you are a doctor if (person.isTechPrimary() && i == Person.T_ASTECH) { continue; } if (person.getPrimaryRole() == Person.T_DOCTOR && i == Person.T_MEDIC) { continue; } cbMenuItem = new JCheckBoxMenuItem(Person.getRoleDesc( i, gui.getCampaign().getFaction().isClan())); cbMenuItem.setActionCommand(makeCommand(CMD_SECONDARY_ROLE, String.valueOf(i))); if (person.getSecondaryRole() == i) { cbMenuItem.setSelected(true); } cbMenuItem.addActionListener(this); cbMenuItem.setEnabled(true); menu.add(cbMenuItem); } } if (menu.getItemCount() > 20) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); // Bloodnames if (StaticChecks.areAllClanEligible(selected)) { menuItem = new JMenuItem(resourceMap.getString("giveRandomBloodname.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_BLOODNAME); menuItem.addActionListener(this); menuItem.setEnabled(StaticChecks.areAllActive(selected)); popup.add(menuItem); } // change salary if (gui.getCampaign().getCampaignOptions().payForSalaries()) { menuItem = new JMenuItem(resourceMap.getString("setSalary.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_SALARY); menuItem.addActionListener(this); menuItem.setEnabled(StaticChecks.areAllActive(selected)); popup.add(menuItem); } // switch pilot menu = new JMenu(resourceMap.getString("assignToUnit.text")); //$NON-NLS-1$ JMenu pilotMenu = new JMenu(resourceMap.getString("assignAsPilot.text")); //$NON-NLS-1$ JMenu crewMenu = new JMenu(resourceMap.getString("assignAsCrewmember.text")); //$NON-NLS-1$ JMenu driverMenu = new JMenu(resourceMap.getString("assignAsDriver.text")); //$NON-NLS-1$ JMenu gunnerMenu = new JMenu(resourceMap.getString("assignAsGunner.text")); //$NON-NLS-1$ JMenu soldierMenu = new JMenu(resourceMap.getString("assignAsSoldier.text")); //$NON-NLS-1$ JMenu techMenu = new JMenu(resourceMap.getString("assignAsTech.text")); //$NON-NLS-1$ JMenu navMenu = new JMenu(resourceMap.getString("asignAsNavigator.text")); //$NON-NLS-1$ /* * if(!person.isAssigned()) { cbMenuItem.setSelected(true); } */ if (oneSelected && person.isActive() && !(person.isPrisoner() || person.isBondsman())) { for (Unit unit : gui.getCampaign().getUnits()) { if (!unit.isAvailable()) { continue; } if (unit.usesSoloPilot()) { if (unit.canTakeMoreDrivers() && person.canDrive(unit.getEntity()) && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_PILOT, unit.getId().toString())); cbMenuItem.addActionListener(this); pilotMenu.add(cbMenuItem); } } else if (unit.usesSoldiers()) { if (unit.canTakeMoreGunners() && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_SOLDIER, unit.getId().toString())); cbMenuItem.addActionListener(this); soldierMenu.add(cbMenuItem); } } else { if (unit.canTakeMoreDrivers() && person.canDrive(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_DRIVER, unit.getId().toString())); cbMenuItem.addActionListener(this); if (unit.getEntity() instanceof Aero) { pilotMenu.add(cbMenuItem); } else { driverMenu.add(cbMenuItem); } } if (unit.canTakeMoreGunners() && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_GUNNER, unit.getId().toString())); cbMenuItem.addActionListener(this); gunnerMenu.add(cbMenuItem); } if (unit.canTakeMoreVesselCrew() && person.hasSkill(SkillType.S_TECH_VESSEL)) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_CREW, unit.getId().toString())); cbMenuItem.addActionListener(this); crewMenu.add(cbMenuItem); } if (unit.canTakeNavigator() && person.hasSkill(SkillType.S_NAV)) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_NAVIGATOR, unit.getId().toString())); cbMenuItem.addActionListener(this); navMenu.add(cbMenuItem); } } if (unit.canTakeTech() && person.canTech(unit.getEntity()) && (person.getMaintenanceTimeUsing() + unit.getMaintenanceTime() <= 480)) { cbMenuItem = new JCheckBoxMenuItem(String.format(resourceMap.getString("maintenanceTimeDesc.format"), //$NON-NLS-1$ unit.getName(), unit.getMaintenanceTime())); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_TECH, unit.getId().toString())); cbMenuItem.addActionListener(this); techMenu.add(cbMenuItem); } } if (pilotMenu.getItemCount() > 0) { menu.add(pilotMenu); if (pilotMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(pilotMenu, 20); } } if (driverMenu.getItemCount() > 0) { menu.add(driverMenu); if (driverMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(driverMenu, 20); } } if (crewMenu.getItemCount() > 0) { menu.add(crewMenu); if (crewMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(crewMenu, 20); } } if (navMenu.getItemCount() > 0) { menu.add(navMenu); if (navMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(navMenu, 20); } } if (gunnerMenu.getItemCount() > 0) { menu.add(gunnerMenu); if (gunnerMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(gunnerMenu, 20); } } if (soldierMenu.getItemCount() > 0) { menu.add(soldierMenu); if (soldierMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(soldierMenu, 20); } } if (techMenu.getItemCount() > 0) { menu.add(techMenu); if (techMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(techMenu, 20); } } menu.setEnabled(!person.isDeployed()); popup.add(menu); } else if (StaticChecks.areAllActive(selected) && StaticChecks.areAllEligible(selected)) { for (Unit unit : gui.getCampaign().getUnits()) { if (!unit.isAvailable()) { continue; } if (StaticChecks.areAllInfantry(selected)) { if (!(unit.getEntity() instanceof Infantry) || unit.getEntity() instanceof BattleArmor) { continue; } if (unit.canTakeMoreGunners() && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_SOLDIER, unit.getId().toString())); cbMenuItem.addActionListener(this); soldierMenu.add(cbMenuItem); } } else if (StaticChecks.areAllBattleArmor(selected)) { if (!(unit.getEntity() instanceof BattleArmor)) { continue; } if (unit.canTakeMoreGunners() && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_SOLDIER, unit.getId().toString())); cbMenuItem.addActionListener(this); soldierMenu.add(cbMenuItem); } } else if (StaticChecks.areAllVeeGunners(selected)) { if (!(unit.getEntity() instanceof Tank)) { continue; } if (unit.canTakeMoreGunners() && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_GUNNER, unit.getId().toString())); cbMenuItem.addActionListener(this); gunnerMenu.add(cbMenuItem); } } else if (StaticChecks.areAllVesselGunners(selected)) { if (!(unit.getEntity() instanceof Aero)) { continue; } if (unit.canTakeMoreGunners() && person.canGun(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_GUNNER, unit.getId().toString())); cbMenuItem.addActionListener(this); gunnerMenu.add(cbMenuItem); } } else if (StaticChecks.areAllVesselCrew(selected)) { if (!(unit.getEntity() instanceof Aero)) { continue; } if (unit.canTakeMoreVesselCrew() && person.hasSkill(SkillType.S_TECH_VESSEL)) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_CREW, unit.getId().toString())); cbMenuItem.addActionListener(this); crewMenu.add(cbMenuItem); } } else if (StaticChecks.areAllVesselPilots(selected)) { if (!(unit.getEntity() instanceof Aero)) { continue; } if (unit.canTakeMoreDrivers() && person.canDrive(unit.getEntity())) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_VESSEL_PILOT, unit.getId().toString())); cbMenuItem.addActionListener(this); pilotMenu.add(cbMenuItem); } } else if (StaticChecks.areAllVesselNavigators(selected)) { if (!(unit.getEntity() instanceof Aero)) { continue; } if (unit.canTakeNavigator() && person.hasSkill(SkillType.S_NAV)) { cbMenuItem = new JCheckBoxMenuItem( unit.getName()); // TODO: check the box cbMenuItem.setActionCommand(makeCommand(CMD_ADD_NAVIGATOR, unit.getId().toString())); cbMenuItem.addActionListener(this); navMenu.add(cbMenuItem); } } } if (soldierMenu.getItemCount() > 0) { menu.add(soldierMenu); if (soldierMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(soldierMenu, 20); } } if (pilotMenu.getItemCount() > 0) { menu.add(pilotMenu); if (pilotMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(pilotMenu, 20); } } if (driverMenu.getItemCount() > 0) { menu.add(driverMenu); if (driverMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(driverMenu, 20); } } if (crewMenu.getItemCount() > 0) { menu.add(crewMenu); if (crewMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(crewMenu, 20); } } if (navMenu.getItemCount() > 0) { menu.add(navMenu); if (navMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(navMenu, 20); } } if (gunnerMenu.getItemCount() > 0) { menu.add(gunnerMenu); if (gunnerMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(gunnerMenu, 20); } } if (soldierMenu.getItemCount() > 0) { menu.add(soldierMenu); if (soldierMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(soldierMenu, 20); } } menu.setEnabled(!person.isDeployed()); popup.add(menu); } cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("none.text")); //$NON-NLS-1$ cbMenuItem.setActionCommand(makeCommand(CMD_REMOVE_UNIT, "-1")); //$NON-NLS-1$ cbMenuItem.addActionListener(this); menu.add(cbMenuItem); if (oneSelected) { if ((person.getAge(gui.getCampaign().getCalendar()) > 13) && (person.isFemale()) && !person.isPregnant()) { menuItem = new JMenuItem(resourceMap.getString("addPregnancy.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_ADD_PREGNANCY); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); popup.add(menuItem); } if (person.isPregnant()) { menuItem = new JMenuItem(resourceMap.getString("removePregnancy.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_REMOVE_PREGNANCY); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); popup.add(menuItem); } } if (oneSelected && person.isActive()) { if ((person.getAge(gui.getCampaign().getCalendar()) > 13) && (person.getSpouseID() == null)) { menu = new JMenu(resourceMap.getString("changeSpouse.text")); //$NON-NLS-1$ JMenuItem surnameMenu; JMenu spouseMenu; String type; for (Person ps : gui.getCampaign().getPersonnel()) { if (person.safeSpouse(ps) && !ps.isDeadOrMIA()) { String pStatus; if (ps.isBondsman()) { pStatus = String.format(resourceMap.getString("marriageBondsmanDesc.format"), //$NON-NLS-1$ ps.getFullName(), ps.getAge(gui.getCampaign().getCalendar()), ps.getRoleDesc()); } else if (ps.isPrisoner()) { pStatus = String.format(resourceMap.getString("marriagePrisonerDesc.format"), //$NON-NLS-1$ ps.getFullName(), ps.getAge(gui.getCampaign().getCalendar()), ps.getRoleDesc()); } else { pStatus = String.format(resourceMap.getString("marriagePartnerDesc.format"), //$NON-NLS-1$ ps.getFullName(), ps.getAge(gui.getCampaign().getCalendar()), ps.getRoleDesc()); } spouseMenu = new JMenu(pStatus); type = resourceMap.getString("marriageNoNameChange.text"); //$NON-NLS-1$ surnameMenu = new JMenuItem(type); surnameMenu.setActionCommand( makeCommand(CMD_ADD_SPOUSE, ps.getId().toString(), OPT_SURNAME_NO_CHANGE)); surnameMenu.addActionListener(this); spouseMenu.add(surnameMenu); if (!ps.isClanner() && !person.isClanner()) { type = resourceMap.getString("marriageRenameSpouse.text"); //$NON-NLS-1$ surnameMenu = new JMenuItem(type); surnameMenu.setActionCommand( makeCommand(CMD_ADD_SPOUSE, ps.getId().toString(), OPT_SURNAME_YOURS)); surnameMenu.addActionListener(this); spouseMenu.add(surnameMenu); type = resourceMap.getString("marriageRenameYourself.text"); //$NON-NLS-1$ surnameMenu = new JMenuItem(type); surnameMenu.setActionCommand( makeCommand(CMD_ADD_SPOUSE, ps.getId().toString(), OPT_SURNAME_SPOUSE)); surnameMenu.addActionListener(this); spouseMenu.add(surnameMenu); type = resourceMap.getString("marriageHyphenateYourself.text"); //$NON-NLS-1$ surnameMenu = new JMenuItem(type); surnameMenu.setActionCommand( makeCommand(CMD_ADD_SPOUSE, ps.getId().toString(), OPT_SURNAME_HYP_YOURS)); surnameMenu.addActionListener(this); spouseMenu.add(surnameMenu); type = resourceMap.getString("marriageHyphenateSpouse.text"); //$NON-NLS-1$ surnameMenu = new JMenuItem(type); surnameMenu.setActionCommand( makeCommand(CMD_ADD_SPOUSE, ps.getId().toString(), OPT_SURNAME_HYP_SPOUSE)); surnameMenu.addActionListener(this); spouseMenu.add(surnameMenu); } menu.add(spouseMenu); } } if (menu.getItemCount() > 30) { MenuScroller.setScrollerFor(menu, 20); } popup.add(menu); } if (person.getSpouseID() != null) { menuItem = new JMenuItem(resourceMap.getString("removeSpouse.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_REMOVE_SPOUSE); menuItem.addActionListener(this); popup.add(menuItem); } menu = new JMenu(resourceMap.getString("spendXP.text")); //$NON-NLS-1$ JMenu currentMenu = new JMenu(resourceMap.getString("spendOnCurrentSkills.text")); //$NON-NLS-1$ JMenu newMenu = new JMenu(resourceMap.getString("spendOnNewSkills.text")); //$NON-NLS-1$ for (int i = 0; i < SkillType.getSkillList().length; i++) { String type = SkillType.getSkillList()[i]; int cost = person.hasSkill(type) ? person.getSkill(type).getCostToImprove() : SkillType.getType(type).getCost(0); if( cost >= 0 ) { String desc = String.format(resourceMap.getString("skillDesc.format"), type, cost); //$NON-NLS-1$ menuItem = new JMenuItem(desc); menuItem.setActionCommand(makeCommand(CMD_IMPROVE, type, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(person.getXp() >= cost); if(person.hasSkill(type)) { currentMenu.add(menuItem); } else { newMenu.add(menuItem); } } } menu.add(currentMenu); menu.add(newMenu); if (gui.getCampaign().getCampaignOptions().useAbilities()) { JMenu abMenu = new JMenu(resourceMap.getString("spendOnSpecialAbilities.text")); //$NON-NLS-1$ int cost = -1; for (SpecialAbility spa : SpecialAbility.getAllSpecialAbilities().values()) { if (null == spa) { continue; } if (!spa.isEligible(person)) { continue; } cost = spa.getCost(); String costDesc; if(cost < 0) { costDesc = resourceMap.getString("costNotPossible.text"); //$NON-NLS-1$ } else { costDesc = String.format(resourceMap.getString("costValue.format"), cost); //$NON-NLS-1$ } boolean available = (cost >= 0) && (person.getXp() >= cost); if (spa.getName().equals("weapon_specialist")) { //$NON-NLS-1$ Unit u = gui.getCampaign().getUnit(person.getUnitId()); if (null != u) { JMenu specialistMenu = new JMenu(resourceMap.getString("weaponSpecialist.text")); //$NON-NLS-1$ TreeSet<String> uniqueWeapons = new TreeSet<String>(); for (int j = 0; j < u.getEntity().getWeaponList().size(); j++) { Mounted m = u.getEntity().getWeaponList().get(j); uniqueWeapons.add(m.getName()); } for (String name : uniqueWeapons) { menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), name, costDesc)); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_WEAPON_SPECIALIST, name, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); } abMenu.add(specialistMenu); } } else if (spa.getName().equals("specialist")) { //$NON-NLS-1$ JMenu specialistMenu = new JMenu(resourceMap.getString("specialist.text")); //$NON-NLS-1$ menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), resourceMap.getString("laserSpecialist.text"), costDesc)); //$NON-NLS-1$ //$NON-NLS-2$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_SPECIALIST, Crew.SPECIAL_LASER, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), resourceMap.getString("missileSpecialist.text"), costDesc)); //$NON-NLS-1$ //$NON-NLS-2$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_SPECIALIST, Crew.SPECIAL_MISSILE, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), resourceMap.getString("ballisticSpecialist.text"), costDesc)); //$NON-NLS-1$ //$NON-NLS-2$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_SPECIALIST, Crew.SPECIAL_BALLISTIC, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); abMenu.add(specialistMenu); } else if (spa.getName().equals("range_master")) { //$NON-NLS-1$ JMenu specialistMenu = new JMenu(resourceMap.getString("rangemaster.text")); //$NON-NLS-1$ menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), resourceMap.getString("rangemaster_med.text"), costDesc)); //$NON-NLS-1$ //$NON-NLS-2$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_RANGEMASTER, Crew.RANGEMASTER_MEDIUM, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), resourceMap.getString("rangemaster_lng.text"), costDesc)); //$NON-NLS-1$ //$NON-NLS-2$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_RANGEMASTER, Crew.RANGEMASTER_LONG, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), resourceMap.getString("rangemaster_xtm.text"), costDesc)); //$NON-NLS-1$ //$NON-NLS-2$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_RANGEMASTER, Crew.RANGEMASTER_EXTREME, String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); specialistMenu.add(menuItem); abMenu.add(specialistMenu); } else { menuItem = new JMenuItem(String.format(resourceMap.getString("abilityDesc.format"), spa.getDisplayName(), costDesc)); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_ACQUIRE_ABILITY, spa.getName(), String.valueOf(cost))); menuItem.addActionListener(this); menuItem.setEnabled(available); abMenu.add(menuItem); } } if (abMenu.getItemCount() > 20) { MenuScroller.setScrollerFor(abMenu, 20); } menu.add(abMenu); } popup.add(menu); } if (oneSelected && person.isActive()) { if (gui.getCampaign().getCampaignOptions().useEdge()) { menu = new JMenu(resourceMap.getString("setEdgeTriggers.text")); //$NON-NLS-1$ cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("edgeTriggerHeadHits.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.getOptions() .booleanOption(OPT_EDGE_HEADHIT)); cbMenuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_HEADHIT)); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem( resourceMap.getString("edgeTriggerTAC.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.getOptions() .booleanOption(OPT_EDGE_TAC)); cbMenuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_TAC)); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("edgeTriggerKO.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.getOptions() .booleanOption(OPT_EDGE_KO)); cbMenuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_KO)); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("edgeTriggerExplosion.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.getOptions() .booleanOption(OPT_EDGE_EXPLOSION)); cbMenuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_EXPLOSION)); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("edgeTriggerMASCFailure.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.getOptions() .booleanOption(OPT_EDGE_MASC_FAILURE)); cbMenuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_MASC_FAILURE)); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); popup.add(menu); } menu = new JMenu(resourceMap.getString("specialFlags.text")); //$NON-NLS-1$ cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("dependent.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.isDependent()); cbMenuItem.setActionCommand(CMD_DEPENDENT); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); cbMenuItem = new JCheckBoxMenuItem(resourceMap.getString("commander.text")); //$NON-NLS-1$ cbMenuItem.setSelected(person.isCommander()); cbMenuItem.setActionCommand(CMD_COMMANDER); cbMenuItem.addActionListener(this); menu.add(cbMenuItem); popup.add(menu); } else if (StaticChecks.areAllActive(selected)) { if (gui.getCampaign().getCampaignOptions().useEdge()) { menu = new JMenu(resourceMap.getString("setEdgeTriggers.text")); //$NON-NLS-1$ submenu = new JMenu(resourceMap.getString("on.text")); //$NON-NLS-1$ menuItem = new JMenuItem(resourceMap.getString("edgeTriggerHeadHits.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_HEADHIT, TRUE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerTAC.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_TAC, TRUE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerKO.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_KO, TRUE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerExplosion.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_EXPLOSION, TRUE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerMASCFailure.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_MASC_FAILURE, TRUE)); menuItem.addActionListener(this); submenu.add(menuItem); menu.add(submenu); submenu = new JMenu(resourceMap.getString("off.text")); //$NON-NLS-1$ menuItem = new JMenuItem(resourceMap.getString("edgeTriggerHeadHits.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_HEADHIT, FALSE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerTAC.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_TAC, FALSE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerKO.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_KO, FALSE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerExplosion.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_EXPLOSION, FALSE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("edgeTriggerMASCFailure.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_EDGE_TRIGGER, OPT_EDGE_MASC_FAILURE, FALSE)); menuItem.addActionListener(this); submenu.add(menuItem); menu.add(submenu); popup.add(menu); } menu = new JMenu(resourceMap.getString("specialFlags.text")); //$NON-NLS-1$ submenu = new JMenu(resourceMap.getString("dependent.text")); //$NON-NLS-1$ menuItem = new JMenuItem(resourceMap.getString("yes.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_DEPENDENT, TRUE)); menuItem.addActionListener(this); submenu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("no.text")); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_DEPENDENT, FALSE)); menuItem.addActionListener(this); submenu.add(menuItem); menu.add(submenu); popup.add(menu); } if (oneSelected) { // change portrait menuItem = new JMenuItem(resourceMap.getString("changePortrait.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_PORTRAIT); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); // change Biography menuItem = new JMenuItem(resourceMap.getString("changeBiography.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_BIOGRAPHY); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("changeCallsign.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_CALLSIGN); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("editPersonnelLog.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_PERSONNEL_LOG); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); } menuItem = new JMenuItem(resourceMap.getString("addSingleLogEntry.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_LOG_ENTRY); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); if (oneSelected || StaticChecks.allHaveSameUnit(selected)) { menuItem = new JMenuItem(resourceMap.getString("assignKill.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_KILL); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); } if (oneSelected) { menuItem = new JMenuItem(resourceMap.getString("editKillLog.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_KILL_LOG); menuItem.addActionListener(this); menuItem.setEnabled(true); popup.add(menuItem); } menuItem = new JMenuItem(resourceMap.getString("exportPersonnel.text")); //$NON-NLS-1$ menuItem.addActionListener(ev -> gui.miExportPersonActionPerformed(ev)); menuItem.setEnabled(true); popup.add(menuItem); if (gui.getCampaign().getCampaignOptions().getUseAtB() && StaticChecks.areAllActive(selected)) { menuItem = new JMenuItem(resourceMap.getString("sack.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_SACK); menuItem.addActionListener(this); popup.add(menuItem); } menu = new JMenu(resourceMap.getString("gmMode.text")); //$NON-NLS-1$ menuItem = new JMenu(resourceMap.getString("changePrisonerStatus.text")); //$NON-NLS-1$ menuItem.add(newCheckboxMenu( Person.getPrisonerStatusName(Person.PRISONER_NOT), makeCommand(CMD_CHANGE_PRISONER_STATUS, OPT_PRISONER_FREE), person.getPrisonerStatus() == Person.PRISONER_NOT)); menuItem.add(newCheckboxMenu( Person.getPrisonerStatusName(Person.PRISONER_YES), makeCommand(CMD_CHANGE_PRISONER_STATUS, OPT_PRISONER_IMPRISONED), (person.getPrisonerStatus() == Person.PRISONER_YES) && !person.isWillingToDefect())); menuItem.add(newCheckboxMenu( resourceMap.getString("prisonerWillingToDefect.text"), //$NON-NLS-1$ makeCommand(CMD_CHANGE_PRISONER_STATUS, OPT_PRISONER_IMPRISONED_DEFECTING), (person.getPrisonerStatus() == Person.PRISONER_YES) && person.isWillingToDefect())); menuItem.add(newCheckboxMenu( Person.getPrisonerStatusName(Person.PRISONER_BONDSMAN), makeCommand(CMD_CHANGE_PRISONER_STATUS, OPT_PRISONER_BONDSMAN), person.getPrisonerStatus() == Person.PRISONER_BONDSMAN)); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("removePerson.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_REMOVE); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); if (!gui.getCampaign().getCampaignOptions().useAdvancedMedical()) { menuItem = new JMenuItem(resourceMap.getString("healPerson.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_HEAL); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); } menuItem = new JMenuItem(resourceMap.getString("addXP.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_ADD_XP); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); menuItem = new JMenuItem(resourceMap.getString("setXP.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_SET_XP); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); if (gui.getCampaign().getCampaignOptions().useEdge()) { menuItem = new JMenuItem(resourceMap.getString("setEdge.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_SET_EDGE); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); } if (oneSelected) { menuItem = new JMenuItem(resourceMap.getString("edit.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); } if (gui.getCampaign().getCampaignOptions().useAdvancedMedical()) { menuItem = new JMenuItem(resourceMap.getString("removeAllInjuries.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_CLEAR_INJURIES); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); if (oneSelected) { for (Injury i : person.getInjuries()) { menuItem = new JMenuItem(String.format(resourceMap.getString("removeInjury.format"), i.getName())); //$NON-NLS-1$ menuItem.setActionCommand(makeCommand(CMD_REMOVE_INJURY, i.getUUID().toString())); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); } menuItem = new JMenuItem(resourceMap.getString("editInjuries.text")); //$NON-NLS-1$ menuItem.setActionCommand(CMD_EDIT_INJURIES); menuItem.addActionListener(this); menuItem.setEnabled(gui.getCampaign().isGM()); menu.add(menuItem); } } popup.addSeparator(); popup.add(menu); popup.show(e.getComponent(), e.getX(), e.getY()); } } @SuppressWarnings("unused") private JMenuItem newMenuItem(String text, String command) { return newMenuItem(text, command, true); } private JMenuItem newMenuItem(String text, String command, boolean enabled) { JMenuItem result = new JMenuItem(text); result.setActionCommand(command); result.addActionListener(this); result.setEnabled(enabled); return result; } private JCheckBoxMenuItem newCheckboxMenu(String text, String command, boolean selected) { return newCheckboxMenu(text, command, selected, true); } private JCheckBoxMenuItem newCheckboxMenu(String text, String command, boolean selected, boolean enabled) { JCheckBoxMenuItem result = new JCheckBoxMenuItem(text); result.setSelected(selected); result.setActionCommand(command); result.addActionListener(this); result.setEnabled(true); return result; } }