summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java')
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java154
1 files changed, 154 insertions, 0 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java
new file mode 100644
index 00000000..736f28e7
--- /dev/null
+++ b/src/de/lmu/ifi/dbs/elki/visualization/visualizers/visunproj/SettingsVisualization.java
@@ -0,0 +1,154 @@
+package de.lmu.ifi.dbs.elki.visualization.visualizers.visunproj;
+
+/*
+ This file is part of ELKI:
+ Environment for Developing KDD-Applications Supported by Index-Structures
+
+ Copyright (C) 2012
+ Ludwig-Maximilians-Universität München
+ Lehr- und Forschungseinheit für Datenbanksysteme
+ ELKI Development Team
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU Affero General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+import java.util.Collection;
+
+import org.apache.batik.util.SVGConstants;
+import org.w3c.dom.Element;
+
+import de.lmu.ifi.dbs.elki.result.HierarchicalResult;
+import de.lmu.ifi.dbs.elki.result.Result;
+import de.lmu.ifi.dbs.elki.result.ResultUtil;
+import de.lmu.ifi.dbs.elki.result.SettingsResult;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.ClassParameter;
+import de.lmu.ifi.dbs.elki.utilities.optionhandling.parameters.Parameter;
+import de.lmu.ifi.dbs.elki.utilities.pairs.Pair;
+import de.lmu.ifi.dbs.elki.visualization.VisualizationTask;
+import de.lmu.ifi.dbs.elki.visualization.VisualizerContext;
+import de.lmu.ifi.dbs.elki.visualization.style.StyleLibrary;
+import de.lmu.ifi.dbs.elki.visualization.svg.SVGPlot;
+import de.lmu.ifi.dbs.elki.visualization.svg.SVGUtil;
+import de.lmu.ifi.dbs.elki.visualization.visualizers.AbstractVisFactory;
+import de.lmu.ifi.dbs.elki.visualization.visualizers.StaticVisualizationInstance;
+import de.lmu.ifi.dbs.elki.visualization.visualizers.Visualization;
+
+/**
+ * Pseudo-Visualizer, that lists the settings of the algorithm-
+ *
+ * @author Erich Schubert
+ *
+ * @apiviz.stereotype factory
+ * @apiviz.uses StaticVisualizationInstance oneway - - «create»
+ * @apiviz.has SettingsResult oneway - - visualizes
+ */
+// TODO: make this a menu item instead of a "visualization"?
+public class SettingsVisualization extends AbstractVisFactory {
+ /**
+ * Name for this visualizer.
+ */
+ private static final String NAME = "Settings";
+
+ /**
+ * Constructor, adhering to
+ * {@link de.lmu.ifi.dbs.elki.utilities.optionhandling.Parameterizable}
+ */
+ public SettingsVisualization() {
+ super();
+ }
+
+ @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.getStyleResult().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 StaticVisualizationInstance(task, layer);
+ }
+
+ @Override
+ public void processNewResult(HierarchicalResult baseResult, Result newResult) {
+ Collection<SettingsResult> settingsResults = ResultUtil.filterResults(newResult, SettingsResult.class);
+ for(SettingsResult sr : settingsResults) {
+ final VisualizationTask task = new VisualizationTask(NAME, sr, null, this);
+ task.width = 1.0;
+ task.height = 1.0;
+ task.level = VisualizationTask.LEVEL_STATIC;
+ baseResult.getHierarchy().add(sr, task);
+ }
+ }
+
+ @Override
+ public boolean allowThumbnails(VisualizationTask task) {
+ return false;
+ }
+} \ No newline at end of file