summaryrefslogtreecommitdiff
path: root/altosuilib
diff options
context:
space:
mode:
Diffstat (limited to 'altosuilib')
-rw-r--r--altosuilib/AltosBTDevice.java4
-rw-r--r--altosuilib/AltosBTDeviceIterator.java4
-rw-r--r--altosuilib/AltosBTKnown.java4
-rw-r--r--altosuilib/AltosBTManage.java4
-rw-r--r--altosuilib/AltosCSVUI.java4
-rw-r--r--altosuilib/AltosConfigFreqUI.java4
-rw-r--r--altosuilib/AltosDataChooser.java4
-rw-r--r--altosuilib/AltosDevice.java2
-rw-r--r--altosuilib/AltosDeviceDialog.java5
-rw-r--r--altosuilib/AltosDeviceUIDialog.java2
-rw-r--r--altosuilib/AltosDisplayThread.java4
-rw-r--r--altosuilib/AltosEepromDelete.java4
-rw-r--r--altosuilib/AltosEepromManage.java4
-rw-r--r--altosuilib/AltosEepromMonitor.java2
-rw-r--r--altosuilib/AltosEepromMonitorUI.java4
-rw-r--r--altosuilib/AltosEepromSelect.java4
-rw-r--r--altosuilib/AltosFlashUI.java5
-rw-r--r--altosuilib/AltosFlightDisplay.java4
-rw-r--r--altosuilib/AltosFlightInfoTableModel.java2
-rw-r--r--altosuilib/AltosFlightStatsTable.java4
-rw-r--r--altosuilib/AltosFontListener.java2
-rw-r--r--altosuilib/AltosGraph.java52
-rw-r--r--altosuilib/AltosGraphDataPoint.java27
-rw-r--r--altosuilib/AltosGraphDataSet.java4
-rw-r--r--altosuilib/AltosInfoTable.java42
-rw-r--r--altosuilib/AltosLed.java2
-rw-r--r--altosuilib/AltosLights.java2
-rw-r--r--altosuilib/AltosPositionListener.java2
-rw-r--r--altosuilib/AltosRomconfigUI.java4
-rw-r--r--altosuilib/AltosScanUI.java157
-rw-r--r--altosuilib/AltosSerial.java4
-rw-r--r--altosuilib/AltosSerialInUseException.java2
-rw-r--r--altosuilib/AltosUIAxis.java10
-rw-r--r--altosuilib/AltosUIConfigure.java31
-rw-r--r--altosuilib/AltosUIDataMissing.java2
-rw-r--r--altosuilib/AltosUIDataPoint.java2
-rw-r--r--altosuilib/AltosUIDataSet.java2
-rw-r--r--altosuilib/AltosUIDialog.java2
-rw-r--r--altosuilib/AltosUIEnable.java4
-rw-r--r--altosuilib/AltosUIFlightTab.java4
-rw-r--r--altosuilib/AltosUIFrame.java75
-rw-r--r--altosuilib/AltosUIFreqList.java (renamed from altosuilib/AltosFreqList.java)11
-rw-r--r--altosuilib/AltosUIGraph.java4
-rw-r--r--altosuilib/AltosUIGrapher.java4
-rw-r--r--altosuilib/AltosUIIndicator.java4
-rw-r--r--altosuilib/AltosUILatLon.java4
-rw-r--r--altosuilib/AltosUILib.java12
-rw-r--r--altosuilib/AltosUIListener.java2
-rw-r--r--altosuilib/AltosUIMap.java4
-rw-r--r--altosuilib/AltosUIMapCache.java39
-rw-r--r--altosuilib/AltosUIMapCacheListener.java22
-rw-r--r--altosuilib/AltosUIMapImage.java2
-rw-r--r--altosuilib/AltosUIMapLine.java23
-rw-r--r--altosuilib/AltosUIMapMark.java4
-rw-r--r--altosuilib/AltosUIMapPath.java4
-rw-r--r--altosuilib/AltosUIMapPreload.java4
-rw-r--r--altosuilib/AltosUIMapRectangle.java2
-rw-r--r--altosuilib/AltosUIMapStore.java2
-rw-r--r--altosuilib/AltosUIMapStoreListener.java2
-rw-r--r--altosuilib/AltosUIMapTile.java4
-rw-r--r--altosuilib/AltosUIMapTileListener.java2
-rw-r--r--altosuilib/AltosUIMapTransform.java4
-rw-r--r--altosuilib/AltosUIMapView.java8
-rw-r--r--altosuilib/AltosUIMapZoomListener.java2
-rw-r--r--altosuilib/AltosUIMarker.java4
-rw-r--r--altosuilib/AltosUIPreferences.java42
-rw-r--r--altosuilib/AltosUIPreferencesBackend.java4
-rw-r--r--altosuilib/AltosUIRateList.java61
-rw-r--r--altosuilib/AltosUISeries.java4
-rw-r--r--altosuilib/AltosUITelemetryList.java47
-rw-r--r--altosuilib/AltosUIUnitsIndicator.java4
-rw-r--r--altosuilib/AltosUIVersion.java.in2
-rw-r--r--altosuilib/AltosUIVoltageIndicator.java4
-rw-r--r--altosuilib/AltosUSBDevice.java3
-rw-r--r--altosuilib/AltosVoice.java2
-rw-r--r--altosuilib/GrabNDrag.java2
-rw-r--r--altosuilib/Makefile.am10
-rwxr-xr-xaltosuilib/OSXAdapter.java206
78 files changed, 876 insertions, 194 deletions
diff --git a/altosuilib/AltosBTDevice.java b/altosuilib/AltosBTDevice.java
index beefa532..2c085021 100644
--- a/altosuilib/AltosBTDevice.java
+++ b/altosuilib/AltosBTDevice.java
@@ -15,10 +15,10 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosBTDevice extends altos_bt_device implements AltosDevice {
diff --git a/altosuilib/AltosBTDeviceIterator.java b/altosuilib/AltosBTDeviceIterator.java
index cad60ffb..c99b27f9 100644
--- a/altosuilib/AltosBTDeviceIterator.java
+++ b/altosuilib/AltosBTDeviceIterator.java
@@ -15,11 +15,11 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.util.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosBTDeviceIterator implements Iterator<AltosBTDevice> {
AltosBTDevice current;
diff --git a/altosuilib/AltosBTKnown.java b/altosuilib/AltosBTKnown.java
index 02883c75..c526269d 100644
--- a/altosuilib/AltosBTKnown.java
+++ b/altosuilib/AltosBTKnown.java
@@ -15,10 +15,10 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosBTKnown implements Iterable<AltosBTDevice> {
LinkedList<AltosBTDevice> devices = new LinkedList<AltosBTDevice>();
diff --git a/altosuilib/AltosBTManage.java b/altosuilib/AltosBTManage.java
index 6da0a3eb..b953ca92 100644
--- a/altosuilib/AltosBTManage.java
+++ b/altosuilib/AltosBTManage.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -23,7 +23,7 @@ import javax.swing.*;
import javax.swing.plaf.basic.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosBTManage extends AltosUIDialog implements ActionListener, Iterable<AltosBTDevice> {
LinkedBlockingQueue<AltosBTDevice> found_devices;
diff --git a/altosuilib/AltosCSVUI.java b/altosuilib/AltosCSVUI.java
index 0a5e4fa2..6328d37d 100644
--- a/altosuilib/AltosCSVUI.java
+++ b/altosuilib/AltosCSVUI.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosCSVUI
extends AltosUIDialog
diff --git a/altosuilib/AltosConfigFreqUI.java b/altosuilib/AltosConfigFreqUI.java
index 6dcd63b8..a0525a00 100644
--- a/altosuilib/AltosConfigFreqUI.java
+++ b/altosuilib/AltosConfigFreqUI.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
class AltosEditFreqUI extends AltosUIDialog implements ActionListener {
Frame frame;
diff --git a/altosuilib/AltosDataChooser.java b/altosuilib/AltosDataChooser.java
index 59891c4a..1990faf1 100644
--- a/altosuilib/AltosDataChooser.java
+++ b/altosuilib/AltosDataChooser.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosDataChooser extends JFileChooser {
JFrame frame;
diff --git a/altosuilib/AltosDevice.java b/altosuilib/AltosDevice.java
index 251ae994..1f5536ff 100644
--- a/altosuilib/AltosDevice.java
+++ b/altosuilib/AltosDevice.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import libaltosJNI.*;
diff --git a/altosuilib/AltosDeviceDialog.java b/altosuilib/AltosDeviceDialog.java
index 0bedea97..d2ccd5e7 100644
--- a/altosuilib/AltosDeviceDialog.java
+++ b/altosuilib/AltosDeviceDialog.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
import java.awt.*;
@@ -131,7 +131,8 @@ public abstract class AltosDeviceDialog extends AltosUIDialog implements ActionL
buttonPane.add(cancel_button);
buttonPane.add(Box.createRigidArea(new Dimension(10, 0)));
- add_bluetooth();
+ if (AltosUILib.has_bluetooth)
+ add_bluetooth();
buttonPane.add(select_button);
diff --git a/altosuilib/AltosDeviceUIDialog.java b/altosuilib/AltosDeviceUIDialog.java
index 3013612a..80a76d6d 100644
--- a/altosuilib/AltosDeviceUIDialog.java
+++ b/altosuilib/AltosDeviceUIDialog.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
import java.awt.*;
diff --git a/altosuilib/AltosDisplayThread.java b/altosuilib/AltosDisplayThread.java
index 06bc68a9..6b6e03e7 100644
--- a/altosuilib/AltosDisplayThread.java
+++ b/altosuilib/AltosDisplayThread.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import javax.swing.*;
import java.io.*;
import java.text.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosDisplayThread extends Thread {
diff --git a/altosuilib/AltosEepromDelete.java b/altosuilib/AltosEepromDelete.java
index 981daddf..39585dad 100644
--- a/altosuilib/AltosEepromDelete.java
+++ b/altosuilib/AltosEepromDelete.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosEepromDelete implements Runnable {
AltosEepromList flights;
diff --git a/altosuilib/AltosEepromManage.java b/altosuilib/AltosEepromManage.java
index 2b967339..81dd3d13 100644
--- a/altosuilib/AltosEepromManage.java
+++ b/altosuilib/AltosEepromManage.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosEepromManage implements ActionListener {
diff --git a/altosuilib/AltosEepromMonitor.java b/altosuilib/AltosEepromMonitor.java
index b1e85622..060d0474 100644
--- a/altosuilib/AltosEepromMonitor.java
+++ b/altosuilib/AltosEepromMonitor.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
diff --git a/altosuilib/AltosEepromMonitorUI.java b/altosuilib/AltosEepromMonitorUI.java
index 02c71cd9..11dd4adb 100644
--- a/altosuilib/AltosEepromMonitorUI.java
+++ b/altosuilib/AltosEepromMonitorUI.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosEepromMonitorUI extends AltosUIDialog implements AltosEepromMonitor {
JFrame owner;
diff --git a/altosuilib/AltosEepromSelect.java b/altosuilib/AltosEepromSelect.java
index 293d3045..1adfdab5 100644
--- a/altosuilib/AltosEepromSelect.java
+++ b/altosuilib/AltosEepromSelect.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
import javax.swing.border.*;
import java.awt.*;
import java.awt.event.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
class AltosEepromItem implements ActionListener {
AltosEepromLog log;
diff --git a/altosuilib/AltosFlashUI.java b/altosuilib/AltosFlashUI.java
index 3f120617..44be2a90 100644
--- a/altosuilib/AltosFlashUI.java
+++ b/altosuilib/AltosFlashUI.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -23,7 +23,7 @@ import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.io.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosFlashUI
extends AltosUIDialog
@@ -213,6 +213,7 @@ public class AltosFlashUI
new AltosHexfileFilter(AltosLib.product_teledongle, "teledongle", "TeleDongle Image"),
new AltosHexfileFilter(AltosLib.product_telemega, "telemega", "TeleMega Image"),
new AltosHexfileFilter(AltosLib.product_easymini, "easymini", "EasyMini Image"),
+ new AltosHexfileFilter(AltosLib.product_easymega, "easymega", "EasyMega Image"),
};
boolean select_source_file() {
diff --git a/altosuilib/AltosFlightDisplay.java b/altosuilib/AltosFlightDisplay.java
index 55b74034..d0f20bb4 100644
--- a/altosuilib/AltosFlightDisplay.java
+++ b/altosuilib/AltosFlightDisplay.java
@@ -15,9 +15,9 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public interface AltosFlightDisplay extends AltosUnitsListener, AltosFontListener {
void reset();
diff --git a/altosuilib/AltosFlightInfoTableModel.java b/altosuilib/AltosFlightInfoTableModel.java
index 3995efb3..0bc4f847 100644
--- a/altosuilib/AltosFlightInfoTableModel.java
+++ b/altosuilib/AltosFlightInfoTableModel.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.table.*;
diff --git a/altosuilib/AltosFlightStatsTable.java b/altosuilib/AltosFlightStatsTable.java
index 703dfb9d..1ec4a03e 100644
--- a/altosuilib/AltosFlightStatsTable.java
+++ b/altosuilib/AltosFlightStatsTable.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import javax.swing.*;
import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosFlightStatsTable extends JComponent implements AltosFontListener {
GridBagLayout layout;
diff --git a/altosuilib/AltosFontListener.java b/altosuilib/AltosFontListener.java
index a98cc131..a1b2170b 100644
--- a/altosuilib/AltosFontListener.java
+++ b/altosuilib/AltosFontListener.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosFontListener {
void font_size_changed(int font_size);
diff --git a/altosuilib/AltosGraph.java b/altosuilib/AltosGraph.java
index f8c8b27b..522eea1e 100644
--- a/altosuilib/AltosGraph.java
+++ b/altosuilib/AltosGraph.java
@@ -15,14 +15,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
@@ -172,6 +172,29 @@ class AltosMagUnits extends AltosUnits {
}
}
+class AltosDopUnits extends AltosUnits {
+
+ public double value(double p, boolean imperial_units) {
+ return p;
+ }
+
+ public double inverse(double p, boolean imperial_units) {
+ return p;
+ }
+
+ public String show_units(boolean imperial_units) {
+ return null;
+ }
+
+ public String say_units(boolean imperial_units) {
+ return null;
+ }
+
+ public int show_fraction(int width, boolean imperial_units) {
+ return 1;
+ }
+}
+
public class AltosGraph extends AltosUIGraph {
static final private Color height_color = new Color(194,31,31);
@@ -191,6 +214,9 @@ public class AltosGraph extends AltosUIGraph {
static final private Color gps_course_color = new Color (100, 31, 112);
static final private Color gps_ground_speed_color = new Color (31, 112, 100);
static final private Color gps_climb_rate_color = new Color (31, 31, 112);
+ static final private Color gps_pdop_color = new Color(50, 194, 0);
+ static final private Color gps_hdop_color = new Color(50, 0, 194);
+ static final private Color gps_vdop_color = new Color(194, 0, 50);
static final private Color temperature_color = new Color (31, 194, 194);
static final private Color dbm_color = new Color(31, 100, 100);
static final private Color state_color = new Color(0,0,0);
@@ -212,11 +238,12 @@ public class AltosGraph extends AltosUIGraph {
static AltosGyroUnits gyro_units = new AltosGyroUnits();
static AltosOrient orient_units = new AltosOrient();
static AltosMagUnits mag_units = new AltosMagUnits();
+ static AltosDopUnits dop_units = new AltosDopUnits();
AltosUIAxis height_axis, speed_axis, accel_axis, voltage_axis, temperature_axis, nsat_axis, dbm_axis;
AltosUIAxis distance_axis, pressure_axis;
AltosUIAxis gyro_axis, orient_axis, mag_axis;
- AltosUIAxis course_axis;
+ AltosUIAxis course_axis, dop_axis;
public AltosGraph(AltosUIEnable enable, AltosFlightStats stats, AltosGraphDataSet dataSet) {
super(enable);
@@ -236,6 +263,7 @@ public class AltosGraph extends AltosUIGraph {
orient_axis = newAxis("Tilt Angle", orient_units, orient_color, 0);
mag_axis = newAxis("Magnetic Field", mag_units, mag_x_color, 0);
course_axis = newAxis("Course", orient_units, gps_course_color, 0);
+ dop_axis = newAxis("Dilution of Precision", dop_units, gps_pdop_color, 0);
addMarker("State", AltosGraphDataPoint.data_state, state_color);
@@ -325,6 +353,24 @@ public class AltosGraph extends AltosUIGraph {
gps_climb_rate_color,
enable_gps,
speed_axis);
+ addSeries("GPS Position DOP",
+ AltosGraphDataPoint.data_gps_pdop,
+ dop_units,
+ gps_pdop_color,
+ false,
+ dop_axis);
+ addSeries("GPS Horizontal DOP",
+ AltosGraphDataPoint.data_gps_hdop,
+ dop_units,
+ gps_hdop_color,
+ false,
+ dop_axis);
+ addSeries("GPS Vertical DOP",
+ AltosGraphDataPoint.data_gps_vdop,
+ dop_units,
+ gps_vdop_color,
+ false,
+ dop_axis);
}
if (stats.has_rssi)
addSeries("Received Signal Strength",
diff --git a/altosuilib/AltosGraphDataPoint.java b/altosuilib/AltosGraphDataPoint.java
index 3aff1e82..56dadb8b 100644
--- a/altosuilib/AltosGraphDataPoint.java
+++ b/altosuilib/AltosGraphDataPoint.java
@@ -15,9 +15,9 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosGraphDataPoint implements AltosUIDataPoint {
@@ -53,7 +53,10 @@ public class AltosGraphDataPoint implements AltosUIDataPoint {
public static final int data_gps_course = 27;
public static final int data_gps_ground_speed = 28;
public static final int data_gps_climb_rate = 29;
- public static final int data_ignitor_0 = 30;
+ public static final int data_gps_pdop = 30;
+ public static final int data_gps_hdop = 31;
+ public static final int data_gps_vdop = 32;
+ public static final int data_ignitor_0 = 33;
public static final int data_ignitor_num = 32;
public static final int data_ignitor_max = data_ignitor_0 + data_ignitor_num - 1;
public static final int data_ignitor_fired_0 = data_ignitor_0 + data_ignitor_num;
@@ -194,6 +197,24 @@ public class AltosGraphDataPoint implements AltosUIDataPoint {
else
y = AltosLib.MISSING;
break;
+ case data_gps_pdop:
+ if (state.gps != null)
+ y = state.gps.pdop;
+ else
+ y = AltosLib.MISSING;
+ break;
+ case data_gps_hdop:
+ if (state.gps != null)
+ y = state.gps.hdop;
+ else
+ y = AltosLib.MISSING;
+ break;
+ case data_gps_vdop:
+ if (state.gps != null)
+ y = state.gps.vdop;
+ else
+ y = AltosLib.MISSING;
+ break;
default:
if (data_ignitor_0 <= index && index <= data_ignitor_max) {
int ignitor = index - data_ignitor_0;
diff --git a/altosuilib/AltosGraphDataSet.java b/altosuilib/AltosGraphDataSet.java
index 36933e9b..0845f20e 100644
--- a/altosuilib/AltosGraphDataSet.java
+++ b/altosuilib/AltosGraphDataSet.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.lang.*;
import java.io.*;
import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
class AltosGraphIterator implements Iterator<AltosUIDataPoint> {
AltosGraphDataSet dataSet;
diff --git a/altosuilib/AltosInfoTable.java b/altosuilib/AltosInfoTable.java
index 23ae4ae5..625fe76f 100644
--- a/altosuilib/AltosInfoTable.java
+++ b/altosuilib/AltosInfoTable.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosInfoTable extends JTable implements AltosFlightDisplay, HierarchyListener {
private AltosFlightInfoTableModel model;
@@ -198,24 +198,28 @@ public class AltosInfoTable extends JTable implements AltosFlightDisplay, Hierar
if (state.gps_height != AltosLib.MISSING)
info_add_row(1, "GPS height", "%8.1f", state.gps_height);
- /* The SkyTraq GPS doesn't report these values */
- /*
- if (false) {
- info_add_row(1, "GPS ground speed", "%8.1f m/s %3d°",
- state.gps.ground_speed,
- state.gps.course);
- info_add_row(1, "GPS climb rate", "%8.1f m/s",
- state.gps.climb_rate);
- info_add_row(1, "GPS error", "%6d m(h)%3d m(v)",
- state.gps.h_error, state.gps.v_error);
- }
- */
-
- info_add_row(1, "GPS hdop", "%8.1f", state.gps.hdop);
+ if (state.gps.ground_speed != AltosLib.MISSING && state.gps.course != AltosLib.MISSING)
+ info_add_row(1, "GPS ground speed", "%6.1f m/s %3d°",
+ state.gps.ground_speed,
+ state.gps.course);
+ if (state.gps.climb_rate != AltosLib.MISSING)
+ info_add_row(1, "GPS climb rate", "%6.1f m/s",
+ state.gps.climb_rate);
+
+ if (state.gps.h_error != AltosLib.MISSING && state.gps.v_error != AltosLib.MISSING)
+ info_add_row(1, "GPS error", "%6d m(h)%3d m(v)",
+ state.gps.h_error, state.gps.v_error);
+ if (state.gps.pdop != AltosLib.MISSING &&
+ state.gps.hdop != AltosLib.MISSING &&
+ state.gps.vdop != AltosLib.MISSING)
+ info_add_row(1, "GPS dop", "%3.1fp/%3.1fh/%3.1fv",
+ state.gps.pdop,
+ state.gps.hdop,
+ state.gps.vdop);
if (state.npad > 0) {
if (state.from_pad != null) {
- info_add_row(1, "Distance from pad", "%6d m",
+ info_add_row(1, "Ground pad dist", "%6d m",
(int) (state.from_pad.distance + 0.5));
info_add_row(1, "Direction from pad", "%6d°",
(int) (state.from_pad.bearing + 0.5));
@@ -234,12 +238,12 @@ public class AltosInfoTable extends JTable implements AltosFlightDisplay, Hierar
info_add_row(1, "Pad GPS alt", "%6.0f m", state.pad_alt);
}
if (state.gps.year != AltosLib.MISSING)
- info_add_row(1, "GPS date", "%04d-%02d-%02d",
+ info_add_row(2, "GPS date", "%04d-%02d-%02d",
state.gps.year,
state.gps.month,
state.gps.day);
if (state.gps.hour != AltosLib.MISSING)
- info_add_row(1, "GPS time", " %02d:%02d:%02d",
+ info_add_row(2, "GPS time", " %02d:%02d:%02d",
state.gps.hour,
state.gps.minute,
state.gps.second);
diff --git a/altosuilib/AltosLed.java b/altosuilib/AltosLed.java
index 2debb62a..0dd5740c 100644
--- a/altosuilib/AltosLed.java
+++ b/altosuilib/AltosLed.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
diff --git a/altosuilib/AltosLights.java b/altosuilib/AltosLights.java
index c91b70e9..30934d96 100644
--- a/altosuilib/AltosLights.java
+++ b/altosuilib/AltosLights.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import javax.swing.*;
diff --git a/altosuilib/AltosPositionListener.java b/altosuilib/AltosPositionListener.java
index 34cf1650..dfc3c649 100644
--- a/altosuilib/AltosPositionListener.java
+++ b/altosuilib/AltosPositionListener.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosPositionListener {
public void position_changed(int position);
diff --git a/altosuilib/AltosRomconfigUI.java b/altosuilib/AltosRomconfigUI.java
index 8f002c4a..481ce656 100644
--- a/altosuilib/AltosRomconfigUI.java
+++ b/altosuilib/AltosRomconfigUI.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosRomconfigUI
extends AltosUIDialog
diff --git a/altosuilib/AltosScanUI.java b/altosuilib/AltosScanUI.java
index b0cde059..7e51a55a 100644
--- a/altosuilib/AltosScanUI.java
+++ b/altosuilib/AltosScanUI.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.io.*;
import java.util.*;
import java.text.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
class AltosScanResult {
String callsign;
@@ -33,32 +33,40 @@ class AltosScanResult {
int flight;
AltosFrequency frequency;
int telemetry;
+ int rate;
boolean interrupted = false;
public String toString() {
- return String.format("%-9.9s serial %-4d flight %-4d (%s %s)",
- callsign, serial, flight, frequency.toShortString(), AltosLib.telemetry_name(telemetry));
+ return String.format("%-9.9s serial %-4d flight %-4d (%s %s %d)",
+ callsign, serial, flight,
+ frequency.toShortString(),
+ AltosLib.telemetry_name(telemetry),
+ AltosLib.ao_telemetry_rate_values[rate]);
}
public String toShortString() {
- return String.format("%s %d %d %7.3f %d",
- callsign, serial, flight, frequency, telemetry);
+ return String.format("%s %d %d %7.3f %d %d",
+ callsign, serial, flight, frequency, telemetry, rate);
}
public AltosScanResult(String in_callsign, int in_serial,
- int in_flight, AltosFrequency in_frequency, int in_telemetry) {
+ int in_flight, AltosFrequency in_frequency,
+ int in_telemetry,
+ int in_rate) {
callsign = in_callsign;
serial = in_serial;
flight = in_flight;
frequency = in_frequency;
telemetry = in_telemetry;
+ rate = in_rate;
}
public boolean equals(AltosScanResult other) {
return (serial == other.serial &&
frequency.frequency == other.frequency.frequency &&
- telemetry == other.telemetry);
+ telemetry == other.telemetry &&
+ rate == other.rate);
}
public boolean up_to_date(AltosScanResult other) {
@@ -132,15 +140,20 @@ public class AltosScanUI
private JLabel scanning_label;
private JLabel frequency_label;
private JLabel telemetry_label;
+ private JLabel rate_label;
private JButton cancel_button;
private JButton monitor_button;
private JCheckBox[] telemetry_boxes;
+ private JCheckBox[] rate_boxes;
javax.swing.Timer timer;
AltosScanResults results = new AltosScanResults();
int telemetry;
boolean select_telemetry = false;
+ int rate;
+ boolean select_rate = false;
+
final static int timeout = 1200;
TelemetryHandler handler;
Thread thread;
@@ -189,10 +202,11 @@ public class AltosScanUI
continue;
if (state.flight != AltosLib.MISSING) {
final AltosScanResult result = new AltosScanResult(state.callsign,
- state.serial,
- state.flight,
- frequencies[frequency_index],
- telemetry);
+ state.serial,
+ state.flight,
+ frequencies[frequency_index],
+ telemetry,
+ rate);
Runnable r = new Runnable() {
public void run() {
results.add(result);
@@ -217,12 +231,18 @@ public class AltosScanUI
frequency_label.setText(String.format("Frequency: %s", frequencies[frequency_index].toString()));
if (select_telemetry)
telemetry_label.setText(String.format("Telemetry: %s", AltosLib.telemetry_name(telemetry)));
+ if (select_rate)
+ rate_label.setText(String.format("Rate: %d baud", AltosLib.ao_telemetry_rate_values[rate]));
}
void set_telemetry() {
reader.set_telemetry(telemetry);
}
+ void set_rate() {
+ reader.set_telemetry_rate(rate);
+ }
+
void set_frequency() throws InterruptedException, TimeoutException {
reader.set_frequency(frequencies[frequency_index].frequency);
reader.reset();
@@ -230,24 +250,43 @@ public class AltosScanUI
void next() throws InterruptedException, TimeoutException {
reader.set_monitor(false);
+
+ /* Let any pending input from the last configuration drain out */
Thread.sleep(100);
- ++frequency_index;
+
+ if (select_rate) {
+ boolean wrapped = false;
+ do {
+ ++rate;
+ if (rate > AltosLib.ao_telemetry_rate_max) {
+ wrapped = true;
+ rate = 0;
+ }
+ } while (!rate_boxes[rate].isSelected());
+ set_rate();
+ if (!wrapped) {
+ set_label();
+ return;
+ }
+ }
if (select_telemetry) {
- if (frequency_index >= frequencies.length ||
- !telemetry_boxes[telemetry - AltosLib.ao_telemetry_min].isSelected())
- {
- frequency_index = 0;
- do {
- ++telemetry;
- if (telemetry > AltosLib.ao_telemetry_max)
- telemetry = AltosLib.ao_telemetry_min;
- } while (!telemetry_boxes[telemetry - AltosLib.ao_telemetry_min].isSelected());
- set_telemetry();
+ boolean wrapped = false;
+ do {
+ ++telemetry;
+ if (telemetry > AltosLib.ao_telemetry_max) {
+ wrapped = true;
+ telemetry = AltosLib.ao_telemetry_min;
+ }
+ } while (!telemetry_boxes[telemetry - AltosLib.ao_telemetry_min].isSelected());
+ set_telemetry();
+ if (!wrapped) {
+ set_label();
+ return;
}
- } else {
- if (frequency_index >= frequencies.length)
- frequency_index = 0;
}
+ ++frequency_index;
+ if (frequency_index >= frequencies.length)
+ frequency_index = 0;
set_frequency();
set_label();
reader.set_monitor(true);
@@ -297,15 +336,33 @@ public class AltosScanUI
AltosUIPreferences.set_scanning_telemetry(scanning_telemetry);
}
+ if (cmd.equals("rate")) {
+ int k;
+ int scanning_rate = 0;
+ for (k = 0; k <= AltosLib.ao_telemetry_rate_max; k++) {
+ if (rate_boxes[k].isSelected())
+ scanning_rate |= (1 << k);
+ }
+ if (scanning_rate == 0) {
+ scanning_rate = (1 << 0);
+ rate_boxes[0].setSelected(true);
+ }
+ AltosUIPreferences.set_scanning_telemetry_rate(scanning_rate);
+ }
+
if (cmd.equals("monitor")) {
close();
AltosScanResult r = (AltosScanResult) (list.getSelectedValue());
if (r != null) {
if (device != null) {
if (reader != null) {
+ System.out.printf("frequency %g rate %d\n", r.frequency.frequency, r.rate);
reader.set_telemetry(r.telemetry);
+ reader.set_telemetry_rate(r.rate);
reader.set_frequency(r.frequency.frequency);
reader.save_frequency();
+ reader.save_telemetry();
+ reader.save_telemetry_rate();
owner.scan_device_selected(device);
}
}
@@ -341,6 +398,7 @@ public class AltosScanUI
reader = new AltosTelemetryReader(new AltosSerial(device));
set_frequency();
set_telemetry();
+ set_rate();
try {
Thread.sleep(100);
} catch (InterruptedException ie) {
@@ -386,11 +444,13 @@ public class AltosScanUI
owner = in_owner;
select_telemetry = in_select_telemetry;
+ select_rate = true;
frequencies = AltosUIPreferences.common_frequencies();
frequency_index = 0;
telemetry = AltosLib.ao_telemetry_standard;
+ rate = 0;
if (!open())
return;
@@ -412,18 +472,24 @@ public class AltosScanUI
if (select_telemetry) {
telemetry_label = new JLabel("");
+ telemetry_label.setPreferredSize(new Dimension(100, 16));
telemetry = AltosLib.ao_telemetry_min;
} else {
telemetry = AltosLib.ao_telemetry_standard;
}
+ if (select_rate) {
+ rate_label = new JLabel("");
+ rate_label.setPreferredSize(new Dimension(100, 16));
+ }
+
set_label();
c.fill = GridBagConstraints.HORIZONTAL;
- c.anchor = GridBagConstraints.WEST;
+ c.anchor = GridBagConstraints.LINE_START;
c.insets = i;
- c.weightx = 1;
- c.weighty = 1;
+ c.weightx = 0;
+ c.weighty = 0;
c.gridx = 0;
c.gridy = 0;
@@ -433,10 +499,35 @@ public class AltosScanUI
c.gridy = 1;
pane.add(frequency_label, c);
- int y_offset = 3;
+ int y_offset_rate = 3;
+ int y_offset_telem = 3;
+
+ int check_x = 0;
+
+ if (select_rate && select_telemetry)
+ c.gridwidth = 1;
+
+ if (select_rate) {
+ c.gridy = 2;
+ c.gridx = check_x++;
+ pane.add(rate_label, c);
+
+ int scanning_rate = AltosUIPreferences.scanning_telemetry_rate();
+ rate_boxes = new JCheckBox[AltosLib.ao_telemetry_rate_max + 1];
+ for (int k = 0; k <= AltosLib.ao_telemetry_rate_max; k++) {
+ rate_boxes[k] = new JCheckBox(String.format("%d baud", AltosLib.ao_telemetry_rate_values[k]));
+ c.gridy = y_offset_rate + k;
+ pane.add(rate_boxes[k], c);
+ rate_boxes[k].setActionCommand("rate");
+ rate_boxes[k].addActionListener(this);
+ rate_boxes[k].setSelected((scanning_rate & (1 << k)) != 0);
+ }
+ y_offset_rate += AltosLib.ao_telemetry_rate_max + 1;
+ }
if (select_telemetry) {
c.gridy = 2;
+ c.gridx = check_x++;
pane.add(telemetry_label, c);
int scanning_telemetry = AltosUIPreferences.scanning_telemetry();
@@ -444,15 +535,17 @@ public class AltosScanUI
for (int k = AltosLib.ao_telemetry_min; k <= AltosLib.ao_telemetry_max; k++) {
int j = k - AltosLib.ao_telemetry_min;
telemetry_boxes[j] = new JCheckBox(AltosLib.telemetry_name(k));
- c.gridy = 3 + j;
+ c.gridy = y_offset_telem + j;
pane.add(telemetry_boxes[j], c);
telemetry_boxes[j].setActionCommand("telemetry");
telemetry_boxes[j].addActionListener(this);
telemetry_boxes[j].setSelected((scanning_telemetry & (1 << k)) != 0);
}
- y_offset += (AltosLib.ao_telemetry_max - AltosLib.ao_telemetry_min + 1);
+ y_offset_telem += (AltosLib.ao_telemetry_max - AltosLib.ao_telemetry_min + 1);
}
+ int y_offset = Math.max(y_offset_rate, y_offset_telem);
+
list = new JList<AltosScanResult>(results) {
//Subclass JList to workaround bug 4832765, which can cause the
//scroll pane to not let the user easily scroll up to the beginning
diff --git a/altosuilib/AltosSerial.java b/altosuilib/AltosSerial.java
index 60e15bdb..0eba55fd 100644
--- a/altosuilib/AltosSerial.java
+++ b/altosuilib/AltosSerial.java
@@ -19,13 +19,13 @@
* Deal with TeleDongle on a serial port
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.*;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import libaltosJNI.*;
/*
diff --git a/altosuilib/AltosSerialInUseException.java b/altosuilib/AltosSerialInUseException.java
index 1e8207d1..cd19b101 100644
--- a/altosuilib/AltosSerialInUseException.java
+++ b/altosuilib/AltosSerialInUseException.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public class AltosSerialInUseException extends Exception {
public AltosDevice device;
diff --git a/altosuilib/AltosUIAxis.java b/altosuilib/AltosUIAxis.java
index 74561673..9e98ddb7 100644
--- a/altosuilib/AltosUIAxis.java
+++ b/altosuilib/AltosUIAxis.java
@@ -15,14 +15,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
@@ -48,7 +48,11 @@ public class AltosUIAxis extends NumberAxis {
public final static int axis_default = axis_include_zero;
public void set_units() {
- setLabel(String.format("%s (%s)", label, units.show_units()));
+ String u = units.show_units();
+ if (u != null)
+ setLabel(String.format("%s (%s)", label, u));
+ else
+ setLabel(label);
}
public void set_enable(boolean enable) {
diff --git a/altosuilib/AltosUIConfigure.java b/altosuilib/AltosUIConfigure.java
index 0e82cacb..9c0f3bc7 100644
--- a/altosuilib/AltosUIConfigure.java
+++ b/altosuilib/AltosUIConfigure.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -223,6 +223,31 @@ public class AltosUIConfigure
row++;
}
+ static final Integer map_caches[] = { 9, 25, 100 };
+
+ public void add_map_cache() {
+ pane.add(new JLabel("Map Cache Size"), constraints(0, 1));
+
+ final JComboBox<Integer> map_cache = new JComboBox<Integer>(map_caches);
+
+ map_cache.setEditable(true);
+ map_cache.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {
+ try {
+ int size = (Integer) (map_cache.getSelectedItem());
+
+ AltosUIPreferences.set_map_cache(size);
+ } catch (ClassCastException ce) {
+ map_cache.setSelectedItem(new Integer(AltosUIPreferences.map_cache()));
+ }
+ }
+ });
+
+ map_cache.setSelectedItem (new Integer(AltosUIPreferences.map_cache()));
+ pane.add(map_cache, constraints(1, 2, GridBagConstraints.BOTH));
+ row++;
+ }
+
public void add_bluetooth() {
}
@@ -257,7 +282,9 @@ public class AltosUIConfigure
add_font_size();
add_look_and_feel();
add_position();
- add_bluetooth();
+ add_map_cache();
+ if (AltosUILib.has_bluetooth)
+ add_bluetooth();
add_frequencies();
/* And a close button at the bottom */
diff --git a/altosuilib/AltosUIDataMissing.java b/altosuilib/AltosUIDataMissing.java
index 353ff30f..9a810a41 100644
--- a/altosuilib/AltosUIDataMissing.java
+++ b/altosuilib/AltosUIDataMissing.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public class AltosUIDataMissing extends Exception {
public int id;
diff --git a/altosuilib/AltosUIDataPoint.java b/altosuilib/AltosUIDataPoint.java
index 3f16500e..f72bbcd5 100644
--- a/altosuilib/AltosUIDataPoint.java
+++ b/altosuilib/AltosUIDataPoint.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosUIDataPoint {
public abstract double x() throws AltosUIDataMissing;
diff --git a/altosuilib/AltosUIDataSet.java b/altosuilib/AltosUIDataSet.java
index ee70a3fd..9e048587 100644
--- a/altosuilib/AltosUIDataSet.java
+++ b/altosuilib/AltosUIDataSet.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosUIDataSet {
public abstract String name();
diff --git a/altosuilib/AltosUIDialog.java b/altosuilib/AltosUIDialog.java
index dc737414..9fc5283e 100644
--- a/altosuilib/AltosUIDialog.java
+++ b/altosuilib/AltosUIDialog.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
diff --git a/altosuilib/AltosUIEnable.java b/altosuilib/AltosUIEnable.java
index da98797a..e227d2b7 100644
--- a/altosuilib/AltosUIEnable.java
+++ b/altosuilib/AltosUIEnable.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -23,7 +23,7 @@ import javax.swing.*;
import java.io.*;
import java.util.concurrent.*;
import java.util.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
diff --git a/altosuilib/AltosUIFlightTab.java b/altosuilib/AltosUIFlightTab.java
index 039d83e0..74161634 100644
--- a/altosuilib/AltosUIFlightTab.java
+++ b/altosuilib/AltosUIFlightTab.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public abstract class AltosUIFlightTab extends JComponent implements AltosFlightDisplay, HierarchyListener {
public GridBagLayout layout;
diff --git a/altosuilib/AltosUIFrame.java b/altosuilib/AltosUIFrame.java
index 6e62c762..2e886932 100644
--- a/altosuilib/AltosUIFrame.java
+++ b/altosuilib/AltosUIFrame.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -36,12 +36,12 @@ public class AltosUIFrame extends JFrame implements AltosUIListener, AltosPositi
}
static String[] altos_icon_names = {
- "/altus-metrum-16.png",
- "/altus-metrum-32.png",
- "/altus-metrum-48.png",
- "/altus-metrum-64.png",
- "/altus-metrum-128.png",
- "/altus-metrum-256.png"
+ "/altusmetrum-altosui-16.png",
+ "/altusmetrum-altosui-32.png",
+ "/altusmetrum-altosui-48.png",
+ "/altusmetrum-altosui-64.png",
+ "/altusmetrum-altosui-128.png",
+ "/altusmetrum-altosui-256.png"
};
static public String[] icon_names;
@@ -157,11 +157,72 @@ public class AltosUIFrame extends JFrame implements AltosUIListener, AltosPositi
}
}
+ static boolean global_settings_done;
+
+ public String getName() {
+ return "Altus Metrum";
+ }
+
+ public void macosx_quit_handler() {
+ System.out.printf("Got quit handler\n");
+ }
+
+ public void macosx_about_handler() {
+ System.out.printf("Got about handler\n");
+ }
+
+ public void macosx_preferences_handler() {
+ System.out.printf("Got preferences handler\n");
+ }
+
+ public void macosx_file_handler(String path) {
+ System.out.printf("Got file handler with \"%s\"\n", path);
+ }
+
+ /* Check that we are on Mac OS X. This is crucial to loading and using the OSXAdapter class.
+ */
+ public static boolean MAC_OS_X = (System.getProperty("os.name").toLowerCase().startsWith("mac os x"));
+
+ private static boolean registered_for_macosx_events;
+
+ /* Generic registration with the Mac OS X application menu
+ * Checks the platform, then attempts to register with the Apple EAWT
+ * See OSXAdapter.java to see how this is done without directly referencing any Apple APIs
+ */
+ public synchronized void register_for_macosx_events() {
+ if (registered_for_macosx_events)
+ return;
+ registered_for_macosx_events = true;
+ if (MAC_OS_X) {
+ try {
+ // Generate and register the OSXAdapter, passing it a hash of all the methods we wish to
+ // use as delegates for various com.apple.eawt.ApplicationListener methods
+ OSXAdapter.setQuitHandler(this, getClass().getDeclaredMethod("macosx_quit_handler", (Class[])null));
+// OSXAdapter.setAboutHandler(this, getClass().getDeclaredMethod("macosx_about_handler", (Class[])null));
+ OSXAdapter.setPreferencesHandler(this, getClass().getDeclaredMethod("macosx_preferences_handler", (Class[])null));
+ OSXAdapter.setFileHandler(this, getClass().getDeclaredMethod("macosx_file_handler", new Class[] { String.class }));
+ } catch (Exception e) {
+ System.err.println("Error while loading the OSXAdapter:");
+ e.printStackTrace();
+ }
+ }
+ }
void init() {
AltosUIPreferences.register_ui_listener(this);
AltosUIPreferences.register_position_listener(this);
position = AltosUIPreferences.position();
addWindowListener(new AltosUIFrameListener());
+
+ /* Try to make menus live in the menu bar like regular Mac apps */
+ if (!global_settings_done) {
+ try {
+ global_settings_done = true;
+ System.setProperty("com.apple.mrj.application.apple.menu.about.name", getName());
+ System.setProperty("com.apple.macos.useScreenMenuBar", "true");
+ System.setProperty("apple.laf.useScreenMenuBar", "true" ); // for older versions of Java
+ } catch (Exception e) {
+ }
+ }
set_icon();
}
diff --git a/altosuilib/AltosFreqList.java b/altosuilib/AltosUIFreqList.java
index e1299aae..84e6dce4 100644
--- a/altosuilib/AltosFreqList.java
+++ b/altosuilib/AltosUIFreqList.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
-public class AltosFreqList extends JComboBox<AltosFrequency> {
+public class AltosUIFreqList extends JComboBox<AltosFrequency> {
String product;
int serial;
@@ -53,6 +53,7 @@ public class AltosFreqList extends JComboBox<AltosFrequency> {
AltosUIPreferences.add_common_frequency(frequency);
insertItemAt(frequency, i);
setMaximumRowCount(getItemCount());
+ setVisible(true);
}
public void set_product(String new_product) {
@@ -70,7 +71,7 @@ public class AltosFreqList extends JComboBox<AltosFrequency> {
return 434.550;
}
- public AltosFreqList () {
+ public AltosUIFreqList () {
super(AltosUIPreferences.common_frequencies());
setMaximumRowCount(getItemCount());
setEditable(false);
@@ -78,7 +79,7 @@ public class AltosFreqList extends JComboBox<AltosFrequency> {
serial = 0;
}
- public AltosFreqList(double in_frequency) {
+ public AltosUIFreqList(double in_frequency) {
this();
set_frequency(in_frequency);
}
diff --git a/altosuilib/AltosUIGraph.java b/altosuilib/AltosUIGraph.java
index 9cca088d..870c4e93 100644
--- a/altosuilib/AltosUIGraph.java
+++ b/altosuilib/AltosUIGraph.java
@@ -15,14 +15,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
diff --git a/altosuilib/AltosUIGrapher.java b/altosuilib/AltosUIGrapher.java
index 724fac18..39accab4 100644
--- a/altosuilib/AltosUIGrapher.java
+++ b/altosuilib/AltosUIGrapher.java
@@ -15,14 +15,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
diff --git a/altosuilib/AltosUIIndicator.java b/altosuilib/AltosUIIndicator.java
index b1626cba..d17078e7 100644
--- a/altosuilib/AltosUIIndicator.java
+++ b/altosuilib/AltosUIIndicator.java
@@ -15,11 +15,11 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public abstract class AltosUIIndicator implements AltosFontListener, AltosUnitsListener {
JLabel label;
diff --git a/altosuilib/AltosUILatLon.java b/altosuilib/AltosUILatLon.java
index 688dd58b..a15bf19f 100644
--- a/altosuilib/AltosUILatLon.java
+++ b/altosuilib/AltosUILatLon.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUILatLon {
public double lat;
diff --git a/altosuilib/AltosUILib.java b/altosuilib/AltosUILib.java
index b51c5963..8fa7dfe6 100644
--- a/altosuilib/AltosUILib.java
+++ b/altosuilib/AltosUILib.java
@@ -15,12 +15,12 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import libaltosJNI.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUILib extends AltosLib {
@@ -80,6 +80,7 @@ public class AltosUILib extends AltosLib {
static public boolean initialized = false;
static public boolean loaded_library = false;
+ static public boolean has_bluetooth = false;
static final String[] library_names = { "altos", "altos32", "altos64" };
@@ -96,6 +97,13 @@ public class AltosUILib extends AltosLib {
loaded_library = false;
}
}
+
+ String OS = System.getProperty("os.name");
+
+ if (OS.startsWith("Linux")) {
+ has_bluetooth = true;
+ }
+
initialized = true;
}
return loaded_library;
diff --git a/altosuilib/AltosUIListener.java b/altosuilib/AltosUIListener.java
index 75a0ad94..a32d310c 100644
--- a/altosuilib/AltosUIListener.java
+++ b/altosuilib/AltosUIListener.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosUIListener {
public void ui_changed(String look_and_feel);
diff --git a/altosuilib/AltosUIMap.java b/altosuilib/AltosUIMap.java
index aaa68f23..c22801f8 100644
--- a/altosuilib/AltosUIMap.java
+++ b/altosuilib/AltosUIMap.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIMap extends JComponent implements AltosFlightDisplay, AltosUIMapZoomListener {
diff --git a/altosuilib/AltosUIMapCache.java b/altosuilib/AltosUIMapCache.java
index 55311d8c..b9064cf4 100644
--- a/altosuilib/AltosUIMapCache.java
+++ b/altosuilib/AltosUIMapCache.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
import javax.imageio.ImageIO;
@@ -24,30 +24,31 @@ import java.awt.*;
import java.io.*;
import java.net.*;
-public class AltosUIMapCache {
+public class AltosUIMapCache implements AltosUIMapCacheListener {
static final int success = 0;
static final int loading = 1;
static final int failed = 2;
static final int bad_request = 3;
static final int forbidden = 4;
- static final int min_cache_size = 9;
- static final int max_cache_size = 24;
+ int min_cache_size; /* configured minimum cache size */
+ int cache_size; /* current cache size */
+ int requested_cache_size; /* cache size computed by application */
private Object fetch_lock = new Object();
private Object cache_lock = new Object();
- int cache_size = min_cache_size;
-
AltosUIMapImage[] images = new AltosUIMapImage[cache_size];
long used;
public void set_cache_size(int new_size) {
+
+ requested_cache_size = new_size;
+
if (new_size < min_cache_size)
new_size = min_cache_size;
- if (new_size > max_cache_size)
- new_size = max_cache_size;
+
if (new_size == cache_size)
return;
@@ -109,6 +110,28 @@ public class AltosUIMapCache {
}
}
+ public void map_cache_changed(int map_cache) {
+ min_cache_size = map_cache;
+
+ set_cache_size(requested_cache_size);
+ }
+
+ public void dispose() {
+ AltosUIPreferences.unregister_map_cache_listener(this);
+
+ for (int i = 0; i < cache_size; i++) {
+ AltosUIMapImage image = images[i];
+
+ if (image != null)
+ image.flush();
+ }
+ }
+
public AltosUIMapCache() {
+ min_cache_size = AltosUIPreferences.map_cache();
+
+ set_cache_size(0);
+
+ AltosUIPreferences.register_map_cache_listener(this);
}
}
diff --git a/altosuilib/AltosUIMapCacheListener.java b/altosuilib/AltosUIMapCacheListener.java
new file mode 100644
index 00000000..680d123e
--- /dev/null
+++ b/altosuilib/AltosUIMapCacheListener.java
@@ -0,0 +1,22 @@
+/*
+ * Copyright © 2014 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_3;
+
+public interface AltosUIMapCacheListener {
+ public void map_cache_changed(int map_cache);
+}
diff --git a/altosuilib/AltosUIMapImage.java b/altosuilib/AltosUIMapImage.java
index 3819d079..77cd4299 100644
--- a/altosuilib/AltosUIMapImage.java
+++ b/altosuilib/AltosUIMapImage.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import javax.swing.*;
import javax.imageio.ImageIO;
diff --git a/altosuilib/AltosUIMapLine.java b/altosuilib/AltosUIMapLine.java
index e09a2d9f..32437d4e 100644
--- a/altosuilib/AltosUIMapLine.java
+++ b/altosuilib/AltosUIMapLine.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,12 +25,13 @@ import java.lang.Math;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIMapLine {
AltosUILatLon start, end;
private Font font = null;
+ static public int stroke_width = 6;
public void set_font(Font font) {
this.font = font;
@@ -87,19 +88,24 @@ public class AltosUIMapLine {
}
public void paint(Graphics2D g, AltosUIMapTransform t) {
- g.setColor(Color.BLUE);
if (start == null || end == null)
return;
+ g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
+
Line2D.Double line = new Line2D.Double(t.screen(start),
t.screen(end));
+ g.setColor(Color.WHITE);
+ g.setStroke(new BasicStroke(stroke_width+4, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
+ g.draw(line);
+
+ g.setColor(Color.BLUE);
+ g.setStroke(new BasicStroke(stroke_width, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g.draw(line);
String message = line_dist();
- g.setFont(font);
- g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
Rectangle2D bounds;
bounds = font.getStringBounds(message, g.getFontRenderContext());
@@ -111,6 +117,13 @@ public class AltosUIMapLine {
} else {
x += 2.0f;
}
+
+ g.setFont(font);
+ g.setColor(Color.WHITE);
+ for (int dy = -2; dy <= 2; dy += 2)
+ for (int dx = -2; dx <= 2; dx += 2)
+ g.drawString(message, x + dx, y + dy);
+ g.setColor(Color.BLUE);
g.drawString(message, x, y);
}
}
diff --git a/altosuilib/AltosUIMapMark.java b/altosuilib/AltosUIMapMark.java
index 8c640e5f..47fc4d5e 100644
--- a/altosuilib/AltosUIMapMark.java
+++ b/altosuilib/AltosUIMapMark.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIMapMark {
diff --git a/altosuilib/AltosUIMapPath.java b/altosuilib/AltosUIMapPath.java
index ff17be67..705f4b6a 100644
--- a/altosuilib/AltosUIMapPath.java
+++ b/altosuilib/AltosUIMapPath.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
class PathPoint {
AltosUILatLon lat_lon;
diff --git a/altosuilib/AltosUIMapPreload.java b/altosuilib/AltosUIMapPreload.java
index 56066d70..1c088a49 100644
--- a/altosuilib/AltosUIMapPreload.java
+++ b/altosuilib/AltosUIMapPreload.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -26,7 +26,7 @@ import java.text.*;
import java.lang.Math;
import java.net.URL;
import java.net.URLConnection;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
class AltosUIMapPos extends Box {
AltosUIFrame owner;
diff --git a/altosuilib/AltosUIMapRectangle.java b/altosuilib/AltosUIMapRectangle.java
index 8a5b16e1..463ef3f2 100644
--- a/altosuilib/AltosUIMapRectangle.java
+++ b/altosuilib/AltosUIMapRectangle.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public class AltosUIMapRectangle {
AltosUILatLon ul, lr;
diff --git a/altosuilib/AltosUIMapStore.java b/altosuilib/AltosUIMapStore.java
index 4cecb54f..dd8ace32 100644
--- a/altosuilib/AltosUIMapStore.java
+++ b/altosuilib/AltosUIMapStore.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.net.*;
diff --git a/altosuilib/AltosUIMapStoreListener.java b/altosuilib/AltosUIMapStoreListener.java
index 91aff00c..0bbd2bc9 100644
--- a/altosuilib/AltosUIMapStoreListener.java
+++ b/altosuilib/AltosUIMapStoreListener.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosUIMapStoreListener {
abstract void notify_store(AltosUIMapStore store, int status);
diff --git a/altosuilib/AltosUIMapTile.java b/altosuilib/AltosUIMapTile.java
index 7c823183..8b6a8f0a 100644
--- a/altosuilib/AltosUIMapTile.java
+++ b/altosuilib/AltosUIMapTile.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.image.*;
@@ -25,7 +25,7 @@ import java.awt.geom.*;
import java.io.*;
import java.util.*;
import java.awt.RenderingHints.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIMapTile {
AltosUIMapTileListener listener;
diff --git a/altosuilib/AltosUIMapTileListener.java b/altosuilib/AltosUIMapTileListener.java
index 4ca13539..f58f55e0 100644
--- a/altosuilib/AltosUIMapTileListener.java
+++ b/altosuilib/AltosUIMapTileListener.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosUIMapTileListener {
abstract public void notify_tile(AltosUIMapTile tile, int status);
diff --git a/altosuilib/AltosUIMapTransform.java b/altosuilib/AltosUIMapTransform.java
index e6f1ffe3..89a3e9f6 100644
--- a/altosuilib/AltosUIMapTransform.java
+++ b/altosuilib/AltosUIMapTransform.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -25,7 +25,7 @@ import java.lang.Math;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIMapTransform {
diff --git a/altosuilib/AltosUIMapView.java b/altosuilib/AltosUIMapView.java
index a14fde65..70b8e2e9 100644
--- a/altosuilib/AltosUIMapView.java
+++ b/altosuilib/AltosUIMapView.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
@@ -26,7 +26,7 @@ import java.lang.*;
import java.awt.geom.*;
import java.util.*;
import java.util.concurrent.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIMapView extends Component implements MouseMotionListener, MouseListener, MouseWheelListener, ComponentListener, AltosUIMapTileListener, AltosUIMapStoreListener {
@@ -67,7 +67,7 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
AltosUILatLon centre;
public void set_font() {
- line.set_font(AltosUILib.value_font);
+ line.set_font(AltosUILib.status_font);
for (AltosUIMapTile tile : tiles.values())
tile.set_font(AltosUILib.value_font);
repaint();
@@ -370,7 +370,7 @@ public class AltosUIMapView extends Component implements MouseMotionListener, Mo
for (Point point : to_remove)
tiles.remove(point);
- cache.set_cache_size(((lower_right.y - upper_left.y) / px_size + 1) * ((lower_right.x - upper_left.x) / px_size + 1));
+ cache.set_cache_size((getWidth() / px_size + 2) * (getHeight() / px_size + 2));
for (int y = upper_left.y; y <= lower_right.y; y += px_size) {
for (int x = upper_left.x; x <= lower_right.x; x += px_size) {
Point point = new Point(x, y);
diff --git a/altosuilib/AltosUIMapZoomListener.java b/altosuilib/AltosUIMapZoomListener.java
index 02e8bb51..23498c89 100644
--- a/altosuilib/AltosUIMapZoomListener.java
+++ b/altosuilib/AltosUIMapZoomListener.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public interface AltosUIMapZoomListener {
abstract public void zoom_changed(int zoom);
diff --git a/altosuilib/AltosUIMarker.java b/altosuilib/AltosUIMarker.java
index cd6fa589..5e9809ee 100644
--- a/altosuilib/AltosUIMarker.java
+++ b/altosuilib/AltosUIMarker.java
@@ -15,14 +15,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
diff --git a/altosuilib/AltosUIPreferences.java b/altosuilib/AltosUIPreferences.java
index 7a582a7d..ecab20d4 100644
--- a/altosuilib/AltosUIPreferences.java
+++ b/altosuilib/AltosUIPreferences.java
@@ -15,13 +15,13 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.*;
import java.awt.Component;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public class AltosUIPreferences extends AltosPreferences {
@@ -34,6 +34,9 @@ public class AltosUIPreferences extends AltosPreferences {
/* Window position preference name */
final static String positionPreference = "POSITION";
+ /* Maps cache size preference name */
+ final static String mapCachePreference = "MAP-CACHE";
+
/* UI Component to pop dialogs up */
static Component component;
@@ -52,6 +55,10 @@ public class AltosUIPreferences extends AltosPreferences {
public static int position = AltosUILib.position_top_left;
+ static LinkedList<AltosUIMapCacheListener> map_cache_listeners;
+
+ public static int map_cache = 9;
+
public static void init() {
AltosPreferences.init(new AltosUIPreferencesBackend());
@@ -68,6 +75,9 @@ public class AltosUIPreferences extends AltosPreferences {
position = backend.getInt(positionPreference, AltosUILib.position_top_left);
position_listeners = new LinkedList<AltosPositionListener>();
+
+ map_cache = backend.getInt(mapCachePreference, 9);
+ map_cache_listeners = new LinkedList<AltosUIMapCacheListener>();
}
static { init(); }
@@ -215,4 +225,32 @@ public class AltosUIPreferences extends AltosPreferences {
return position;
}
}
+
+ public static void register_map_cache_listener(AltosUIMapCacheListener l) {
+ synchronized(backend) {
+ map_cache_listeners.add(l);
+ }
+ }
+
+ public static void unregister_map_cache_listener(AltosUIMapCacheListener l) {
+ synchronized (backend) {
+ map_cache_listeners.remove(l);
+ }
+ }
+
+ public static void set_map_cache(int new_map_cache) {
+ synchronized(backend) {
+ map_cache = new_map_cache;
+ backend.putInt(mapCachePreference, map_cache);
+ flush_preferences();
+ for (AltosUIMapCacheListener l: map_cache_listeners)
+ l.map_cache_changed(map_cache);
+ }
+ }
+
+ public static int map_cache() {
+ synchronized(backend) {
+ return map_cache;
+ }
+ }
}
diff --git a/altosuilib/AltosUIPreferencesBackend.java b/altosuilib/AltosUIPreferencesBackend.java
index da29253d..4048fd83 100644
--- a/altosuilib/AltosUIPreferencesBackend.java
+++ b/altosuilib/AltosUIPreferencesBackend.java
@@ -15,11 +15,11 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.File;
import java.util.prefs.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import javax.swing.filechooser.FileSystemView;
public class AltosUIPreferencesBackend implements AltosPreferencesBackend {
diff --git a/altosuilib/AltosUIRateList.java b/altosuilib/AltosUIRateList.java
new file mode 100644
index 00000000..ee35ce6d
--- /dev/null
+++ b/altosuilib/AltosUIRateList.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright © 2011 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_3;
+
+import javax.swing.*;
+import org.altusmetrum.altoslib_5.*;
+
+public class AltosUIRateList extends JComboBox<String> {
+
+ String product;
+ int serial;
+
+ public void set_rate(int new_rate) {
+ int i;
+
+ setVisible(new_rate >= 0);
+ setSelectedIndex(new_rate);
+ }
+
+ public void set_product(String new_product) {
+ product = new_product;
+ }
+
+ public void set_serial(int new_serial) {
+ serial = new_serial;
+ }
+
+ public int rate() {
+ return getSelectedIndex();
+ }
+
+ public AltosUIRateList () {
+ super();
+ for (int i = 0; i < AltosLib.ao_telemetry_rate_values.length; i++)
+ addItem(String.format("%d baud", AltosLib.ao_telemetry_rate_values[i]));
+ setMaximumRowCount(getItemCount());
+ setEditable(false);
+ product = "Unknown";
+ serial = 0;
+ }
+
+ public AltosUIRateList(int in_rate) {
+ this();
+ set_rate(in_rate);
+ }
+}
diff --git a/altosuilib/AltosUISeries.java b/altosuilib/AltosUISeries.java
index b0632d18..809020c4 100644
--- a/altosuilib/AltosUISeries.java
+++ b/altosuilib/AltosUISeries.java
@@ -15,14 +15,14 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.io.*;
import java.util.ArrayList;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
import org.jfree.ui.*;
import org.jfree.chart.*;
diff --git a/altosuilib/AltosUITelemetryList.java b/altosuilib/AltosUITelemetryList.java
new file mode 100644
index 00000000..facfdcde
--- /dev/null
+++ b/altosuilib/AltosUITelemetryList.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright © 2014 Keith Packard <keithp@keithp.com>
+ *
+ * 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.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+
+package org.altusmetrum.altosuilib_3;
+
+import java.util.*;
+import javax.swing.*;
+import org.altusmetrum.altoslib_5.*;
+
+
+public class AltosUITelemetryList extends JComboBox<String> {
+ public int get_selected() {
+ return getSelectedIndex() + 1;
+ }
+
+ public void set_selected(int telemetry) {
+ setSelectedIndex(telemetry-1);
+ }
+
+ public AltosUITelemetryList(int serial) {
+ super();
+ for (int i = AltosLib.ao_telemetry_min; i <= AltosLib.ao_telemetry_max; i++)
+ addItem(AltosLib.telemetry_name(i));
+
+ int telemetry = AltosPreferences.telemetry(serial);
+ if (telemetry < AltosLib.ao_telemetry_min || AltosLib.ao_telemetry_max < telemetry)
+ telemetry = AltosLib.ao_telemetry_standard;
+ setMaximumRowCount(AltosLib.ao_telemetry_max);
+ set_selected(telemetry);
+ revalidate();
+ }
+}
+
diff --git a/altosuilib/AltosUIUnitsIndicator.java b/altosuilib/AltosUIUnitsIndicator.java
index 2285b6fc..50c30851 100644
--- a/altosuilib/AltosUIUnitsIndicator.java
+++ b/altosuilib/AltosUIUnitsIndicator.java
@@ -15,11 +15,11 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public abstract class AltosUIUnitsIndicator extends AltosUIIndicator {
diff --git a/altosuilib/AltosUIVersion.java.in b/altosuilib/AltosUIVersion.java.in
index 0edb5c04..9fd5757b 100644
--- a/altosuilib/AltosUIVersion.java.in
+++ b/altosuilib/AltosUIVersion.java.in
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
public class AltosUIVersion {
public final static String version = "@VERSION@";
diff --git a/altosuilib/AltosUIVoltageIndicator.java b/altosuilib/AltosUIVoltageIndicator.java
index 3ff17213..8e991856 100644
--- a/altosuilib/AltosUIVoltageIndicator.java
+++ b/altosuilib/AltosUIVoltageIndicator.java
@@ -15,11 +15,11 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import javax.swing.*;
-import org.altusmetrum.altoslib_4.*;
+import org.altusmetrum.altoslib_5.*;
public abstract class AltosUIVoltageIndicator extends AltosUIUnitsIndicator {
diff --git a/altosuilib/AltosUSBDevice.java b/altosuilib/AltosUSBDevice.java
index b70b5e83..f4906a73 100644
--- a/altosuilib/AltosUSBDevice.java
+++ b/altosuilib/AltosUSBDevice.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.util.*;
import libaltosJNI.*;
@@ -79,6 +79,7 @@ public class AltosUSBDevice extends altos_device implements AltosDevice {
if (want_product == AltosUILib.product_altimeter)
return have_product == AltosUILib.product_telemetrum ||
have_product == AltosUILib.product_telemega ||
+ have_product == AltosUILib.product_easymega ||
have_product == AltosUILib.product_telegps ||
have_product == AltosUILib.product_easymini ||
have_product == AltosUILib.product_telemini;
diff --git a/altosuilib/AltosVoice.java b/altosuilib/AltosVoice.java
index a3995f68..e02730ba 100644
--- a/altosuilib/AltosVoice.java
+++ b/altosuilib/AltosVoice.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import com.sun.speech.freetts.Voice;
import com.sun.speech.freetts.VoiceManager;
diff --git a/altosuilib/GrabNDrag.java b/altosuilib/GrabNDrag.java
index 4426f7a3..9bccb808 100644
--- a/altosuilib/GrabNDrag.java
+++ b/altosuilib/GrabNDrag.java
@@ -15,7 +15,7 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
*/
-package org.altusmetrum.altosuilib_2;
+package org.altusmetrum.altosuilib_3;
import java.awt.*;
import java.awt.event.*;
diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am
index e08fbe74..d51da91d 100644
--- a/altosuilib/Makefile.am
+++ b/altosuilib/Makefile.am
@@ -36,7 +36,6 @@ altosuilib_JAVA = \
AltosVoice.java \
AltosDisplayThread.java \
AltosDeviceUIDialog.java \
- AltosFreqList.java \
AltosSerial.java \
AltosSerialInUseException.java \
AltosConfigFreqUI.java \
@@ -68,6 +67,7 @@ altosuilib_JAVA = \
AltosUIMapPath.java \
AltosUIMapTile.java \
AltosUIMapCache.java \
+ AltosUIMapCacheListener.java \
AltosUIMapImage.java \
AltosUIMapTransform.java \
AltosUIMapRectangle.java \
@@ -80,7 +80,11 @@ altosuilib_JAVA = \
AltosUIFlightTab.java \
AltosUIIndicator.java \
AltosUIUnitsIndicator.java \
- AltosUIVoltageIndicator.java
+ AltosUIVoltageIndicator.java \
+ AltosUIFreqList.java \
+ AltosUITelemetryList.java \
+ AltosUIRateList.java \
+ OSXAdapter.java
JAR=altosuilib_$(ALTOSUILIB_VERSION).jar
@@ -99,7 +103,7 @@ ICONJAR= -C $(ICONDIR) redled.png -C $(ICONDIR) redoff.png \
all-local: $(JAR)
clean-local:
- -rm -rf $(JAVAROOT) $(JAR)
+ -rm -rf $(JAVAROOT) altosuilib_*.jar
install-altosuilibJAVA: $(JAR)
@$(NORMAL_INSTALL)
diff --git a/altosuilib/OSXAdapter.java b/altosuilib/OSXAdapter.java
new file mode 100755
index 00000000..23aacd78
--- /dev/null
+++ b/altosuilib/OSXAdapter.java
@@ -0,0 +1,206 @@
+/*
+
+File: OSXAdapter.java
+
+Abstract: Hooks existing preferences/about/quit functionality from an
+ existing Java app into handlers for the Mac OS X application menu.
+ Uses a Proxy object to dynamically implement the
+ com.apple.eawt.ApplicationListener interface and register it with the
+ com.apple.eawt.Application object. This allows the complete project
+ to be both built and run on any platform without any stubs or
+ placeholders. Useful for developers looking to implement Mac OS X
+ features while supporting multiple platforms with minimal impact.
+
+Version: 2.0
+
+Disclaimer: IMPORTANT: This Apple software is supplied to you by
+Apple Inc. ("Apple") in consideration of your agreement to the
+following terms, and your use, installation, modification or
+redistribution of this Apple software constitutes acceptance of these
+terms. If you do not agree with these terms, please do not use,
+install, modify or redistribute this Apple software.
+
+In consideration of your agreement to abide by the following terms, and
+subject to these terms, Apple grants you a personal, non-exclusive
+license, under Apple's copyrights in this original Apple software (the
+"Apple Software"), to use, reproduce, modify and redistribute the Apple
+Software, with or without modifications, in source and/or binary forms;
+provided that if you redistribute the Apple Software in its entirety and
+without modifications, you must retain this notice and the following
+text and disclaimers in all such redistributions of the Apple Software.
+Neither the name, trademarks, service marks or logos of Apple Inc.
+may be used to endorse or promote products derived from the Apple
+Software without specific prior written permission from Apple. Except
+as expressly stated in this notice, no other rights or licenses, express
+or implied, are granted by Apple herein, including but not limited to
+any patent rights that may be infringed by your derivative works or by
+other works in which the Apple Software may be incorporated.
+
+The Apple Software is provided by Apple on an "AS IS" basis. APPLE
+MAKES NO WARRANTIES, EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION
+THE IMPLIED WARRANTIES OF NON-INFRINGEMENT, MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE, REGARDING THE APPLE SOFTWARE OR ITS USE AND
+OPERATION ALONE OR IN COMBINATION WITH YOUR PRODUCTS.
+
+IN NO EVENT SHALL APPLE BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL
+OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+INTERRUPTION) ARISING IN ANY WAY OUT OF THE USE, REPRODUCTION,
+MODIFICATION AND/OR DISTRIBUTION OF THE APPLE SOFTWARE, HOWEVER CAUSED
+AND WHETHER UNDER THEORY OF CONTRACT, TORT (INCLUDING NEGLIGENCE),
+STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
+
+Copyright © 2003-2007 Apple, Inc., All Rights Reserved
+
+*/
+
+package org.altusmetrum.altosuilib_3;
+
+import java.lang.reflect.*;
+import java.util.HashMap;
+
+
+public class OSXAdapter implements InvocationHandler {
+
+ protected Object targetObject;
+ protected Method targetMethod;
+ protected String proxySignature;
+
+ static Object macOSXApplication;
+
+ // Pass this method an Object and Method equipped to perform application shutdown logic
+ // The method passed should return a boolean stating whether or not the quit should occur
+ public static void setQuitHandler(Object target, Method quitHandler) {
+ setHandler(new OSXAdapter("handleQuit", target, quitHandler));
+ }
+
+ // Pass this method an Object and Method equipped to display application info
+ // They will be called when the About menu item is selected from the application menu
+ public static void setAboutHandler(Object target, Method aboutHandler) {
+ boolean enableAboutMenu = (target != null && aboutHandler != null);
+ if (enableAboutMenu) {
+ setHandler(new OSXAdapter("handleAbout", target, aboutHandler));
+ }
+ // If we're setting a handler, enable the About menu item by calling
+ // com.apple.eawt.Application reflectively
+ try {
+ Method enableAboutMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledAboutMenu", new Class[] { boolean.class });
+ enableAboutMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enableAboutMenu) });
+ } catch (Exception ex) {
+ System.err.println("OSXAdapter could not access the About Menu");
+ ex.printStackTrace();
+ }
+ }
+
+ // Pass this method an Object and a Method equipped to display application options
+ // They will be called when the Preferences menu item is selected from the application menu
+ public static void setPreferencesHandler(Object target, Method prefsHandler) {
+ boolean enablePrefsMenu = (target != null && prefsHandler != null);
+ if (enablePrefsMenu) {
+ setHandler(new OSXAdapter("handlePreferences", target, prefsHandler));
+ }
+ // If we're setting a handler, enable the Preferences menu item by calling
+ // com.apple.eawt.Application reflectively
+ try {
+ Method enablePrefsMethod = macOSXApplication.getClass().getDeclaredMethod("setEnabledPreferencesMenu", new Class[] { boolean.class });
+ enablePrefsMethod.invoke(macOSXApplication, new Object[] { Boolean.valueOf(enablePrefsMenu) });
+ } catch (Exception ex) {
+ System.err.println("OSXAdapter could not access the About Menu");
+ ex.printStackTrace();
+ }
+ }
+
+ // Pass this method an Object and a Method equipped to handle document events from the Finder
+ // Documents are registered with the Finder via the CFBundleDocumentTypes dictionary in the
+ // application bundle's Info.plist
+ public static void setFileHandler(Object target, Method fileHandler) {
+ setHandler(new OSXAdapter("handleOpenFile", target, fileHandler) {
+ // Override OSXAdapter.callTarget to send information on the
+ // file to be opened
+ public boolean callTarget(Object appleEvent) {
+ if (appleEvent != null) {
+ try {
+ Method getFilenameMethod = appleEvent.getClass().getDeclaredMethod("getFilename", (Class[])null);
+ String filename = (String) getFilenameMethod.invoke(appleEvent, (Object[])null);
+ this.targetMethod.invoke(this.targetObject, new Object[] { filename });
+ } catch (Exception ex) {
+
+ }
+ }
+ return true;
+ }
+ });
+ }
+
+ // setHandler creates a Proxy object from the passed OSXAdapter and adds it as an ApplicationListener
+ public static void setHandler(OSXAdapter adapter) {
+ try {
+ Class applicationClass = Class.forName("com.apple.eawt.Application");
+ if (macOSXApplication == null) {
+ macOSXApplication = applicationClass.getConstructor((Class[])null).newInstance((Object[])null);
+ }
+ Class applicationListenerClass = Class.forName("com.apple.eawt.ApplicationListener");
+ Method addListenerMethod = applicationClass.getDeclaredMethod("addApplicationListener", new Class[] { applicationListenerClass });
+ // Create a proxy object around this handler that can be reflectively added as an Apple ApplicationListener
+ Object osxAdapterProxy = Proxy.newProxyInstance(OSXAdapter.class.getClassLoader(), new Class[] { applicationListenerClass }, adapter);
+ addListenerMethod.invoke(macOSXApplication, new Object[] { osxAdapterProxy });
+ } catch (ClassNotFoundException cnfe) {
+ System.err.println("This version of Mac OS X does not support the Apple EAWT. ApplicationEvent handling has been disabled (" + cnfe + ")");
+ } catch (Exception ex) { // Likely a NoSuchMethodException or an IllegalAccessException loading/invoking eawt.Application methods
+ System.err.println("Mac OS X Adapter could not talk to EAWT:");
+ ex.printStackTrace();
+ }
+ }
+
+ // Each OSXAdapter has the name of the EAWT method it intends to listen for (handleAbout, for example),
+ // the Object that will ultimately perform the task, and the Method to be called on that Object
+ protected OSXAdapter(String proxySignature, Object target, Method handler) {
+ this.proxySignature = proxySignature;
+ this.targetObject = target;
+ this.targetMethod = handler;
+ }
+
+ // Override this method to perform any operations on the event
+ // that comes with the various callbacks
+ // See setFileHandler above for an example
+ public boolean callTarget(Object appleEvent) throws InvocationTargetException, IllegalAccessException {
+ Object result = targetMethod.invoke(targetObject, (Object[])null);
+ if (result == null) {
+ return true;
+ }
+ return Boolean.valueOf(result.toString()).booleanValue();
+ }
+
+ // InvocationHandler implementation
+ // This is the entry point for our proxy object; it is called every time an ApplicationListener method is invoked
+ public Object invoke (Object proxy, Method method, Object[] args) throws Throwable {
+ if (isCorrectMethod(method, args)) {
+ boolean handled = callTarget(args[0]);
+ setApplicationEventHandled(args[0], handled);
+ }
+ // All of the ApplicationListener methods are void; return null regardless of what happens
+ return null;
+ }
+
+ // Compare the method that was called to the intended method when the OSXAdapter instance was created
+ // (e.g. handleAbout, handleQuit, handleOpenFile, etc.)
+ protected boolean isCorrectMethod(Method method, Object[] args) {
+ return (targetMethod != null && proxySignature.equals(method.getName()) && args.length == 1);
+ }
+
+ // It is important to mark the ApplicationEvent as handled and cancel the default behavior
+ // This method checks for a boolean result from the proxy method and sets the event accordingly
+ protected void setApplicationEventHandled(Object event, boolean handled) {
+ if (event != null) {
+ try {
+ Method setHandledMethod = event.getClass().getDeclaredMethod("setHandled", new Class[] { boolean.class });
+ // If the target method returns a boolean, use that as a hint
+ setHandledMethod.invoke(event, new Object[] { Boolean.valueOf(handled) });
+ } catch (Exception ex) {
+ System.err.println("OSXAdapter was unable to handle an ApplicationEvent: " + event);
+ ex.printStackTrace();
+ }
+ }
+ }
+}