source: osm/applications/editors/josm/plugins/livegps/src/livegps/LiveGpsPlugin.java

Last change on this file was 36120, checked in by stoecker, 8 months ago

code cleanup

  • Property svn:eol-style set to native
File size: 9.4 KB
Line 
1// License: Public Domain. For details, see LICENSE file.
2package livegps;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.event.ActionEvent;
7import java.awt.event.KeyEvent;
8import java.beans.PropertyChangeListener;
9import java.util.ArrayList;
10import java.util.List;
11
12import javax.swing.JCheckBoxMenuItem;
13import javax.swing.JMenu;
14
15import org.openstreetmap.josm.actions.JosmAction;
16import org.openstreetmap.josm.data.gpx.GpxData;
17import org.openstreetmap.josm.gui.MainApplication;
18import org.openstreetmap.josm.gui.MainMenu;
19import org.openstreetmap.josm.gui.MapFrame;
20import org.openstreetmap.josm.gui.layer.Layer;
21import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
22import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
23import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
24import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
25import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
26import org.openstreetmap.josm.plugins.Plugin;
27import org.openstreetmap.josm.plugins.PluginInformation;
28import org.openstreetmap.josm.spi.preferences.Config;
29import org.openstreetmap.josm.tools.Shortcut;
30
31/**
32 * Main LiveGPS plugin class
33 */
34public class LiveGpsPlugin extends Plugin implements LayerChangeListener {
35 private boolean enabled = false;
36 private LiveGpsAcquirer acquirer = null;
37 private Thread acquirerThread = null;
38 private LiveGpsAcquirerNMEA acquirerNMEA = null;
39 private Thread acquirerNMEAThread = null;
40 private JMenu lgpsmenu = null;
41 private JCheckBoxMenuItem lgpscapture;
42 private JCheckBoxMenuItem lgpsautocenter;
43 private LiveGpsDialog lgpsdialog;
44 /* List of foreign (e.g. other plugins) subscribers */
45 List<PropertyChangeListener> listenerQueue = new ArrayList<>();
46
47 private GpxData data = new GpxData();
48 private LiveGpsLayer lgpslayer = null;
49
50 public class CaptureAction extends JosmAction {
51 public CaptureAction() {
52 super(
53 tr("Capture GPS Track"),
54 "capturemenu",
55 tr("Connect to gpsd server and show current position in LiveGPS layer."),
56 Shortcut.registerShortcut("menu:livegps:capture", tr(
57 "GPS: {0}", tr("Capture GPS Track")),
58 KeyEvent.VK_R, Shortcut.CTRL), true);
59 }
60
61 @Override
62 public void actionPerformed(ActionEvent e) {
63 enableTracking(lgpscapture.isSelected());
64 }
65 }
66
67 public class CenterAction extends JosmAction {
68 public CenterAction() {
69 super(tr("Center Once"), "centermenu",
70 tr("Center the LiveGPS layer to current position."),
71 Shortcut.registerShortcut("edit:centergps", tr("GPS: {0}",
72 tr("Center Once")), KeyEvent.VK_HOME,
73 Shortcut.DIRECT), true);
74 }
75
76 @Override
77 public void actionPerformed(ActionEvent e) {
78 if (lgpslayer != null) {
79 lgpslayer.center();
80 }
81 }
82 }
83
84 public class AutoCenterAction extends JosmAction {
85 public AutoCenterAction() {
86 super(
87 tr("Auto-Center"),
88 "autocentermenu",
89 tr("Continuously center the LiveGPS layer to current position."),
90 Shortcut.registerShortcut("menu:livegps:autocenter", tr(
91 "GPS: {0}", tr("Auto-Center")),
92 KeyEvent.VK_HOME, Shortcut.CTRL), true);
93 }
94
95 @Override
96 public void actionPerformed(ActionEvent e) {
97 if (lgpslayer != null) {
98 setAutoCenter(lgpsautocenter.isSelected());
99 }
100 }
101 }
102
103 @Override
104 public void layerOrderChanged(LayerOrderChangeEvent e) {
105 }
106
107 @Override
108 public void layerAdded(LayerAddEvent e) {
109 }
110
111 @Override
112 public void layerRemoving(LayerRemoveEvent e) {
113 Layer oldLayer = e.getRemovedLayer();
114 if (oldLayer != lgpslayer)
115 return;
116
117 enableTracking(false);
118 lgpscapture.setSelected(false);
119 MainApplication.getLayerManager().removeLayerChangeListener(this);
120 lgpslayer = null;
121 }
122
123 public LiveGpsPlugin(PluginInformation info) {
124 super(info);
125 MainMenu menu = MainApplication.getMenu();
126 lgpsmenu = menu.gpsMenu;
127 if (lgpsmenu.getItemCount() > 0) {
128 lgpsmenu.addSeparator();
129 }
130
131 JosmAction captureAction = new CaptureAction();
132 lgpscapture = new JCheckBoxMenuItem(captureAction);
133 lgpsmenu.add(lgpscapture);
134 lgpscapture.setAccelerator(captureAction.getShortcut().getKeyStroke());
135
136 JosmAction centerAction = new CenterAction();
137 MainMenu.add(lgpsmenu, centerAction);
138
139 JosmAction autoCenterAction = new AutoCenterAction();
140 lgpsautocenter = new JCheckBoxMenuItem(autoCenterAction);
141 lgpsmenu.add(lgpsautocenter);
142 lgpsautocenter.setAccelerator(autoCenterAction.getShortcut().getKeyStroke());
143 }
144
145 /**
146 * Set to <code>true</code> if the current position should always be in the center of the map.
147 * @param autoCenter if <code>true</code> the map is always centered.
148 */
149 public void setAutoCenter(boolean autoCenter) {
150 lgpsautocenter.setSelected(autoCenter); // just in case this method was
151 // not called from the menu
152 if (lgpslayer != null) {
153 lgpslayer.setAutoCenter(autoCenter);
154 if (autoCenter)
155 lgpslayer.center();
156 }
157 }
158
159 /**
160 * Returns <code>true</code> if autocenter is selected.
161 * @return <code>true</code> if autocenter is selected.
162 */
163 public boolean isAutoCenter() {
164 return lgpsautocenter.isSelected();
165 }
166
167 /**
168 * Enable or disable gps tracking
169 * @param enable if <code>true</code> tracking is started.
170 */
171 public void enableTracking(boolean enable) {
172
173 if (enable && !enabled) {
174 if (lgpslayer == null) {
175 lgpslayer = new LiveGpsLayer(data);
176 MainApplication.getLayerManager().addLayer(lgpslayer);
177 MainApplication.getLayerManager().addLayerChangeListener(this);
178 lgpslayer.setAutoCenter(isAutoCenter());
179 }
180
181 assert (acquirer == null);
182 assert (acquirerThread == null);
183
184 if (!Config.getPref().getBoolean(LiveGPSPreferences.C_DISABLED)) {
185
186 acquirer = new LiveGpsAcquirer();
187 acquirerThread = new Thread(acquirer);
188
189 acquirer.addPropertyChangeListener(lgpslayer);
190 acquirer.addPropertyChangeListener(lgpsdialog);
191 for (PropertyChangeListener listener : listenerQueue) {
192 acquirer.addPropertyChangeListener(listener);
193 }
194
195 acquirerThread.start();
196 }
197
198 assert (acquirerNMEA == null);
199 assert (acquirerNMEAThread == null);
200
201 if (!Config.getPref().get(LiveGPSPreferences.C_SERIAL).isEmpty()) {
202 acquirerNMEA = new LiveGpsAcquirerNMEA();
203 acquirerNMEAThread = new Thread(acquirerNMEA);
204 acquirerNMEA.addPropertyChangeListener(lgpslayer);
205 acquirerNMEA.addPropertyChangeListener(lgpsdialog);
206
207 for (PropertyChangeListener listener : listenerQueue) {
208 acquirerNMEA.addPropertyChangeListener(listener);
209 }
210
211 acquirerNMEAThread.start();
212 }
213
214 enabled = true;
215 } else if (!enable && enabled) {
216 assert (lgpslayer != null);
217 assert (acquirer != null);
218 assert (acquirerThread != null);
219
220 if (acquirerThread != null) {
221 acquirer.shutdown();
222 acquirer = null;
223 acquirerThread = null;
224 }
225
226 if (acquirerNMEAThread != null) {
227 acquirerNMEA.shutdown();
228 acquirerNMEA = null;
229 acquirerNMEAThread = null;
230 }
231
232 enabled = false;
233 }
234 }
235
236 /**
237 * Add a listener for gps events.
238 * @param listener the listener.
239 */
240 public void addPropertyChangeListener(PropertyChangeListener listener) {
241 assert !listenerQueue.contains(listener);
242
243 listenerQueue.add(listener);
244 if (acquirer != null)
245 acquirer.addPropertyChangeListener(listener);
246 if (acquirerNMEA != null)
247 acquirerNMEA.addPropertyChangeListener(listener);
248 }
249
250 /**
251 * Remove a listener for gps events.
252 * @param listener the listener.
253 */
254 public void removePropertyChangeListener(PropertyChangeListener listener) {
255 assert listenerQueue.contains(listener);
256
257 listenerQueue.remove(listener);
258 if (acquirer != null)
259 acquirer.removePropertyChangeListener(listener);
260 if (acquirerNMEA != null)
261 acquirerNMEA.removePropertyChangeListener(listener);
262 }
263
264 @Override
265 public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
266 if (newFrame != null)
267 newFrame.addToggleDialog(lgpsdialog = new LiveGpsDialog(newFrame));
268 }
269
270 /**
271 * Return the LiveGPS menu
272 * @return the {@code JMenu} entry
273 */
274 public JMenu getLgpsMenu() {
275 return this.lgpsmenu;
276 }
277
278 @Override
279 public PreferenceSetting getPreferenceSetting() {
280 return new LiveGPSPreferences();
281 }
282}
Note: See TracBrowser for help on using the repository browser.