package net.sf.openrocket.gui.main.flightconfigpanel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
import net.sf.openrocket.rocketcomponent.FlightConfigurableComponent;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.Pair;
public class FlightConfigurableTableModel<T extends FlightConfigurableComponent> extends AbstractTableModel implements ComponentChangeListener{
private static final Translator trans = Application.getTranslator();
private static final String CONFIGURATION = trans.get("edtmotorconfdlg.col.configuration");
protected final Rocket rocket;
protected final Class<T> clazz;
private final List<T> components = new ArrayList<T>();
public FlightConfigurableTableModel(Class<T> clazz, Rocket rocket) {
super();
this.rocket = rocket;
this.clazz = clazz;
this.rocket.addComponentChangeListener(this);
initialize();
}
@Override
public void componentChanged(ComponentChangeEvent e) {
if ( e.isMotorChange() || e.isTreeChange() ) {
initialize();
fireTableStructureChanged();
}
}
/**
* Return true if this component should be included in the table.
* @param component
* @return
*/
protected boolean includeComponent( T component ) {
return true;
}
protected void initialize() {
components.clear();
Iterator<RocketComponent> it = rocket.iterator();
while (it.hasNext()) {
RocketComponent c = it.next();
if (clazz.isAssignableFrom(c.getClass()) && includeComponent( (T) c) ) {
components.add( (T) c);
}
}
}
@Override
public int getRowCount() {
return rocket.getFlightConfigurationIDs().length - 1;
}
@Override
public int getColumnCount() {
return components.size() + 1;
}
@Override
public Object getValueAt(int row, int column) {
String id = getConfiguration(row);
switch (column) {
case 0: {
return id;
}
default: {
int index = column - 1;
T d = components.get(index);
return new Pair<String, T>(id, d);
}
}
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0: {
return CONFIGURATION;
}
default: {
int index = column - 1;
T d = components.get(index);
return d.toString();
}
}
}
private String getConfiguration(int row) {
String id = rocket.getFlightConfigurationIDs()[row + 1];
return id;
}
}