package mekhq.gui.dialog; import java.awt.Component; import java.awt.Container; import java.awt.Dimension; import java.awt.Frame; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.util.ArrayList; import java.util.List; import java.util.Objects; import java.util.ResourceBundle; import java.util.TreeMap; import javax.swing.AbstractAction; import javax.swing.AbstractListModel; import javax.swing.DefaultListCellRenderer; import javax.swing.JButton; import javax.swing.JDialog; import javax.swing.JList; import javax.swing.JScrollPane; import org.joda.time.DateTime; import megamek.common.util.EncodeControl; import mekhq.campaign.universe.Era; import mekhq.campaign.universe.Faction; public class ChooseFactionsDialog extends JDialog { private static final long serialVersionUID = 805616085217507489L; private DateTime date; ResourceBundle resourceMap; private JList<Faction> factionList; private List<String> result; private boolean changed; public ChooseFactionsDialog(Frame parent, DateTime date, List<String> defaults) { this(parent, date, defaults, true); } public ChooseFactionsDialog(Frame parent, DateTime date, List<String> defaults, boolean modal) { super(parent, modal); this.date = Objects.requireNonNull(date); this.result = defaults; this.changed = false; initComponents(); setLocationRelativeTo(parent); } protected void initComponents() { resourceMap = ResourceBundle.getBundle("mekhq.resources.ChooseFactionsDialog", new EncodeControl()); //$NON-NLS-1$ setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); setName("form"); //$NON-NLS-1$ setTitle(resourceMap.getString("Form.title")); //$NON-NLS-1$ setMinimumSize(new Dimension(400, 500)); final Container content = getContentPane(); content.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridx = 0; gbc.gridy = 0; gbc.gridwidth = 2; gbc.weightx = 1.0; gbc.weighty = 1.0; gbc.fill = GridBagConstraints.BOTH; JScrollPane scrollPane = new JScrollPane(); factionList = new JList<>(new FactionListModel(date)); factionList.setCellRenderer(new DefaultListCellRenderer(){ private static final long serialVersionUID = -2504011562223561964L; @Override public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) { DefaultListCellRenderer result = (DefaultListCellRenderer) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if(value instanceof Faction) { result.setText(((Faction)value).getFullName(Era.getEra(date.getYear()))); } return result; } }); scrollPane.setViewportView(factionList); content.add(scrollPane, gbc); gbc.gridy = 1; gbc.gridwidth = 1; gbc.weighty = 0.0; gbc.anchor = GridBagConstraints.WEST; gbc.fill = GridBagConstraints.NONE; content.add(new JButton(new AbstractAction(resourceMap.getString("ok.label")) { //$NON-NLS-1$ private static final long serialVersionUID = -8920630119126015954L; @Override public void actionPerformed(ActionEvent e) { result = new ArrayList<>(); for(Faction faction : factionList.getSelectedValuesList()) { result.add(faction.getShortName()); } changed = true; setVisible(false); } }), gbc); gbc.gridx = 1; gbc.anchor = GridBagConstraints.EAST; content.add(new JButton(new AbstractAction(resourceMap.getString("cancel.label")){ //$NON-NLS-1$ private static final long serialVersionUID = -8920630119126015955L; @Override public void actionPerformed(ActionEvent e) { setVisible(false); } }), gbc); pack(); } public List<String> getResult() { return result; } public boolean isChanged() { return changed; } private static class FactionListModel extends AbstractListModel<Faction> { private static final long serialVersionUID = 2779479232585980171L; private TreeMap<String, Faction> factionMap = new TreeMap<>(); private List<String> names; public FactionListModel(DateTime date) { int era = Era.getEra(date.getYear()); for(Faction faction : Faction.getFactions()) { factionMap.put(faction.getFullName(era), faction); } names = new ArrayList<>(factionMap.navigableKeySet()); } @Override public int getSize() { return names.size(); } @Override public Faction getElementAt(int index) { return factionMap.get(names.get(index)); } } }