/*
* HireBulkPersonnel.java
*
* Created on Jan 6, 2010, 10:46:02 PM
*/
package mekhq.gui.dialog;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.GregorianCalendar;
import java.util.Objects;
import java.util.ResourceBundle;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;
import javax.swing.JSpinner;
import javax.swing.JTextField;
import javax.swing.SpinnerNumberModel;
import javax.swing.WindowConstants;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.joda.time.DateTime;
import org.joda.time.Days;
import org.joda.time.Years;
import megamek.common.Compute;
import megamek.common.util.EncodeControl;
import mekhq.Utilities;
import mekhq.campaign.Campaign;
import mekhq.campaign.personnel.Person;
import mekhq.campaign.personnel.Ranks;
/**
*
* @author Jay Lawson
*/
public class HireBulkPersonnelDialog extends JDialog {
private static final long serialVersionUID = -6946480787293179307L;
private static final Insets ZERO_INSETS = new Insets(0, 0, 0, 0);
private static final Insets DEFAULT_INSETS = new Insets(5, 5, 5, 5);
private Campaign campaign;
private JComboBox<PersonTypeItem> choiceType;
private JComboBox<String> choiceRanks;
private DefaultComboBoxModel<String> rankModel;
private JSpinner spnNumber;
private JButton btnHire;
private JButton btnClose;
private JPanel panButtons;
private JSpinner minAge;
private JSpinner maxAge;
private boolean useAge = false;
private int minAgeVal = 19;
private int maxAgeVal = 99;
private ResourceBundle resourceMap = ResourceBundle.getBundle("mekhq.resources.HireBulkPersonnelDialog", new EncodeControl()); //$NON-NLS-1$
public HireBulkPersonnelDialog(Frame parent, boolean modal, Campaign c) {
super(parent, modal);
this.campaign = c;
initComponents();
setLocationRelativeTo(getParent());
}
private static GridBagConstraints newConstraints(int xPos, int yPos) {
return newConstraints(xPos, yPos, GridBagConstraints.NONE);
}
private static GridBagConstraints newConstraints(int xPos, int yPos, int fill) {
GridBagConstraints result = new GridBagConstraints();
result.gridx = xPos;
result.gridy = yPos;
result.fill = fill;
result.anchor = GridBagConstraints.WEST;
result.insets = DEFAULT_INSETS;
return result;
}
private void initComponents() {
GridBagConstraints gridBagConstraints;
choiceType = new JComboBox<PersonTypeItem>();
choiceRanks = new JComboBox<String>();
btnHire = new JButton(resourceMap.getString("btnHire.text")); //$NON-NLS-1$
btnClose = new JButton(resourceMap.getString("btnClose.text")); //$NON-NLS-1$
panButtons = new JPanel(new GridBagLayout());
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
setName("Form"); // NOI18N
setTitle(resourceMap.getString("Form.title")); //$NON-NLS-1$
getContentPane().setLayout(new GridBagLayout());
getContentPane().add(new JLabel(resourceMap.getString("lblType.text")), newConstraints(0, 0)); //$NON-NLS-1$
DefaultComboBoxModel<PersonTypeItem> personTypeModel = new DefaultComboBoxModel<PersonTypeItem>();
for(int i = 1; i < Person.T_NUM; i++) {
personTypeModel.addElement(new PersonTypeItem(Person.getRoleDesc(i,campaign.getFaction().isClan()), i));
}
// Add "none" for generic AsTechs
personTypeModel.addElement(new PersonTypeItem(Person.getRoleDesc(0, campaign.getFaction().isClan()), 0));
choiceType.setModel(personTypeModel);
choiceType.setName("choiceType"); // NOI18N
gridBagConstraints = newConstraints(1, 0, GridBagConstraints.HORIZONTAL);
gridBagConstraints.weightx = 1.0;
choiceType.setSelectedIndex(0);
choiceType.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
// If we change the type, we need to setup the ranks for that type
refreshRanksCombo();
}
});
getContentPane().add(choiceType, gridBagConstraints);
getContentPane().add(new JLabel(resourceMap.getString("lblRank.text")), newConstraints(0, 1)); //$NON-NLS-1$
rankModel = new DefaultComboBoxModel<String>();
choiceRanks.setModel(rankModel);
choiceRanks.setName("choiceRanks"); // NOI18N
refreshRanksCombo();
gridBagConstraints = newConstraints(1, 1, GridBagConstraints.HORIZONTAL);
gridBagConstraints.weightx = 1.0;
getContentPane().add(choiceRanks, gridBagConstraints);
spnNumber = new JSpinner(new SpinnerNumberModel(1, 1, 100, 1));
getContentPane().add(new JLabel(resourceMap.getString("lblNumber.text")), newConstraints(0, 2)); //$NON-NLS-1$
gridBagConstraints = newConstraints(1, 2);
gridBagConstraints.weightx = 1.0;
getContentPane().add(spnNumber, gridBagConstraints);
int mainGridPos = 3;
if(campaign.isGM()) {
// GM tools
JSeparator sep = new JSeparator();
gridBagConstraints = newConstraints(0, mainGridPos, GridBagConstraints.HORIZONTAL);
gridBagConstraints.gridwidth = 2;
getContentPane().add(sep, gridBagConstraints);
++ mainGridPos;
gridBagConstraints = newConstraints(0, mainGridPos);
gridBagConstraints.weightx = 1.0;
JCheckBox ageRangeCheck = new JCheckBox(resourceMap.getString("lblAgeRange.text")); //$NON-NLS-1$
ageRangeCheck.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
useAge = ((JCheckBox)e.getSource()).isSelected();
minAge.setEnabled(useAge);
maxAge.setEnabled(useAge);
}
});
getContentPane().add(ageRangeCheck, gridBagConstraints);
gridBagConstraints = newConstraints(1, mainGridPos);
gridBagConstraints.weightx = 1.0;
JPanel ageRangePanel = new JPanel(new GridBagLayout());
getContentPane().add(ageRangePanel, gridBagConstraints);
minAge = new JSpinner(new SpinnerNumberModel(19, 0, 99, 1));
((JSpinner.DefaultEditor)minAge.getEditor()).getTextField().setHorizontalAlignment(JTextField.CENTER);
((JSpinner.DefaultEditor)minAge.getEditor()).getTextField().setColumns(3);
minAge.setEnabled(false);
minAge.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
minAgeVal = (Integer)minAge.getModel().getValue();
if(minAgeVal > maxAgeVal) {
maxAge.setValue(minAgeVal);
}
}
});
ageRangePanel.add(minAge, newConstraints(0, 0));
ageRangePanel.add(new JLabel(resourceMap.getString("lblAgeRangeSeparator.text")), newConstraints(1, 0)); //$NON-NLS-1$
maxAge = new JSpinner(new SpinnerNumberModel(99, 0, 99, 1));
((JSpinner.DefaultEditor)maxAge.getEditor()).getTextField().setHorizontalAlignment(JTextField.CENTER);
((JSpinner.DefaultEditor)maxAge.getEditor()).getTextField().setColumns(3);
maxAge.setEnabled(false);
maxAge.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
maxAgeVal = (Integer)maxAge.getModel().getValue();
if(maxAgeVal < minAgeVal) {
minAge.setValue(maxAgeVal);
}
}
});
//maxAge.setAlignmentY(CENTER_ALIGNMENT);
ageRangePanel.add(maxAge, newConstraints(2, 0));
++ mainGridPos;
}
btnHire.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
hire();
}
});
gridBagConstraints = newConstraints(0, 0);
gridBagConstraints.insets = ZERO_INSETS;
panButtons.add(btnHire, gridBagConstraints);
gridBagConstraints.gridx++;
btnClose.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent evt) {
setVisible(false);
}
});
panButtons.add(btnClose, gridBagConstraints);
gridBagConstraints = newConstraints(0, mainGridPos, GridBagConstraints.HORIZONTAL);
gridBagConstraints.gridwidth = 2;
gridBagConstraints.weightx = 1.0;
getContentPane().add(panButtons, gridBagConstraints);
pack();
}
private void hire() {
int number = (Integer)spnNumber.getModel().getValue();
GregorianCalendar today = campaign.getCalendar();
DateTime earliestBirthDate = null;
DateTime latestBirthDate = null;
if(useAge) {
// One day before birthday
earliestBirthDate = Utilities.getDateTimeDay(today).minus(Years.years(maxAgeVal + 1)).plus(Days.ONE);
// Just the birthday
latestBirthDate = Utilities.getDateTimeDay(today).minus(Years.years(minAgeVal));
}
while(number > 0) {
Person p = campaign.newPerson(((PersonTypeItem)choiceType.getSelectedItem()).id);
p.setRankNumeric(campaign.getRanks().getRankNumericFromNameAndProfession(p.getProfession(), (String)choiceRanks.getSelectedItem()));
int age = p.getAge(today);
if(useAge) {
if((age > maxAgeVal) || (age < minAgeVal)) {
int days = Days.daysBetween(earliestBirthDate, latestBirthDate).getDays();
DateTime birthDay = earliestBirthDate.plus(Days.days(Compute.randomInt(days)));
p.setBirthday(birthDay.toGregorianCalendar());
age = p.getAge(today);
}
}
// Limit skills by age for children and adolescents
if(age < 12) {
p.removeAllSkills();
} else if(age < 14) {
p.limitSkills(0);
} else if(age < 18) {
p.limitSkills(age - 13);
}
if(!campaign.recruitPerson(p)) {
number = 0;
} else {
number--;
}
}
}
private void refreshRanksCombo() {
// Clear everything and start over! Wee!
rankModel.removeAllElements();
// Determine correct profession to pass into the loop
int primaryRoleId = ((PersonTypeItem) choiceType.getSelectedItem()).id;
if(0 == primaryRoleId) {
// "Nobody" selected
rankModel.addElement(campaign.getRanks().getRank(0).getName(0));
choiceRanks.setModel(rankModel);
choiceRanks.setSelectedIndex(0);
return;
}
int profession = Person.getProfessionFromPrimaryRole((primaryRoleId));
while (campaign.getRanks().isEmptyProfession(profession) && profession != Ranks.RPROF_MW) {
profession = campaign.getRanks().getAlternateProfession(profession);
}
for (String rankName : campaign.getAllRankNamesFor(profession)) {
rankModel.addElement(rankName);
}
choiceRanks.setModel(rankModel);
choiceRanks.setSelectedIndex(0);
}
private static class PersonTypeItem {
public String name;
public int id;
public PersonTypeItem(String name, int id) {
this.name = Objects.requireNonNull(name);
this.id = id;
}
@Override
public String toString() {
return name;
}
}
}