package maps.gml.view; import maps.gml.GMLShape; import maps.gml.GMLRoad; import maps.gml.GMLBuilding; import maps.gml.GMLSpace; import maps.gml.GMLCoordinates; import rescuecore2.misc.gui.ScreenTransform; import java.awt.Graphics2D; import java.awt.Color; import java.awt.Polygon; import java.util.List; /** This class knows how to decorate buildings, roads and spaces. */ public class FilledShapeDecorator implements BuildingDecorator, RoadDecorator, SpaceDecorator { private Color buildingColour; private Color roadColour; private Color spaceColour; /** Construct a FilledShapeDecorator. @param buildingColour The colour of buildings. @param roadColour The colour of roads. @param spaceColour The colour of spaces. */ public FilledShapeDecorator(Color buildingColour, Color roadColour, Color spaceColour) { this.buildingColour = buildingColour; this.roadColour = roadColour; this.spaceColour = spaceColour; } @Override public void decorate(GMLBuilding building, Graphics2D g, ScreenTransform transform) { if (buildingColour == null) { return; } g.setColor(buildingColour); draw(building, g, transform); } @Override public void decorate(GMLRoad road, Graphics2D g, ScreenTransform transform) { if (roadColour == null) { return; } g.setColor(roadColour); draw(road, g, transform); } @Override public void decorate(GMLSpace space, Graphics2D g, ScreenTransform transform) { if (spaceColour == null) { return; } g.setColor(spaceColour); draw(space, g, transform); } private void draw(GMLShape shape, Graphics2D g, ScreenTransform transform) { List<GMLCoordinates> coords = shape.getUnderlyingCoordinates(); int n = coords.size(); int[] xs = new int[n]; int[] ys = new int[n]; int i = 0; for (GMLCoordinates next : coords) { xs[i] = transform.xToScreen(next.getX()); ys[i] = transform.yToScreen(next.getY()); ++i; } g.fill(new Polygon(xs, ys, n)); } }