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

Last change on this file since 12028 was 12028, checked in by Don-vip, 7 years ago

see #14120 - fix java warnings

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