Author: abeld
Date: 2009-03-15 04:39:32 -0700 (Sun, 15 Mar 2009)
New Revision: 16266
Modified:
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/VisualPropertyCatalogImpl.java
Log:
Fix VisualPropertyCatalogImpl.addRenderer() and .removeRenderer() to correctly
handle the case when multiple Renderers define the same VisualProperties. This
requires storing a bit more state.
Modified:
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/VisualPropertyCatalogImpl.java
===================================================================
---
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/VisualPropertyCatalogImpl.java
2009-03-15 11:26:55 UTC (rev 16265)
+++
core3/viewmodel-impl/trunk/src/main/java/org/cytoscape/view/model/internal/VisualPropertyCatalogImpl.java
2009-03-15 11:39:32 UTC (rev 16266)
@@ -36,7 +36,9 @@
import java.util.ArrayList;
import java.util.Collection;
+import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -52,16 +54,20 @@
*/
public class VisualPropertyCatalogImpl implements VisualPropertyCatalog {
- // Map of visal properties. This object will be updated dynamically by
- // listeners
- private final Set<VisualProperty<?>> visualPropertySet;
+ // Map of visual properties. This object will be updated dynamically by
+ // listeners.
+ //
+ // In order to be able to remove VisualProperties of a Renderer only if
they
+ // are not used by some other renderer, we need to store, for each VP,
which
+ // Renderers define the given VP. Thus need to use a VP->(list of
Renderers) map.
+ private final Map<VisualProperty<?>, List<Renderer>> visualPropertySet;
/**
* Constructor. Just initializes collections for currently available
* renderers and VPs
*/
public VisualPropertyCatalogImpl() {
- visualPropertySet = new HashSet<VisualProperty<?>>();
+ visualPropertySet = new HashMap<VisualProperty<?>,
List<Renderer>>();
}
/**
@@ -73,7 +79,7 @@
* @return DOCUMENT ME!
*/
public VisualProperty<?> getVisualProperty(final String name) {
- for (VisualProperty<?> vp : visualPropertySet) {
+ for (VisualProperty<?> vp : visualPropertySet.keySet()) {
if (vp.getID().equals(name)) {
return vp;
}
@@ -150,24 +156,24 @@
final Collection<? extends View<?>> views, final String
objectType) {
if (views == null)
- return filterForObjectType(visualPropertySet,
objectType);
+ return filterForObjectType(visualPropertySet.keySet(),
objectType);
// System.out.println("making list of VisualProperties in
use:");
final Set<VisualProperty<?>> toRemove = new
HashSet<VisualProperty<?>>();
/* apply DependentVisualPropertyCallbacks */
- for (VisualProperty<?> vp : visualPropertySet) {
+ for (VisualProperty<?> vp : visualPropertySet.keySet()) {
final DependentVisualPropertyCallback callback = vp
.dependentVisualPropertyCallback();
if (callback != null) {
- toRemove.addAll(callback.changed(views,
visualPropertySet));
+ toRemove.addAll(callback.changed(views,
visualPropertySet.keySet()));
}
}
// System.out.println("removing:"+toRemove.size());
final Set<VisualProperty<?>> result = new
HashSet<VisualProperty<?>>(
- visualPropertySet);
+ visualPropertySet.keySet());
result.removeAll(toRemove);
// System.out.println("len of result:"+result.size());
@@ -195,11 +201,29 @@
@SuppressWarnings("unchecked")
public void addRenderer(Renderer renderer, Map props) {
System.out.println("====> Renderer bound: " +
renderer.toString());
- this.visualPropertySet.addAll(renderer.getVisualProperties());
+ for (VisualProperty<?>vp: renderer.getVisualProperties()){
+ if (this.visualPropertySet.containsKey(vp)){
+ List<Renderer> renderers =
this.visualPropertySet.get(vp);
+ renderers.add(renderer);
+ } else {
+ List<Renderer> renderers = new
ArrayList<Renderer>();
+ renderers.add(renderer);
+ this.visualPropertySet.put(vp, renderers);
+ }
+ }
}
@SuppressWarnings("unchecked")
public void removeRenderer(Renderer renderer, Map props) {
-
this.visualPropertySet.removeAll(renderer.getVisualProperties());
+ for (VisualProperty<?>vp: renderer.getVisualProperties()){
+ List<Renderer> renderers =
this.visualPropertySet.get(vp);
+ if (renderers.size() == 1){
+ // this is the last renderer that defined this
VP, remove the VP
+ this.visualPropertySet.remove(vp);
+ } else {
+ // others also defined this VP, only remove
renderer from the list:
+ renderers.remove(renderer);
+ }
+ }
}
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"cytoscape-cvs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/cytoscape-cvs?hl=en
-~----------~----~----~----~------~----~------~--~---