package elw.dp.app;
import elw.dp.mips.Instruction;
import elw.dp.mips.Instructions;
import elw.dp.mips.asm.Data;
import javax.swing.table.AbstractTableModel;
public class InstructionsTableModel extends AbstractTableModel {
public static final String COL_ADDR = "Addr";
private static final String COL_BIN = "Bin";
private static final String COL_LABELS = "Labels";
public static final String COL_CODE = "Code";
public static final String COL_ACC = "rw";
private final String[] columns = new String[]{COL_ACC, COL_ADDR, COL_BIN, COL_CODE, COL_LABELS};
private final Instructions instructions;
public InstructionsTableModel(Instructions instructions) {
this.instructions = instructions;
}
public String getColumnName(int column) {
return columns[column];
}
public int getColumnCount() {
return columns.length;
}
public int getRowCount() {
return instructions.getSize();
}
public Object getValueAt(int rowIndex, int columnIndex) {
final String colName = columns[columnIndex];
final int address = instructions.getAddressAt(rowIndex);
if (COL_ADDR.equals(colName)) {
return Data.int2hex(address, 2);
} else if (COL_BIN.equals(colName)) {
final Instruction internal = instructions.getInternal(address);
if (internal != null) {
final String code = internal.getBinaryCode();
return groupBy(code, 4);
}
} else if (COL_CODE.equals(colName)) {
final Instruction internal = instructions.getInternal(address);
if (internal != null) {
return internal.getCodeLine();
}
} else if (COL_ACC.equals(colName)) {
return getAccessMod(address);
} else if (COL_LABELS.equals(colName)) {
final Instruction internal = instructions.getInternal(address);
if (internal != null) {
StringBuilder labelsStr = new StringBuilder();
for (String label : internal.getLabels()) {
if (labelsStr.length() > 0) {
labelsStr.append(", ");
}
labelsStr.append(label);
}
return labelsStr.toString();
}
}
return "";
}
private String groupBy(final String code, final int group) {
if (code.length() > group) {
return code.substring(0, group) + " " + groupBy(code.substring(group), group);
}
return code;
}
private String getAccessMod(int rowIndex) {
StringBuffer accessMod = new StringBuffer();
if (instructions.getReadAddresses().contains(rowIndex)) {
accessMod.append("r");
}
return accessMod.toString();
}
}