package haven.minimap;
import java.awt.Color;
import java.util.*;
import haven.*;
import haven.minimap.Marker.Shape;
class MarkerFactory {
private final Set<String> unknownNameCache;
private final Map<String, MarkerTemplate> templateCache;
private final Map<String, ConfigMarker> matches;
private final List<ConfigMarker> patterns;
public MarkerFactory() {
unknownNameCache = new HashSet<String>();
templateCache = new HashMap<String, MarkerTemplate>();
matches = new HashMap<String, ConfigMarker>();
patterns = new ArrayList<ConfigMarker>();
setConfig(new RadarConfig());
}
public Marker makeMarker(String resname, Gob gob) {
MarkerTemplate mt = findTemplate(resname);
if ((mt == null) && Config.radar_icons && (gob.getattr(GobIcon.class) != null)){
mt = new MarkerTemplate(Color.WHITE, true, resname, true, Shape.CIRCLE);
templateCache.put(resname, mt);
}
if(mt != null){
return new Marker(resname, gob, mt);
}
return null;
}
private MarkerTemplate findTemplate(String resname) {
if (unknownNameCache.contains(resname))
return null;
if (templateCache.containsKey(resname))
return templateCache.get(resname);
// now check if we have match defined in the config
ConfigMarker marker = matches.get(resname);
if (marker == null) {
// try to match resource name with known patterns
for (ConfigMarker cm : patterns)
if (resname.matches(cm.match)) {
marker = cm;
break;
}
}
if (marker != null) {
MarkerTemplate template = createTemplate(resname, marker);
templateCache.put(resname, template);
return template;
} else {
unknownNameCache.add(resname);
return null;
}
}
private MarkerTemplate createTemplate(String resname, ConfigMarker cm) {
return new MarkerTemplate(cm.color, cm.show, cm.hastext() ? cm.text : resname, cm.tooltip, cm.shape);
}
public void setConfig(RadarConfig config) {
unknownNameCache.clear();
templateCache.clear();
matches.clear();
patterns.clear();
for (ConfigGroup group : config.getGroups()) {
for (ConfigMarker marker : group.markers) {
if (marker.ispattern)
patterns.add(marker);
else
matches.put(marker.match, marker);
}
}
}
}