38
38
import java .awt .Toolkit ;
39
39
import java .awt .event .ActionEvent ;
40
40
import java .awt .event .ActionListener ;
41
+ import java .time .LocalDate ;
41
42
import java .time .temporal .ChronoUnit ;
42
43
import java .util .ArrayList ;
43
44
import java .util .HashMap ;
64
65
import megamek .logging .MMLogger ;
65
66
import mekhq .MekHQ ;
66
67
import mekhq .campaign .Campaign ;
68
+ import mekhq .campaign .CampaignOptions ;
67
69
import mekhq .campaign .finances .Money ;
68
70
import mekhq .campaign .finances .enums .TransactionType ;
69
71
import mekhq .campaign .mission .Mission ;
@@ -87,47 +89,47 @@ public class RetirementDefectionDialog extends JDialog {
87
89
private static final MMLogger logger = MMLogger .create (RetirementDefectionDialog .class );
88
90
89
91
private static final String PAN_OVERVIEW = "PanOverview" ;
90
- private static final String PAN_RESULTS = "PanResults" ;
92
+ private static final String PAN_RESULTS = "PanResults" ;
91
93
92
94
private String currentPanel ;
93
95
94
- final private CampaignGUI hqView ;
95
- final private Mission contract ;
96
+ final private CampaignGUI hqView ;
97
+ final private Mission contract ;
96
98
final private RetirementDefectionTracker rdTracker ;
97
99
98
- private Map <UUID , TargetRoll > targetRolls ;
99
- final private Map <UUID , UUID > unitAssignments ;
100
+ private Map <UUID , TargetRoll > targetRolls ;
101
+ final private Map <UUID , UUID > unitAssignments ;
100
102
101
- private JPanel panMain ;
102
- private JTextArea txtInstructions ;
103
+ private JPanel panMain ;
104
+ private JTextArea txtInstructions ;
103
105
private CardLayout cardLayout ;
104
106
105
107
/* Overview Panel components */
106
- private JComboBox <PersonnelFilter > cbGroupOverview ;
107
- private JSpinner spnGeneralMod ;
108
- private JLabel lblTotal ;
109
- private JLabel lblTotalShares ;
110
- private RetirementTable personnelTable ;
108
+ private JComboBox <PersonnelFilter > cbGroupOverview ;
109
+ private JSpinner spnGeneralMod ;
110
+ private JLabel lblTotal ;
111
+ private JLabel lblTotalShares ;
112
+ private RetirementTable personnelTable ;
111
113
private TableRowSorter <RetirementTableModel > personnelSorter ;
112
114
private TableRowSorter <RetirementTableModel > retireeSorter ;
113
- private JTextArea txtTargetDetails ;
115
+ private JTextArea txtTargetDetails ;
114
116
115
117
/* Results Panel components */
116
- private JComboBox <PersonnelFilter > cbGroupResults ;
117
- private JLabel lblPayment ;
118
- private RetirementTable retireeTable ;
119
- private JButton btnAddUnit ;
120
- private JButton btnRemoveUnit ;
121
- private JComboBox <String > cbUnitCategory ;
122
- private JCheckBox chkShowAllUnits ;
123
- private JTable unitAssignmentTable ;
118
+ private JComboBox <PersonnelFilter > cbGroupResults ;
119
+ private JLabel lblPayment ;
120
+ private RetirementTable retireeTable ;
121
+ private JButton btnAddUnit ;
122
+ private JButton btnRemoveUnit ;
123
+ private JComboBox <String > cbUnitCategory ;
124
+ private JCheckBox chkShowAllUnits ;
125
+ private JTable unitAssignmentTable ;
124
126
private TableRowSorter <UnitAssignmentTableModel > unitSorter ;
125
127
126
128
/* Button Panel components */
127
- private JButton btnCancel ;
129
+ private JButton btnCancel ;
128
130
private JToggleButton btnEdit ;
129
- private JButton btnRoll ;
130
- private JButton btnDone ;
131
+ private JButton btnRoll ;
132
+ private JButton btnDone ;
131
133
132
134
private boolean aborted = true ;
133
135
@@ -136,10 +138,10 @@ public class RetirementDefectionDialog extends JDialog {
136
138
137
139
public RetirementDefectionDialog (CampaignGUI gui , Mission mission , boolean doRetirement ) {
138
140
super (gui .getFrame (), true );
139
- hqView = gui ;
141
+ hqView = gui ;
140
142
unitAssignments = new HashMap <>();
141
- this .contract = mission ;
142
- rdTracker = hqView .getCampaign ().getRetirementDefectionTracker ();
143
+ this .contract = mission ;
144
+ rdTracker = hqView .getCampaign ().getRetirementDefectionTracker ();
143
145
if (doRetirement ) {
144
146
targetRolls = rdTracker .getTargetNumbers (mission , hqView .getCampaign ());
145
147
@@ -168,15 +170,15 @@ public RetirementDefectionDialog(CampaignGUI gui, Mission mission, boolean doRet
168
170
private void initComponents (boolean doRetirement ) {
169
171
setTitle (resourceMap .getString ("title.text" ));
170
172
171
- Dimension screenSize = Toolkit .getDefaultToolkit ().getScreenSize ();
172
- int screenWidth = (int ) (screenSize .getWidth () * 0.75 );
173
- int screenHeight = (int ) (screenSize .getHeight () * 0.94 );
173
+ Dimension screenSize = Toolkit .getDefaultToolkit ().getScreenSize ();
174
+ int screenWidth = (int ) (screenSize .getWidth () * 0.75 );
175
+ int screenHeight = (int ) (screenSize .getHeight () * 0.94 );
174
176
175
177
setSize (screenWidth , screenHeight );
176
178
177
179
setLayout (new BorderLayout ());
178
180
cardLayout = new CardLayout ();
179
- panMain = new JPanel (cardLayout );
181
+ panMain = new JPanel (cardLayout );
180
182
add (panMain , BorderLayout .CENTER );
181
183
182
184
txtInstructions = new JTextArea ();
@@ -190,8 +192,8 @@ private void initComponents(boolean doRetirement) {
190
192
String instructions = resourceMap .getString ("txtInstructions.Overview.text" );
191
193
if (null == contract ) {
192
194
instructions += "\n \n Days since last Employee Turnover check: " +
193
- ChronoUnit .DAYS .between (rdTracker .getLastRetirementRoll (),
194
- hqView .getCampaign ().getLocalDate ());
195
+ ChronoUnit .DAYS .between (rdTracker .getLastRetirementRoll (),
196
+ hqView .getCampaign ().getLocalDate ());
195
197
}
196
198
txtInstructions .setText (instructions );
197
199
} else {
@@ -265,11 +267,11 @@ private void initComponents(boolean doRetirement) {
265
267
if (personnelTable .getSelectedRow () < 0 ) {
266
268
return ;
267
269
}
268
- int row = personnelTable .convertRowIndexToModel (personnelTable .getSelectedRow ());
269
- UUID id = ((RetirementTableModel ) (personnelTable .getModel ())).getPerson (row ).getId ();
270
+ int row = personnelTable .convertRowIndexToModel (personnelTable .getSelectedRow ());
271
+ UUID id = ((RetirementTableModel ) (personnelTable .getModel ())).getPerson (row ).getId ();
270
272
txtTargetDetails .setText (targetRolls .get (id ).getDesc () +
271
- (payBonus (id ) ? " -2 (Bonus)" : " " ) +
272
- ((miscModifier (id ) != 0 ) ? miscModifier (id ) + " (Misc)" : "" ));
273
+ (payBonus (id ) ? " -2 (Bonus)" : " " ) +
274
+ ((miscModifier (id ) != 0 ) ? miscModifier (id ) + " (Misc)" : "" ));
273
275
});
274
276
275
277
personnelTable .getColumnModel ()
@@ -351,7 +353,7 @@ private void initComponents(boolean doRetirement) {
351
353
panRetirees .add (panTop , BorderLayout .PAGE_START );
352
354
353
355
RetirementTableModel model = new RetirementTableModel (hqView .getCampaign ());
354
- retireeTable = new RetirementTable (model , hqView );
356
+ retireeTable = new RetirementTable (model , hqView );
355
357
retireeSorter = new TableRowSorter <>(model );
356
358
retireeSorter .setComparator (RetirementTableModel .COL_PERSON , new PersonRankStringSorter (hqView .getCampaign ()));
357
359
retireeTable .setRowSorter (retireeSorter );
@@ -461,17 +463,17 @@ private void initComponents(boolean doRetirement) {
461
463
private void setBonusAndShareTotals (Money totalBonuses ) {
462
464
if (totalBonuses .isGreaterThan (hqView .getCampaign ().getFinances ().getBalance ())) {
463
465
lblTotal .setText ("<html>" +
464
- resourceMap .getString ("lblTotalBonus.text" ) +
465
- ' ' +
466
- "<font color='" +
467
- MekHQ .getMHQOptions ().getFontColorNegativeHexColor () +
468
- "'>" +
469
- getTotalBonus ().toAmountAndSymbolString () +
470
- "</font></html>" );
466
+ resourceMap .getString ("lblTotalBonus.text" ) +
467
+ ' ' +
468
+ "<font color='" +
469
+ MekHQ .getMHQOptions ().getFontColorNegativeHexColor () +
470
+ "'>" +
471
+ getTotalBonus ().toAmountAndSymbolString () +
472
+ "</font></html>" );
471
473
} else {
472
474
lblTotal .setText (resourceMap .getString ("lblTotalBonus.text" ) +
473
- ' ' +
474
- getTotalBonus ().toAmountAndSymbolString ());
475
+ ' ' +
476
+ getTotalBonus ().toAmountAndSymbolString ());
475
477
}
476
478
477
479
if (hqView .getCampaign ().getCampaignOptions ().isUseShareSystem ()) {
@@ -583,9 +585,9 @@ private void initResults() {
583
585
* they go if it is still around
584
586
*/
585
587
if (hqView .getCampaign ().getCampaignOptions ().isTrackOriginalUnit () &&
586
- (null != person .getOriginalUnitId ()) &&
587
- !unitAssignments .containsValue (person .getOriginalUnitId ()) &&
588
- (hqView .getCampaign ().getUnit (person .getOriginalUnitId ()) != null )) {
588
+ (null != person .getOriginalUnitId ()) &&
589
+ !unitAssignments .containsValue (person .getOriginalUnitId ()) &&
590
+ (hqView .getCampaign ().getUnit (person .getOriginalUnitId ()) != null )) {
589
591
unitAssignments .put (id , person .getOriginalUnitId ());
590
592
if (hqView .getCampaign ().getCampaignOptions ().isUseShareSystem ()) {
591
593
Money temp = rdTracker .getPayout (id )
@@ -609,7 +611,8 @@ private void initResults() {
609
611
lblPayment .setText (totalPayout ().toAmountAndSymbolString ());
610
612
}
611
613
612
- private void filterPersonnel (TableRowSorter <RetirementTableModel > sorter , JComboBox <PersonnelFilter > comboBox , boolean resultsView ) {
614
+ private void filterPersonnel (TableRowSorter <RetirementTableModel > sorter , JComboBox <PersonnelFilter > comboBox ,
615
+ boolean resultsView ) {
613
616
PersonnelFilter nGroup = (comboBox .getSelectedItem () != null ) ?
614
617
(PersonnelFilter ) comboBox .getSelectedItem () :
615
618
PersonnelFilter .ACTIVE ;
@@ -619,8 +622,8 @@ private void filterPersonnel(TableRowSorter<RetirementTableModel> sorter, JCombo
619
622
public boolean include (Entry <? extends RetirementTableModel , ? extends Integer > entry ) {
620
623
Person person = entry .getModel ().getPerson (entry .getIdentifier ());
621
624
if (resultsView &&
622
- (rdTracker .getRetirees (contract ) != null ) &&
623
- !rdTracker .getRetirees (contract ).contains (person .getId ())) {
625
+ (rdTracker .getRetirees (contract ) != null ) &&
626
+ !rdTracker .getRetirees (contract ).contains (person .getId ())) {
624
627
return false ;
625
628
} else {
626
629
return nGroup .getFilteredInformation (person , hqView .getCampaign ().getLocalDate ());
@@ -635,19 +638,19 @@ public void filterUnits() {
635
638
@ Override
636
639
public boolean include (Entry <? extends UnitAssignmentTableModel , ? extends Integer > entry ) {
637
640
UnitAssignmentTableModel unitModel = entry .getModel ();
638
- Unit unit = unitModel .getUnit (entry .getIdentifier ());
641
+ Unit unit = unitModel .getUnit (entry .getIdentifier ());
639
642
if (!chkShowAllUnits .isSelected () && retireeTable .getSelectedRow () >= 0 ) {
640
643
Person selectedPerson = ((RetirementTableModel ) retireeTable .getModel ()).getPerson (retireeTable .convertRowIndexToModel (
641
644
retireeTable .getSelectedRow ()));
642
645
if (null != rdTracker .getPayout (selectedPerson .getId ()) &&
643
- rdTracker .getPayout (selectedPerson .getId ()).getWeightClass () > 0 &&
644
- weightClassIndex (unit ) != rdTracker .getPayout (selectedPerson .getId ()).getWeightClass ()) {
646
+ rdTracker .getPayout (selectedPerson .getId ()).getWeightClass () > 0 &&
647
+ weightClassIndex (unit ) != rdTracker .getPayout (selectedPerson .getId ()).getWeightClass ()) {
645
648
return false ;
646
649
}
647
650
}
648
651
/* Can't really give a platoon as payment */
649
652
if ((unit .getEntity ().getUnitType () == UnitType .BATTLE_ARMOR ) ||
650
- (unit .getEntity ().getUnitType () == UnitType .INFANTRY )) {
653
+ (unit .getEntity ().getUnitType () == UnitType .INFANTRY )) {
651
654
return false ;
652
655
}
653
656
if (unitAssignments .containsValue (unit .getId ())) {
@@ -656,8 +659,8 @@ public boolean include(Entry<? extends UnitAssignmentTableModel, ? extends Integ
656
659
if (nGroup < 0 ) {
657
660
return true ;
658
661
}
659
- Entity en = unit .getEntity ();
660
- int type = -1 ;
662
+ Entity en = unit .getEntity ();
663
+ int type = -1 ;
661
664
if (null != en ) {
662
665
type = unit .getEntity ().getUnitType ();
663
666
}
@@ -709,8 +712,8 @@ public Money totalPayout() {
709
712
* final payout.
710
713
*/
711
714
if ((rdTracker .getPayout (id ).getWeightClass () == 0 ) &&
712
- (unitAssignments .get (id ) != null ) &&
713
- (hqView .getCampaign ().getUnit (unitAssignments .get (id )) != null )) {
715
+ (unitAssignments .get (id ) != null ) &&
716
+ (hqView .getCampaign ().getUnit (unitAssignments .get (id )) != null )) {
714
717
payout = payout .minus (hqView .getCampaign ().getUnit (unitAssignments .get (id )).getSellValue ());
715
718
}
716
719
@@ -749,7 +752,7 @@ public boolean payBonus(UUID id) {
749
752
750
753
public int miscModifier (UUID id ) {
751
754
return ((RetirementTableModel ) personnelTable .getModel ()).getMiscModifier (id ) +
752
- (Integer ) spnGeneralMod .getValue ();
755
+ (Integer ) spnGeneralMod .getValue ();
753
756
}
754
757
755
758
private int getTotalShares () {
@@ -840,16 +843,21 @@ private boolean unitAssignmentsComplete() {
840
843
return true ;
841
844
}
842
845
843
- boolean assignmentComplete = rdTracker .getRetirees ()
844
- .stream ()
845
- .filter (uuid -> isBreakingContract (hqView .getCampaign ().getPerson (uuid ),
846
- hqView .getCampaign ().getLocalDate (),
847
- hqView .getCampaign ()
848
- .getCampaignOptions ()
849
- .getServiceContractDuration ()))
850
- .findFirst ()
851
- .map (uuid -> (!unitAssignments .containsKey (uuid )))
852
- .orElse (true );
846
+ boolean assignmentComplete = true ;
847
+ LocalDate today = hqView .getCampaign ().getLocalDate ();
848
+ CampaignOptions campaignOptions = hqView .getCampaign ().getCampaignOptions ();
849
+ int serviceContractDuration = campaignOptions .getServiceContractDuration ();
850
+ for (UUID personId : rdTracker .getRetirees ()) {
851
+ Person retiree = hqView .getCampaign ().getPerson (personId );
852
+ UUID originalUnitId = retiree .getOriginalUnitId ();
853
+
854
+ if (isBreakingContract (retiree , today , serviceContractDuration )) {
855
+ if (!unitAssignments .containsKey (personId ) && unitAssignments .containsValue (originalUnitId )) {
856
+ assignmentComplete = false ;
857
+ break ;
858
+ }
859
+ }
860
+ }
853
861
854
862
return ((assignmentComplete ) && (totalPayout .isLessThan (hqView .getCampaign ().getFunds ())));
855
863
}
@@ -859,22 +867,17 @@ private void enableAddRemoveButtons() {
859
867
btnAddUnit .setEnabled (false );
860
868
btnRemoveUnit .setEnabled (false );
861
869
} else {
862
- int retireeRow = retireeTable .convertRowIndexToModel (retireeTable .getSelectedRow ());
863
- UUID pid = ((RetirementTableModel ) (retireeTable .getModel ())).getPerson (retireeRow ).getId ();
864
- if (isBreakingContract (hqView .getCampaign ().getPerson (pid ),
865
- hqView .getCampaign ().getLocalDate (),
866
- hqView .getCampaign ().getCampaignOptions ().getServiceContractDuration ())) {
870
+ int retireeRow = retireeTable .convertRowIndexToModel (retireeTable .getSelectedRow ());
871
+ UUID pid = ((RetirementTableModel ) (retireeTable .getModel ())).getPerson (retireeRow ).getId ();
872
+ if (null == rdTracker .getPayout (pid ) &&
873
+ isBreakingContract (hqView .getCampaign ().getPerson (pid ),
874
+ hqView .getCampaign ().getLocalDate (),
875
+ hqView .getCampaign ().getCampaignOptions ().getServiceContractDuration ())) {
867
876
btnAddUnit .setEnabled (false );
868
877
btnRemoveUnit .setEnabled (false );
869
878
} else if (hqView .getCampaign ().getPerson (pid ).getPrimaryRole ().isSoldierOrBattleArmour ()) {
870
879
btnAddUnit .setEnabled (false );
871
880
btnRemoveUnit .setEnabled (false );
872
- } else if (unitAssignments .containsKey (pid )) {
873
- btnAddUnit .setEnabled (false );
874
- btnRemoveUnit .setEnabled ((!hqView .getCampaign ().getCampaignOptions ().isTrackOriginalUnit () ||
875
- !unitAssignments .get (pid )
876
- .equals (hqView .getCampaign ().getPerson (pid ).getOriginalUnitId ())) ||
877
- btnEdit .isSelected ());
878
881
} else if (null != rdTracker .getPayout (pid ) && rdTracker .getPayout (pid ).getWeightClass () > 0 ) {
879
882
if (unitAssignmentTable .getSelectedRow () < 0 ) {
880
883
btnAddUnit .setEnabled (false );
@@ -1012,7 +1015,8 @@ public Object getCellEditorValue() {
1012
1015
}
1013
1016
1014
1017
@ Override
1015
- public Component getTableCellEditorComponent (JTable table , Object value , boolean isSelected , int row , int column ) {
1018
+ public Component getTableCellEditorComponent (JTable table , Object value , boolean isSelected , int row ,
1019
+ int column ) {
1016
1020
spinner .setValue (value );
1017
1021
return spinner ;
1018
1022
}
0 commit comments