package husacct.validate.presentation.tableModels;
import husacct.ServiceProvider;
import husacct.validate.presentation.ColorRenderer;
import java.awt.Color;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
public class ColorTableModel extends AbstractTableModel {
private static final long serialVersionUID = 2492345975488386436L;
private Vector<Object> dataVector = new Vector<Object>();
private String columnNames[] = {ServiceProvider.getInstance().getLocaleService().getTranslatedString("SeverityName"), ServiceProvider.getInstance().getLocaleService().getTranslatedString("Color")};
private Class<?>[] types = new Class[] {String.class, JButton.class};
private boolean[] canEdit = new boolean[] {false, true};
private List<Color> rowColours = new ArrayList<Color>();
@Override
public Class<?> getColumnClass(int columnIndex) {
return types[columnIndex];
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return canEdit[columnIndex];
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public int getRowCount() {
return dataVector.size();
}
@Override
public Object getValueAt(int row, int column) {
Vector<?> rowVector = (Vector<?>) dataVector.elementAt(row);
return rowVector.elementAt(column);
}
@Override
public void setValueAt(Object value, int row, int column) {
Vector<Object> rowVector = (Vector<Object>) dataVector.elementAt(row);
rowVector.setElementAt(value, column);
fireTableRowsUpdated(row, row);
}
public void setColorEditor(JTable table, int columnNumber) {
TableColumn column = table.getColumnModel().getColumn(columnNumber);
TableCellEditor editor = new ColorChooserEditor();
column.setCellEditor(editor);
column.setCellRenderer(new ColorRenderer(true));
}
protected static Vector<Object> convertToVector(Object[] anArray) {
if (anArray == null) {
return null;
}
Vector<Object> v = new Vector<Object>(anArray.length);
for (int i = 0; i < anArray.length; i++) {
v.addElement(anArray[i]);
}
return v;
}
private void justifyRows(int from, int to) {
dataVector.setSize(getRowCount());
for (int i = from; i < to; i++) {
if (dataVector.elementAt(i) == null) {
dataVector.setElementAt(new Vector<Object>(), i);
}
((Vector<?>) dataVector.elementAt(i)).setSize(getColumnCount());
}
}
public void addRow(Vector<Object> rowData) {
insertRow(getRowCount(), rowData);
}
public void addRow(Object[] rowData) {
addRow(convertToVector(rowData));
}
public void insertRow(int row, Vector<Object> rowData) {
dataVector.insertElementAt(rowData, row);
justifyRows(row, row + 1);
fireTableRowsInserted(row, row);
}
public void insertRow(int row, Object[] rowData) {
insertRow(row, convertToVector(rowData));
}
private static int gcd(int i, int j) {
return (j == 0) ? i : gcd(j, i % j);
}
private static void rotate(Vector<Object> v, int a, int b, int shift) {
int size = b - a;
int r = size - shift;
int g = gcd(size, r);
for (int i = 0; i < g; i++) {
int to = i;
Object tmp = v.elementAt(a + to);
for (int from = (to + r) % size; from != i; from = (to + r) % size) {
v.setElementAt(v.elementAt(a + from), a + to);
to = from;
}
v.setElementAt(tmp, a + to);
}
}
public void moveRow(int start, int end, int to) {
int shift = to - start;
int first, last;
if (shift < 0) {
first = to;
last = end;
} else {
first = start;
last = to + end - start;
}
rotate(dataVector, first, last + 1, shift);
fireTableRowsUpdated(first, last);
}
public void removeRow(int row) {
dataVector.removeElementAt(row);
fireTableRowsDeleted(row, row);
}
public void setRowColour(int row, Color c) {
rowColours.add(c);
fireTableRowsUpdated(row, row);
}
public Color getRowColour(int row) {
return rowColours.get(row);
}
}