source: osm/applications/editors/josm/plugins/smed2/src/smed2/Smed2Action.java@ 30285

Last change on this file since 30285 was 30285, checked in by malcolmh, 11 years ago

save

File size: 6.4 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 smed2;
11
12import java.awt.*;
13import java.awt.event.*;
14import java.util.*;
15import java.util.Map.Entry;
16
17import javax.swing.*;
18
19import static org.openstreetmap.josm.tools.I18n.tr;
20
21import org.openstreetmap.josm.actions.JosmAction;
22import org.openstreetmap.josm.gui.MapView;
23import org.openstreetmap.josm.gui.MapView.EditLayerChangeListener;
24import org.openstreetmap.josm.gui.layer.*;
25import org.openstreetmap.josm.data.SelectionChangedListener;
26import org.openstreetmap.josm.data.imagery.ImageryInfo;
27import org.openstreetmap.josm.data.osm.*;
28import org.openstreetmap.josm.data.osm.event.*;
29import org.openstreetmap.josm.Main;
30
31import s57.S57map;
32import s57.S57map.*;
33import panels.PanelS57;
34import panels.PanelMain;
35import panels.ShowFrame;
36
37public class Smed2Action extends JosmAction implements EditLayerChangeListener, SelectionChangedListener {
38 private static String editor = tr("SeaMap Editor");
39 public static JFrame editFrame = null;
40 public static ShowFrame showFrame = null;
41 private boolean isOpen = false;
42 public static PanelMain panelMain = null;
43 public static PanelS57 panelS57 = null;
44 public static MapImage rendering;
45 public static S57map map = null;
46 public DataSet data = null;
47
48 private final DataSetListener dataSetListener = new DataSetListener() {
49
50 @Override
51 public void dataChanged(DataChangedEvent e) {
52 makeMap();
53 }
54
55 @Override
56 public void nodeMoved(NodeMovedEvent e) {
57 makeMap();
58 }
59
60 @Override
61 public void otherDatasetChange(AbstractDatasetChangedEvent e) {
62 makeMap();
63 }
64
65 @Override
66 public void primitivesAdded(PrimitivesAddedEvent e) {
67 makeMap();
68 }
69
70 @Override
71 public void primitivesRemoved(PrimitivesRemovedEvent e) {
72 makeMap();
73 }
74
75 @Override
76 public void relationMembersChanged(RelationMembersChangedEvent e) {
77 makeMap();
78 }
79
80 @Override
81 public void tagsChanged(TagsChangedEvent e) {
82 makeMap();
83 }
84
85 @Override
86 public void wayNodesChanged(WayNodesChangedEvent e) {
87 makeMap();
88 }
89 };
90
91 public Smed2Action() {
92 super(editor, "Smed2", editor, null, true);
93 }
94
95 @Override
96 public void actionPerformed(ActionEvent arg0) {
97 SwingUtilities.invokeLater(new Runnable() {
98 public void run() {
99 if (!isOpen)
100 createFrame();
101 else
102 editFrame.toFront();
103 isOpen = true;
104 }
105 });
106 }
107
108 protected void createFrame() {
109 editFrame = new JFrame(editor);
110 editFrame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
111 editFrame.addWindowListener(new java.awt.event.WindowAdapter() {
112 public void windowClosing(java.awt.event.WindowEvent e) {
113 closeDialog();
114 }
115 });
116 editFrame.setSize(new Dimension(480, 480));
117 editFrame.setLocation(100, 200);
118 editFrame.setResizable(true);
119 editFrame.setAlwaysOnTop(true);
120 editFrame.setVisible(true);
121 panelMain = new PanelMain();
122 editFrame.add(panelMain);
123
124 panelS57 = new PanelS57();
125 editFrame.add(panelS57);
126
127 showFrame = new ShowFrame(tr("Seamark Inspector"));
128 showFrame.setSize(new Dimension(300, 300));
129 showFrame.setLocation(50, 400);
130 showFrame.setResizable(false);
131 showFrame.setAlwaysOnTop(true);
132 showFrame.setEnabled(true);
133 showFrame.setVisible(false);
134
135 // System.out.println("hello");
136 rendering = new MapImage(new ImageryInfo("OpenSeaMap"), this);
137 rendering.setBackgroundLayer(true);
138 Main.main.addLayer(rendering);
139 MapView.addEditLayerChangeListener(this);
140 DataSet.addSelectionListener(this);
141 editLayerChanged(Main.main.getEditLayer(), Main.main.getEditLayer());
142 }
143
144 public void closeDialog() {
145 if (isOpen) {
146 Main.main.removeLayer(rendering);
147 MapView.removeEditLayerChangeListener(this);
148 editFrame.setVisible(false);
149 editFrame.dispose();
150 data = null;
151 map = null;
152 }
153 isOpen = false;
154 }
155
156 @Override
157 public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
158 if (oldLayer != null) {
159 oldLayer.data.removeDataSetListener(dataSetListener);
160 }
161 if (newLayer != null) {
162 newLayer.data.addDataSetListener(dataSetListener);
163 data = newLayer.data;
164// makeMap();
165 } else {
166 data = null;
167 map = null;
168 }
169 }
170
171 @Override
172 public void selectionChanged(Collection<? extends OsmPrimitive> selection) {
173 OsmPrimitive nextFeature = null;
174 OsmPrimitive feature = null;
175
176 showFrame.setVisible(false);
177 panelMain.clearMark();
178 if (map != null) {
179 for (OsmPrimitive osm : selection) {
180 nextFeature = osm;
181 if (selection.size() == 1) {
182 if (nextFeature.compareTo(feature) != 0) {
183 feature = nextFeature;
184 Feature id = map.index.get(feature.getUniqueId());
185 if (id != null) {
186// panelMain.parseMark(id);
187 showFrame.setVisible(true);
188 showFrame.showFeature(feature, map);
189 }
190 }
191 } else {
192 showFrame.setVisible(false);
193 PanelMain.messageBar.setText(tr("Select only one object"));
194 }
195 }
196 if (nextFeature == null) {
197 feature = null;
198 panelMain.clearMark();
199 showFrame.setVisible(false);
200 PanelMain.messageBar.setText(tr("Select a map object"));
201 }
202 }
203 }
204
205 void makeMap() {
206 map = new S57map();
207 if (data != null) {
208 for (Node node : data.getNodes()) {
209 map.addNode(node.getUniqueId(), node.getCoor().lat(), node.getCoor().lon());
210 for (Entry<String, String> entry : node.getKeys().entrySet()) {
211 map.addTag(entry.getKey(), entry.getValue());
212 }
213 map.tagsDone(node.getUniqueId());
214 }
215 for (Way way : data.getWays()) {
216 map.addEdge(way.getUniqueId());
217 for (Node node : way.getNodes()) {
218 map.addToEdge((node.getUniqueId()));
219 }
220 for (Entry<String, String> entry : way.getKeys().entrySet()) {
221 map.addTag(entry.getKey(), entry.getValue());
222 }
223 map.tagsDone(way.getUniqueId());
224 }
225 for (Relation rel : data.getRelations()) {
226 if (rel.isMultipolygon()) {
227 map.addArea(rel.getUniqueId());
228 for (RelationMember mem : rel.getMembers()) {
229 if (mem.getType() == OsmPrimitiveType.WAY)
230 map.addToArea(mem.getUniqueId(), (mem.getRole().equals("outer")));
231 }
232 }
233 for (Entry<String, String> entry : rel.getKeys().entrySet()) {
234 map.addTag(entry.getKey(), entry.getValue());
235 }
236 map.tagsDone(rel.getUniqueId());
237 }
238 if (rendering != null) rendering.zoomChanged();
239 }
240 }
241}
Note: See TracBrowser for help on using the repository browser.