package net.sf.openrocket.gui.adaptors;
import java.awt.Component;
import java.util.List;
import javax.swing.AbstractListModel;
import javax.swing.ComboBoxModel;
import javax.swing.SwingUtilities;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import net.sf.openrocket.database.Database;
import net.sf.openrocket.database.DatabaseListener;
import net.sf.openrocket.document.OpenRocketDocument;
import net.sf.openrocket.gui.dialogs.preset.ComponentPresetChooserDialog;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.logging.Markers;
import net.sf.openrocket.preset.ComponentPreset;
import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
import net.sf.openrocket.rocketcomponent.ComponentChangeListener;
import net.sf.openrocket.rocketcomponent.RocketComponent;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.util.BugException;
public class PresetModel extends AbstractListModel implements ComboBoxModel, ComponentChangeListener, DatabaseListener<ComponentPreset> {
private static final Logger log = LoggerFactory.getLogger(PresetModel.class);
private static final Translator trans = Application.getTranslator();
private static final String NONE_SELECTED = trans.get("lbl.select");
private static final String SELECT_DATABASE = trans.get("lbl.database");
private final Component parent;
private final RocketComponent component;
private final OpenRocketDocument document;
private ComponentPreset previousPreset;
private List<ComponentPreset> presets;
public PresetModel(Component parent, OpenRocketDocument document, RocketComponent component) {
this.parent = parent;
this.document = document;
presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
this.component = component;
previousPreset = component.getPresetComponent();
component.addComponentChangeListener(this);
}
@Override
public int getSize() {
return presets.size() + 2;
}
@Override
public Object getElementAt(int index) {
if (index == 0) {
return NONE_SELECTED;
}
if (index == getSize() - 1) {
return SELECT_DATABASE;
}
return presets.get(index - 1);
}
@Override
public void setSelectedItem(Object item) {
log.info(Markers.USER_MARKER, "User selected preset item '" + item + "' for component " + component);
if (item == null) {
throw new BugException("item is null");
} else if (item.equals(NONE_SELECTED)) {
component.clearPreset();
} else if (item.equals(SELECT_DATABASE)) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
ComponentPresetChooserDialog dialog =
new ComponentPresetChooserDialog(SwingUtilities.getWindowAncestor(parent), component);
dialog.setVisible(true);
ComponentPreset preset = dialog.getSelectedComponentPreset();
if (preset != null) {
setSelectedItem(preset);
}
}
});
} else {
document.addUndoPosition("Use Preset " + component.getComponentName());
component.loadPreset((ComponentPreset) item);
}
}
@Override
public Object getSelectedItem() {
ComponentPreset preset = component.getPresetComponent();
if (preset == null) {
return NONE_SELECTED;
} else {
return preset;
}
}
@Override
public void componentChanged(ComponentChangeEvent e) {
if (previousPreset != component.getPresetComponent()) {
previousPreset = component.getPresetComponent();
fireContentsChanged(this, 0, getSize());
}
}
@Override
public void elementAdded(ComponentPreset element, Database<ComponentPreset> source) {
presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
this.fireContentsChanged(this, 0, getSize());
}
@Override
public void elementRemoved(ComponentPreset element, Database<ComponentPreset> source) {
presets = Application.getComponentPresetDao().listForType(component.getPresetType(), true);
this.fireContentsChanged(this, 0, getSize());
}
}