source: subversion/applications/editors/josm/plugins/tracer/src/org/openstreetmap/josm/plugins/tracer/TracerAction.java

Last change on this file was 34563, checked in by donvip, 8 months ago

update to JOSM 14153

File size: 5.8 KB
Line 
1/**
2 * Tracer - plugin for JOSM
3 * Jan Bilak
4 * This program is free software and licensed under GPL.
5 */
6package org.openstreetmap.josm.plugins.tracer;
7
8import static org.openstreetmap.josm.tools.I18n.tr;
9
10import java.awt.Cursor;
11import java.awt.Point;
12import java.awt.event.ActionEvent;
13import java.awt.event.InputEvent;
14import java.awt.event.KeyEvent;
15import java.awt.event.MouseEvent;
16import java.awt.event.MouseListener;
17import java.util.ArrayList;
18import java.util.Collection;
19import java.util.LinkedList;
20
21import org.openstreetmap.josm.actions.mapmode.MapMode;
22import org.openstreetmap.josm.command.AddCommand;
23import org.openstreetmap.josm.command.Command;
24import org.openstreetmap.josm.command.SequenceCommand;
25import org.openstreetmap.josm.data.UndoRedoHandler;
26import org.openstreetmap.josm.data.coor.LatLon;
27import org.openstreetmap.josm.data.osm.DataSet;
28import org.openstreetmap.josm.data.osm.Node;
29import org.openstreetmap.josm.data.osm.Way;
30import org.openstreetmap.josm.gui.MainApplication;
31import org.openstreetmap.josm.gui.PleaseWaitRunnable;
32import org.openstreetmap.josm.gui.progress.ProgressMonitor;
33import org.openstreetmap.josm.tools.ImageProvider;
34import org.openstreetmap.josm.tools.Logging;
35import org.openstreetmap.josm.tools.Shortcut;
36import org.xml.sax.SAXException;
37
38class TracerAction extends MapMode implements MouseListener {
39
40    private static final long serialVersionUID = 1L;
41    protected boolean cancel;
42    private boolean ctrl;
43    private boolean alt;
44    private boolean shift;
45    protected TracerServer server = new TracerServer();
46
47    public TracerAction() {
48        super(tr("Tracer"), "tracer-sml", tr("Tracer."), Shortcut.registerShortcut("tools:tracer", tr("Tool: {0}", tr("Tracer")), KeyEvent.VK_T, Shortcut.DIRECT), getCursor());
49    }
50
51    @Override
52    public void enterMode() {
53        if (!isEnabled()) {
54            return;
55        }
56        super.enterMode();
57        MainApplication.getMap().mapView.setCursor(getCursor());
58        MainApplication.getMap().mapView.addMouseListener(this);
59    }
60
61    @Override
62    public void exitMode() {
63        super.exitMode();
64        MainApplication.getMap().mapView.removeMouseListener(this);
65    }
66
67    private static Cursor getCursor() {
68        return ImageProvider.getCursor("crosshair", "tracer-sml");
69    }
70
71    protected void traceAsync(Point clickPoint) {
72        cancel = false;
73        /**
74         * Positional data
75         */
76        final LatLon pos = MainApplication.getMap().mapView.getLatLon(clickPoint.x, clickPoint.y);
77
78        try {
79            PleaseWaitRunnable tracerTask = new PleaseWaitRunnable(tr("Tracing")) {
80
81                @Override
82                protected void realRun() throws SAXException {
83                    traceSync(pos, progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
84                }
85
86                @Override
87                protected void finish() {
88                }
89
90                @Override
91                protected void cancel() {
92                    TracerAction.this.cancel();
93                }
94            };
95            Thread executeTraceThread = new Thread(tracerTask);
96            executeTraceThread.start();
97        } catch (Exception e) {
98            Logging.error(e);
99        }
100    }
101
102    private void tagBuilding(Way way) {
103        if(!alt) way.put("building", "yes");
104        way.put("source", "cuzk:km");
105    }
106
107    private void traceSync(LatLon pos, ProgressMonitor progressMonitor) {
108        Collection<Command> commands = new LinkedList<>();
109
110        progressMonitor.beginTask(null, 3);
111        try {
112            ArrayList<LatLon> coordList = server.trace(pos);
113
114            if (coordList.size() == 0) {
115                return;
116            }
117           
118            DataSet ds = MainApplication.getLayerManager().getEditDataSet();
119
120            // make nodes a way
121            Way way = new Way();
122            Node firstNode = null;
123            for (LatLon coord : coordList) {
124                Node node = new Node(coord);
125                if (firstNode == null) {
126                    firstNode = node;
127                }
128                commands.add(new AddCommand(ds, node));
129                way.addNode(node);
130            }
131            way.addNode(firstNode);
132
133            tagBuilding(way);
134            commands.add(new AddCommand(ds, way));
135
136            // connect to other buildings
137            if (!ctrl) {
138                commands.add(ConnectWays.connect(way));
139                }
140
141            if (!commands.isEmpty()) {
142                   UndoRedoHandler.getInstance().add(new SequenceCommand(tr("Tracer building"), commands));
143
144                if (shift) {
145                    ds.addSelected(way);
146                } else {
147                    ds.setSelected(way);
148                }
149            } else {
150                System.out.println("Failed");
151            }
152
153        } finally {
154            progressMonitor.finishTask();
155        }
156    }
157
158    public void cancel() {
159        cancel = true;
160    }
161
162    @Override
163    public void mouseClicked(MouseEvent e) {
164    }
165
166    @Override
167    public void mouseEntered(MouseEvent e) {
168    }
169
170    @Override
171    public void mouseExited(MouseEvent e) {
172    }
173
174    @Override
175    public void mousePressed(MouseEvent e) {
176        if (!MainApplication.getMap().mapView.isActiveLayerDrawable()) {
177            return;
178        }
179        requestFocusInMapView();
180        updateKeyModifiers(e);
181        if (e.getButton() == MouseEvent.BUTTON1) {
182            traceAsync(e.getPoint());
183        }
184    }
185
186    @Override
187    protected void updateKeyModifiers(MouseEvent e) {
188        ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
189        alt = (e.getModifiers() & (ActionEvent.ALT_MASK | InputEvent.ALT_GRAPH_MASK)) != 0;
190        shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
191    }
192
193    @Override
194    public void mouseReleased(MouseEvent e) {
195    }
196}
197
Note: See TracBrowser for help on using the repository browser.