}
@Override
public Visualization makeVisualization(VisualizationTask task) {
SettingsResult sr = task.getResult();
VisualizerContext context = task.getContext();
SVGPlot svgp = task.getPlot();
Collection<Pair<Object, Parameter<?, ?>>> settings = sr.getSettings();
Element layer = svgp.svgElement(SVGConstants.SVG_G_TAG);
// FIXME: use CSSClass and StyleLibrary
int i = 0;
Object last = null;
for(Pair<Object, Parameter<?, ?>> setting : settings) {
if(setting.first != last && setting.first != null) {
String name;
try {
if(setting.first instanceof Class) {
name = ((Class<?>) setting.first).getName();
} else {
name = setting.first.getClass().getName();
}
if(ClassParameter.class.isInstance(setting.first)) {
name = ((ClassParameter<?>) setting.first).getValue().getName();
}
}
catch(NullPointerException e) {
name = "[null]";
}
Element object = svgp.svgText(0, i + 0.7, name);
object.setAttribute(SVGConstants.SVG_STYLE_ATTRIBUTE, "font-size: 0.6; font-weight: bold");
layer.appendChild(object);
i++;
last = setting.first;
}
// get name and value
String name = setting.second.getOptionID().getName();
String value = "[unset]";
try {
if(setting.second.isDefined()) {
value = setting.second.getValueAsString();
}
}
catch(NullPointerException e) {
value = "[null]";
}
Element label = svgp.svgText(0, i + 0.7, name);
label.setAttribute(SVGConstants.SVG_STYLE_ATTRIBUTE, "font-size: 0.6");
layer.appendChild(label);
Element vale = svgp.svgText(7.5, i + 0.7, value);
vale.setAttribute(SVGConstants.SVG_STYLE_ATTRIBUTE, "font-size: 0.6");
layer.appendChild(vale);
// only advance once, since we want these two to be in the same line.
i++;
}
int cols = Math.max(30, (int) (i * task.getHeight() / task.getWidth()));
int rows = i;
final double margin = context.getStyleLibrary().getSize(StyleLibrary.MARGIN);
final String transform = SVGUtil.makeMarginTransform(task.getWidth(), task.getHeight(), cols, rows, margin / StyleLibrary.SCALE);
SVGUtil.setAtt(layer, SVGConstants.SVG_TRANSFORM_ATTRIBUTE, transform);
return new StaticVisualization(task, layer);
}