package husacct.validate.presentation.tableModels;
import husacct.validate.domain.validation.Severity;
import java.util.List;
import java.util.Vector;
import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.table.AbstractTableModel;
public class ComboBoxTableModel extends AbstractTableModel {
private static final long serialVersionUID = -7158951096196307267L;
private Vector dataVector;
private Vector columnIdentifiers;
private DefaultCellEditor editor;
private List<Severity> comboboxValues;
private Object[] columnNames = {};
public DefaultCellEditor getEditor() {
return editor;
}
public void setComboboxValues(List<Severity> comboboxValues) {
this.comboboxValues = comboboxValues;
}
public ComboBoxTableModel(Vector columnNames, int rowCount) {
setDataVector(newVector(rowCount), columnNames);
}
public ComboBoxTableModel(Object[] columnNames, int rowCount, List<Severity> comboboxValues) {
this(convertToVector(columnNames), rowCount);
this.columnNames = columnNames;
this.comboboxValues = comboboxValues;
JComboBox comboBox = new JComboBox();// comboboxValues);
for (Severity severity : comboboxValues) {
comboBox.addItem(severity);
}
comboBox.setEditable(true);
editor = new DefaultCellEditor(comboBox);
}
Class<?>[] types;
Boolean[] canEdit;
@Override
public Class<?> getColumnClass(int columnIndex) {
return types[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit[columnIndex];
}
@Override
public int getRowCount() {
return dataVector.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int row, int column) {
Vector rowVector = (Vector) dataVector.elementAt(row);
return rowVector.elementAt(column);
}
@Override
public String getColumnName(int column) {
return (String) columnNames[column];
}
@Override
public void setValueAt(Object value, int row, int column) {
if (isValidValue(value)) {
Vector rowVector = (Vector) dataVector.elementAt(row);
rowVector.setElementAt(value, column);
fireTableRowsUpdated(row, row);
}
}
protected boolean isValidValue(Object value) {
Object sValue = value;
for (int i = 0; i < comboboxValues.size(); i++) {
if (sValue.equals(comboboxValues.get(i))) {
return true;
}
}
return false;
}
protected static Vector convertToVector(Object[] anArray) {
if (anArray == null) {
return null;
}
Vector v = new Vector(anArray.length);
for (int i = 0; i < anArray.length; i++) {
v.addElement(anArray[i]);
}
return v;
}
private static Vector newVector(int size) {
Vector v = new Vector(size);
v.setSize(size);
return v;
}
public final void setDataVector(Vector dataVector, Vector columnIdentifiers) {
this.dataVector = nonNullVector(dataVector);
this.columnIdentifiers = nonNullVector(columnIdentifiers);
justifyRows(0, getRowCount());
fireTableStructureChanged();
}
private static Vector nonNullVector(Vector v) {
return (v != null) ? v : new Vector();
}
public void checkValuesAreValid() {
for (int i = 0; i < getRowCount(); i++) {
boolean b = false;
for (Severity value : comboboxValues) {
if (value.equals(getValueAt(i, 1))) {
b = true;
}
}
if (!b) {
setValueAt(comboboxValues.get(0), i, 1);
}
}
}
private void justifyRows(int from, int to) {
dataVector.setSize(getRowCount());
for (int i = from; i < to; i++) {
if (comboboxValues.contains(dataVector.elementAt(i))) {
dataVector.setElementAt(new Vector(), i);
}
((Vector) dataVector.elementAt(i)).setSize(getColumnCount());
}
}
public void addRow(Vector rowData) {
insertRow(getRowCount(), rowData);
}
public void addRow(Object[] rowData) {
addRow(convertToVector(rowData));
}
public void insertRow(int row, Vector rowData) {
dataVector.insertElementAt(rowData, row);
justifyRows(row, row + 1);
fireTableRowsInserted(row, row);
}
public void insertRow(int row, Object[] rowData) {
insertRow(row, convertToVector(rowData));
}
public void removeRow(int row) {
dataVector.removeElementAt(row);
fireTableRowsDeleted(row, row);
}
public void setTypes(Class<?>[] types) {
this.types = types;
}
public void setCanEdit(Boolean[] canEdit) {
this.canEdit = canEdit;
}
public void clear() {
int rows = getRowCount();
while (0 < rows) {
removeRow(0);
rows--;
}
}
}