package net.sf.openrocket.gui.main.flightconfigpanel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import net.sf.openrocket.formatting.RocketDescriptor;
import net.sf.openrocket.gui.dialogs.flightconfiguration.SeparationSelectionDialog;
import net.sf.openrocket.l10n.Translator;
import net.sf.openrocket.rocketcomponent.Rocket;
import net.sf.openrocket.rocketcomponent.Stage;
import net.sf.openrocket.rocketcomponent.StageSeparationConfiguration;
import net.sf.openrocket.startup.Application;
import net.sf.openrocket.unit.UnitGroup;
public class SeparationConfigurationPanel extends FlightConfigurablePanel<Stage> {
static final Translator trans = Application.getTranslator();
private RocketDescriptor descriptor = Application.getInjector().getInstance(RocketDescriptor.class);
private FlightConfigurableTableModel<Stage> separationTableModel;
private final JButton selectSeparationButton;
private final JButton resetDeploymentButton;
SeparationConfigurationPanel(FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) {
super(flightConfigurationPanel,rocket);
JScrollPane scroll = new JScrollPane(table);
this.add(scroll, "span, grow, wrap");
//// Select deployment
selectSeparationButton = new JButton(trans.get("edtmotorconfdlg.but.Selectseparation"));
selectSeparationButton.setEnabled(false);
selectSeparationButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
selectDeployment();
}
});
this.add(selectSeparationButton, "split, align right, sizegroup button");
//// Reset deployment
resetDeploymentButton = new JButton(trans.get("edtmotorconfdlg.but.Resetseparation"));
resetDeploymentButton.setEnabled(false);
resetDeploymentButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
resetDeployment();
}
});
this.add(resetDeploymentButton, "sizegroup button, wrap");
}
@Override
protected JTable initializeTable() {
//// Separation selection
separationTableModel = new FlightConfigurableTableModel<Stage>(Stage.class, rocket) {
@Override
protected boolean includeComponent(Stage component) {
return component.getStageNumber() > 0;
}
};
JTable separationTable = new JTable(separationTableModel);
separationTable.getTableHeader().setReorderingAllowed(false);
separationTable.setCellSelectionEnabled(true);
separationTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
separationTable.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
updateButtonState();
if (e.getClickCount() == 2) {
// Double-click edits
selectDeployment();
}
}
});
separationTable.setDefaultRenderer(Object.class, new SeparationTableCellRenderer());
return separationTable;
}
private void selectDeployment() {
Stage stage = getSelectedComponent();
if (stage == null) {
return;
}
JDialog d = new SeparationSelectionDialog(SwingUtilities.getWindowAncestor(this), rocket, stage);
d.setVisible(true);
fireTableDataChanged();
}
private void resetDeployment() {
Stage stage = getSelectedComponent();
if (stage == null) {
return;
}
String id = rocket.getDefaultConfiguration().getFlightConfigurationID();
stage.getStageSeparationConfiguration().resetDefault(id);
fireTableDataChanged();
}
public void updateButtonState() {
boolean componentSelected = getSelectedComponent() != null;
selectSeparationButton.setEnabled(componentSelected);
resetDeploymentButton.setEnabled(componentSelected);
}
private class SeparationTableCellRenderer extends FlightConfigurablePanel<Stage>.FlightConfigurableCellRenderer {
@Override
protected JLabel format(Stage stage, String configId, JLabel label) {
StageSeparationConfiguration sepConfig = stage.getStageSeparationConfiguration().get(configId);
String spec = getSeparationSpecification(sepConfig);
label.setText(spec);
if (stage.getStageSeparationConfiguration().isDefault(configId)) {
shaded(label);
} else {
regular(label);
}
return label;
}
private String getSeparationSpecification( StageSeparationConfiguration sepConfig ) {
String str;
str = sepConfig.getSeparationEvent().toString();
if (sepConfig.getSeparationDelay() > 0.001) {
str += " + " + UnitGroup.UNITS_SHORT_TIME.toStringUnit(sepConfig.getSeparationDelay());
}
return str;
}
}
}