package net.sf.openrocket.gui.preset;
import net.sf.openrocket.database.Database;
import net.sf.openrocket.database.DatabaseListener;
import net.sf.openrocket.database.Databases;
import net.sf.openrocket.gui.dialogs.CustomMaterialDialog;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.material.Material;
import net.sf.openrocket.startup.Application;
import javax.swing.DefaultComboBoxModel;
import javax.swing.SwingUtilities;
import java.awt.Component;
/**
* A material model specifically for presets.
*/
public class MaterialModel extends DefaultComboBoxModel implements DatabaseListener<Material> {
private static final String CUSTOM = "Custom";
private final Database<Material> database;
private static final Translator trans = Application.getTranslator();
private Material.Type type;
private Component parent;
public MaterialModel(Component theParent, Material.Type theType, Database<Material> materials) {
parent = theParent;
type = theType;
database = materials;
database.addDatabaseListener(this);
}
public MaterialModel(Component theParent, Material.Type theType) {
parent = theParent;
type = theType;
switch (type) {
case LINE:
this.database = Databases.LINE_MATERIAL;
break;
case BULK:
this.database = Databases.BULK_MATERIAL;
break;
case SURFACE:
this.database = Databases.SURFACE_MATERIAL;
break;
default:
throw new IllegalArgumentException("Unknown material type:" + type);
}
database.addDatabaseListener(this);
}
@Override
public void setSelectedItem(Object item) {
if (item == null) {
// Clear selection - huh?
return;
}
if (item == CUSTOM) {
// Open custom material dialog in the future, after combo box has closed
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
CustomMaterialDialog dialog = new CustomMaterialDialog(SwingUtilities.getWindowAncestor(parent), (Material) getSelectedItem(), true,
//// Define custom material
trans.get("MaterialModel.title.Defcustmat"));
dialog.setVisible(true);
if (!dialog.getOkClicked()) {
return;
}
Material material = dialog.getMaterial();
MaterialModel.super.setSelectedItem(material);
if (dialog.isAddSelected()) {
database.add(material);
}
}
});
}
else if (item instanceof Material) {
super.setSelectedItem(item);
}
else {
throw new IllegalArgumentException("Illegal item class " + item.getClass() +
" item=" + item);
}
}
@Override
public Object getElementAt(int index) {
if (index == database.size()) {
return CUSTOM;
}
else if (index >= database.size() + 1) {
return null;
}
return database.get(index);
}
@Override
public int getSize() {
return database.size() + 1;
}
//////// Change listeners
@Override
public void elementAdded(Material element, Database<Material> source) {
this.fireContentsChanged(this, 0, database.size());
}
@Override
public void elementRemoved(Material element, Database<Material> source) {
this.fireContentsChanged(this, 0, database.size());
}
public Material.Type getType() {
return type;
}
public void removeListener() {
database.removeChangeListener(this);
}
}