package maps.gml.view;
import java.awt.Graphics2D;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import maps.gml.GMLBuilding;
import maps.gml.GMLEdge;
import maps.gml.GMLNode;
import maps.gml.GMLRoad;
import maps.gml.GMLSpace;
import rescuecore2.misc.gui.ScreenTransform;
/**
* Draws an overlay consisting of Decorators.
*/
public class DecoratorOverlay implements Overlay {
private transient Map<GMLNode, NodeDecorator> nodeDecorators;
private transient Map<GMLEdge, EdgeDecorator> edgeDecorators;
private transient Map<GMLBuilding, BuildingDecorator> buildingDecorators;
private transient Map<GMLRoad, RoadDecorator> roadDecorators;
private transient Map<GMLSpace, SpaceDecorator> spaceDecorators;
/**
* Construct a DecoratorOverlay.
*/
public DecoratorOverlay() {
nodeDecorators = new HashMap<GMLNode, NodeDecorator>();
edgeDecorators = new HashMap<GMLEdge, EdgeDecorator>();
buildingDecorators = new HashMap<GMLBuilding, BuildingDecorator>();
roadDecorators = new HashMap<GMLRoad, RoadDecorator>();
spaceDecorators = new HashMap<GMLSpace, SpaceDecorator>();
}
/**
* Set the NodeDecorator for a set of GMLNodes.
*
* @param decorator
* The decorator to set.
* @param nodes
* The nodes to set the decorator for.
*/
public void setNodeDecorator(NodeDecorator decorator, GMLNode... nodes) {
setNodeDecorator(decorator, Arrays.asList(nodes));
}
/**
* Set the NodeDecorator for a set of GMLNodes.
*
* @param decorator
* The decorator to set.
* @param nodes
* The nodes to set the decorator for.
*/
public void setNodeDecorator(NodeDecorator decorator,
Collection<? extends GMLNode> nodes) {
for (GMLNode next : nodes) {
nodeDecorators.put(next, decorator);
}
}
/**
* Get the NodeDecorator for a GMLNodes.
*
* @param node
* The node to look up.
* @return The NodeDecorator for that node. This will be null if no custom
* decorator has been set for that node.
*/
public NodeDecorator getNodeDecorator(GMLNode node) {
NodeDecorator result = nodeDecorators.get(node);
return result;
}
/**
* Remove any custom NodeDecorator for a set of GMLNodes.
*
* @param nodes
* The nodes to remove any custom decorator for.
*/
public void clearNodeDecorator(GMLNode... nodes) {
clearNodeDecorator(Arrays.asList(nodes));
}
/**
* Remove any custom NodeDecorator for a set of GMLNodes.
*
* @param nodes
* The nodes to remove any custom decorator for.
*/
public void clearNodeDecorator(Collection<? extends GMLNode> nodes) {
for (GMLNode next : nodes) {
nodeDecorators.remove(next);
}
}
/**
* Remove any custom NodeDecorators.
*/
public void clearAllNodeDecorators() {
nodeDecorators.clear();
}
/**
* Set the EdgeDecorator for a set of GMLEdges.
*
* @param decorator
* The decorator to set.
* @param edges
* The edges to set the decorator for.
*/
public void setEdgeDecorator(EdgeDecorator decorator, GMLEdge... edges) {
setEdgeDecorator(decorator, Arrays.asList(edges));
}
/**
* Set the EdgeDecorator for a set of GMLEdges.
*
* @param decorator
* The decorator to set.
* @param edges
* The edges to set the decorator for.
*/
public void setEdgeDecorator(EdgeDecorator decorator,
Collection<? extends GMLEdge> edges) {
for (GMLEdge next : edges) {
edgeDecorators.put(next, decorator);
}
}
/**
* Get the EdgeDecorator for a GMLEdge.
*
* @param edge
* The edge to look up.
* @return The EdgeDecorator for that edge. This will be null if no custom
* decorator has been set for that edge.
*/
public EdgeDecorator getEdgeDecorator(GMLEdge edge) {
EdgeDecorator result = edgeDecorators.get(edge);
return result;
}
/**
* Remove any custom EdgeDecorator for a set of GMLEdges.
*
* @param edges
* The edges to remove any custom decorator for.
*/
public void clearEdgeDecorator(GMLEdge... edges) {
clearEdgeDecorator(Arrays.asList(edges));
}
/**
* Remove any custom EdgeDecorator for a set of GMLEdges.
*
* @param edges
* The edges to remove any custom decorator for.
*/
public void clearEdgeDecorator(Collection<? extends GMLEdge> edges) {
for (GMLEdge next : edges) {
edgeDecorators.remove(next);
}
}
/**
* Remove any custom EdgeDecorators.
*/
public void clearAllEdgeDecorators() {
edgeDecorators.clear();
}
/**
* Set the BuildingDecorator for a set of GMLBuildings.
*
* @param decorator
* The decorator to set.
* @param buildings
* The buildings to set the decorator for.
*/
public void setBuildingDecorator(BuildingDecorator decorator,
GMLBuilding... buildings) {
setBuildingDecorator(decorator, Arrays.asList(buildings));
}
/**
* Set the BuildingDecorator for a set of GMLBuildings.
*
* @param decorator
* The decorator to set.
* @param buildings
* The buildings to set the decorator for.
*/
public void setBuildingDecorator(BuildingDecorator decorator,
Collection<? extends GMLBuilding> buildings) {
for (GMLBuilding next : buildings) {
buildingDecorators.put(next, decorator);
}
}
/**
* Get the BuildingDecorator for a GMLBuildings.
*
* @param building
* The building to look up.
* @return The BuildingDecorator for that building. This will be null if no
* custom decorator has been set for that building.
*/
public BuildingDecorator getBuildingDecorator(GMLBuilding building) {
BuildingDecorator result = buildingDecorators.get(building);
return result;
}
/**
* Remove any custom BuildingDecorator for a set of GMLBuildings.
*
* @param buildings
* The buildings to remove any custom decorator for.
*/
public void clearBuildingDecorator(GMLBuilding... buildings) {
clearBuildingDecorator(Arrays.asList(buildings));
}
/**
* Remove any custom BuildingDecorator for a set of GMLBuildings.
*
* @param buildings
* The buildings to remove any custom decorator for.
*/
public void clearBuildingDecorator(
Collection<? extends GMLBuilding> buildings) {
for (GMLBuilding next : buildings) {
buildingDecorators.remove(next);
}
}
/**
* Remove any custom BuildingDecorators.
*/
public void clearAllBuildingDecorators() {
buildingDecorators.clear();
}
/**
* Set the RoadDecorator for a set of GMLRoads.
*
* @param decorator
* The decorator to set.
* @param roads
* The roads to set the decorator for.
*/
public void setRoadDecorator(RoadDecorator decorator, GMLRoad... roads) {
setRoadDecorator(decorator, Arrays.asList(roads));
}
/**
* Set the RoadDecorator for a set of GMLRoads.
*
* @param decorator
* The decorator to set.
* @param roads
* The roads to set the decorator for.
*/
public void setRoadDecorator(RoadDecorator decorator,
Collection<? extends GMLRoad> roads) {
for (GMLRoad next : roads) {
roadDecorators.put(next, decorator);
}
}
/**
* Get the RoadDecorator for a GMLRoads.
*
* @param road
* The road to look up.
* @return The RoadDecorator for that road. Will return null if no custom
* decorator has been set for that road.
*/
public RoadDecorator getRoadDecorator(GMLRoad road) {
RoadDecorator result = roadDecorators.get(road);
return result;
}
/**
* Remove any custom RoadDecorator for a set of GMLRoads.
*
* @param roads
* The roads to remove any custom decorator for.
*/
public void clearRoadDecorator(GMLRoad... roads) {
clearRoadDecorator(Arrays.asList(roads));
}
/**
* Remove any custom RoadDecorator for a set of GMLRoads.
*
* @param roads
* The roads to remove any custom decorator for.
*/
public void clearRoadDecorator(Collection<? extends GMLRoad> roads) {
for (GMLRoad next : roads) {
roadDecorators.remove(next);
}
}
/**
* Remove any custom RoadDecorators.
*/
public void clearAllRoadDecorators() {
roadDecorators.clear();
}
/**
* Set the SpaceDecorator for a set of GMLSpaces.
*
* @param decorator
* The decorator to set.
* @param spaces
* The spaces to set the decorator for.
*/
public void setSpaceDecorator(SpaceDecorator decorator, GMLSpace... spaces) {
setSpaceDecorator(decorator, Arrays.asList(spaces));
}
/**
* Set the SpaceDecorator for a set of GMLSpaces.
*
* @param decorator
* The decorator to set.
* @param spaces
* The spaces to set the decorator for.
*/
public void setSpaceDecorator(SpaceDecorator decorator,
Collection<? extends GMLSpace> spaces) {
for (GMLSpace next : spaces) {
spaceDecorators.put(next, decorator);
}
}
/**
* Get the SpaceDecorator for a GMLSpaces.
*
* @param space
* The space to look up.
* @return The SpaceDecorator for that space. This will be null if no custom
* decorator has been set for that space.
*/
public SpaceDecorator getSpaceDecorator(GMLSpace space) {
SpaceDecorator result = spaceDecorators.get(space);
return result;
}
/**
* Remove any custom SpaceDecorator for a set of GMLSpaces.
*
* @param spaces
* The spaces to remove any custom decorator for.
*/
public void clearSpaceDecorator(GMLSpace... spaces) {
clearSpaceDecorator(Arrays.asList(spaces));
}
/**
* Remove any custom SpaceDecorator for a set of GMLSpaces.
*
* @param spaces
* The spaces to remove any custom decorator for.
*/
public void clearSpaceDecorator(Collection<? extends GMLSpace> spaces) {
for (GMLSpace next : spaces) {
spaceDecorators.remove(next);
}
}
/**
* Remove any custom SpaceDecorators.
*/
public void clearAllSpaceDecorators() {
spaceDecorators.clear();
}
/**
* Remove all types of Decorators.
*/
public void clearAllDecorators() {
clearAllBuildingDecorators();
clearAllRoadDecorators();
clearAllSpaceDecorators();
clearAllEdgeDecorators();
clearAllNodeDecorators();
}
@Override
public void render(Graphics2D g, ScreenTransform transform) {
for (Entry<GMLRoad, RoadDecorator> e : roadDecorators.entrySet()) {
e.getValue().decorate(e.getKey(), (Graphics2D) g.create(),
transform);
}
for (Entry<GMLBuilding, BuildingDecorator> e : buildingDecorators
.entrySet()) {
e.getValue().decorate(e.getKey(), (Graphics2D) g.create(),
transform);
}
for (Entry<GMLSpace, SpaceDecorator> e : spaceDecorators.entrySet()) {
e.getValue().decorate(e.getKey(), (Graphics2D) g.create(),
transform);
}
for (Entry<GMLEdge, EdgeDecorator> e : edgeDecorators.entrySet()) {
e.getValue().decorate(e.getKey(), (Graphics2D) g.create(),
transform);
}
for (Entry<GMLNode, NodeDecorator> e : nodeDecorators.entrySet()) {
e.getValue().decorate(e.getKey(), (Graphics2D) g.create(),
transform);
}
}
}