/*
* NewAtBContractDialog.java
*
* Copyright (c) 2014 Carl Spain. All rights reserved.
*
* This file is part of MekHQ.
*
* MekHQ 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 3 of the License, or
* (at your option) any later version.
*
* MekHQ 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.
*
* You should have received a copy of the GNU General Public License
* along with MekHQ. If not, see <http://www.gnu.org/licenses/>.
*/
package mekhq.gui.dialog;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashSet;
import java.util.ResourceBundle;
import java.util.Set;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.SpinnerNumberModel;
import mekhq.Utilities;
import mekhq.campaign.Campaign;
import mekhq.campaign.finances.Transaction;
import mekhq.campaign.mission.AtBContract;
import mekhq.campaign.rating.FieldManualMercRevDragoonsRating;
import mekhq.campaign.rating.IUnitRating;
import mekhq.campaign.universe.Planet;
import mekhq.campaign.universe.RandomFactionGenerator;
import mekhq.gui.FactionComboBox;
import mekhq.gui.model.SortedComboBoxModel;
import mekhq.gui.utilities.JSuggestField;
/**
* @author Neoancient
*
*/
public class NewAtBContractDialog extends NewContractDialog {
/**
*
*/
private static final long serialVersionUID = 7965491540448120578L;
protected FactionComboBox cbEmployer;
protected FactionComboBox cbEnemy;
protected JCheckBox chkShowAllFactions;
protected JComboBox<String> cbPlanets;
protected JCheckBox chkShowAllPlanets;
protected JComboBox<String> cbMissionType;
protected JComboBox<String> cbAllySkill;
protected JComboBox<String> cbAllyQuality;
protected JComboBox<String> cbEnemySkill;
protected JComboBox<String> cbEnemyQuality;
protected JSpinner spnShares;
protected JLabel lblRequiredLances;
Set<String> currentFactions;
Set<String> employerSet;
int dragoonRating;
public NewAtBContractDialog(java.awt.Frame parent, boolean modal, Campaign c) {
super(parent, modal, c);
}
@Override
protected void initComponents() {
RandomFactionGenerator.getInstance().updateTables(campaign.getDate(),
campaign.getCurrentPlanet(), campaign.getCampaignOptions());
currentFactions = RandomFactionGenerator.getInstance().getCurrentFactions();
employerSet = RandomFactionGenerator.getInstance().getEmployerSet();
contract = new AtBContract("New Contract");
contract.calculateContract(campaign);
((AtBContract)contract).initContractDetails(campaign);
IUnitRating rating = new FieldManualMercRevDragoonsRating(campaign);
rating.reInitialize();
dragoonRating = rating.getUnitRatingAsInteger();
super.initComponents();
updateEnemies();
updatePlanets();
if (getCurrentEmployerCode() != null) {
((AtBContract)contract).setEmployerCode(getCurrentEmployerCode(), campaign.getEra());
}
if (getCurrentEnemyCode() != null) {
((AtBContract)contract).setEnemyCode(getCurrentEnemyCode());
}
((AtBContract)contract).setPlanetName((String)cbPlanets.getSelectedItem());
spnMultiplier.setModel(new SpinnerNumberModel(contract.getMultiplier(), 0.1, 10.0, 0.1));
updatePaymentMultiplier();
contract.calculateContract(campaign);
this.doUpdateContract(cbPlanets);
addAllListeners();
}
@Override
protected void initDescPanel(ResourceBundle resourceMap, JPanel descPanel) {
AtBContract contract = (AtBContract)(this.contract);
java.awt.GridBagConstraints gbc;
txtName = new javax.swing.JTextField();
JLabel lblName = new JLabel();
cbEmployer = new FactionComboBox();
cbEmployer.addFactionEntries(employerSet, campaign.getEra());
JLabel lblEmployer = new JLabel();
cbEnemy = new FactionComboBox();
JLabel lblEnemy = new JLabel();
chkShowAllFactions = new JCheckBox();
cbPlanets = new JComboBox<String>();
cbPlanets.setModel(new SortedComboBoxModel<String>());
chkShowAllPlanets = new JCheckBox();
cbMissionType = new JComboBox<String>(AtBContract.missionTypeNames);
JLabel lblType = new JLabel();
btnOK = new javax.swing.JButton();
btnClose = new javax.swing.JButton();
JScrollPane scrDesc = new JScrollPane();
txtDesc = new javax.swing.JTextArea();
JLabel lblPlanetName = new JLabel();
String[] skillNames = {"Green", "Regular", "Veteran", "Elite"};
String[] ratingNames = {"F", "D", "C", "B", "A"};
cbAllySkill = new JComboBox<String>(skillNames);
cbAllyQuality = new JComboBox<String>(ratingNames);
JLabel lblAllyRating = new JLabel();
cbEnemySkill = new JComboBox<String>(skillNames);
cbEnemyQuality = new JComboBox<String>(ratingNames);;
JLabel lblEnemyRating = new JLabel();
JLabel lblShares = new JLabel();
spnShares = new JSpinner(new SpinnerNumberModel(20, 20, 50, 10));
lblRequiredLances = new JLabel();
int y = 0;
lblName.setText(resourceMap.getString("lblName.text")); // NOI18N
lblName.setName("lblName"); // NOI18N
gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblName, gbc);
txtName.setText(contract.getName());
txtName.setName("txtName"); // NOI18N
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(txtName, gbc);
if (campaign.getFactionCode().equals("MERC")) {
lblEmployer.setText(resourceMap.getString("lblEmployer.text")); // NOI18N
lblEmployer.setName("lblEmployer"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblEmployer, gbc);
// cbEmployer.setSelectedIndex(0);
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbEmployer, gbc);
}
lblEnemy.setText(resourceMap.getString("lblEnemy.text")); // NOI18N
lblEnemy.setName("lblEnemy"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblEnemy, gbc);
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbEnemy, gbc);
chkShowAllFactions.setText(resourceMap.getString("chkShowAllFactions.text"));
chkShowAllFactions.setName("chkShowAllFactions");
chkShowAllFactions.setSelected(false);
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(chkShowAllFactions, gbc);
chkShowAllFactions.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showAllFactions(chkShowAllFactions.isSelected());
}
});
lblPlanetName.setText(resourceMap.getString("lblPlanetName.text")); // NOI18N
lblPlanetName.setName("lblPlanetName"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblPlanetName, gbc);
suggestPlanet = new JSuggestField(this, campaign.getPlanetNames());
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(suggestPlanet, gbc);
descPanel.add(cbPlanets, gbc);
suggestPlanet.setVisible(false);
chkShowAllPlanets.setText(resourceMap.getString("chkShowAllPlanets.text"));
chkShowAllPlanets.setName("chkShowAllPlanets");
chkShowAllPlanets.setSelected(false);
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(chkShowAllPlanets, gbc);
chkShowAllPlanets.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
showAllPlanets(chkShowAllPlanets.isSelected());
}
});
lblType.setText(resourceMap.getString("lblType.text")); // NOI18N
lblType.setName("lblType"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblType, gbc);
cbMissionType.setSelectedItem(contract.getMissionTypeName());
cbMissionType.setName("cbMissionType"); // NOI18N
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 2;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbMissionType, gbc);
lblAllyRating.setText(resourceMap.getString("lblAllyRating.text")); // NOI18N
lblEnemy.setName("lblAllyRating"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblAllyRating, gbc);
cbAllySkill.setSelectedIndex(contract.getAllySkill());
gbc.gridx = 1;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.weightx = 1.0;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbAllySkill, gbc);
cbAllyQuality.setSelectedIndex(contract.getAllyQuality());
gbc.gridx = 2;
gbc.gridy = y++;
gbc.gridwidth = 1;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbAllyQuality, gbc);
lblEnemyRating.setText(resourceMap.getString("lblEnemyRating.text")); // NOI18N
lblEnemyRating.setName("lblAllyRating"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblEnemyRating, gbc);
cbEnemySkill.setSelectedIndex(contract.getEnemySkill());
gbc.gridx = 1;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.weightx = 1.0;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbEnemySkill, gbc);
cbEnemyQuality.setSelectedIndex(contract.getEnemyQuality());
gbc.gridx = 2;
gbc.gridy = y++;
gbc.gridwidth = 1;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(cbEnemyQuality, gbc);
lblShares.setText(resourceMap.getString("lblShares.text")); // NOI18N
lblShares.setName("lblShares"); // NOI18N
gbc.gridx = 0;
gbc.gridy = y;
gbc.gridwidth = 1;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(lblShares, gbc);
spnShares.setName("spnShares"); // NOI18N
gbc.gridx = 1;
gbc.gridy = y++;
gbc.gridwidth = 1;
gbc.fill = java.awt.GridBagConstraints.HORIZONTAL;
gbc.anchor = java.awt.GridBagConstraints.WEST;
gbc.insets = new java.awt.Insets(5, 5, 5, 5);
descPanel.add(spnShares, gbc);
txtDesc.setText(contract.getDescription());
txtDesc.setName("txtDesc");
txtDesc.setEditable(true);
txtDesc.setLineWrap(true);
txtDesc.setWrapStyleWord(true);
txtDesc.setBorder(BorderFactory.createCompoundBorder(
BorderFactory.createTitledBorder(resourceMap.getString("txtDesc.title")),
BorderFactory.createEmptyBorder(5,5,5,5)));
scrDesc.setViewportView(txtDesc);
scrDesc.setPreferredSize(new Dimension(400, 200));
scrDesc.setMinimumSize(new Dimension(400, 200));
gbc.gridx = 0;
gbc.gridy = y++;
gbc.gridwidth = 3;
gbc.weightx = 1.0;
gbc.weighty = 1.0;
gbc.fill = java.awt.GridBagConstraints.BOTH;
gbc.anchor = java.awt.GridBagConstraints.NORTHWEST;
gbc.insets = new java.awt.Insets(5, 5, 0, 0);
descPanel.add(scrDesc, gbc);
}
private void addAllListeners() {
cbPlanets.addActionListener(contractUpdateActionListener);
cbMissionType.addActionListener(contractUpdateActionListener);
cbEmployer.addActionListener(contractUpdateActionListener);
cbEnemy.addActionListener(contractUpdateActionListener);
cbAllySkill.addActionListener(contractUpdateActionListener);
cbAllyQuality.addActionListener(contractUpdateActionListener);
cbEnemySkill.addActionListener(contractUpdateActionListener);
cbEnemyQuality.addActionListener(contractUpdateActionListener);
suggestPlanet.addFocusListener(contractUpdateFocusListener);
suggestPlanet.addActionListener(contractUpdateActionListener);
}
private void removeAllListeners() {
cbPlanets.removeActionListener(contractUpdateActionListener);
cbMissionType.removeActionListener(contractUpdateActionListener);
cbEmployer.removeActionListener(contractUpdateActionListener);
cbEnemy.removeActionListener(contractUpdateActionListener);
cbAllySkill.removeActionListener(contractUpdateActionListener);
cbAllyQuality.removeActionListener(contractUpdateActionListener);
cbEnemySkill.removeActionListener(contractUpdateActionListener);
cbEnemyQuality.removeActionListener(contractUpdateActionListener);
suggestPlanet.removeFocusListener(contractUpdateFocusListener);
suggestPlanet.removeActionListener(contractUpdateActionListener);
}
private String getCurrentEmployerCode() {
if (campaign.getFactionCode().equals("MERC")) {
return cbEmployer.getSelectedItemKey();
} else {
return campaign.getFactionCode();
}
}
private String getCurrentEnemyCode() {
return cbEnemy.getSelectedItemKey();
}
private void updateEnemies() {
if (chkShowAllFactions.isSelected()) {
return;
}
cbEnemy.removeAllItems();
if (getCurrentEmployerCode() == null) {
return;
}
cbEnemy.addFactionEntries(RandomFactionGenerator.getInstance().
getEnemyList(getCurrentEmployerCode()), campaign.getEra());
cbEnemy.setSelectedItemByKey(((AtBContract)contract).getEnemyCode());
}
private void showAllFactions(boolean show) {
removeAllListeners();
if (show) {
cbEmployer.removeAllItems();
cbEnemy.removeAllItems();
cbEmployer.addFactionEntries(currentFactions, campaign.getEra());
cbEnemy.addFactionEntries(currentFactions, campaign.getEra());
cbEmployer.setSelectedItemByKey(((AtBContract)contract).getEmployerCode());
cbEnemy.setSelectedItemByKey(((AtBContract)contract).getEnemyCode());
} else {
cbEmployer.removeAllItems();
cbEmployer.addFactionEntries(employerSet, campaign.getEra());
cbEmployer.setSelectedItemByKey(((AtBContract)contract).getEmployerCode());
updateEnemies();
}
addAllListeners();
}
private void showAllPlanets(boolean show) {
removeAllListeners();
updatePlanets();
suggestPlanet.setVisible(show);
cbPlanets.setVisible(!show);
addAllListeners();
}
private void updatePlanets() {
if (chkShowAllPlanets.isSelected() ||
getCurrentEmployerCode() == null ||
getCurrentEnemyCode()== null) {
return;
}
AtBContract contract = (AtBContract)this.contract;
HashSet<String> planets = new HashSet<String>();
if (contract.getMissionType() >= AtBContract.MT_PLANETARYASSAULT ||
getCurrentEnemyCode().equals("REB") ||
getCurrentEnemyCode().equals("PIR")) {
for (Planet p : RandomFactionGenerator.getInstance().
getMissionTargetList(getCurrentEmployerCode(), getCurrentEnemyCode(),
campaign.getDate())) {
planets.add(p.getName(Utilities.getDateTimeDay(campaign.getCalendar())));
}
}
if ((contract.getMissionType() < AtBContract.MT_PLANETARYASSAULT ||
contract.getMissionType() == AtBContract.MT_RELIEFDUTY) &&
!contract.equals("REB")) {
for (Planet p : RandomFactionGenerator.getInstance().
getMissionTargetList(getCurrentEnemyCode(), getCurrentEmployerCode(),
campaign.getDate())) {
planets.add(p.getName(Utilities.getDateTimeDay(campaign.getCalendar())));
}
}
cbPlanets.removeAllItems();
for (String planet : planets) {
cbPlanets.addItem(planet);
}
}
protected void updatePaymentMultiplier() {
if (((AtBContract)contract).getEmployerCode() != null &&
((AtBContract)contract).getEnemyCode() != null) {
((AtBContract)contract).calculatePaymentMultiplier(campaign);
spnMultiplier.setValue(contract.getMultiplier());
}
}
@Override
protected void btnOKActionPerformed(ActionEvent evt) {//GEN-FIRST:event_btnHireActionPerformed
if (!btnOK.equals(evt.getSource())) {
return;
}
AtBContract contract = (AtBContract)this.contract;
contract.setName(txtName.getText());
if (chkShowAllPlanets.isSelected()) {
//contract.setPlanetName(suggestPlanet.getText());
} else {
contract.setPlanetName((String)cbPlanets.getSelectedItem());
}
contract.setEmployerCode(getCurrentEmployerCode(), campaign.getEra());
contract.setMissionType(cbMissionType.getSelectedIndex());
contract.setDesc(txtDesc.getText());
contract.setCommandRights(choiceCommand.getSelectedIndex());
contract.setEnemyCode(getCurrentEnemyCode());
contract.setAllySkill(cbAllySkill.getSelectedIndex());
contract.setAllyQuality(cbAllyQuality.getSelectedIndex());
contract.setEnemySkill(cbEnemySkill.getSelectedIndex());
contract.setEnemyQuality(cbEnemyQuality.getSelectedIndex());
contract.setAllyBotName(contract.getEmployerName(campaign.getEra()));
contract.setEnemyBotName(contract.getEnemyName(campaign.getEra()));
contract.setSharesPct((Integer)spnShares.getValue());
contract.calculatePartsAvailabilityLevel(campaign);
campaign.getFinances().credit(contract.getTotalAdvanceMonies(), Transaction.C_CONTRACT, "Advance monies for " + contract.getName(), campaign.getCalendar().getTime());
campaign.addMission(contract);
this.setVisible(false);
}
protected void doUpdateContract(Object source) {
removeAllListeners();
AtBContract contract = (AtBContract)this.contract;
if (cbPlanets.equals(source) && null != cbPlanets.getSelectedItem()) {
contract.setPlanetName((String)cbPlanets.getSelectedItem());
//reset the start date as null so we recalculate travel time
contract.setStartDate(null);
} else if (source.equals(cbEmployer)) {
System.out.println("Setting employer code to " + getCurrentEmployerCode());
long time = System.currentTimeMillis();
contract.setEmployerCode(getCurrentEmployerCode(), campaign.getEra());
System.out.println("to set employer code: " + (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
updateEnemies();
System.out.println("to update enemies: " + (System.currentTimeMillis() - time));
time = System.currentTimeMillis();
updatePlanets();
System.out.println("to update planets: " + (System.currentTimeMillis() - time));
} else if (source.equals(cbEnemy)) {
contract.setEnemyCode(getCurrentEnemyCode());
updatePlanets();
} else if (source.equals(cbMissionType)) {
contract.setMissionType(cbMissionType.getSelectedIndex());
contract.calculateLength(campaign.getCampaignOptions().getVariableContractLength());
spnLength.setValue(contract.getLength());
updatePlanets();
} else if (source.equals(cbAllySkill)) {
contract.setAllySkill(cbAllySkill.getSelectedIndex());
} else if (source.equals(cbAllyQuality)) {
contract.setAllyQuality(cbAllyQuality.getSelectedIndex());
} else if (source.equals(cbEnemySkill)) {
contract.setEnemySkill(cbEnemySkill.getSelectedIndex());
} else if (source.equals(cbEnemyQuality)) {
contract.setEnemyQuality(cbEnemyQuality.getSelectedIndex());
}
updatePaymentMultiplier();
super.doUpdateContract(source);
addAllListeners();
}
}