summaryrefslogtreecommitdiff
path: root/src/de/lmu/ifi/dbs/elki/visualization/gui
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/visualization/gui')
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/SelectionTableWindow.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java7
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java3
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java5
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java2
-rw-r--r--src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java12
6 files changed, 29 insertions, 5 deletions
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/SelectionTableWindow.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/SelectionTableWindow.java
index 0c8e7500..754779fe 100644
--- a/src/de/lmu/ifi/dbs/elki/visualization/gui/SelectionTableWindow.java
+++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/SelectionTableWindow.java
@@ -44,6 +44,7 @@ import de.lmu.ifi.dbs.elki.database.datastore.DataStoreEvent;
import de.lmu.ifi.dbs.elki.database.datastore.DataStoreListener;
import de.lmu.ifi.dbs.elki.database.ids.ArrayModifiableDBIDs;
import de.lmu.ifi.dbs.elki.database.ids.DBID;
+import de.lmu.ifi.dbs.elki.database.ids.DBIDIter;
import de.lmu.ifi.dbs.elki.database.ids.DBIDUtil;
import de.lmu.ifi.dbs.elki.database.ids.ModifiableDBIDs;
import de.lmu.ifi.dbs.elki.database.relation.Relation;
@@ -227,8 +228,8 @@ public class SelectionTableWindow extends JFrame implements DataStoreListener, R
// Unselect first ...
context.setSelection(new DBIDSelection(remain));
// Now delete them.
- for(DBID id : todel) {
- upd.delete(id);
+ for(DBIDIter iter = todel.iter(); iter.valid(); iter.advance()) {
+ upd.delete(iter.getDBID());
}
}
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java
index 8b6f4892..3e1348ac 100644
--- a/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java
+++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/detail/DetailView.java
@@ -149,6 +149,9 @@ public class DetailView extends SVGPlot implements ResultListener {
if(VisualizerUtil.isVisible(task)) {
try {
Visualization v = task.getFactory().makeVisualization(task.clone(this, context, visi.proj, width, height));
+ if (VisualizerUtil.isNoExport(task)) {
+ v.getLayer().setAttribute(NO_EXPORT_ATTRIBUTE, NO_EXPORT_ATTRIBUTE);
+ }
layers.add(v);
layermap.put(task, v);
}
@@ -291,10 +294,14 @@ public class DetailView extends SVGPlot implements ResultListener {
if(VisualizerUtil.isVisible(task)) {
// LoggingUtil.warning("Need to recreate a missing layer for " + v);
vis = task.getFactory().makeVisualization(task.clone(this, context, visi.proj, width, height));
+ if (VisualizerUtil.isNoExport(task)) {
+ vis.getLayer().setAttribute(NO_EXPORT_ATTRIBUTE, NO_EXPORT_ATTRIBUTE);
+ }
layermap.put(task, vis);
this.scheduleUpdate(new InsertVisualization(vis));
}
}
+ // FIXME: ensure layers are ordered correctly!
}
@Override
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java
index c3575e43..36851b85 100644
--- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java
+++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/LayerMap.java
@@ -33,6 +33,9 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.Visualization;
* Class to help keeping track of the materialized layers of the different visualizations.
*
* @author Erich Schubert
+ *
+ * @apiviz.has PlotItem
+ * @apiviz.has VisualizationTask
*/
public class LayerMap {
/**
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java
index 56d6ce32..92ddb0b8 100644
--- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java
+++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/OverviewPlot.java
@@ -66,9 +66,9 @@ import de.lmu.ifi.dbs.elki.visualization.visualizers.VisualizerUtil;
* @apiviz.landmark
* @apiviz.has VisualizerContext
* @apiviz.composedOf RectangleArranger
+ * @apiviz.composedOf LayerMap
* @apiviz.has DetailViewSelectedEvent
* @apiviz.uses DetailView
- * @apiviz.uses Projector
*/
// FIXME: there still is a synchronization issue, that causes the initialization
// to be run twice in parallel.
@@ -322,6 +322,9 @@ public class OverviewPlot extends SVGPlot implements ResultListener {
LoggingUtil.warning("Visualization returned empty layer: " + vis);
}
else {
+ if (VisualizerUtil.isNoExport(task)) {
+ vis.getLayer().setAttribute(NO_EXPORT_ATTRIBUTE, NO_EXPORT_ATTRIBUTE);
+ }
parent.appendChild(vis.getLayer());
}
return vis;
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java
index cbe5a4be..73ee797e 100644
--- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java
+++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/PlotItem.java
@@ -40,6 +40,8 @@ import de.lmu.ifi.dbs.elki.visualization.projections.Projection;
* @author Erich Schubert
*
* @apiviz.composedOf Projection
+ * @apiviz.composedOf VisualizationTask
+ * @apiviz.composedOf PlotItem
*/
public class PlotItem {
/**
diff --git a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java
index 77825a5f..a70393a5 100644
--- a/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java
+++ b/src/de/lmu/ifi/dbs/elki/visualization/gui/overview/RectangleArranger.java
@@ -302,6 +302,10 @@ public class RectangleArranger<T> {
}
protected void splitRow(int bestey, double besthi) {
+ assert(bestey < heights.size());
+ if (heights.get(bestey) - besthi <= Double.MIN_NORMAL) {
+ return;
+ }
logger.debugFine("Split row " + bestey);
heights.add(bestey + 1, besthi);
heights.set(bestey, heights.get(bestey) - besthi);
@@ -310,6 +314,10 @@ public class RectangleArranger<T> {
}
protected void splitCol(int bestex, double bestwi) {
+ assert(bestex < widths.size());
+ if (widths.get(bestex) - bestwi <= Double.MIN_NORMAL) {
+ return;
+ }
final int rows = heights.size();
logger.debugFine("Split column " + bestex);
widths.add(bestex + 1, bestwi);
@@ -371,7 +379,7 @@ public class RectangleArranger<T> {
{
double wsum = 0.0;
for(int x = 0; x < cols; x++) {
- assert (widths.get(x) > 0) : "Negative width: "+widths.get(x);
+ assert (widths.get(x) > 0) : "Non-positive width: "+widths.get(x);
wsum += widths.get(x);
}
assert (Math.abs(wsum - twidth) < 1E-10);
@@ -379,7 +387,7 @@ public class RectangleArranger<T> {
{
double hsum = 0.0;
for(int y = 0; y < rows; y++) {
- assert (heights.get(y) > 0) : "Negative height: "+heights.get(y);
+ assert (heights.get(y) > 0) : "Non-positive height: "+heights.get(y);
hsum += heights.get(y);
}
assert (Math.abs(hsum - theight) < 1E-10);