source: josm/trunk/src/org/openstreetmap/josm/gui/layer/ValidatorLayer.java@ 16438

Last change on this file since 16438 was 16438, checked in by simon04, 4 years ago

see #19251 - Java 8: use Stream

  • Property svn:eol-style set to native
File size: 6.2 KB
Line 
1// License: GPL. For details, see LICENSE file.
2package org.openstreetmap.josm.gui.layer;
3
4import static org.openstreetmap.josm.tools.I18n.tr;
5
6import java.awt.Graphics2D;
7import java.io.File;
8import java.util.Arrays;
9import java.util.Collections;
10import java.util.List;
11import java.util.stream.Collectors;
12
13import javax.swing.Action;
14import javax.swing.Icon;
15import javax.swing.tree.DefaultMutableTreeNode;
16
17import org.openstreetmap.josm.actions.RenameLayerAction;
18import org.openstreetmap.josm.actions.SaveActionBase;
19import org.openstreetmap.josm.data.Bounds;
20import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
21import org.openstreetmap.josm.data.validation.OsmValidator;
22import org.openstreetmap.josm.data.validation.Severity;
23import org.openstreetmap.josm.data.validation.TestError;
24import org.openstreetmap.josm.gui.MainApplication;
25import org.openstreetmap.josm.gui.MapView;
26import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
27import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
28import org.openstreetmap.josm.gui.dialogs.validator.ValidatorTreePanel;
29import org.openstreetmap.josm.gui.io.importexport.ValidatorErrorExporter;
30import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
31import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
32import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
33import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
34import org.openstreetmap.josm.gui.layer.validation.PaintVisitor;
35import org.openstreetmap.josm.tools.ImageProvider;
36import org.openstreetmap.josm.tools.MultiMap;
37
38/**
39 * A layer showing error messages.
40 *
41 * @author frsantos
42 *
43 * @since 3669 (creation)
44 * @since 10386 (new LayerChangeListener interface)
45 */
46public class ValidatorLayer extends Layer implements LayerChangeListener {
47 private final Runnable invalidator = this::invalidate;
48
49 /**
50 * Constructs a new Validator layer
51 */
52 public ValidatorLayer() {
53 super(tr("Validation errors"));
54 MainApplication.getLayerManager().addLayerChangeListener(this);
55 MainApplication.getMap().validatorDialog.tree.addInvalidationListener(invalidator);
56 }
57
58 /**
59 * Return a static icon.
60 */
61 @Override
62 public Icon getIcon() {
63 return ImageProvider.get("layer", "validator_small");
64 }
65
66 /**
67 * Draw all primitives in this layer but do not draw modified ones (they
68 * are drawn by the edit layer).
69 * Draw nodes last to overlap the ways they belong to.
70 */
71 @Override
72 public void paint(final Graphics2D g, final MapView mv, Bounds bounds) {
73 DefaultMutableTreeNode root = MainApplication.getMap().validatorDialog.tree.getRoot();
74 if (root == null || root.getChildCount() == 0)
75 return;
76
77 PaintVisitor paintVisitor = new PaintVisitor(g, mv);
78
79 DefaultMutableTreeNode severity = (DefaultMutableTreeNode) root.getLastChild();
80 while (severity != null) {
81 ValidatorTreePanel.visitTestErrors(severity, paintVisitor::visit);
82
83 // Severities in inverse order
84 severity = severity.getPreviousSibling();
85 }
86
87 paintVisitor.clearPaintedObjects();
88 }
89
90 @Override
91 public String getToolTipText() {
92 MultiMap<Severity, TestError> errorTree = new MultiMap<>();
93 List<TestError> errors = MainApplication.getMap().validatorDialog.tree.getErrors();
94 for (TestError e : errors) {
95 errorTree.put(e.getSeverity(), e);
96 }
97
98 String b = Arrays.stream(Severity.values())
99 .filter(errorTree::containsKey)
100 .map(s -> tr(s.toString()) + ": " + errorTree.get(s).size() + "<br>")
101 .collect(Collectors.joining());
102
103 if (b.length() == 0)
104 return "<html>" + tr("No validation errors") + "</html>";
105 else
106 return "<html>" + tr("Validation errors") + ":<br>" + b + "</html>";
107 }
108
109 @Override
110 public void mergeFrom(Layer from) {
111 // Do nothing
112 }
113
114 @Override
115 public boolean isMergable(Layer other) {
116 return false;
117 }
118
119 @Override
120 public void visitBoundingBox(BoundingXYVisitor v) {
121 // Do nothing
122 }
123
124 @Override
125 public Object getInfoComponent() {
126 return getToolTipText();
127 }
128
129 @Override
130 public Action[] getMenuEntries() {
131 return new Action[] {
132 LayerListDialog.getInstance().createShowHideLayerAction(),
133 LayerListDialog.getInstance().createDeleteLayerAction(),
134 SeparatorLayerAction.INSTANCE,
135 new RenameLayerAction(null, this),
136 SeparatorLayerAction.INSTANCE,
137 new LayerListPopup.InfoAction(this),
138 new LayerSaveAsAction(this)
139 };
140 }
141
142 @Override
143 public boolean isSavable() {
144 return true; // With ValidatorErrorExporter
145 }
146
147 @Override
148 public boolean checkSaveConditions() {
149 return true;
150 }
151
152 @Override
153 public File createAndOpenSaveFileChooser() {
154 return SaveActionBase.createAndOpenSaveFileChooser(tr("Save Validation errors file"), ValidatorErrorExporter.FILE_FILTER);
155 }
156
157 @Override
158 public void layerOrderChanged(LayerOrderChangeEvent e) {
159 // Do nothing
160 }
161
162 @Override
163 public void layerAdded(LayerAddEvent e) {
164 // Do nothing
165 }
166
167 /**
168 * If layer is the OSM Data layer, remove all errors
169 */
170 @Override
171 public void layerRemoving(LayerRemoveEvent e) {
172 // Removed layer is still in that list.
173 if (e.getRemovedLayer() instanceof OsmDataLayer && e.getSource().getLayersOfType(OsmDataLayer.class).size() <= 1) {
174 e.scheduleRemoval(Collections.singleton(this));
175 } else if (e.getRemovedLayer() == this) {
176 OsmValidator.resetErrorLayer();
177 }
178 }
179
180 @Override
181 public LayerPositionStrategy getDefaultLayerPosition() {
182 return LayerPositionStrategy.IN_FRONT;
183 }
184
185 @Override
186 public synchronized void destroy() {
187 MainApplication.getMap().validatorDialog.tree.removeInvalidationListener(invalidator);
188 MainApplication.getLayerManager().removeLayerChangeListener(this);
189 super.destroy();
190 }
191
192 @Override
193 public String getChangesetSourceTag() {
194 return "JOSM Validator";
195 }
196}
Note: See TracBrowser for help on using the repository browser.