source: subversion/applications/editors/josm/plugins/infomode/src/org/openstreetmap/josm/plugins/infomode/InfoMode.java

Last change on this file was 34755, checked in by donvip, 5 months ago

update to JOSM 14456

File size: 10.4 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.plugins.infomode;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.AWTEvent;
7import java.awt.BasicStroke;
8import java.awt.Color;
9import java.awt.Cursor;
10import java.awt.Graphics2D;
11import java.awt.Point;
12import java.awt.Stroke;
13import java.awt.Toolkit;
14import java.awt.event.AWTEventListener;
15import java.awt.event.ActionEvent;
16import java.awt.event.InputEvent;
17import java.awt.event.KeyEvent;
18import java.awt.event.MouseEvent;
19import java.util.HashSet;
20import java.util.Set;
21
22import javax.swing.Popup;
23import javax.swing.PopupFactory;
24
25import org.openstreetmap.josm.actions.mapmode.MapMode;
26import org.openstreetmap.josm.data.Bounds;
27import org.openstreetmap.josm.data.coor.EastNorth;
28import org.openstreetmap.josm.data.gpx.GpxTrack;
29import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
30import org.openstreetmap.josm.data.gpx.WayPoint;
31import org.openstreetmap.josm.data.projection.ProjectionRegistry;
32import org.openstreetmap.josm.gui.MainApplication;
33import org.openstreetmap.josm.gui.MapView;
34import org.openstreetmap.josm.gui.layer.GpxLayer;
35import org.openstreetmap.josm.gui.layer.Layer;
36import org.openstreetmap.josm.gui.layer.MapViewPaintable;
37import org.openstreetmap.josm.tools.Logging;
38import org.openstreetmap.josm.tools.Shortcut;
39
40class InfoMode extends MapMode implements MapViewPaintable, AWTEventListener {
41    private MapView mv;
42    private String statusText;
43    //private boolean drawing;
44    //private boolean ctrl;
45    private boolean shift;
46    //private boolean oldCtrl;
47    //private boolean oldShift;
48    private EastNorth pos;
49    private WayPoint wpOld;
50    private Popup oldPopup;
51    private InfoPanel infoPanel;
52
53    InfoMode() {
54        super(tr("InfoMode"), "infomode.png", tr("GPX info mode"),
55                Shortcut.registerShortcut("mapmode:infomode", tr("Mode: {0}", tr("GPX info mode")), KeyEvent.VK_BACK_SLASH, Shortcut.DIRECT),
56                Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
57        infoPanel = new InfoPanel();
58    }
59
60// <editor-fold defaultstate="collapsed" desc="Event listeners">
61
62    @Override
63    public void enterMode() {
64        if (!isEnabled()) return;
65        super.enterMode();
66        mv = MainApplication.getMap().mapView;
67        mv.addMouseListener(this);
68        mv.addMouseMotionListener(this);
69        mv.addTemporaryLayer(this);
70        /*if (!(Main.main.getActiveLayer() instanceof GpxLayer)) {
71            boolean answer = ConditionalOptionPaneUtil.showConfirmationDialog(
72                    "scan_all_layers", MainApplication.getMainFrame(),
73                    tr("Please select GPX layer to view only its trackpoint info. Do you want to scan all GPX layers?"),
74                    tr("Select layer to scan"), JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, JOptionPane.YES_OPTION );
75                 if(!answer) return;
76        }*/
77
78        MainApplication.getMap().statusLine.setHelpText(
79                tr("Move the mouse to show trackpoint info for current layer. Hold shift to highlight tracks"));
80        MainApplication.getMap().statusLine.repaint();
81
82        try {
83            Toolkit.getDefaultToolkit().addAWTEventListener(this,
84                    AWTEvent.KEY_EVENT_MASK);
85        } catch (SecurityException ex) {
86            Logging.error(ex);
87        }
88    }
89
90    @Override
91    public void exitMode() {
92        super.exitMode();
93        MainApplication.getMap().mapView.removeMouseListener(this);
94        MainApplication.getMap().mapView.removeMouseMotionListener(this);
95
96        MainApplication.getMap().mapView.removeTemporaryLayer(this);
97        if (oldPopup != null) oldPopup.hide();
98
99        try {
100            Toolkit.getDefaultToolkit().removeAWTEventListener(this);
101        } catch (SecurityException ex) {
102            Logging.error(ex);
103        }
104
105        repaint();
106    }
107
108    @Override
109    public boolean layerIsSupported(Layer l) {
110        return true;
111    }
112
113    //////////    Event listener methods
114
115    @Override
116    public void paint(Graphics2D g, MapView mv, Bounds bbox) {
117        if (pos == null) return;
118        Layer curL = mv.getLayerManager().getActiveLayer();
119        if (curL instanceof GpxLayer) showLayerInfo(g, curL, mv); else {
120            for (Layer l : mv.getLayerManager().getLayers()) {
121                if (l instanceof GpxLayer) {
122                    if (showLayerInfo(g, l, mv)) return;
123                }
124            }
125        }
126    }
127
128    @Override
129    public void eventDispatched(AWTEvent event) {
130        updateKeyModifiers((InputEvent) event);
131        if (event.getID() == KeyEvent.KEY_PRESSED) {
132            doKeyEvent((KeyEvent) event);
133        }
134//        updateStatusLine();
135        repaint();
136    }
137
138    @Override
139    public void mousePressed(MouseEvent e) {
140        if (!isEnabled()) return;
141        if (e.getButton() != MouseEvent.BUTTON1) return;
142        //setStatusLine(tr("Please move the mouse to draw new way"));
143        repaint();
144
145    }
146
147    @Override
148    public void mouseReleased(MouseEvent e) {
149        if (!isEnabled()) return;
150        if (e.getButton() != MouseEvent.BUTTON1) return;
151        if (oldPopup != null) {
152            oldPopup.hide();
153            oldPopup = null;
154            wpOld = null;
155        }
156        repaint();
157    }
158
159    @Override
160    public void mouseDragged(MouseEvent e) {
161        if (oldPopup != null) {
162            oldPopup.hide();
163            oldPopup = null;
164            wpOld = null;
165        }
166    }
167
168    @Override
169    public void mouseMoved(MouseEvent e) {
170        if (!isEnabled()) return;
171        pos = mv.getEastNorth(e.getX(), e.getY());
172        repaint();
173    }
174
175    private void doKeyEvent(KeyEvent e) {
176        ///  System.out.println(e);
177        if (e.getKeyCode() == KeyEvent.VK_BACK_SPACE) {
178            filterTracks();
179            repaint();
180        }
181        if (e.getKeyCode() == KeyEvent.VK_BACK_SLASH ||
182                e.getKeyCode() == KeyEvent.VK_ENTER ||
183                e.getKeyCode() == KeyEvent.VK_ESCAPE) {
184            MainApplication.getMap().selectSelectTool(false);
185        }
186    }
187
188
189    /**
190     * Updates shift and ctrl key states
191     */
192    @Override
193    protected void updateKeyModifiers(InputEvent e) {
194        //oldCtrl = ctrl;
195        //oldShift = shift;
196        ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
197        shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
198    }
199
200    @Override
201    protected void updateStatusLine() {
202        MainApplication.getMap().statusLine.setHelpText(statusText);
203        MainApplication.getMap().statusLine.repaint();
204    }
205// </editor-fold>
206
207    private void repaint() {
208        if (MainApplication.getMap() != null)
209            MainApplication.getMap().mapView.repaint();
210    }
211    /*private void setStatusLine(String tr) {
212        statusText=tr;
213        updateStatusLine();
214    }*/
215
216    private synchronized void filterTracks() {
217        Layer l = getLayerManager().getActiveLayer();
218
219        if (l instanceof GpxLayer && pos != null) {
220            GpxLayer gpxL = (GpxLayer) l;
221            Set<GpxTrack> toRemove = new HashSet<>();
222            for (GpxTrack track : gpxL.data.tracks) {
223                boolean f = true;
224                sg: for (GpxTrackSegment seg : track.getSegments()) {
225                    for (WayPoint S : seg.getWayPoints()) {
226                        if (S.hasDate()) {
227                            f = false;
228                            break sg;
229                        }
230                    }
231                }
232                if (f) toRemove.add(track);
233            }
234            gpxL.data.tracks.removeAll(toRemove);
235        }
236    }
237
238    private boolean showLayerInfo(Graphics2D g, Layer l, MapView mv) {
239            GpxLayer gpxL = (GpxLayer) l;
240
241            double minDist = 1e9, d;
242            WayPoint wp = null, oldWp = null, prevWp = null;
243            GpxTrack trk = null;
244            double maxD = mv.getDist100Pixel()/3;
245            for (GpxTrack track : gpxL.data.tracks) {
246                for (GpxTrackSegment seg : track.getSegments()) {
247                    oldWp = null; // next segment will have new previous point
248                    for (WayPoint S : seg.getWayPoints()) {
249                        d = S.getEastNorth(ProjectionRegistry.getProjection()).distance(pos);
250
251                        if (d < minDist && d < maxD) {
252                            minDist = d;
253                            prevWp = oldWp;
254                            wp = S;
255                            trk = track;
256                            }
257                        oldWp = S;
258                    }
259                }
260            }
261            if (wp != null) {
262                Point p = mv.getPoint(wp.getCoor());
263
264                g.setColor(Color.RED);
265                g.fillOval(p.x-10, p.y-10, 20, 20); // mark selected point
266                if (shift) { // highlight track
267                    g.setColor(new Color(255, 30, 0, 128));
268                    Stroke oldStroke = g.getStroke();
269                    g.setStroke(new BasicStroke(10));
270                    for (GpxTrackSegment seg : trk.getSegments()) {
271                    Point oldP = null, curP = null; // next segment will have new previous point
272                        for (WayPoint S : seg.getWayPoints()) {
273                            curP = mv.getPoint(S.getEastNorth(ProjectionRegistry.getProjection()));
274                            if (oldP != null) g.drawLine(oldP.x, oldP.y, curP.x, curP.y);
275                            oldP = curP;
276                        }
277                    }
278                    g.setStroke(oldStroke);
279                }
280                Point s = mv.getLocationOnScreen();
281                int pcx = s.x+p.x-40;
282                int pcy = s.y+p.y+30;
283                if (shift) {
284                    pcx += 40;
285                    pcy -= 30;
286                }
287                if (wp != wpOld) {
288                    if (oldPopup != null) oldPopup.hide();
289                    double vel = -1;
290                    if (prevWp != null && wp.getTimeInMillis() != prevWp.getTimeInMillis()) {
291                        vel = wp.getCoor().greatCircleDistance(prevWp.getCoor())/
292                                (wp.getTime()-prevWp.getTime());
293                    }
294                    infoPanel.setData(wp, trk, vel, gpxL.data.tracks);
295                    Popup pp = PopupFactory.getSharedInstance().getPopup(mv, infoPanel, pcx, pcy);
296                    pp.show();
297                    wpOld = wp;
298                    oldPopup = pp;
299                }
300                return true;
301            }
302            return false;
303    }
304}
Note: See TracBrowser for help on using the repository browser.