X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=altosuilib%2FAltosFreqList.java;h=b985d4721ee338b9e92054fcab440527aa60c0b2;hb=e612693e33ef3b0e22db0656792992fa6e961ff2;hp=e1299aaebe89401c5dd3b7898bbb85bafb72007f;hpb=6579e4cae8fea65780f1c4677f29c1fc17ca41e2;p=fw%2Faltos 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 { +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 action_listeners = new LinkedList(); + + 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 { 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 { } 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; }