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

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

save

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