package maps.gml.editor;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Collection;
import maps.gml.GMLBuilding;
import maps.gml.GMLEdge;
import maps.gml.GMLMap;
import maps.gml.GMLNode;
import maps.gml.GMLObject;
import maps.gml.GMLRoad;
import maps.gml.GMLSpace;
import maps.gml.view.DecoratorOverlay;
import maps.gml.view.EdgeDecorator;
import maps.gml.view.FilledShapeDecorator;
import maps.gml.view.LineEdgeDecorator;
import maps.gml.view.NodeDecorator;
import maps.gml.view.SquareNodeDecorator;
import maps.validate.GMLMapValidator;
import maps.validate.MapValidator;
import maps.validate.ValidationError;
import rescuecore2.log.Logger;
/**
* Check the map for errors and highlight them on the map.
*
*/
public class ValidateFunction extends AbstractFunction {
private static final Color HIGHLIGHT_COLOUR = Color.RED;
private static final int NODE_SIZE = 5;
private DecoratorOverlay overlay = new DecoratorOverlay();
private NodeDecorator nodeHighlight;
private EdgeDecorator edgeHighlight;
private FilledShapeDecorator shapeHighlight;
/**
* Create a new ValidateFunction.
* @param editor The editor.
*/
public ValidateFunction(GMLEditor editor) {
super(editor);
nodeHighlight = new SquareNodeDecorator(HIGHLIGHT_COLOUR, NODE_SIZE);
edgeHighlight = new LineEdgeDecorator(HIGHLIGHT_COLOUR);
shapeHighlight = new FilledShapeDecorator(HIGHLIGHT_COLOUR,
HIGHLIGHT_COLOUR, HIGHLIGHT_COLOUR);
}
@Override
public void execute() {
overlay.clearAllDecorators();
Collection<ValidationError> allErrors = new ArrayList<ValidationError>();
for (MapValidator<GMLMap> validator : GMLMapValidator
.getDefaultValidators()) {
Logger.info("Validating " + validator);
Collection<ValidationError> errors = validator.validate(editor
.getMap());
allErrors.addAll(errors);
for (ValidationError e : errors) {
System.out.println(e);
addDecorator(e.getId());
}
}
editor.getInspector().setErrors(allErrors);
editor.getViewer().removeOverlay(overlay);
editor.getViewer().addOverlay(overlay);
editor.getViewer().repaint();
}
/**
* Add a new error decorator for the object with the given id.
* @param id
*/
private void addDecorator(int id) {
GMLObject obj = editor.getMap().getObject(id);
if (obj == null) {
return;
}
if (obj instanceof GMLBuilding) {
overlay.setBuildingDecorator(shapeHighlight, (GMLBuilding) obj);
}
else if (obj instanceof GMLRoad) {
overlay.setRoadDecorator(shapeHighlight, (GMLRoad) obj);
}
else if (obj instanceof GMLSpace) {
overlay.setSpaceDecorator(shapeHighlight, (GMLSpace) obj);
}
else if (obj instanceof GMLEdge) {
overlay.setEdgeDecorator(edgeHighlight, (GMLEdge) obj);
}
else if (obj instanceof GMLNode) {
overlay.setNodeDecorator(nodeHighlight, (GMLNode) obj);
}
}
@Override
public String getName() {
return "Validate map";
}
}