package mekhq.gui.model; import java.awt.Component; import java.text.DecimalFormat; import java.util.ArrayList; import javax.swing.JTable; import javax.swing.SwingConstants; import javax.swing.table.DefaultTableCellRenderer; import megamek.common.TargetRoll; import mekhq.campaign.Campaign; import mekhq.campaign.work.IAcquisitionWork; /** * A table model for displaying acquisitions. Unlike the other table models here, this one * can apply to multiple tables and so we have to be more careful in its design */ public class ProcurementTableModel extends DataTableModel { private static final long serialVersionUID = 534443424190075264L; Campaign campaign; public final static int COL_NAME = 0; public final static int COL_COST = 1; public final static int COL_TARGET = 2; public final static int COL_NEXT = 3; public final static int COL_QUEUE = 4; public final static int N_COL = 5; public ProcurementTableModel(Campaign c) { data = new ArrayList<IAcquisitionWork>(); campaign = c; } public int getRowCount() { return data.size(); } public int getColumnCount() { return N_COL; } @Override public String getColumnName(int column) { switch(column) { case COL_NAME: return "Name"; case COL_COST: return "Cost"; case COL_TARGET: return "Target"; case COL_QUEUE: return "Quantity"; case COL_NEXT: return "Next Check"; default: return "?"; } } public void incrementItem(int row) { ((IAcquisitionWork)data.get(row)).incrementQuantity(); this.fireTableCellUpdated(row, COL_QUEUE); } public void decrementItem(int row) { ((IAcquisitionWork)data.get(row)).decrementQuantity(); this.fireTableCellUpdated(row, COL_QUEUE); } public void removeRow(int row) { getCampaign().getShoppingList().removeItem(getNewEquipmentAt(row)); } public Object getValueAt(int row, int col) { //Part part; IAcquisitionWork shoppingItem; if(data.isEmpty()) { return ""; } else { //part = getNewPartAt(row); shoppingItem = getAcquisition(row); } if(null == shoppingItem) { return "?"; } if(col == COL_NAME) { return shoppingItem.getAcquisitionName(); } if(col == COL_COST) { return DecimalFormat.getInstance().format(shoppingItem.getBuyCost()); } if(col == COL_TARGET) { TargetRoll target = getCampaign().getTargetForAcquisition(shoppingItem, getCampaign().getLogisticsPerson(), false); String value = target.getValueAsString(); if(target.getValue() != TargetRoll.IMPOSSIBLE && target.getValue() != TargetRoll.AUTOMATIC_SUCCESS && target.getValue() != TargetRoll.AUTOMATIC_FAIL) { value += "+"; } return value; } if(col == COL_QUEUE) { return shoppingItem.getQuantity(); } if(col == COL_NEXT) { int days = shoppingItem.getDaysToWait(); String dayName = " day"; if(days != 1) { dayName += "s"; } return days + dayName; } return "?"; } @Override public boolean isCellEditable(int row, int col) { return false; } @Override public Class<? extends Object> getColumnClass(int c) { return getValueAt(0, c).getClass(); } public Object getNewEquipmentAt(int row) { return ((IAcquisitionWork) data.get(row)).getNewEquipment(); } public IAcquisitionWork getAcquisition(int row) { return (IAcquisitionWork) data.get(row); } public int getColumnWidth(int c) { switch(c) { case COL_NAME: return 200; case COL_COST: case COL_TARGET: case COL_NEXT: return 40; default: return 15; } } public int getAlignment(int col) { switch(col) { case COL_COST: return SwingConstants.RIGHT; case COL_TARGET: case COL_NEXT: return SwingConstants.CENTER; default: return SwingConstants.LEFT; } } public String getTooltip(int row, int col) { //Part part; IAcquisitionWork shoppingItem; if(data.isEmpty()) { return null; } else { //part = getNewPartAt(row); shoppingItem = getAcquisition(row); } if(null ==shoppingItem) { return null; } switch(col) { case COL_TARGET: TargetRoll target = getCampaign().getTargetForAcquisition(shoppingItem, getCampaign().getLogisticsPerson(), false); return target.getDesc(); default: return "<html>You can increase or decrease the quantity with the left/right arrows keys or the plus/minus keys.<br>Quantities reduced to zero will remain on the list until the next procurement cycle.</html>"; } } private Campaign getCampaign() { return campaign; } public ProcurementTableModel.Renderer getRenderer() { return new ProcurementTableModel.Renderer(); } public class Renderer extends DefaultTableCellRenderer { private static final long serialVersionUID = 9054581142945717303L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); setOpaque(true); int actualCol = table.convertColumnIndexToModel(column); int actualRow = table.convertRowIndexToModel(row); setHorizontalAlignment(getAlignment(actualCol)); setToolTipText(getTooltip(actualRow, actualCol)); return this; } } }