package pipe.gui;
import javax.swing.table.AbstractTableModel;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
/**
*
* @param <D> table row datum item
*/
@SuppressWarnings("serial")
public abstract class AbstractComponentTableModel<D extends AbstractDatum> extends AbstractTableModel {
/**
* Number of non-empty rows
*/
protected int count = 0;
/**
* Maximum number of items to be shown
*/
protected static final int DATA_SIZE = 100;
/**
* Data in the table once it has been modified.
*/
protected final List<D> modifiedData = new ArrayList<>();
/**
* Data that has been deleted from the table
*/
protected final Collection<D> deletedData = new HashSet<>();
/**
* Names of columns in table to appear in order
*/
protected String[] columnNames;
/**
*
* @param col column
* @return the name for the column
*/
@Override
public final String getColumnName(int col) {
return columnNames[col];
}
/**
*
* @param row of the table
* @param col column of the table
* @return true for all cells
*/
@Override
public final boolean isCellEditable(int row, int col) {
return true;
}
/**
*
* @return number of rows
*/
@Override
public final int getRowCount() {
return modifiedData.size();
}
/**
*
* @return number of columns
*/
@Override
public final int getColumnCount() {
return columnNames.length;
}
/**
* @param datum datum to check in model
* @return true if the row being edited is an existing component in the Petri net
*/
protected final boolean isExistingDatum(D datum) {
return datum.initial != null;
}
/**
*
* @return table data
*/
public final List<D> getTableData() {
return modifiedData;
}
/**
* Deletes the row from the model
* @param row of the table
*/
public final void deleteRow(int row) {
if (isExistingDatum(modifiedData.get(row))) {
deletedData.add(modifiedData.get(row));
count--;
}
modifiedData.remove(row);
fireTableRowsDeleted(row, row);
}
/**
*
* @return all deleted rows
*/
public final Collection<D> getDeletedData() {
return deletedData;
}
/**
*
* Updates the value in the table a (rowIndex, colIndex) with value
*
* @param value of the cell
* @param rowIndex index in row
* @param colIndex index in column
*/
@Override
public final void setValueAt(Object value, int rowIndex, int colIndex) {
D datum = modifiedData.get(rowIndex);
updateTableAt(value, rowIndex, colIndex);
if (!isExistingDatum(datum) && !datum.id.isEmpty()) {
count++;
}
fireTableCellUpdated(rowIndex, colIndex);
}
/**
*
* Inherited method for updating the actual item
*
* @param value of the cell
* @param rowIndex index in row
* @param colIndex index in column
*/
protected abstract void updateTableAt(Object value, int rowIndex, int colIndex);
}