package mekhq.gui.model; import java.awt.Color; import java.awt.Component; import java.awt.Image; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.UUID; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.AbstractTableModel; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.TableCellRenderer; import megamek.common.Jumpship; import megamek.common.SmallCraft; import megamek.common.UnitType; import mekhq.IconPackage; import mekhq.campaign.Campaign; import mekhq.campaign.unit.Unit; import mekhq.gui.BasicInfo; import mekhq.gui.dialog.RetirementDefectionDialog; public class UnitAssignmentTableModel extends AbstractTableModel { /** * */ private static final long serialVersionUID = 7740627991191879456L; public final static int COL_UNIT = 0; public final static int COL_CLASS = 1; public final static int COL_COST = 2; public final static int N_COL = 3; private final static String[] colNames = { "Unit", "Class", "Cost" }; private Campaign campaign; ArrayList<UUID> data; public UnitAssignmentTableModel(Campaign c) { this.campaign = c; data = new ArrayList<UUID>(); } public void setData(ArrayList<UUID> data) { this.data = data; fireTableDataChanged(); } @Override public int getRowCount() { return data.size(); } @Override public int getColumnCount() { return N_COL; } @Override public String getColumnName(int column) { return colNames[column]; } public int getColumnWidth(int c) { switch(c) { case COL_UNIT: return 125; case COL_COST: return 70; case COL_CLASS: default: return 20; } } public int getAlignment(int col) { switch(col) { case COL_UNIT: return SwingConstants.LEFT; case COL_COST: return SwingConstants.RIGHT; case COL_CLASS: default: return SwingConstants.CENTER; } } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public Class<?> getColumnClass(int col) { return getValueAt(0, col).getClass(); } @Override public Object getValueAt(int row, int col) { Unit u; DecimalFormat formatter = new DecimalFormat(); if(data.isEmpty()) { return ""; } else { u = campaign.getUnit(data.get(row)); } switch (col) { case COL_UNIT: if(null != u) { return u.getName(); } return "-"; case COL_CLASS: return RetirementDefectionDialog.weightClassIndex(u); case COL_COST: return formatter.format(u.getBuyCost()); default: return "?"; } } public Unit getUnit(int row) { return campaign.getUnit(data.get(row)); } public TableCellRenderer getRenderer(int col, IconPackage icons) { if (col == COL_UNIT) { return new VisualRenderer(icons); } else return new TextRenderer(); } public class TextRenderer extends DefaultTableCellRenderer { /** * */ private static final long serialVersionUID = -3368335772600192895L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); int actualCol = table.convertColumnIndexToModel(column); setHorizontalAlignment(getAlignment(actualCol)); setForeground(isSelected?Color.WHITE:Color.BLACK); if (isSelected) { setBackground(Color.DARK_GRAY); } else { // tiger stripes if ((row % 2) == 0) { setBackground(new Color(220, 220, 220)); } else { setBackground(Color.WHITE); } } return this; } } public class VisualRenderer extends BasicInfo implements TableCellRenderer { /** * */ private static final long serialVersionUID = 7261885081786958754L; public VisualRenderer(IconPackage icons) { super(icons); } public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { Component c = this; int actualCol = table.convertColumnIndexToModel(column); int actualRow = table.convertRowIndexToModel(row); Unit u = getUnit(actualRow); String color = "black"; if(isSelected) { color = "white"; } setText(getValueAt(actualRow, actualCol).toString(), color); if (actualCol == COL_UNIT) { if(null != u) { String desc = "<b>" + u.getName() + "</b><br>"; desc += u.getEntity().getWeightClassName(); if(!(u.getEntity() instanceof SmallCraft || u.getEntity() instanceof Jumpship)) { desc += " " + UnitType.getTypeDisplayableName(UnitType.determineUnitTypeCode(u.getEntity())); } desc += "<br>" + u.getStatus() + ""; setText(desc, color); Image mekImage = getImageFor(u); if(null != mekImage) { setImage(mekImage); } else { clearImage(); } } else { clearImage(); } } if (isSelected) { c.setBackground(Color.DARK_GRAY); } else { // tiger stripes if ((row % 2) == 0) { c.setBackground(new Color(220, 220, 220)); } else { c.setBackground(Color.WHITE); } } return c; } } }