b985d4721ee338b9e92054fcab440527aa60c0b2
[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         private void set_selected(AltosFrequency frequency) {
63                 for (int i = 0; i < frequencies.length; i++) {
64                         if (frequencies[i].frequency == frequency.frequency) {
65                                 selected = i;
66                                 String  new_text = String.format("Frequency: %7.3f MHz (%s) ▾",
67                                                                  frequency.frequency,
68                                                                  frequency.description);
69                                 setText(new_text);
70                         }
71                 }
72         }
73
74         private AltosFrequency get_selected() {
75                 if (0 <= selected && selected < frequencies.length)
76                         return frequencies[selected];
77                 return null;
78         }
79
80         private void add(AltosFrequency add) {
81                 int insert;
82
83                 for (insert = 0; insert < frequencies.length; insert++) {
84                         if (frequencies[insert].frequency == add.frequency)
85                                 return;
86                         if (add.frequency < frequencies[insert].frequency)
87                                 break;
88                 }
89
90                 AltosFrequency[]        new_frequencies = new AltosFrequency[frequencies.length + 1];
91
92                 for (int before = 0; before < insert; before++)
93                         new_frequencies[before] = frequencies[before];
94                 new_frequencies[insert] = add;
95
96                 for (int after = insert; after < frequencies.length; after++)
97                         new_frequencies[after+1] = frequencies[after];
98
99                 frequencies = new_frequencies;
100
101                 FreqEntry       e = new FreqEntry(add);
102                 add(e, insert);
103                 e.addActionListener(this);
104         }
105
106         private void remove(AltosFrequency remove) {
107                 int delete;
108                 for (delete = 0; delete < frequencies.length; delete++) {
109                         if (frequencies[delete].frequency == remove.frequency)
110                                 break;
111                         if (remove.frequency < frequencies[delete].frequency)
112                                 return;
113                 }
114
115                 remove(delete);
116
117                 AltosFrequency[]        new_frequencies = new AltosFrequency[frequencies.length - 1];
118
119                 for (int before = 0; before < delete; before++)
120                         new_frequencies[before] = frequencies[before];
121
122                 for (int after = delete + 1; after < frequencies.length; after++)
123                         new_frequencies[after-1] = frequencies[after];
124                 frequencies = new_frequencies;
125         }
126
127         public void set_frequency(double new_frequency) {
128                 int i;
129
130                 if (new_frequency < 0) {
131                         setVisible(false);
132                         return;
133                 }
134
135                 for (i = 0; i < frequencies.length; i++) {
136                         AltosFrequency  f = frequencies[i];
137
138                         if (f.close(new_frequency)) {
139                                 set_selected(f);
140                                 return;
141                         }
142                 }
143
144                 String  description = String.format("%s serial %d", product, serial);
145                 AltosFrequency  frequency = new AltosFrequency(new_frequency, description);
146                 AltosUIPreferences.add_common_frequency(frequency);
147
148                 add(frequency);
149                 set_selected(frequency);
150         }
151
152         public void set_product(String new_product) {
153                 product = new_product;
154         }
155
156         public void set_serial(int new_serial) {
157                 serial = new_serial;
158         }
159
160         public double frequency() {
161                 AltosFrequency  f = get_selected();
162                 if (f != null)
163                         return f.frequency;
164                 return 434.550;
165         }
166
167         public AltosFreqList () {
168                 super();
169                 for (AltosFrequency frequency: AltosUIPreferences.common_frequencies())
170                         add(frequency);
171                 product = "Unknown";
172                 serial = 0;
173         }
174
175         public AltosFreqList(double in_frequency) {
176                 this();
177                 set_frequency(in_frequency);
178         }
179 }