Skip to content

Commit 975c5ff

Browse files
authored
Merge pull request #2444 from Windchild292/dev_Windchild_2442
2442: Fixing Multiple Ranks Issues
2 parents cd1b308 + 8f0b7ab commit 975c5ff

File tree

4 files changed

+37
-159
lines changed

4 files changed

+37
-159
lines changed

MekHQ/src/mekhq/campaign/Campaign.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -3326,7 +3326,7 @@ public void processNewDayUnits() {
33263326
fixPart(part, tech);
33273327
} catch (Exception e) {
33283328
MekHQ.getLogger().error(String.format(
3329-
"Could not perform overnight maintenance on %s (%d) due to an error",
3329+
"Could not perform overnight maintenance on %s (%d) due to an error",
33303330
part.getName(), part.getId()), e);
33313331
addReport(String.format("ERROR: an error occurred performing overnight maintenance on %s, check the log",
33323332
part.getName()));
@@ -4364,10 +4364,6 @@ public Ranks getRanks() {
43644364
return ranks;
43654365
}
43664366

4367-
public void setRankSystem(int system) {
4368-
getRanks().setRankSystem(system);
4369-
}
4370-
43714367
public List<String> getAllRankNamesFor(int p) {
43724368
List<String> retVal = new ArrayList<>();
43734369
for (Rank rank : getRanks().getAllRanks()) {

MekHQ/src/mekhq/campaign/io/CampaignXmlParser.java

+2-11
Original file line numberDiff line numberDiff line change
@@ -707,12 +707,8 @@ private static void processInfoNode(Campaign retVal, Node wni, Version version)
707707
retVal.updateTechFactionCode();
708708
} else if (xn.equalsIgnoreCase("retainerEmployerCode")) {
709709
retVal.setRetainerEmployerCode(wn.getTextContent());
710-
} else if (xn.equalsIgnoreCase("officerCut")) {
711-
officerCut = Integer.parseInt(wn.getTextContent().trim());
712-
} else if (xn.equalsIgnoreCase("rankNames")) {
713-
rankNames = wn.getTextContent().trim();
714710
} else if (xn.equalsIgnoreCase("ranks") || xn.equalsIgnoreCase("rankSystem")) {
715-
Ranks r = Ranks.generateInstanceFromXML(wn, version);
711+
Ranks r = Ranks.generateInstanceFromXML(wn, version, false);
716712
if (r != null) {
717713
retVal.setRanks(r);
718714
}
@@ -731,8 +727,7 @@ private static void processInfoNode(Campaign retVal, Node wni, Version version)
731727
} else if (xn.equalsIgnoreCase("overtime")) {
732728
retVal.setOvertime(Boolean.parseBoolean(wn.getTextContent().trim()));
733729
} else if (xn.equalsIgnoreCase("astechPool")) {
734-
retVal.setAstechPool(Integer.parseInt(wn.getTextContent()
735-
.trim()));
730+
retVal.setAstechPool(Integer.parseInt(wn.getTextContent().trim()));
736731
} else if (xn.equalsIgnoreCase("astechPoolMinutes")) {
737732
retVal.setAstechPoolMinutes(Integer.parseInt(wn.getTextContent().trim()));
738733
} else if (xn.equalsIgnoreCase("astechPoolOvertime")) {
@@ -746,10 +741,6 @@ private static void processInfoNode(Campaign retVal, Node wni, Version version)
746741
}
747742
}
748743
}
749-
if (null != rankNames) {
750-
//backwards compatibility
751-
retVal.getRanks().setRanksFromList(rankNames, officerCut);
752-
}
753744

754745
// TODO: this could probably be better
755746
retVal.setCurrentReportHTML(Utilities.combineString(retVal.getCurrentReport(), Campaign.REPORT_LINEBREAK));

MekHQ/src/mekhq/campaign/personnel/ranks/Ranks.java

+22-82
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,8 @@
2727
import java.util.ArrayList;
2828
import java.util.Hashtable;
2929
import java.util.List;
30-
import java.util.StringJoiner;
3130
import java.util.Vector;
3231

33-
import javax.swing.JOptionPane;
3432
import javax.xml.parsers.DocumentBuilder;
3533

3634
import megamek.common.annotations.Nullable;
@@ -163,7 +161,7 @@ public static void initializeRankSystems() {
163161
// Okay, so what element is it?
164162
if (wn.getNodeName().equalsIgnoreCase("rankSystem")) {
165163
// Starting to generate rankSystem
166-
value = generateInstanceFromXML(wn, null);
164+
value = generateInstanceFromXML(wn, null, true);
167165
rankSystems.put(value.getRankSystem(), value);
168166
}
169167
}
@@ -188,6 +186,10 @@ public void setRankSystemName(String rankSystemName) {
188186
this.rankSystemName = rankSystemName;
189187
}
190188

189+
public boolean isCustom() {
190+
return getRankSystem() == Ranks.RS_CUSTOM;
191+
}
192+
191193
public int getRankNumericFromNameAndProfession(int profession, String name) {
192194
while ((profession != RPROF_MW) && isEmptyProfession(profession)) {
193195
profession = getAlternateProfession(profession);
@@ -311,35 +313,6 @@ public int getRankOrder(String rank, int profession) {
311313
return 0;
312314
}
313315

314-
public void setRankSystem(int system) {
315-
if (system < RS_NUM) {
316-
rankSystem = system;
317-
useRankSystem(rankSystem);
318-
}
319-
}
320-
321-
public String getRankNameList(int profession) {
322-
StringJoiner joiner = new StringJoiner(",");
323-
for (Rank rank : getAllRanks()) {
324-
joiner.add(rank.getName(profession));
325-
}
326-
return joiner.toString();
327-
}
328-
329-
//Keep this for reverse compatibility in loading campaigns
330-
public void setRanksFromList(String names, int officerCut) {
331-
ArrayList<ArrayList<String>> rankNames = new ArrayList<>();
332-
String[] rnames = names.split(",");
333-
for (String rname : rnames) {
334-
ArrayList<String> temp = new ArrayList<>(RPROF_NUM);
335-
for (int i = 0; i < RPROF_NUM; i++) {
336-
temp.add(rname);
337-
}
338-
rankNames.add(temp);
339-
}
340-
setCustomRanks(rankNames, officerCut);
341-
}
342-
343316
private String getRankPostTag(int rankNum) {
344317
if (rankNum == 0) {
345318
return " <!-- E0 \"None\" -->";
@@ -359,16 +332,12 @@ private String getRankPostTag(int rankNum) {
359332
}
360333

361334
public void writeToXml(PrintWriter pw1, int indent) {
362-
writeToXml(pw1, indent, false);
363-
}
364-
365-
public void writeToXml(PrintWriter pw1, int indent, boolean saveAll) {
366335
MekHqXmlUtil.writeSimpleXMLOpenIndentedLine(pw1, indent++, "rankSystem");
367336
MekHqXmlUtil.writeSimpleXmlTag(pw1, indent, "systemId", getRankSystem());
368337
MekHqXmlUtil.writeSimpleXmlTag(pw1, indent, "systemName", getRankSystemName());
369338

370339
// Only write out the ranks if we're using a custom system
371-
if ((rankSystem == RS_CUSTOM) || saveAll) {
340+
if (rankSystem == RS_CUSTOM) {
372341
for (int i = 0; i < ranks.size(); i++) {
373342
Rank r = ranks.get(i);
374343
r.writeToXml(pw1, indent);
@@ -379,67 +348,38 @@ public void writeToXml(PrintWriter pw1, int indent, boolean saveAll) {
379348
MekHqXmlUtil.writeSimpleXMLCloseIndentedLine(pw1, --indent, "rankSystem");
380349
}
381350

382-
public static Ranks generateInstanceFromXML(Node wn, Version version) {
383-
Ranks retVal = new Ranks();
384-
boolean showMessage = false;
385-
351+
public static Ranks generateInstanceFromXML(final Node wn, final @Nullable Version version,
352+
final boolean initialLoad) {
353+
final Ranks retVal = new Ranks();
386354
// Dump the ranks ArrayList so we can re-use it.
387355
retVal.ranks = new ArrayList<>();
388356

389357
try {
390358
NodeList nl = wn.getChildNodes();
391-
392359
for (int x = 0; x < nl.getLength(); x++) {
393360
Node wn2 = nl.item(x);
394361

395-
if (wn2.getNodeName().equalsIgnoreCase("system")
396-
|| wn2.getNodeName().equalsIgnoreCase("rankSystem")) {
397-
retVal.rankSystem = Integer.parseInt(wn2.getTextContent().trim());
398-
399-
if ((version != null) && (retVal.rankSystem != RS_CUSTOM)) {
400-
retVal = Ranks.getRanksFromSystem(retVal.rankSystem);
401-
}
402-
403-
retVal.setRankSystemName(PersonMigrator.migrateRankSystemName(retVal.getRankSystem()));
404-
} else if (wn2.getNodeName().equalsIgnoreCase("systemId")) {
405-
retVal.rankSystem = Integer.parseInt(wn2.getTextContent().trim());
406-
if ((version != null) && (retVal.rankSystem != RS_CUSTOM)) {
407-
retVal = Ranks.getRanksFromSystem(retVal.rankSystem);
362+
if (wn2.getNodeName().equalsIgnoreCase("system") // Legacy, 0.47.15 removal
363+
|| wn2.getNodeName().equalsIgnoreCase("rankSystem") // Legacy, 0.47.15 removal
364+
|| wn2.getNodeName().equalsIgnoreCase("systemId")) {
365+
final int rankSystem = Integer.parseInt(wn2.getTextContent().trim());
366+
if (!initialLoad && (retVal.rankSystem != RS_CUSTOM)) {
367+
return Ranks.getRanksFromSystem(retVal.rankSystem);
408368
}
369+
retVal.rankSystem = rankSystem;
409370
} else if (wn2.getNodeName().equalsIgnoreCase("systemName")) {
410371
retVal.setRankSystemName(wn2.getTextContent().trim());
411372
} else if (wn2.getNodeName().equalsIgnoreCase("rank")) {
412-
// If we're parsing from the XML or using custom ranks, then parse the rank sub-nodes
413-
if (retVal.oldRankSystem == 7) {
414-
showMessage = true;
415-
}
416-
if ((version == null) || (retVal.rankSystem == RS_CUSTOM)) {
417-
retVal.ranks.add(Rank.generateInstanceFromXML(wn2));
418-
} else {
419-
// Otherwise... use the default ranks for this system
420-
int temp = retVal.oldRankSystem;
421-
retVal = Ranks.getRanksFromSystem(retVal.rankSystem);
422-
retVal.oldRankSystem = temp;
423-
return retVal;
424-
}
373+
retVal.ranks.add(Rank.generateInstanceFromXML(wn2));
425374
}
426375
}
427376

428-
if (showMessage) {
429-
JOptionPane.showConfirmDialog(
430-
null,
431-
"You have used a custom rank set in your campaign."
432-
+ "\nYou must recreate that system for this version.",
433-
"Custom Ranks",
434-
JOptionPane.OK_CANCEL_OPTION);
377+
if ((version != null) && version.isLowerThan("0.48.0")) {
378+
retVal.setRankSystemName(PersonMigrator.migrateRankSystemName(retVal.getRankSystem()));
435379
}
436-
} catch (Exception ex) {
437-
// Errrr, apparently either the class name was invalid...
438-
// Or the listed name doesn't exist.
439-
// Doh!
440-
MekHQ.getLogger().error(ex);
380+
} catch (Exception e) {
381+
MekHQ.getLogger().error(e);
441382
}
442-
443383
return retVal;
444384
}
445385

@@ -483,6 +423,6 @@ public void setRanksFromModel(RankTableModel model) {
483423

484424
@Override
485425
public String toString() {
486-
return rankSystemName;
426+
return getRankSystemName();
487427
}
488428
}

MekHQ/src/mekhq/gui/dialog/CampaignOptionsDialog.java

+12-61
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@
4343
import java.util.EventObject;
4444
import java.util.Hashtable;
4545
import java.util.List;
46+
import java.util.Objects;
4647
import java.util.Optional;
4748
import java.util.ResourceBundle;
4849
import java.util.Set;
@@ -105,7 +106,6 @@
105106
import mekhq.gui.model.RankTableModel;
106107
import mekhq.gui.model.SortedComboBoxModel;
107108
import mekhq.gui.preferences.JWindowPreference;
108-
import mekhq.gui.utilities.TableCellListener;
109109
import mekhq.module.PersonnelMarketServiceManager;
110110
import mekhq.module.api.PersonnelMarketMethod;
111111
import mekhq.preferences.PreferencesNode;
@@ -381,7 +381,7 @@ public class CampaignOptionsDialog extends JDialog {
381381

382382
//region Rank System Tab
383383
private JPanel panRank;
384-
private JComboBox<String> comboRanks;
384+
private JComboBox<Ranks> comboRanks;
385385
@SuppressWarnings("unused")
386386
private JButton btnAddRank; // FIXME: Unused
387387
@SuppressWarnings("unused")
@@ -526,7 +526,6 @@ public CampaignOptionsDialog(JFrame parent, boolean modal, Campaign c) {
526526
private void initComponents() {
527527
//region Variable Declaration and Initialisation
528528
tabOptions = new JTabbedPane();
529-
comboRanks = new JComboBox<>();
530529
comboFactionNames = new JComboBox<>();
531530
sldGender = new JSlider(SwingConstants.HORIZONTAL);
532531
panRepair = new JPanel();
@@ -3093,55 +3092,23 @@ public Component getListCellRendererComponent(JList<?> list, Object value, int i
30933092
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
30943093
panRank.add(lblRank, gridBagConstraints);
30953094

3096-
DefaultComboBoxModel<String> rankModel = new DefaultComboBoxModel<>();
3095+
DefaultComboBoxModel<Ranks> rankModel = new DefaultComboBoxModel<>();
30973096
for (int i = 0; i < Ranks.RS_NUM; i++) {
30983097
final Ranks ranks = Ranks.getRanksFromSystem(i);
30993098
if (ranks != null) {
3100-
rankModel.addElement(ranks.getRankSystemName());
3099+
rankModel.addElement(ranks);
31013100
}
31023101
}
3103-
comboRanks.setModel(rankModel);
3104-
comboRanks.setSelectedIndex(campaign.getRanks().getRankSystem());
3102+
comboRanks = new JComboBox<>(rankModel);
31053103
comboRanks.setName("comboRanks");
3106-
comboRanks.setActionCommand("fillRanks");
3107-
comboRanks.addActionListener(evt -> {
3108-
if (evt.getActionCommand().equals("fillRanks")) {
3109-
fillRankInfo();
3110-
}
3111-
});
3112-
gridBagConstraints = new java.awt.GridBagConstraints();
3104+
comboRanks.addActionListener(evt -> fillRankInfo());
3105+
gridBagConstraints = new GridBagConstraints();
31133106
gridBagConstraints.gridx = 1;
31143107
gridBagConstraints.gridy = 1;
3115-
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
3116-
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
3108+
gridBagConstraints.fill = GridBagConstraints.NONE;
3109+
gridBagConstraints.anchor = GridBagConstraints.WEST;
31173110
panRank.add(comboRanks, gridBagConstraints);
31183111

3119-
/*btnAddRank = new JButton("Add Rank");
3120-
gridBagConstraints.gridx = 2;
3121-
gridBagConstraints.gridy = 0;
3122-
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
3123-
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
3124-
panRank.add(btnAddRank, gridBagConstraints);
3125-
btnAddRank.addActionListener(new java.awt.event.ActionListener() {
3126-
public void actionPerformed(java.awt.event.ActionEvent evt) {
3127-
addRank();
3128-
}
3129-
});
3130-
3131-
3132-
btnDeleteRank = new JButton("Remove Rank");
3133-
gridBagConstraints.gridx = 3;
3134-
gridBagConstraints.gridy = 0;
3135-
gridBagConstraints.fill = java.awt.GridBagConstraints.NONE;
3136-
gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST;
3137-
panRank.add(btnDeleteRank, gridBagConstraints);
3138-
btnDeleteRank.addActionListener(new java.awt.event.ActionListener() {
3139-
public void actionPerformed(java.awt.event.ActionEvent evt) {
3140-
removeRank();
3141-
}
3142-
});
3143-
btnDeleteRank.setEnabled(false);*/
3144-
31453112
ranksModel = new RankTableModel(campaign.getRanks().getRanksForModel(), rankColNames);
31463113
tableRanks = new JTable(ranksModel);
31473114
tableRanks.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -3161,22 +3128,6 @@ public void actionPerformed(java.awt.event.ActionEvent evt) {
31613128
}
31623129
}
31633130
tableRanks.getSelectionModel().addListSelectionListener(this::tableRanksValueChanged);
3164-
AbstractAction rankCellAction = new AbstractAction() {
3165-
private static final long serialVersionUID = -7586376360964669234L;
3166-
3167-
@Override
3168-
public void actionPerformed(ActionEvent e) {
3169-
TableCellListener tcl = (TableCellListener)e.getSource();
3170-
if (!(tcl.getOldValue().equals(tcl.getNewValue()))) {
3171-
comboRanks.setActionCommand("noFillRanks");
3172-
comboRanks.setSelectedIndex(Ranks.RS_CUSTOM);
3173-
comboRanks.setActionCommand("fillRanks");
3174-
}
3175-
}
3176-
3177-
};
3178-
@SuppressWarnings(value = "unused") // FIXME:
3179-
TableCellListener rankCellListener = new TableCellListener(tableRanks, rankCellAction);
31803131
scrRanks.setViewportView(tableRanks);
31813132

31823133
gridBagConstraints = new java.awt.GridBagConstraints();
@@ -4269,7 +4220,7 @@ private void setUserPreferences() {
42694220
}
42704221

42714222
private void fillRankInfo() {
4272-
final Ranks ranks = Ranks.getRanksFromSystem(comboRanks.getSelectedIndex());
4223+
final Ranks ranks = (Ranks) comboRanks.getSelectedItem();
42734224
if (ranks != null) {
42744225
ranksModel.setDataVector(ranks.getRanksForModel(), rankColNames);
42754226
TableColumn column;
@@ -4833,8 +4784,8 @@ private void updateOptions() {
48334784
RandomNameGenerator.getInstance().setChosenFaction((String) comboFactionNames.getSelectedItem());
48344785
}
48354786
RandomGenderGenerator.setPercentFemale(sldGender.getValue());
4836-
campaign.setRankSystem(comboRanks.getSelectedIndex());
4837-
if (comboRanks.getSelectedIndex() == Ranks.RS_CUSTOM) {
4787+
campaign.setRanks((Ranks) Objects.requireNonNull(comboRanks.getSelectedItem()));
4788+
if (campaign.getRanks().isCustom()) {
48384789
campaign.getRanks().setRanksFromModel(ranksModel);
48394790
}
48404791
campaign.setCamoCategory(camoCategory);

0 commit comments

Comments
 (0)