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

Last change on this file since 32370 was 32370, checked in by donvip, 8 years ago

update to JOSM 10279

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