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

Last change on this file since 29771 was 29771, checked in by akks, 11 years ago

[josm_plugins]: move more plugin items to new menus, set minimum JOSM to 6082, add Netbeans projects

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