diff options
author | Keith Packard <keithp@keithp.com> | 2014-06-16 21:57:35 -0700 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2014-06-16 21:57:35 -0700 |
commit | e612693e33ef3b0e22db0656792992fa6e961ff2 (patch) | |
tree | 7b0bca38c4c3dbfa22c35634850cde527d4de18a /altosuilib | |
parent | 6579e4cae8fea65780f1c4677f29c1fc17ca41e2 (diff) |
altosui/telegps: Use menus for frequency list and telemetry formats
This will let us move them into the Mac OS X menu bar, as well as
making them look a bit nicer.
Signed-off-by: Keith Packard <keithp@keithp.com>
Diffstat (limited to 'altosuilib')
-rw-r--r-- | altosuilib/AltosFreqList.java | 124 | ||||
-rw-r--r-- | altosuilib/AltosUITelemetryMenu.java | 88 | ||||
-rw-r--r-- | altosuilib/Makefile.am | 3 |
3 files changed, 199 insertions, 16 deletions
diff --git a/altosuilib/AltosFreqList.java b/altosuilib/AltosFreqList.java index e1299aae..b985d472 100644 --- a/altosuilib/AltosFreqList.java +++ b/altosuilib/AltosFreqList.java @@ -17,15 +17,113 @@ package org.altusmetrum.altosuilib_2; +import java.util.*; import javax.swing.*; +import java.awt.event.*; import org.altusmetrum.altoslib_4.*; -public class AltosFreqList extends JComboBox<AltosFrequency> { +class FreqEntry extends JMenuItem { + AltosFrequency frequency; + + public FreqEntry(AltosFrequency frequency) { + super(frequency.toShortString()); + this.frequency = frequency; + } +} + +public class AltosFreqList extends JMenu implements ActionListener { String product; int serial; int calibrate; + AltosFrequency[] frequencies = new AltosFrequency[0]; + + int selected = -1; + + LinkedList<ActionListener> action_listeners = new LinkedList<ActionListener>(); + + public void addActionListener(ActionListener listener) { + action_listeners.add(listener); + } + + public void removeActionListener(ActionListener listener) { + action_listeners.remove(listener); + } + + public void actionPerformed(ActionEvent ev) { + FreqEntry e = (FreqEntry) ev.getSource(); + set_selected(e.frequency); + ActionEvent event = new ActionEvent(e.frequency, 0, "selected"); + for (ActionListener l : action_listeners) + l.actionPerformed(event); + } + + private void set_selected(AltosFrequency frequency) { + for (int i = 0; i < frequencies.length; i++) { + if (frequencies[i].frequency == frequency.frequency) { + selected = i; + String new_text = String.format("Frequency: %7.3f MHz (%s) ▾", + frequency.frequency, + frequency.description); + setText(new_text); + } + } + } + + private AltosFrequency get_selected() { + if (0 <= selected && selected < frequencies.length) + return frequencies[selected]; + return null; + } + + private void add(AltosFrequency add) { + int insert; + + for (insert = 0; insert < frequencies.length; insert++) { + if (frequencies[insert].frequency == add.frequency) + return; + if (add.frequency < frequencies[insert].frequency) + break; + } + + AltosFrequency[] new_frequencies = new AltosFrequency[frequencies.length + 1]; + + for (int before = 0; before < insert; before++) + new_frequencies[before] = frequencies[before]; + new_frequencies[insert] = add; + + for (int after = insert; after < frequencies.length; after++) + new_frequencies[after+1] = frequencies[after]; + + frequencies = new_frequencies; + + FreqEntry e = new FreqEntry(add); + add(e, insert); + e.addActionListener(this); + } + + private void remove(AltosFrequency remove) { + int delete; + for (delete = 0; delete < frequencies.length; delete++) { + if (frequencies[delete].frequency == remove.frequency) + break; + if (remove.frequency < frequencies[delete].frequency) + return; + } + + remove(delete); + + AltosFrequency[] new_frequencies = new AltosFrequency[frequencies.length - 1]; + + for (int before = 0; before < delete; before++) + new_frequencies[before] = frequencies[before]; + + for (int after = delete + 1; after < frequencies.length; after++) + new_frequencies[after-1] = frequencies[after]; + frequencies = new_frequencies; + } + public void set_frequency(double new_frequency) { int i; @@ -34,25 +132,21 @@ public class AltosFreqList extends JComboBox<AltosFrequency> { return; } - for (i = 0; i < getItemCount(); i++) { - AltosFrequency f = (AltosFrequency) getItemAt(i); + for (i = 0; i < frequencies.length; i++) { + AltosFrequency f = frequencies[i]; if (f.close(new_frequency)) { - setSelectedIndex(i); + set_selected(f); return; } } - for (i = 0; i < getItemCount(); i++) { - AltosFrequency f = (AltosFrequency) getItemAt(i); - if (new_frequency < f.frequency) - break; - } String description = String.format("%s serial %d", product, serial); AltosFrequency frequency = new AltosFrequency(new_frequency, description); AltosUIPreferences.add_common_frequency(frequency); - insertItemAt(frequency, i); - setMaximumRowCount(getItemCount()); + + add(frequency); + set_selected(frequency); } public void set_product(String new_product) { @@ -64,16 +158,16 @@ public class AltosFreqList extends JComboBox<AltosFrequency> { } public double frequency() { - AltosFrequency f = (AltosFrequency) getSelectedItem(); + AltosFrequency f = get_selected(); if (f != null) return f.frequency; return 434.550; } public AltosFreqList () { - super(AltosUIPreferences.common_frequencies()); - setMaximumRowCount(getItemCount()); - setEditable(false); + super(); + for (AltosFrequency frequency: AltosUIPreferences.common_frequencies()) + add(frequency); product = "Unknown"; serial = 0; } diff --git a/altosuilib/AltosUITelemetryMenu.java b/altosuilib/AltosUITelemetryMenu.java new file mode 100644 index 00000000..fc4a91c5 --- /dev/null +++ b/altosuilib/AltosUITelemetryMenu.java @@ -0,0 +1,88 @@ +/* + * 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_2; + +import java.util.*; +import javax.swing.*; +import java.awt.event.*; +import org.altusmetrum.altoslib_4.*; + +class TelemetryMenuItem extends JMenuItem { + public int telemetry; + + public TelemetryMenuItem (int telemetry) { + super(AltosLib.telemetry_name(telemetry)); + this.telemetry = telemetry; + } +} + +public class AltosUITelemetryMenu extends JMenu implements ActionListener { + TelemetryMenuItem selected = null; + + public int get_selected() { + if (selected == null) + return AltosLib.ao_telemetry_off; + return selected.telemetry; + } + + public void set_selected(int telemetry) { + for (int i = 0; i < getItemCount(); i++) { + TelemetryMenuItem item = (TelemetryMenuItem) getItem(i); + if (item.telemetry == telemetry) { + selected = item; + String new_text = String.format("Format: %s ▾", AltosLib.telemetry_name(telemetry)); + setText(new_text); + break; + } + } + } + + private LinkedList<ActionListener> action_listeners = new LinkedList<ActionListener>(); + + public void addActionListener(ActionListener l) { + action_listeners.add(l); + } + + public void removeActionListener(ActionListener l) { + action_listeners.remove(l); + } + + public void actionPerformed(ActionEvent e) { + TelemetryMenuItem item = (TelemetryMenuItem) e.getSource(); + set_selected(item.telemetry); + ActionEvent my_e = new ActionEvent(selected, 0, "selected"); + for (ActionListener l : action_listeners) + l.actionPerformed(my_e); + } + + public AltosUITelemetryMenu(int serial) { + super(); + for (int i = AltosLib.ao_telemetry_min; i <= AltosLib.ao_telemetry_max; i++) { + TelemetryMenuItem item = new TelemetryMenuItem(i); + + item.addActionListener(this); + add(item); + } + + int telemetry = AltosPreferences.telemetry(serial); + if (telemetry < AltosLib.ao_telemetry_min || AltosLib.ao_telemetry_max < telemetry) + telemetry = AltosLib.ao_telemetry_standard; + set_selected(telemetry); + } +} + diff --git a/altosuilib/Makefile.am b/altosuilib/Makefile.am index e08fbe74..157cd5e8 100644 --- a/altosuilib/Makefile.am +++ b/altosuilib/Makefile.am @@ -80,7 +80,8 @@ altosuilib_JAVA = \ AltosUIFlightTab.java \ AltosUIIndicator.java \ AltosUIUnitsIndicator.java \ - AltosUIVoltageIndicator.java + AltosUIVoltageIndicator.java \ + AltosUITelemetryMenu.java JAR=altosuilib_$(ALTOSUILIB_VERSION).jar |