package gui;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
import javax.swing.table.DefaultTableModel;
import database.DatabaseItem;
import database.DatabaseModel;
import database.DatabaseProperty;
public class DatabaseTableModel extends DefaultTableModel {
/**
*
*/
private static final long serialVersionUID = 9048042861984139507L;
private List<DatabaseItem> _databaseItems;
private DatabaseModel _model;
public DatabaseTableModel (DatabaseModel model)
{
super();
_databaseItems = new ArrayList<DatabaseItem>();
_model = model;
this.addColumn("Item Name");
// Add any existing properties and items
for (DatabaseProperty property : _model.getPropertyList()) {
this.addProperty(property);
}
for (DatabaseItem item : _model.getItemList()) {
this.addItem(item);
}
}
@Override
public boolean isCellEditable(int row, int column)
{
DatabaseItem item = _databaseItems.get(row);
String propertyName = this.getColumnName(column);
if(propertyName.equals("Item Name"))
return false;
DatabaseProperty property = item.getPropertyValue(propertyName);
if(property == null)
return false;
else
return property.isTableElementEditable();
}
@Override
public Object getValueAt(int row, int column)
{
DatabaseItem item = _databaseItems.get(row);
String propertyName = this.getColumnName(column);
if(propertyName.equals("Item Name"))
return item.getName();
DatabaseProperty property = item.getPropertyValue(propertyName);
if(property == null) {
property = _model.getPropertyValue(propertyName);
if(property.isTableElementEditable())
return property.getTableElement();
else
return "...";
}
else if(!property.isTableElementEditable())
return "...";
else
return property.getTableElement();
}
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Class getColumnClass(int column)
{
String propertyName = this.getColumnName(column);
if(propertyName.equals("Item Name"))
return String.class;
DatabaseProperty property = _model.getPropertyValue(propertyName);
if(property.isTableElementEditable())
return property.getTableElement().getClass();
else
return String.class;
}
@Override
public void setValueAt(Object aValue, int row, int column)
{
DatabaseItem item = _databaseItems.get(row);
String propertyName = this.getColumnName(column);
DatabaseProperty property = item.getPropertyValue(propertyName);
if(property != null)
property.setTableElement(aValue);
}
public void addProperty(DatabaseProperty newProperty) {
//Object[] properties = new Object[getRowCount()];
this.addColumn(newProperty.getName());
}
@SuppressWarnings("rawtypes")
public void removeProperty(DatabaseProperty propertyToRemove) {
int column = this.findColumn(propertyToRemove.getName());
if (column != -1) {
columnIdentifiers.remove(column);
for (Object row : this.dataVector) {
((Vector)row).remove(column);
}
this.fireTableStructureChanged();
}
}
public void addItem(DatabaseItem newItem) {
// First construct the array of the properties
_databaseItems.add(newItem);
Object[] properties = new Object[getColumnCount()];
for(int i = 0; i < getColumnCount(); i++) {
String propertyName = getColumnName(i);
properties[i] = newItem.getPropertyValue(propertyName);
}
this.addRow(properties);
}
public void removeItem(DatabaseItem itemToRemove) {
int rowToRemove = _databaseItems.indexOf(itemToRemove);
if (rowToRemove != -1)
this.removeRow(rowToRemove);
_databaseItems.remove(itemToRemove);
}
public DatabaseItem getSelectedItem(int row) {
return _databaseItems.get(row);
}
public DatabaseProperty selectProperty(int row, int column) {
DatabaseItem item = _databaseItems.get(row);
String propertyName = this.getColumnName(column);
if(propertyName.equals("Item Name"))
return null;
DatabaseProperty property = item.getPropertyValue(propertyName);
if(property == null) {
property = _model.createInstance(propertyName);
item.addProperty(propertyName, property);
}
property.update(_model);
return property;
}
}