package open.dolphin.table;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.swing.table.AbstractTableModel;
/**
*
* @author Kazushi Minagawa, Digital Globe, Inc.
* @param <T>
*/
public class ListTableModel<T> extends AbstractTableModel {
public static final String COLLECTION_CHANGED = "collectionChanged";
private String[] columnNames;
private int startNumRows;
private String[] propNames;
private Class[] columnClasses;
private List<T> dataProvider = new ArrayList<>();
private PropertyChangeSupport boundSupport;
public ListTableModel(String[] columnNames, int startNumRows) {
super();
this.columnNames = columnNames;
this.startNumRows = startNumRows;
}
public ListTableModel(String[] columnNames, int startNumRows, String[] propNames, Class[] columnClasses) {
this(columnNames, startNumRows);
this.propNames = propNames;
this.columnClasses = columnClasses;
}
public void addPropertyChangeListener(PropertyChangeListener l) {
if (boundSupport == null) {
boundSupport = new PropertyChangeSupport(this);
}
boundSupport.addPropertyChangeListener(l);
}
public void removePropertyChangeListener(PropertyChangeListener l) {
if (boundSupport != null) {
boundSupport.removePropertyChangeListener(l);
}
}
@Override
public int getRowCount() {
return (dataProvider != null && dataProvider.size() > startNumRows)
? dataProvider.size()
: startNumRows;
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public String getColumnName(int index) {
return (columnNames != null && index < columnNames.length)
? columnNames[index]
: null;
}
@Override
public Class getColumnClass(int index) {
return (columnClasses != null && index < columnClasses.length) ? columnClasses[index]
: Object.class;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
T object = getObject(rowIndex);
//minagawa^
if (propNames==null || propNames[columnIndex]==null) {
return (Object) object;
}
//minagawa$
if (object != null) {
try {
String prop = propNames[columnIndex];
StringBuilder sb = new StringBuilder();
if (prop.startsWith("get") || prop.startsWith("is")) {
sb.append(prop);
} else {
sb.append("get");
sb.append(prop.substring(0,1).toUpperCase());
sb.append(prop.substring(1));
}
prop = sb.toString();
Method targetMethod = object.getClass().getMethod(prop, (Class[]) null);
return targetMethod.invoke(object, (Object[]) null);
} catch (NoSuchMethodException | SecurityException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace(System.err);
}
}
return null;
}
public List<T> getDataProvider() {
return dataProvider;
}
public void setDataProvider(List<T> dataProvider) {
List<T> oldList = this.dataProvider;
if (oldList != null) {
oldList.clear();
}
this.dataProvider = dataProvider;
this.fireTableDataChanged();
if (boundSupport != null && oldList != this.dataProvider) {
boundSupport.firePropertyChange(COLLECTION_CHANGED, oldList, this.dataProvider);
}
}
public void clear() {
if (dataProvider != null) {
dataProvider.clear();
this.fireTableDataChanged();
}
}
public void addObject(T obj) {
if (dataProvider != null) {
dataProvider.add(obj);
this.fireTableDataChanged();
}
}
public void addObject(int row, T obj) {
if (dataProvider != null) {
try {
dataProvider.add(row, obj);
this.fireTableDataChanged();
} catch (Exception e) {
}
}
}
public void addAll(Collection<T> c) {
if (dataProvider != null) {
try {
dataProvider.addAll(c);
this.fireTableDataChanged();
} catch (Exception e) {
}
}
}
public void deleteAt(int row) {
if (dataProvider != null) {
try {
dataProvider.remove(row);
this.fireTableDataChanged();
} catch (Exception e) {
}
}
}
public void delete(T obj) {
if (dataProvider != null) {
try {
dataProvider.remove(obj);
this.fireTableDataChanged();
} catch (Exception e) {
}
}
}
public void moveRow(int from, int to) {
if (! isValidRow(from) || ! isValidRow(to)) {
return;
}
if (from == to) {
return;
}
T move = dataProvider.remove(from);
dataProvider.add(to, move);
this.fireTableDataChanged();
}
public int getObjectCount() {
return dataProvider != null ? dataProvider.size() : 0;
}
public T getObject(int row) {
return isValidRow(row) ? dataProvider.get(row) : null;
}
public void setColumnName(String columnName, int col) {
if (col >=0 && col < columnNames.length) {
columnNames[col] = columnName;
this.fireTableStructureChanged();
}
}
public void setColumnNames(String[] newNames) {
if (newNames!=null) {
this.columnNames = newNames;
this.fireTableStructureChanged();
}
}
public void setProperty(String prop, int col) {
if (propNames != null && col >=0 && col < propNames.length) {
propNames[col] = prop;
if(dataProvider != null) {
this.fireTableDataChanged();
}
}
}
public boolean isValidRow(int row) {
return (dataProvider != null &&
(!dataProvider.isEmpty()) &&
row >= 0 &&
row < dataProvider.size() );
}
//masuda^
public void setObject(int row, T obj) {
if (dataProvider != null) {
try {
dataProvider.set(row, obj);
this.fireTableDataChanged();
} catch (Exception e) {
}
}
}
public String getProperty(int col) {
if (propNames != null && col >= 0 && col < propNames.length) {
return propNames[col];
}
return null;
}
//masuda$
}