diff options
Diffstat (limited to 'src/de/lmu/ifi/dbs/elki/visualization/gui')
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); |