altosui: Fix the 'Graph' button on the landed tab
[fw/altos] / altosui / AltosLanded.java
index 760b2d64e1456a6ebb4ddccf68414b4621eac4c8..7c50adacba874d053c892e913277dc71330083d0 100644 (file)
@@ -21,259 +21,94 @@ import java.awt.*;
 import java.awt.event.*;
 import javax.swing.*;
 import java.io.*;
-import org.altusmetrum.altoslib_4.*;
-import org.altusmetrum.altosuilib_2.*;
-
-public class AltosLanded extends JComponent implements AltosFlightDisplay, ActionListener, HierarchyListener {
-       GridBagLayout   layout;
-
-       private AltosState              last_state;
-       private AltosListenerState      last_listener_state;
-
-       public abstract class LandedValue implements AltosFontListener, AltosUnitsListener {
-               JLabel          label;
-               JTextField      value;
-               AltosUnits      units;
-               double          v;
-               String          last_value = "";
-
-               abstract void show(AltosState state, AltosListenerState listener_state);
-
-               void reset() {
-                       value.setText("");
-               }
-
-               void show() {
-                       label.setVisible(true);
-                       value.setVisible(true);
-               }
-
-               void show(String s) {
-                       show();
-                       if (!last_value.equals(s)) {
-                               value.setText(s);
-                               last_value = s;
+import org.altusmetrum.altoslib_5.*;
+import org.altusmetrum.altosuilib_3.*;
+
+public class AltosLanded extends AltosUIFlightTab implements ActionListener {
+
+       class Bearing extends AltosUIIndicator {
+               public void show (AltosState state, AltosListenerState listener_state) {
+                       if (state.from_pad != null && state.from_pad.bearing != AltosLib.MISSING) {
+                               show( String.format("%3.0f°", state.from_pad.bearing),
+                                     state.from_pad.bearing_words(
+                                             AltosGreatCircle.BEARING_LONG));
+                       } else {
+                               show("Missing", "Missing");
                        }
                }
-
-               void show(double v) {
-                       this.v = v;
-                       if (v == AltosLib.MISSING)
-                               show("Missing");
-                       else
-                               show(units.show(8, v));
-               }
-
-               void show(String format, double v) {
-                       show(String.format(format, v));
-               }
-
-               public void font_size_changed(int font_size) {
-                       label.setFont(Altos.label_font);
-                       value.setFont(Altos.value_font);
-               }
-
-               public void units_changed(boolean imperial_units) {
-                       if (units != null)
-                               show(v);
+               public Bearing (Container container, int y) {
+                       super (container, y, "Bearing", 2);
                }
-
-               void hide() {
-                       label.setVisible(false);
-                       value.setVisible(false);
-               }
-
-               public LandedValue (GridBagLayout layout, int y, AltosUnits units, String text) {
-                       this.units = units;
-
-                       GridBagConstraints      c = new GridBagConstraints();
-                       c.weighty = 1;
-
-                       label = new JLabel(text);
-                       label.setFont(Altos.label_font);
-                       label.setHorizontalAlignment(SwingConstants.LEFT);
-                       c.gridx = 0; c.gridy = y;
-                       c.insets = new Insets(10, 10, 10, 10);
-                       c.anchor = GridBagConstraints.WEST;
-                       c.weightx = 0;
-                       c.fill = GridBagConstraints.VERTICAL;
-                       layout.setConstraints(label, c);
-                       add(label);
-
-                       value = new JTextField(Altos.text_width);
-                       value.setEditable(false);
-                       value.setFont(Altos.value_font);
-                       value.setHorizontalAlignment(SwingConstants.RIGHT);
-                       c.gridx = 1; c.gridy = y;
-                       c.anchor = GridBagConstraints.WEST;
-                       c.weightx = 1;
-                       c.fill = GridBagConstraints.BOTH;
-                       layout.setConstraints(value, c);
-                       add(value);
-               }
-
-               public LandedValue (GridBagLayout layout, int y, String text) {
-                       this(layout, y, null, text);
-               }
-       }
-
-       String pos(double p, String pos, String neg) {
-               String  h = pos;
-               if (p < 0) {
-                       h = neg;
-                       p = -p;
-               }
-               int deg = (int) Math.floor(p);
-               double min = (p - Math.floor(p)) * 60.0;
-               return String.format("%s %4d° %9.6f", h, deg, min);
        }
 
-       class Lat extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show();
-                       if (state.gps != null && state.gps.connected && state.gps.lat != AltosLib.MISSING)
-                               show(pos(state.gps.lat,"N", "S"));
+       class Distance extends AltosUIUnitsIndicator {
+               public double value(AltosState state, int i) {
+                       if (state.from_pad != null)
+                               return state.from_pad.distance;
                        else
-                               show("???");
-               }
-               public Lat (GridBagLayout layout, int y) {
-                       super (layout, y, "Latitude");
+                               return AltosLib.MISSING;
                }
-       }
-
-       Lat lat;
 
-       class Lon extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show();
-                       if (state.gps != null && state.gps.connected && state.gps.lon != AltosLib.MISSING)
-                               show(pos(state.gps.lon,"E", "W"));
-                       else
-                               show("???");
-               }
-               public Lon (GridBagLayout layout, int y) {
-                       super (layout, y, "Longitude");
+               public Distance(Container container, int y) {
+                       super(container, y, AltosConvert.distance, "Ground Distance", 2);
                }
        }
 
-       Lon lon;
-
-       class Bearing extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show();
-                       if (state.from_pad != null)
-                               show("%3.0f°", state.from_pad.bearing);
-                       else
-                               show("???");
-               }
-               public Bearing (GridBagLayout layout, int y) {
-                       super (layout, y, "Bearing");
-               }
-       }
+       class Lat extends AltosUIUnitsIndicator {
 
-       Bearing bearing;
+               public boolean hide (AltosState state, int i) { return state.gps == null || !state.gps.connected; }
 
-       class Distance extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show();
-                       if (state.from_pad != null)
-                               show(state.from_pad.distance);
-                       else
-                               show("???");
+               public double value(AltosState state, int i) {
+                       if (state.gps == null)
+                               return AltosLib.MISSING;
+                       if (!state.gps.connected)
+                               return AltosLib.MISSING;
+                       return state.gps.lat;
                }
-               public Distance (GridBagLayout layout, int y) {
-                       super (layout, y, AltosConvert.distance, "Distance");
-               }
-       }
 
-       Distance distance;
-
-       class Height extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show(state.max_height());
-               }
-               public Height (GridBagLayout layout, int y) {
-                       super (layout, y, AltosConvert.height, "Maximum Height");
+               public Lat (Container container, int y) {
+                       super (container, y, AltosConvert.latitude, "Latitude", 2);
                }
        }
 
-       Height  height;
+       class Lon extends AltosUIUnitsIndicator {
+               public boolean hide (AltosState state, int i) { return state.gps == null || !state.gps.connected; }
 
-       class Speed extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show(state.max_speed());
+               public double value(AltosState state, int i) {
+                       if (state.gps == null)
+                               return AltosLib.MISSING;
+                       if (!state.gps.connected)
+                               return AltosLib.MISSING;
+                       return state.gps.lon;
                }
-               public Speed (GridBagLayout layout, int y) {
-                       super (layout, y, AltosConvert.speed, "Maximum Speed");
-               }
-       }
 
-       Speed   speed;
-
-       class Accel extends LandedValue {
-               void show (AltosState state, AltosListenerState listener_state) {
-                       show(state.max_acceleration());
-               }
-               public Accel (GridBagLayout layout, int y) {
-                       super (layout, y, AltosConvert.accel, "Maximum Acceleration");
+               public Lon (Container container, int y) {
+                       super (container, y, AltosConvert.longitude, "Longitude", 2);
                }
        }
 
-       Accel   accel;
+       class MaxHeight extends AltosUIUnitsIndicator {
+               public double value(AltosState state, int i) { return state.max_height(); }
 
-       public void reset() {
-               lat.reset();
-               lon.reset();
-               bearing.reset();
-               distance.reset();
-               height.reset();
-               speed.reset();
-               accel.reset();
+               public MaxHeight (Container container, int y) {
+                       super (container, y, AltosConvert.height, "Maximum Height", 2);
+               }
        }
 
-       public void font_size_changed(int font_size) {
-               lat.font_size_changed(font_size);
-               lon.font_size_changed(font_size);
-               bearing.font_size_changed(font_size);
-               distance.font_size_changed(font_size);
-               height.font_size_changed(font_size);
-               speed.font_size_changed(font_size);
-               accel.font_size_changed(font_size);
-       }
+       class MaxSpeed extends AltosUIUnitsIndicator {
+               public double value(AltosState state, int i) { return state.max_speed(); }
 
-       public void units_changed(boolean imperial_units) {
-               lat.units_changed(imperial_units);
-               lon.units_changed(imperial_units);
-               bearing.units_changed(imperial_units);
-               distance.units_changed(imperial_units);
-               height.units_changed(imperial_units);
-               speed.units_changed(imperial_units);
-               accel.units_changed(imperial_units);
+               public MaxSpeed (Container container, int y) {
+                       super (container, y, AltosConvert.speed, "Maximum Speed", 2);
+               }
        }
 
-       public void show(AltosState state, AltosListenerState listener_state) {
-               if (!isShowing()) {
-                       last_state = state;
-                       last_listener_state = listener_state;
-                       return;
-               }
+       class MaxAccel extends AltosUIUnitsIndicator {
+               public double value(AltosState state, int i) { return state.max_acceleration(); }
 
-               if (state.gps != null && state.gps.connected) {
-                       bearing.show(state, listener_state);
-                       distance.show(state, listener_state);
-                       lat.show(state, listener_state);
-                       lon.show(state, listener_state);
-               } else {
-                       bearing.hide();
-                       distance.hide();
-                       lat.hide();
-                       lon.hide();
+               public MaxAccel (Container container, int y) {
+                       super (container, y, AltosConvert.speed, "Maximum acceleration", 2);
                }
-               height.show(state, listener_state);
-               speed.show(state, listener_state);
-               accel.show(state, listener_state);
-               if (reader.backing_file() != null)
-                       graph.setEnabled(true);
        }
 
        JButton graph;
@@ -316,32 +151,23 @@ public class AltosLanded extends JComponent implements AltosFlightDisplay, Actio
                return "Landed";
        }
 
-       public void hierarchyChanged(HierarchyEvent e) {
-               if (last_state != null && isShowing()) {
-                       AltosState              state = last_state;
-                       AltosListenerState      listener_state = last_listener_state;
-
-                       last_state = null;
-                       last_listener_state = null;
-                       show(state, listener_state);
-               }
+       public void show(AltosState state, AltosListenerState listener_state) {
+               super.show(state, listener_state);
+               if (reader.backing_file() != null)
+                       graph.setEnabled(true);
        }
 
        public AltosLanded(AltosFlightReader in_reader) {
-               layout = new GridBagLayout();
-
                reader = in_reader;
 
-               setLayout(layout);
-
                /* Elements in descent display */
-               bearing = new Bearing(layout, 0);
-               distance = new Distance(layout, 1);
-               lat = new Lat(layout, 2);
-               lon = new Lon(layout, 3);
-               height = new Height(layout, 4);
-               speed = new Speed(layout, 5);
-               accel = new Accel(layout, 6);
+               add(new Bearing(this, 0));
+               add(new Distance(this, 1));
+               add(new Lat(this, 2));
+               add(new Lon(this, 3));
+               add(new MaxHeight(this, 4));
+               add(new MaxSpeed(this, 5));
+               add(new MaxAccel(this, 6));
 
                graph = new JButton ("Graph Flight");
                graph.setActionCommand("graph");
@@ -350,7 +176,7 @@ public class AltosLanded extends JComponent implements AltosFlightDisplay, Actio
 
                GridBagConstraints      c = new GridBagConstraints();
 
-               c.gridx = 0; c.gridy = 7;
+               c.gridx = 1; c.gridy = 7;
                c.insets = new Insets(10, 10, 10, 10);
                c.anchor = GridBagConstraints.WEST;
                c.weightx = 0;