altosui: Fix ground station configure frequency list
[fw/altos] / altosuilib / AltosFreqList.java
1 /*
2  * Copyright © 2011 Keith Packard <keithp@keithp.com>
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License as published by
6  * the Free Software Foundation; version 2 of the License.
7  *
8  * This program is distributed in the hope that it will be useful, but
9  * WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
11  * General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License along
14  * with this program; if not, write to the Free Software Foundation, Inc.,
15  * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
16  */
17
18 package org.altusmetrum.altosuilib_2;
19
20 import java.util.*;
21 import javax.swing.*;
22 import java.awt.event.*;
23 import org.altusmetrum.altoslib_4.*;
24
25 class FreqEntry extends JMenuItem {
26         AltosFrequency  frequency;
27
28         public FreqEntry(AltosFrequency frequency) {
29                 super(frequency.toShortString());
30                 this.frequency = frequency;
31         }
32 }
33
34 public class AltosFreqList extends JMenu implements ActionListener {
35
36         String  product;
37         int     serial;
38         int     calibrate;
39
40         AltosFrequency[]        frequencies = new AltosFrequency[0];
41
42         int     selected = -1;
43
44         LinkedList<ActionListener> action_listeners = new LinkedList<ActionListener>();
45
46         public void addActionListener(ActionListener listener) {
47                 action_listeners.add(listener);
48         }
49
50         public void removeActionListener(ActionListener listener) {
51                 action_listeners.remove(listener);
52         }
53
54         public void actionPerformed(ActionEvent ev) {
55                 FreqEntry e = (FreqEntry) ev.getSource();
56                 set_selected(e.frequency);
57                 ActionEvent event = new ActionEvent(e.frequency, 0, "selected");
58                 for (ActionListener l : action_listeners)
59                         l.actionPerformed(event);
60         }
61
62         boolean label = true;
63
64         public void set_label(boolean label) {
65                 this.label = label;
66                 set_label();
67         }
68
69         private void set_label() {
70                 String  new_text = "";
71                 if (0 <= selected && selected < frequencies.length) {
72                         AltosFrequency  frequency = frequencies[selected];
73                         new_text = String.format("%s%7.3f MHz (%s) ▾",
74                                                  label ? "Frequency: " : "",
75                                                  frequency.frequency,
76                                                  frequency.description);
77                 }
78                 setText(new_text);
79         }
80
81         private void set_selected(AltosFrequency frequency) {
82                 for (int i = 0; i < frequencies.length; i++) {
83                         if (frequencies[i].frequency == frequency.frequency) {
84                                 selected = i;
85                                 set_label();
86                         }
87                 }
88         }
89
90         private AltosFrequency get_selected() {
91                 if (0 <= selected && selected < frequencies.length)
92                         return frequencies[selected];
93                 return null;
94         }
95
96         private void add(AltosFrequency add) {
97                 int insert;
98
99                 for (insert = 0; insert < frequencies.length; insert++) {
100                         if (frequencies[insert].frequency == add.frequency)
101                                 return;
102                         if (add.frequency < frequencies[insert].frequency)
103                                 break;
104                 }
105
106                 AltosFrequency[]        new_frequencies = new AltosFrequency[frequencies.length + 1];
107
108                 for (int before = 0; before < insert; before++)
109                         new_frequencies[before] = frequencies[before];
110                 new_frequencies[insert] = add;
111
112                 for (int after = insert; after < frequencies.length; after++)
113                         new_frequencies[after+1] = frequencies[after];
114
115                 frequencies = new_frequencies;
116
117                 FreqEntry       e = new FreqEntry(add);
118                 add(e, insert);
119                 e.addActionListener(this);
120         }
121
122         private void remove(AltosFrequency remove) {
123                 int delete;
124                 for (delete = 0; delete < frequencies.length; delete++) {
125                         if (frequencies[delete].frequency == remove.frequency)
126                                 break;
127                         if (remove.frequency < frequencies[delete].frequency)
128                                 return;
129                 }
130
131                 remove(delete);
132
133                 AltosFrequency[]        new_frequencies = new AltosFrequency[frequencies.length - 1];
134
135                 for (int before = 0; before < delete; before++)
136                         new_frequencies[before] = frequencies[before];
137
138                 for (int after = delete + 1; after < frequencies.length; after++)
139                         new_frequencies[after-1] = frequencies[after];
140                 frequencies = new_frequencies;
141         }
142
143         public void set_frequency(double new_frequency) {
144                 int i;
145
146                 if (new_frequency < 0) {
147                         setVisible(false);
148                         return;
149                 }
150
151                 for (i = 0; i < frequencies.length; i++) {
152                         AltosFrequency  f = frequencies[i];
153
154                         if (f.close(new_frequency)) {
155                                 set_selected(f);
156                                 return;
157                         }
158                 }
159
160                 String  description = String.format("%s serial %d", product, serial);
161                 AltosFrequency  frequency = new AltosFrequency(new_frequency, description);
162                 AltosUIPreferences.add_common_frequency(frequency);
163
164                 add(frequency);
165                 set_selected(frequency);
166         }
167
168         public void set_product(String new_product) {
169                 product = new_product;
170         }
171
172         public void set_serial(int new_serial) {
173                 serial = new_serial;
174         }
175
176         public double frequency() {
177                 AltosFrequency  f = get_selected();
178                 if (f != null)
179                         return f.frequency;
180                 return 434.550;
181         }
182
183         public AltosFreqList(double in_frequency, boolean label) {
184                 super();
185                 this.label = label;
186
187                 for (AltosFrequency frequency: AltosUIPreferences.common_frequencies())
188                         add(frequency);
189                 product = "Unknown";
190                 serial = 0;
191
192                 if (in_frequency != 0)
193                         set_frequency(in_frequency);
194         }
195         public AltosFreqList(double in_frequency) {
196                 this(in_frequency, true);
197         }
198
199         public AltosFreqList (boolean label) {
200                 this(0, label);
201         }
202
203         public AltosFreqList () {
204                 this(0, true);
205         }
206 }