import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
-import org.altusmetrum.AltosLib.*;
-import org.altusmetrum.altosuilib.*;
+import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altosuilib_2.*;
public class AltosConfigPyroUI
extends AltosUIDialog
- implements ItemListener, DocumentListener
+ implements ItemListener, DocumentListener, AltosUnitsListener, ActionListener
{
AltosConfigUI owner;
Container pane;
}
}
- class PyroItem implements ItemListener, DocumentListener
+ class PyroItem implements ItemListener, DocumentListener, AltosUnitsListener
{
public int flag;
- public JRadioButton enable;
+ public JCheckBox enable;
public JTextField value;
- public JComboBox combo;
+ public JComboBox<String> combo;
AltosConfigPyroUI ui;
+ boolean setting;
public void set_enable(boolean enable) {
if (value != null)
public void itemStateChanged(ItemEvent e) {
set_enable(enable.isSelected());
- ui.set_dirty();
+ if (!setting)
+ ui.set_dirty();
}
public void changedUpdate(DocumentEvent e) {
- ui.set_dirty();
+ if (!setting)
+ ui.set_dirty();
}
public void insertUpdate(DocumentEvent e) {
- ui.set_dirty();
+ if (!setting)
+ ui.set_dirty();
}
public void removeUpdate(DocumentEvent e) {
- ui.set_dirty();
+ if (!setting)
+ ui.set_dirty();
+ }
+
+ public void units_changed(boolean imperial_units) {
+ AltosUnits units = AltosPyro.pyro_to_units(flag);
+
+ if (units != null) {
+ try {
+ double v = units.parse(value.getText(), !imperial_units);
+ set(enabled(), v);
+ } catch (NumberFormatException ne) {
+ set(enabled(), 0.0);
+ }
+ }
}
public void set(boolean new_enable, double new_value) {
+ setting = true;
enable.setSelected(new_enable);
set_enable(new_enable);
if (value != null) {
double scale = AltosPyro.pyro_to_scale(flag);
- String format = "%6.0f";
- if (scale >= 10)
- format = "%6.1f";
- else if (scale >= 100)
+ double unit_value = new_value;
+ AltosUnits units = AltosPyro.pyro_to_units(flag);
+ if (units != null)
+ unit_value = units.value(new_value);
+ String format;
+ if (scale >= 100)
format = "%6.2f";
- value.setText(String.format(format, new_value));
+ else if (scale >= 10)
+ format = "%6.1f";
+ else
+ format = "%6.0f";
+ value.setText(String.format(format, unit_value));
}
if (combo != null)
if (new_value >= AltosLib.ao_flight_boost && new_value <= AltosLib.ao_flight_landed)
combo.setSelectedIndex((int) new_value - AltosLib.ao_flight_boost);
+ setting = false;
}
public boolean enabled() {
return enable.isSelected();
}
- public double value() {
- if (value != null)
- return Double.parseDouble(value.getText());
+ public double value() throws AltosConfigDataException {
+ if (value != null) {
+ AltosUnits units = AltosPyro.pyro_to_units(flag);
+ try {
+ if (units != null)
+ return units.parse(value.getText());
+ return Double.parseDouble(value.getText());
+ } catch (NumberFormatException e) {
+ throw new AltosConfigDataException("\"%s\": %s\n", value.getText(), e.getMessage());
+ }
+ }
if (combo != null)
return combo.getSelectedIndex() + AltosLib.ao_flight_boost;
return 0;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.LINE_START;
c.insets = il;
- enable = new JRadioButton();
+ enable = new JCheckBox();
enable.addItemListener(this);
pane.add(enable, c);
-
+
if ((flag & AltosPyro.pyro_no_value) == 0) {
c = new GridBagConstraints();
c.gridx = x+1; c.gridy = y;
c.insets = il;
if ((flag & AltosPyro.pyro_state_value) != 0) {
make_state_names();
- combo = new JComboBox(state_names);
+ combo = new JComboBox<String>(state_names);
combo.addItemListener(this);
pane.add(combo, c);
} else {
}
}
- class PyroColumn {
+ class PyroColumn implements AltosUnitsListener {
public PyroItem[] items;
public JLabel label;
int channel;
}
}
- public AltosPyro get() {
+ public AltosPyro get() throws AltosConfigDataException {
AltosPyro p = new AltosPyro(channel);
int row = 0;
for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
if ((AltosPyro.pyro_all & flag) != 0) {
if (items[row].enabled()) {
- System.out.printf ("Flag %x enabled\n", flag);
+ try {
p.flags |= flag;
p.set_value(flag, items[row].value());
+ } catch (AltosConfigDataException ae) {
+ throw new AltosConfigDataException("%s, %s",
+ AltosPyro.pyro_to_name(flag),
+ ae.getMessage());
+ }
}
row++;
}
}
- System.out.printf ("Pyro %x %s\n", p.flags, p.toString());
return p;
}
+ public void units_changed(boolean imperial_units) {
+ int row = 0;
+ for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1) {
+ if ((AltosPyro.pyro_all & flag) != 0) {
+ items[row].units_changed(imperial_units);
+ row++;
+ }
+ }
+ }
+
public PyroColumn(AltosConfigPyroUI ui, int x, int y, int in_channel) {
channel = in_channel;
items = new PyroItem[nrow];
int row = 0;
-
+
GridBagConstraints c;
c = new GridBagConstraints();
c.gridx = x; c.gridy = y;
c.fill = GridBagConstraints.NONE;
c.anchor = GridBagConstraints.CENTER;
c.insets = il;
- label = new JLabel(String.format("Pyro Channel %d", channel));
+ label = new JLabel(String.format("Pyro Channel %c", 'A' + channel));
pane.add(label, c);
y++;
}
PyroColumn[] columns;
+ JLabel[] labels;
public void set_pyros(AltosPyro[] pyros) {
for (int i = 0; i < pyros.length; i++) {
}
}
- public AltosPyro[] get_pyros() {
+ public AltosPyro[] get_pyros() throws AltosConfigDataException {
AltosPyro[] pyros = new AltosPyro[columns.length];
- for (int c = 0; c < columns.length; c++)
- pyros[c] = columns[c].get();
+ for (int c = 0; c < columns.length; c++) {
+ try {
+ pyros[c] = columns[c].get();
+ } catch (AltosConfigDataException ae) {
+ throw new AltosConfigDataException ("Channel %c, %s", c + 'A', ae.getMessage());
+ }
+ }
return pyros;
}
+ JLabel pyro_firing_time_label;
+ JComboBox<String> pyro_firing_time_value;
+
+ static String[] pyro_firing_time_values = {
+ "0.050", "0.100", "0.250", "0.500", "1.0", "2.0"
+ };
+
+ public void set_pyro_firing_time(double new_pyro_firing_time) {
+ pyro_firing_time_value.setSelectedItem(Double.toString(new_pyro_firing_time));
+ pyro_firing_time_value.setEnabled(new_pyro_firing_time >= 0);
+ }
+
+ public double get_pyro_firing_time() throws AltosConfigDataException {
+ String v = pyro_firing_time_value.getSelectedItem().toString();
+
+ try {
+ return Double.parseDouble(v);
+ } catch (NumberFormatException e) {
+ throw new AltosConfigDataException("Invalid pyro firing time \"%s\"", v);
+ }
+ }
+
public void set_dirty() {
owner.set_dirty();
}
owner.set_dirty();
}
- public AltosConfigPyroUI(AltosConfigUI in_owner, AltosPyro[] pyros) {
+ public void units_changed(boolean imperial_units) {
+ for (int c = 0; c < columns.length; c++)
+ columns[c].units_changed(imperial_units);
+ int r = 0;
+ for (int flag = 1; flag <= AltosPyro.pyro_all; flag <<= 1) {
+ String n = AltosPyro.pyro_to_name(flag);
+ if (n != null) {
+ labels[r].setText(n);
+ r++;
+ }
+ }
+ }
+
+ /* A window listener to catch closing events and tell the config code */
+ class ConfigListener extends WindowAdapter {
+ AltosConfigPyroUI ui;
+ AltosConfigUI owner;
+
+ public ConfigListener(AltosConfigPyroUI this_ui, AltosConfigUI this_owner) {
+ ui = this_ui;
+ owner = this_owner;
+ }
+
+ public void windowClosing(WindowEvent e) {
+ ui.setVisible(false);
+ }
+ }
+
+ /* Listen for events from our buttons */
+ public void actionPerformed(ActionEvent e) {
+ String cmd = e.getActionCommand();
+
+ if (cmd.equals("Close"))
+ setVisible(false);
+ }
+
+ public AltosConfigPyroUI(AltosConfigUI in_owner, AltosPyro[] pyros, double pyro_firing_time) {
super(in_owner, "Configure Pyro Channels", false);
pane = getContentPane();
pane.setLayout(new GridBagLayout());
+ int nrow = 0;
+ for (int flag = 1; flag < AltosPyro.pyro_all; flag <<= 1)
+ if ((flag & AltosPyro.pyro_all) != 0)
+ nrow++;
+
+ labels = new JLabel[nrow];
+
int row = 1;
for (int flag = 1; flag <= AltosPyro.pyro_all; flag <<= 1) {
c.insets = il;
JLabel label = new JLabel(n);
pane.add(label, c);
+ labels[row-1] = label;
row++;
}
}
columns[i] = new PyroColumn(this, i*2 + 1, 0, i);
columns[i].set(pyros[i]);
}
+
+ /* Pyro firing time */
+ c = new GridBagConstraints();
+ c.gridx = 0; c.gridy = row;
+ c.gridwidth = 2;
+ c.fill = GridBagConstraints.NONE;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = il;
+ c.ipady = 5;
+ pyro_firing_time_label = new JLabel("Pyro Firing Time(s):");
+ pane.add(pyro_firing_time_label, c);
+
+ c = new GridBagConstraints();
+ c.gridx = 2; c.gridy = row;
+ c.gridwidth = 7;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.weightx = 1;
+ c.anchor = GridBagConstraints.LINE_START;
+ c.insets = ir;
+ c.ipady = 5;
+ pyro_firing_time_value = new JComboBox<String>(pyro_firing_time_values);
+ pyro_firing_time_value.setEditable(true);
+ pyro_firing_time_value.addItemListener(this);
+ set_pyro_firing_time(pyro_firing_time);
+ pane.add(pyro_firing_time_value, c);
+ pyro_firing_time_value.setToolTipText("Length of extra pyro channel firing pulse");
+
+ c = new GridBagConstraints();
+ c.gridx = pyros.length*2-1;
+ c.fill = GridBagConstraints.HORIZONTAL;
+ c.gridwidth = 2;
+ c.gridy = 1000;
+ JButton close = new JButton("Close");
+ pane.add(close, c);
+ close.addActionListener(this);
+ close.setActionCommand("Close");
+
+ addWindowListener(new ConfigListener(this, owner));
+ AltosPreferences.register_units_listener(this);
+ }
+
+ public void dispose() {
+ AltosPreferences.unregister_units_listener(this);
+ super.dispose();
}
public void make_visible() {