doc: Use icons for admonitions
[fw/altos] / altosui / AltosIdleMonitorUI.java
index bbab017f1c525779c622e1623f1db541c8d72fba..fc76b2b658c87db172a8043bce7e6912679ae7fa 100644 (file)
@@ -3,7 +3,8 @@
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; version 2 of the License.
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
  *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -23,22 +24,30 @@ import javax.swing.*;
 import javax.swing.event.*;
 import java.io.*;
 import java.util.concurrent.*;
-import org.altusmetrum.altoslib_1.*;
-import org.altusmetrum.altosuilib_1.*;
+import java.util.Arrays;
+import org.altusmetrum.altoslib_13.*;
+import org.altusmetrum.altosuilib_13.*;
 
-public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosFontListener, AltosIdleMonitorListener, DocumentListener {
+public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDisplay, AltosIdleMonitorListener, DocumentListener {
        AltosDevice             device;
        JTabbedPane             pane;
        AltosPad                pad;
        AltosInfoTable          flightInfo;
        AltosFlightStatus       flightStatus;
+       AltosIgnitor            igniter;
        AltosIdleMonitor        thread;
+       AltosUIMap              sitemap;
        int                     serial;
        boolean                 remote;
+       boolean                 has_igniter;
+       boolean                 has_map;
 
        void stop_display() {
                if (thread != null) {
-                       thread.abort();
+                       try {
+                               thread.abort();
+                       } catch (InterruptedException ie) {
+                       }
                }
                thread = null;
        }
@@ -52,26 +61,54 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                flightInfo.clear();
        }
 
-       public void set_font() {
-               pad.set_font();
-               flightInfo.set_font();
+       public void font_size_changed(int font_size) {
+               pad.font_size_changed(font_size);
+               flightInfo.font_size_changed(font_size);
        }
 
-       public void font_size_changed(int font_size) {
-               set_font();
+       public void units_changed(boolean imperial_units) {
+               pad.units_changed(imperial_units);
+               flightInfo.units_changed(imperial_units);
        }
 
        AltosFlightStatusUpdate status_update;
 
        public void show(AltosState state, AltosListenerState listener_state) {
                status_update.saved_state = state;
-               try {
+               if (igniter.should_show(state)) {
+                       if (!has_igniter) {
+                               pane.add("Ignitor", igniter);
+                               has_igniter = true;
+                       }
+               } else {
+                       if (has_igniter) {
+                               pane.remove(igniter);
+                               has_igniter = false;
+                       }
+               }
+               if (state.gps != null && state.gps.connected) {
+                       if (!has_map) {
+                               pane.add("Site Map", sitemap);
+                               has_map = true;
+                       }
+               } else {
+                       if (has_map) {
+                               pane.remove(sitemap);
+                               has_map = false;
+                       }
+               }
+
+//             try {
                        pad.show(state, listener_state);
                        flightStatus.show(state, listener_state);
                        flightInfo.show(state, listener_state);
-               } catch (Exception e) {
-                       System.out.print("Show exception" + e);
-               }
+                       if (has_igniter)
+                               igniter.show(state, listener_state);
+                       if (has_map)
+                               sitemap.show(state, listener_state);
+//             } catch (Exception e) {
+//                     System.out.print("Show exception " + e);
+//             }
        }
 
        public void update(final AltosState state, final AltosListenerState listener_state) {
@@ -83,14 +120,37 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                SwingUtilities.invokeLater(r);
        }
 
+       public void failed() {
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       close();
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
+       public void error(final String reason) {
+               Runnable r = new Runnable() {
+                               public void run() {
+                                       disconnect();
+                                       JOptionPane.showMessageDialog(AltosIdleMonitorUI.this,
+                                                                     reason,
+                                                                     "Error fetching data",
+                                                                     JOptionPane.ERROR_MESSAGE);
+                               }
+                       };
+               SwingUtilities.invokeLater(r);
+       }
+
        Container       bag;
-       AltosFreqList   frequencies;
+       AltosUIFreqList frequencies;
        JTextField      callsign_value;
 
        /* DocumentListener interface methods */
        public void changedUpdate(DocumentEvent e) {
                if (callsign_value != null) {
                        String  callsign = callsign_value.getText();
+                       System.out.printf("callsign set to %s\n", callsign);
                        thread.set_callsign(callsign);
                        AltosUIPreferences.set_callsign(callsign);
                }
@@ -104,32 +164,48 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                changedUpdate(e);
        }
 
-       int row = 0;
-
-       public GridBagConstraints constraints (int x, int width, int fill) {
-               GridBagConstraints c = new GridBagConstraints();
-               Insets insets = new Insets(4, 4, 4, 4);
-
-               c.insets = insets;
-               c.fill = fill;
-               if (width == 3)
-                       c.anchor = GridBagConstraints.CENTER;
-               else if (x == 2)
-                       c.anchor = GridBagConstraints.EAST;
-               else
-                       c.anchor = GridBagConstraints.WEST;
-               c.gridx = x;
-               c.gridwidth = width;
-               c.gridy = row;
-               return c;
+       void idle_exception(JFrame owner, Exception e) {
+               if (e instanceof FileNotFoundException) {
+                       JOptionPane.showMessageDialog(owner,
+                                                     ((FileNotFoundException) e).getMessage(),
+                                                     "Cannot open target device",
+                                                     JOptionPane.ERROR_MESSAGE);
+               } else if (e instanceof AltosSerialInUseException) {
+                       JOptionPane.showMessageDialog(owner,
+                                                     String.format("Device \"%s\" already in use",
+                                                                   device.toShortString()),
+                                                     "Device in use",
+                                                     JOptionPane.ERROR_MESSAGE);
+               } else if (e instanceof IOException) {
+                       IOException ee = (IOException) e;
+                       JOptionPane.showMessageDialog(owner,
+                                                     device.toShortString(),
+                                                     ee.getLocalizedMessage(),
+                                                     JOptionPane.ERROR_MESSAGE);
+               } else {
+                       JOptionPane.showMessageDialog(owner,
+                                                     String.format("Connection to \"%s\" failed",
+                                                                   device.toShortString()),
+                                                     "Connection Failed",
+                                                     JOptionPane.ERROR_MESSAGE);
+               }
        }
 
-       public GridBagConstraints constraints(int x, int width) {
-               return constraints(x, width, GridBagConstraints.NONE);
+       private void close() {
+               try {
+                       disconnect();
+               } catch (Exception ex) {
+                       System.out.printf("Exception %s\n", ex.toString());
+                       for (StackTraceElement el : ex.getStackTrace())
+                               System.out.printf("%s\n", el.toString());
+               }
+               setVisible(false);
+               dispose();
+               AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
        }
 
        public AltosIdleMonitorUI(JFrame in_owner)
-               throws FileNotFoundException, AltosSerialInUseException, TimeoutException, InterruptedException {
+               throws FileNotFoundException, TimeoutException, InterruptedException {
 
                device = AltosDeviceUIDialog.show(in_owner, Altos.product_any);
                remote = false;
@@ -137,6 +213,19 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                        remote = true;
 
                serial = device.getSerial();
+
+               AltosSerial link;
+               try {
+                       link = new AltosSerial(device);
+               } catch (Exception ex) {
+                       idle_exception(in_owner, ex);
+                       return;
+               }
+               link.set_frame(this);
+
+               /* We let the user set the freq/callsign, so don't bother with the cancel dialog */
+               link.set_cancel_enable(false);
+
                bag = getContentPane();
                bag.setLayout(new GridBagLayout());
 
@@ -144,8 +233,10 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
 
                /* Stick frequency selector at top of table for telemetry monitoring */
                if (remote && serial >= 0) {
+                       set_inset(3);
+
                        // Frequency menu
-                       frequencies = new AltosFreqList(AltosUIPreferences.frequency(serial));
+                       frequencies = new AltosUIFreqList(AltosUIPreferences.frequency(serial));
                        frequencies.addActionListener(new ActionListener() {
                                        public void actionPerformed(ActionEvent e) {
                                                double frequency = frequencies.frequency();
@@ -160,15 +251,17 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                        callsign_value = new JTextField(AltosUIPreferences.callsign());
                        callsign_value.getDocument().addDocumentListener(this);
                        callsign_value.setToolTipText("Callsign sent in packet mode");
-                       bag.add(callsign_value, constraints(2, 1, GridBagConstraints.BOTH));
-                       row++;
+                       bag.add(callsign_value, constraints(2, 1, GridBagConstraints.HORIZONTAL));
+                       next_row();
                }
 
+               set_inset(0);
 
                /* Flight status is always visible */
                flightStatus = new AltosFlightStatus();
-               bag.add(flightStatus, constraints(0, 3, GridBagConstraints.HORIZONTAL));
-               row++;
+               bag.add(flightStatus, constraints(0, 4, GridBagConstraints.HORIZONTAL));
+
+               next_row();
 
                /* The rest of the window uses a tabbed pane to
                 * show one of the alternate data views
@@ -181,8 +274,12 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                flightInfo = new AltosInfoTable();
                pane.add("Table", new JScrollPane(flightInfo));
 
+               igniter = new AltosIgnitor();
+
+               sitemap = new AltosUIMap();
+
                /* Make the tabbed pane use the rest of the window space */
-               bag.add(pane, constraints(0, 3, GridBagConstraints.BOTH));
+               bag.add(pane, constraints(0, 4, GridBagConstraints.BOTH));
 
                setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
 
@@ -191,17 +288,14 @@ public class AltosIdleMonitorUI extends AltosUIFrame implements AltosFlightDispl
                addWindowListener(new WindowAdapter() {
                                @Override
                                public void windowClosing(WindowEvent e) {
-                                       disconnect();
-                                       setVisible(false);
-                                       dispose();
-                                       AltosUIPreferences.unregister_font_listener(AltosIdleMonitorUI.this);
+                                       close();
                                }
                        });
 
                pack();
                setVisible(true);
 
-               thread = new AltosIdleMonitor((AltosIdleMonitorListener) this, (AltosLink) new AltosSerial (device), (boolean) remote);
+               thread = new AltosIdleMonitor(this, link, (boolean) remote);
 
                status_update = new AltosFlightStatusUpdate(flightStatus);