source: osm/applications/editors/josm/plugins/seachartedit/src/scedit/SCeditAction.java@ 34396

Last change on this file since 34396 was 34098, checked in by donvip, 7 years ago

update to JOSM 13558/13559

File size: 10.0 KB
Line 
1/* Copyright 2014 Malcolm Herring
2 *
3 * This is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, version 3 of the License.
6 *
7 * For a copy of the GNU General Public License, see <http://www.gnu.org/licenses/>.
8 */
9
10package scedit;
11
12import static org.openstreetmap.josm.tools.I18n.tr;
13
14import java.awt.Color;
15import java.awt.Dimension;
16import java.awt.event.ActionEvent;
17import java.util.Collection;
18import java.util.Map.Entry;
19
20import javax.swing.JFrame;
21import javax.swing.SwingUtilities;
22import javax.swing.WindowConstants;
23
24import org.openstreetmap.josm.actions.JosmAction;
25import org.openstreetmap.josm.data.Bounds;
26import org.openstreetmap.josm.data.SelectionChangedListener;
27import org.openstreetmap.josm.data.coor.LatLon;
28import org.openstreetmap.josm.data.osm.DataSet;
29import org.openstreetmap.josm.data.osm.Node;
30import org.openstreetmap.josm.data.osm.OsmPrimitive;
31import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
32import org.openstreetmap.josm.data.osm.Relation;
33import org.openstreetmap.josm.data.osm.RelationMember;
34import org.openstreetmap.josm.data.osm.Way;
35import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
36import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
37import org.openstreetmap.josm.data.osm.event.DataSetListener;
38import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
39import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
40import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
41import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
42import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
43import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
44import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
45import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
46import org.openstreetmap.josm.gui.layer.OsmDataLayer;
47
48import panels.PanelMain;
49import panels.PanelS57;
50import panels.ShowFrame;
51import s57.S57map;
52import s57.S57map.Feature;
53
54public class SCeditAction extends JosmAction implements ActiveLayerChangeListener, SelectionChangedListener {
55 private static String title = tr("SeaChart Editor");
56 public static JFrame editFrame = null;
57 public static ShowFrame showFrame = null;
58 private boolean isOpen = false;
59 public static PanelMain panelMain = null;
60 public static PanelS57 panelS57 = null;
61 public static S57map map = null;
62 public DataSet data = null;
63
64 private final DataSetListener dataSetListener = new DataSetListener() {
65
66 @Override
67 public void dataChanged(DataChangedEvent e) {
68 makeMap();
69 }
70
71 @Override
72 public void nodeMoved(NodeMovedEvent e) {
73 makeMap();
74 }
75
76 @Override
77 public void otherDatasetChange(AbstractDatasetChangedEvent e) {
78 makeMap();
79 }
80
81 @Override
82 public void primitivesAdded(PrimitivesAddedEvent e) {
83 makeMap();
84 }
85
86 @Override
87 public void primitivesRemoved(PrimitivesRemovedEvent e) {
88 makeMap();
89 }
90
91 @Override
92 public void relationMembersChanged(RelationMembersChangedEvent e) {
93 makeMap();
94 }
95
96 @Override
97 public void tagsChanged(TagsChangedEvent e) {
98 makeMap();
99 }
100
101 @Override
102 public void wayNodesChanged(WayNodesChangedEvent e) {
103 makeMap();
104 }
105 };
106
107 public SCeditAction() {
108 super(title, "SC", title, null, true);
109 }
110
111 @Override
112 public void actionPerformed(ActionEvent arg0) {
113 SwingUtilities.invokeLater(new Runnable() {
114 @Override
115 public void run() {
116 if (!isOpen)
117 createFrame();
118 else
119 editFrame.toFront();
120 isOpen = true;
121 }
122 });
123 }
124
125 protected void createFrame() {
126 editFrame = new JFrame(title);
127 editFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
128 editFrame.addWindowListener(new java.awt.event.WindowAdapter() {
129 @Override
130 public void windowClosing(java.awt.event.WindowEvent e) {
131 closeDialog();
132 }
133 });
134 editFrame.setSize(new Dimension(480, 480));
135 editFrame.setLocation(100, 200);
136 editFrame.setResizable(true);
137 editFrame.setAlwaysOnTop(true);
138 editFrame.setVisible(true);
139 panelMain = new PanelMain();
140 editFrame.add(panelMain);
141
142 panelS57 = new PanelS57();
143 editFrame.add(panelS57);
144
145 showFrame = new ShowFrame(tr("Seamark Inspector"));
146 showFrame.setSize(new Dimension(300, 300));
147 showFrame.setLocation(50, 400);
148 showFrame.setResizable(false);
149 showFrame.setAlwaysOnTop(true);
150 showFrame.setEnabled(true);
151 showFrame.setVisible(false);
152
153 getLayerManager().addAndFireActiveLayerChangeListener(this);
154 DataSet.addSelectionListener(this);
155 }
156
157 public void closeDialog() {
158 if (isOpen) {
159 getLayerManager().removeActiveLayerChangeListener(this);
160 editFrame.setVisible(false);
161 editFrame.dispose();
162 data = null;
163 map = null;
164 }
165 isOpen = false;
166 }
167
168 @Override
169 public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
170 if (e.getPreviousDataLayer() != null) {
171 e.getPreviousDataLayer().getDataSet().removeDataSetListener(dataSetListener);
172 }
173 OsmDataLayer newLayer = getLayerManager().getEditLayer();
174 if (newLayer != null) {
175 newLayer.getDataSet().addDataSetListener(dataSetListener);
176 data = newLayer.getDataSet();
177 makeMap();
178 } else {
179 data = null;
180 map = null;
181 }
182 }
183
184 @Override
185 public void selectionChanged(Collection<? extends OsmPrimitive> selection) {
186 OsmPrimitive nextFeature = null;
187 OsmPrimitive feature = null;
188
189 showFrame.setVisible(false);
190 panelMain.clearMark();
191 if (map != null) {
192 for (OsmPrimitive osm : selection) {
193 nextFeature = osm;
194 if (selection.size() == 1) {
195 if (nextFeature.compareTo(feature) != 0) {
196 feature = nextFeature;
197 Feature id = map.index.get(feature.getUniqueId());
198 if (id != null) {
199 panelMain.parseMark(id);
200 showFrame.setVisible(true);
201 showFrame.showFeature(feature, map);
202 }
203 }
204 } else {
205 showFrame.setVisible(false);
206 PanelMain.setStatus(tr("Select only one object"), Color.orange);
207 }
208 }
209 if (nextFeature == null) {
210 feature = null;
211 panelMain.clearMark();
212 showFrame.setVisible(false);
213 PanelMain.setStatus(tr("Select a map object"), Color.yellow);
214 }
215 }
216 }
217
218 void makeMap() {
219 map = new S57map(true);
220 if (data != null) {
221 double minlat = 90;
222 double maxlat = -90;
223 double minlon = 180;
224 double maxlon = -180;
225 for (Bounds bounds : data.getDataSourceBounds()) {
226 if (bounds.getMinLat() < minlat) {
227 minlat = bounds.getMinLat();
228 }
229 if (bounds.getMaxLat() > maxlat) {
230 maxlat = bounds.getMaxLat();
231 }
232 if (bounds.getMinLon() < minlon) {
233 minlon = bounds.getMinLon();
234 }
235 if (bounds.getMaxLon() > maxlon) {
236 maxlon = bounds.getMaxLon();
237 }
238 }
239 map.addNode(1, maxlat, minlon);
240 map.addNode(2, minlat, minlon);
241 map.addNode(3, minlat, maxlon);
242 map.addNode(4, maxlat, maxlon);
243 map.bounds.minlat = Math.toRadians(minlat);
244 map.bounds.maxlat = Math.toRadians(maxlat);
245 map.bounds.minlon = Math.toRadians(minlon);
246 map.bounds.maxlon = Math.toRadians(maxlon);
247 for (Node node : data.getNodes()) {
248 LatLon coor = node.getCoor();
249 if (coor != null) {
250 map.addNode(node.getUniqueId(), coor.lat(), coor.lon());
251 for (Entry<String, String> entry : node.getKeys().entrySet()) {
252 map.addTag(entry.getKey(), entry.getValue());
253 }
254 map.tagsDone(node.getUniqueId());
255 }
256 }
257 for (Way way : data.getWays()) {
258 if (way.getNodesCount() > 0) {
259 map.addEdge(way.getUniqueId());
260 for (Node node : way.getNodes()) {
261 map.addToEdge((node.getUniqueId()));
262 }
263 for (Entry<String, String> entry : way.getKeys().entrySet()) {
264 map.addTag(entry.getKey(), entry.getValue());
265 }
266 map.tagsDone(way.getUniqueId());
267 }
268 }
269 for (Relation rel : data.getRelations()) {
270 if (rel.isMultipolygon() && (rel.getMembersCount() > 0)) {
271 map.addArea(rel.getUniqueId());
272 for (RelationMember mem : rel.getMembers()) {
273 if (mem.getType() == OsmPrimitiveType.WAY)
274 map.addToArea(mem.getUniqueId(), (mem.getRole().equals("outer")));
275 }
276 for (Entry<String, String> entry : rel.getKeys().entrySet()) {
277 map.addTag(entry.getKey(), entry.getValue());
278 }
279 map.tagsDone(rel.getUniqueId());
280 }
281 }
282 map.mapDone();
283 }
284 }
285}
Note: See TracBrowser for help on using the repository browser.