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

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

[SeaChartEditor] refresh

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