altosui: Display error message when parsing pyro channel values fails
[fw/altos] / altosui / AltosConfigPyroUI.java
index b667b15a18379529467f59d9ce7f09c135095949..7a298a3ca679a6f26df6abc46816d4efcb3b00c6 100644 (file)
@@ -21,8 +21,8 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import javax.swing.event.*;
-import org.altusmetrum.altoslib_3.*;
-import org.altusmetrum.altosuilib_1.*;
+import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altosuilib_2.*;
 
 public class AltosConfigPyroUI
        extends AltosUIDialog
@@ -50,7 +50,7 @@ public class AltosConfigPyroUI
                public int              flag;
                public JCheckBox        enable;
                public JTextField       value;
-               public JComboBox        combo;
+               public JComboBox<String>        combo;
                AltosConfigPyroUI       ui;
                boolean                 setting;
 
@@ -105,11 +105,13 @@ public class AltosConfigPyroUI
                                AltosUnits units = AltosPyro.pyro_to_units(flag);
                                if (units != null)
                                        unit_value = units.value(new_value);
-                               String  format = "%6.0f";
-                               if (scale >= 10)
-                                       format = "%6.1f";
-                               else if (scale >= 100)
+                               String  format;
+                               if (scale >= 100)
                                        format = "%6.2f";
+                               else if (scale >= 10)
+                                       format = "%6.1f";
+                               else
+                                       format = "%6.0f";
                                value.setText(String.format(format, unit_value));
                        }
                        if (combo != null)
@@ -122,12 +124,16 @@ public class AltosConfigPyroUI
                        return enable.isSelected();
                }
 
-               public double value() {
+               public double value() throws AltosConfigDataException {
                        if (value != null) {
                                AltosUnits units = AltosPyro.pyro_to_units(flag);
-                               if (units != null)
-                                       return units.parse(value.getText());
-                               return Double.parseDouble(value.getText());
+                               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;
@@ -159,7 +165,7 @@ public class AltosConfigPyroUI
                                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 {
@@ -187,15 +193,21 @@ public class AltosConfigPyroUI
                        }
                }
 
-               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()) {
+                                               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++;
                                }
@@ -254,10 +266,15 @@ public class AltosConfigPyroUI
                }
        }
 
-       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;
        }