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

Last change on this file was 33739, checked in by donvip, 18 months ago

update to JOSM 12987

  • Property svn:eol-style set to native
File size: 7.8 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.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<>();
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 layerOrderChanged(LayerOrderChangeEvent e) {
98    }
99
100    @Override
101    public void layerAdded(LayerAddEvent e) {
102    }
103
104    @Override
105    public void layerRemoving(LayerRemoveEvent e) {
106        Layer oldLayer = e.getRemovedLayer();
107        if (oldLayer != lgpslayer)
108            return;
109
110        enableTracking(false);
111        lgpscapture.setSelected(false);
112        MainApplication.getLayerManager().removeLayerChangeListener(this);
113        lgpslayer = null;
114    }
115
116    public LiveGpsPlugin(PluginInformation info) {
117        super(info);
118        MainMenu menu = MainApplication.getMenu();
119        lgpsmenu = menu.gpsMenu;
120        if (lgpsmenu.getItemCount() > 0) {
121            lgpsmenu.addSeparator();
122        }
123
124        JosmAction captureAction = new CaptureAction();
125        lgpscapture = new JCheckBoxMenuItem(captureAction);
126        lgpsmenu.add(lgpscapture);
127        lgpscapture.setAccelerator(captureAction.getShortcut().getKeyStroke());
128
129        JosmAction centerAction = new CenterAction();
130        MainMenu.add(lgpsmenu, centerAction);
131
132        JosmAction autoCenterAction = new AutoCenterAction();
133        lgpsautocenter = new JCheckBoxMenuItem(autoCenterAction);
134        lgpsmenu.add(lgpsautocenter);
135        lgpsautocenter.setAccelerator(autoCenterAction.getShortcut().getKeyStroke());
136    }
137
138    /**
139     * Set to <code>true</code> if the current position should always be in the center of the map.
140     * @param autoCenter if <code>true</code> the map is always centered.
141     */
142    public void setAutoCenter(boolean autoCenter) {
143        lgpsautocenter.setSelected(autoCenter); // just in case this method was
144        // not called from the menu
145        if (lgpslayer != null) {
146            lgpslayer.setAutoCenter(autoCenter);
147            if (autoCenter)
148                lgpslayer.center();
149        }
150    }
151
152    /**
153     * Returns <code>true</code> if autocenter is selected.
154     * @return <code>true</code> if autocenter is selected.
155     */
156    public boolean isAutoCenter() {
157        return lgpsautocenter.isSelected();
158    }
159
160    /**
161     * Enable or disable gps tracking
162     * @param enable if <code>true</code> tracking is started.
163     */
164    public void enableTracking(boolean enable) {
165
166        if (enable && !enabled) {
167            assert (acquirer == null);
168            assert (acquirerThread == null);
169
170            acquirer = new LiveGpsAcquirer();
171            acquirerThread = new Thread(acquirer);
172
173            if (lgpslayer == null) {
174                lgpslayer = new LiveGpsLayer(data);
175                MainApplication.getLayerManager().addLayer(lgpslayer);
176                MainApplication.getLayerManager().addLayerChangeListener(this);
177                lgpslayer.setAutoCenter(isAutoCenter());
178            }
179
180            acquirer.addPropertyChangeListener(lgpslayer);
181            acquirer.addPropertyChangeListener(lgpsdialog);
182            for (PropertyChangeListener listener : listenerQueue) {
183                acquirer.addPropertyChangeListener(listener);
184            }
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    @Override
228    public void mapFrameInitialized(MapFrame oldFrame, MapFrame newFrame) {
229        if (newFrame != null)
230            newFrame.addToggleDialog(lgpsdialog = new LiveGpsDialog(newFrame));
231    }
232
233    /**
234     * @return the lgpsmenu
235     */
236    public JMenu getLgpsMenu() {
237        return this.lgpsmenu;
238    }
239}
Note: See TracBrowser for help on using the repository browser.