source: osm/applications/editors/josm/plugins/SeaChart/src/seachart/SeachartAction.java@ 36498

Last change on this file since 36498 was 36483, checked in by stoecker, 3 months ago

set eol-style, fix checkstyle issues, add ignores

  • Property svn:eol-style set to native
File size: 8.1 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package seachart;
3
4import java.awt.event.ActionEvent;
5import java.util.Map.Entry;
6
7import javax.swing.SwingUtilities;
8
9import org.openstreetmap.josm.actions.JosmAction;
10import org.openstreetmap.josm.data.Bounds;
11import org.openstreetmap.josm.data.coor.LatLon;
12import org.openstreetmap.josm.data.imagery.ImageryInfo;
13import org.openstreetmap.josm.data.osm.DataSet;
14import org.openstreetmap.josm.data.osm.Node;
15import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
16import org.openstreetmap.josm.data.osm.Relation;
17import org.openstreetmap.josm.data.osm.RelationMember;
18import org.openstreetmap.josm.data.osm.Way;
19import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
20import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
21import org.openstreetmap.josm.data.osm.event.DataSetListener;
22import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
23import org.openstreetmap.josm.data.osm.event.PrimitivesAddedEvent;
24import org.openstreetmap.josm.data.osm.event.PrimitivesRemovedEvent;
25import org.openstreetmap.josm.data.osm.event.RelationMembersChangedEvent;
26import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
27import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
28import org.openstreetmap.josm.gui.MainApplication;
29import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
30import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
31import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
32import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
33import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
34import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
35import org.openstreetmap.josm.gui.layer.OsmDataLayer;
36
37import s57.S57map;
38
39/**
40 * @author Malcolm Herring
41 */
42public class SeachartAction extends JosmAction implements ActiveLayerChangeListener, LayerChangeListener {
43 private static String title = "SeaChart";
44 private boolean isOpen = false;
45 public static ChartImage rendering;
46 public static S57map map = null;
47 public DataSet data = null;
48
49 private final DataSetListener dataSetListener = new DataSetListener() {
50
51 @Override
52 public void dataChanged(DataChangedEvent e) {
53 makeChart();
54 }
55
56 @Override
57 public void nodeMoved(NodeMovedEvent e) {
58 makeChart();
59 }
60
61 @Override
62 public void otherDatasetChange(AbstractDatasetChangedEvent e) {
63 makeChart();
64 }
65
66 @Override
67 public void primitivesAdded(PrimitivesAddedEvent e) {
68 makeChart();
69 }
70
71 @Override
72 public void primitivesRemoved(PrimitivesRemovedEvent e) {
73 makeChart();
74 }
75
76 @Override
77 public void relationMembersChanged(RelationMembersChangedEvent e) {
78 makeChart();
79 }
80
81 @Override
82 public void tagsChanged(TagsChangedEvent e) {
83 makeChart();
84 }
85
86 @Override
87 public void wayNodesChanged(WayNodesChangedEvent e) {
88 makeChart();
89 }
90 };
91
92 public SeachartAction() {
93 super(title, "SC", title, null, true);
94 }
95
96 @Override
97 public void layerAdded(LayerAddEvent e) {
98 }
99
100 @Override
101 public void layerRemoving(LayerRemoveEvent e) {
102 if ("SeaChart".equals(e.getRemovedLayer().getName())) {
103 closeChartLayer();
104 }
105 }
106
107 @Override
108 public void layerOrderChanged(LayerOrderChangeEvent e) {
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 createChartLayer();
118 isOpen = true;
119 }
120 });
121 }
122
123 protected void createChartLayer() {
124 rendering = new ChartImage(new ImageryInfo("SeaChart"));
125 rendering.setBackgroundLayer(true);
126 MainApplication.getLayerManager().addLayer(rendering);
127 MainApplication.getLayerManager().addAndFireActiveLayerChangeListener(this);
128 MainApplication.getLayerManager().addLayerChangeListener(this);
129 }
130
131 public void closeChartLayer() {
132 if (isOpen) {
133 try {
134 MainApplication.getLayerManager().removeActiveLayerChangeListener(this);
135 MainApplication.getLayerManager().removeLayerChangeListener(this);
136 MainApplication.getLayerManager().removeLayer(rendering);
137 } catch (Exception e) {
138 // Assume that this can't be serious?
139 System.err.println(e);
140 }
141 }
142 isOpen = false;
143 }
144
145 @Override
146 public void activeOrEditLayerChanged(ActiveLayerChangeEvent e) {
147 OsmDataLayer oldLayer = e.getPreviousDataLayer();
148 if (oldLayer != null) {
149 oldLayer.getDataSet().removeDataSetListener(dataSetListener);
150 }
151 OsmDataLayer newLayer = MainApplication.getLayerManager().getEditLayer();
152 if (newLayer != null) {
153 newLayer.getDataSet().addDataSetListener(dataSetListener);
154 data = newLayer.getDataSet();
155 makeChart();
156 } else {
157 data = null;
158 map = null;
159 }
160 }
161
162 void makeChart() {
163 map = new S57map(false);
164 if (data != null) {
165 double minlat = 90;
166 double maxlat = -90;
167 double minlon = 180;
168 double maxlon = -180;
169 for (Bounds bounds : data.getDataSourceBounds()) {
170 if (bounds.getMinLat() < minlat) {
171 minlat = bounds.getMinLat();
172 }
173 if (bounds.getMaxLat() > maxlat) {
174 maxlat = bounds.getMaxLat();
175 }
176 if (bounds.getMinLon() < minlon) {
177 minlon = bounds.getMinLon();
178 }
179 if (bounds.getMaxLon() > maxlon) {
180 maxlon = bounds.getMaxLon();
181 }
182 }
183 map.addNode(1, maxlat, minlon);
184 map.addNode(2, minlat, minlon);
185 map.addNode(3, minlat, maxlon);
186 map.addNode(4, maxlat, maxlon);
187 map.bounds.minlat = Math.toRadians(minlat);
188 map.bounds.maxlat = Math.toRadians(maxlat);
189 map.bounds.minlon = Math.toRadians(minlon);
190 map.bounds.maxlon = Math.toRadians(maxlon);
191 for (Node node : data.getNodes()) {
192 LatLon coor = node.getCoor();
193 if (coor != null) {
194 map.addNode(node.getUniqueId(), coor.lat(), coor.lon());
195 for (Entry<String, String> entry : node.getKeys().entrySet()) {
196 map.addTag(entry.getKey(), entry.getValue());
197 }
198 map.tagsDone(node.getUniqueId());
199 }
200 }
201 for (Way way : data.getWays()) {
202 if (way.getNodesCount() > 0) {
203 map.addEdge(way.getUniqueId());
204 for (Node node : way.getNodes()) {
205 map.addToEdge(node.getUniqueId());
206 }
207 for (Entry<String, String> entry : way.getKeys().entrySet()) {
208 map.addTag(entry.getKey(), entry.getValue());
209 }
210 map.tagsDone(way.getUniqueId());
211 }
212 }
213 for (Relation rel : data.getRelations()) {
214 if (rel.isMultipolygon() && (rel.getMembersCount() > 0)) {
215 map.addArea(rel.getUniqueId());
216 for (RelationMember mem : rel.getMembers()) {
217 if (mem.getType() == OsmPrimitiveType.WAY)
218 map.addToArea(mem.getUniqueId(), mem.getRole().equals("outer"));
219 }
220 for (Entry<String, String> entry : rel.getKeys().entrySet()) {
221 map.addTag(entry.getKey(), entry.getValue());
222 }
223 map.tagsDone(rel.getUniqueId());
224 }
225 }
226 map.mapDone();
227 if (rendering != null) rendering.zoomChanged();
228 }
229 }
230
231}
Note: See TracBrowser for help on using the repository browser.