Author: scooter
Date: 2012-09-12 16:51:05 -0700 (Wed, 12 Sep 2012)
New Revision: 30360

Added:
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsPositionCalculator.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsTranslator.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DummyCustomGraphics.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/NullCustomGraphicsFactory.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientOvalFactory.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientRoundRectangleFactory.java
Removed:
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/DummyCustomGraphics.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DefaultCyCustomGraphicsFactory.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ReplaceDummyGraphicsTask.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/
Modified:
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/CyActivator.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/AbstractDCustomGraphics.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsManager.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphics.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphicsFactory.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/DNodeView.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/visualproperty/CustomGraphicsVisualProperty.java
Log:
Last of the internal refactoring of custom graphics (for now).  Now, on to 
adding service listeners into the CustomGraphicsManager!


Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/CyActivator.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/CyActivator.java
 2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/CyActivator.java
 2012-09-12 23:51:05 UTC (rev 30360)
@@ -16,6 +16,11 @@
 import org.cytoscape.application.swing.CyNodeViewContextMenuFactory;
 import org.cytoscape.ding.action.GraphicsDetailAction;
 import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+import org.cytoscape.ding.customgraphics.CustomGraphicsTranslator;
+import org.cytoscape.ding.customgraphics.NullCustomGraphicsFactory;
+import org.cytoscape.ding.customgraphics.bitmap.URLImageCustomGraphicsFactory;
+import org.cytoscape.ding.customgraphics.vector.GradientRoundRectangleFactory;
+import org.cytoscape.ding.customgraphics.vector.GradientOvalFactory;
 import org.cytoscape.ding.customgraphicsmgr.internal.CustomGraphicsManagerImpl;
 import 
org.cytoscape.ding.customgraphicsmgr.internal.action.CustomGraphicsManagerAction;
 import org.cytoscape.ding.customgraphicsmgr.internal.ui.CustomGraphicsBrowser;
@@ -32,7 +37,6 @@
 import org.cytoscape.ding.impl.HandleFactoryImpl;
 import org.cytoscape.ding.impl.NVLTFActionSupport;
 import org.cytoscape.ding.impl.ViewTaskFactoryListener;
-import org.cytoscape.ding.impl.customgraphics.CustomGraphicsTranslator;
 //
 // Annotation api
 //
@@ -468,6 +472,22 @@
 
                registerAllServices(bc, customGraphicsManager, new 
Properties());
                registerService(bc, customGraphicsManagerAction, 
CyAction.class, new Properties());
+
+               // Create and register our built-in factories.
+               // TODO:  When the CustomGraphicsFactory service stuff is set 
up, just
+               // register these as services
+               NullCustomGraphicsFactory nullFactory = new 
NullCustomGraphicsFactory(customGraphicsManager);
+               customGraphicsManager.addCustomGraphicsFactory(nullFactory);
+
+               URLImageCustomGraphicsFactory imageFactory = new 
URLImageCustomGraphicsFactory(customGraphicsManager);
+               customGraphicsManager.addCustomGraphicsFactory(imageFactory);
+
+               GradientOvalFactory ovalFactory = new 
GradientOvalFactory(customGraphicsManager);
+               customGraphicsManager.addCustomGraphicsFactory(ovalFactory);
+
+               GradientRoundRectangleFactory rectangleFactory = 
+                    new GradientRoundRectangleFactory(customGraphicsManager);
+               
customGraphicsManager.addCustomGraphicsFactory(rectangleFactory);
        }
        
        /**

Deleted: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/DummyCustomGraphics.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/DummyCustomGraphics.java
 2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/DummyCustomGraphics.java
 2012-09-12 23:51:05 UTC (rev 30360)
@@ -1,18 +0,0 @@
-package org.cytoscape.ding;
-
-import java.awt.Image;
-
-import org.cytoscape.ding.customgraphics.AbstractDCustomGraphics;
-import org.cytoscape.ding.customgraphics.NullCustomGraphics;
-
-public final class DummyCustomGraphics extends AbstractDCustomGraphics {
-       
-       public DummyCustomGraphics(Long id, String displayName) {
-               super(id, displayName);
-       }
-
-       @Override
-       public Image getRenderedImage() {
-               return NullCustomGraphics.DEF_IMAGE;
-       }
-}
\ No newline at end of file

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/AbstractDCustomGraphics.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/AbstractDCustomGraphics.java
      2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/AbstractDCustomGraphics.java
      2012-09-12 23:51:05 UTC (rev 30360)
@@ -91,6 +91,7 @@
        }
 
        @Override abstract public Image getRenderedImage();
+       @Override abstract public String toString();
 
 
        public Collection<String> getTags() {
@@ -116,7 +117,7 @@
                        name = displayName.replace(",", "___");
                }
 
-               return this.getClass().getName() + DELIMITER + 
this.getIdentifier()
+               return this.getClass().getCanonicalName() + DELIMITER + 
this.getIdentifier()
                                + DELIMITER + name + DELIMITER + tagStr;
        }
        

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsManager.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsManager.java
        2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsManager.java
        2012-09-12 23:51:05 UTC (rev 30360)
@@ -3,11 +3,19 @@
 import java.net.URL;
 import java.util.Collection;
 import java.util.Properties;
+import java.util.Set;
 import java.util.SortedSet;
 
 import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
 
 public interface CustomGraphicsManager {
+
+       void addCustomGraphicsFactory(CyCustomGraphicsFactory factory);
+       void removeCustomGraphicsFactory(CyCustomGraphicsFactory factory);
+       CyCustomGraphicsFactory getCustomGraphicsFactory(Class<? extends 
CyCustomGraphics> cls);
+       CyCustomGraphicsFactory getCustomGraphicsFactory(String className);
+       Collection<CyCustomGraphicsFactory> getAllCustomGraphicsFactories();
        
        void addCustomGraphics(CyCustomGraphics cg, URL source);
        

Copied: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsPositionCalculator.java
 (from rev 30353, 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/CustomGraphicsPositionCalculator.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsPositionCalculator.java
                             (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsPositionCalculator.java
     2012-09-12 23:51:05 UTC (rev 30360)
@@ -0,0 +1,75 @@
+package org.cytoscape.ding.customgraphics;
+
+import java.awt.Shape;
+import java.awt.geom.AffineTransform;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.cytoscape.ding.ObjectPosition;
+import org.cytoscape.ding.Position;
+import org.cytoscape.ding.impl.DNodeView;
+import org.cytoscape.view.presentation.customgraphics.CustomGraphicLayer;
+import org.cytoscape.graph.render.stateful.PaintFactory;
+
+public class CustomGraphicsPositionCalculator {
+       
+       /**
+        * Defines displacement.
+        */
+       private static final Map<Position, Float[]> DISPLACEMENT_MAP;
+       
+       static {
+               DISPLACEMENT_MAP = new HashMap<Position, Float[]>();
+               
+               DISPLACEMENT_MAP.put(Position.CENTER, new Float[]{0f, 0f} );
+               
+               DISPLACEMENT_MAP.put(Position.NORTH,  new Float[]{0f, -0.5f});
+               DISPLACEMENT_MAP.put(Position.NORTH_WEST, new Float[]{-0.5f, 
-0.5f});
+               DISPLACEMENT_MAP.put(Position.NORTH_EAST, new Float[]{0.5f, 
-0.5f});
+               
+               DISPLACEMENT_MAP.put(Position.SOUTH,  new Float[]{0f, 0.5f});
+               DISPLACEMENT_MAP.put(Position.SOUTH_WEST,  new Float[]{-0.5f, 
0.5f});
+               DISPLACEMENT_MAP.put(Position.SOUTH_EAST,  new Float[]{0.5f, 
0.5f});
+               
+               DISPLACEMENT_MAP.put(Position.WEST,  new Float[]{-0.5f, 0f});
+               
+               DISPLACEMENT_MAP.put(Position.EAST,  new Float[]{0.5f, 0f});
+       }
+       
+       
+       /**
+        * Creates new custom graphics in new location
+        * 
+        * @param p
+        * @param nv
+        * @param cg
+        * @return
+        */
+       public static CustomGraphicLayer transform(final ObjectPosition p, 
final DNodeView nv, final CustomGraphicLayer cg) {           
+               final Position anc = p.getAnchor();
+               final Position ancN = p.getTargetAnchor();
+               
+               final double nodeW = nv.getWidth();
+               final double nodeH = nv.getHeight();
+               final double cgW = cg.getBounds().getWidth();
+               final double cgH = cg.getBounds().getHeight();
+               
+               final Float[] disp1 = DISPLACEMENT_MAP.get(anc);
+               final Float[] disp2 = DISPLACEMENT_MAP.get(ancN);
+               
+               // 1. Displacement for graphics
+               final double dispX = -disp1[0] * nodeW;
+               final double dispY = -disp1[1] * nodeH;
+               
+               final double dispNX = disp2[0] * cgW;
+               final double dispNY = disp2[1] * cgH;
+               
+               // calc total and apply transform
+               double totalDispX = dispX + dispNX + p.getOffsetX();
+               double totalDispY = dispY + dispNY + p.getOffsetY();
+               
+               final AffineTransform tf = 
AffineTransform.getTranslateInstance(totalDispX, totalDispY);
+
+               return cg.transform(tf);
+       }
+}

Copied: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsTranslator.java
 (from rev 30353, 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/customgraphics/CustomGraphicsTranslator.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsTranslator.java
                             (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/CustomGraphicsTranslator.java
     2012-09-12 23:51:05 UTC (rev 30360)
@@ -0,0 +1,64 @@
+package org.cytoscape.ding.customgraphics;
+
+import java.io.IOException;
+import java.net.URL;
+
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.ding.customgraphics.NullCustomGraphics;
+import org.cytoscape.ding.customgraphics.bitmap.URLImageCustomGraphics;
+import org.cytoscape.view.vizmap.mappings.ValueTranslator;
+
+public class CustomGraphicsTranslator implements ValueTranslator<String, 
CyCustomGraphics>{
+
+       
+       private final CustomGraphicsManager cgManager;
+       
+       public CustomGraphicsTranslator(final CustomGraphicsManager cgManager) {
+               this.cgManager = cgManager;
+       }
+       
+       @Override
+       public CyCustomGraphics translate(String inputValue) {
+               return parse(inputValue);
+       }
+
+       @Override
+       public Class<CyCustomGraphics> getTranslatedValueType() {
+               return CyCustomGraphics.class;
+       }
+       
+       
+       /**
+        * Create a custom graphics from the given URL string.
+        * This code try to access the data source and download the image.
+        * 
+        * @param value String representation of image source URL.
+        * 
+        * @return Image Custom Graphics created from the source image.
+        */
+       private final CyCustomGraphics parse(String value) {
+               if(value == null)
+                       return null;
+
+               // TODO: this needs to be made generic.  If we have a URL, then 
we can
+               // hand it to the appropriate factory
+               
+               try {
+                       final URL url = new URL(value);
+                       CyCustomGraphics graphics = 
cgManager.getCustomGraphicsBySourceURL(url);
+                       if(graphics == null) {
+                               // Currently not in the Manager.  Need to 
create new instance.
+                               graphics = new 
URLImageCustomGraphics(cgManager.getNextAvailableID(), url.toString());
+                               // Use URL as display name
+                               graphics.setDisplayName(value);
+                               
+                               // Register to manager.
+                               cgManager.addCustomGraphics(graphics, url);
+                       }
+                       return graphics;
+               } catch (IOException e) {
+                       return null;                    
+               }
+       }
+}

Deleted: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DefaultCyCustomGraphicsFactory.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DefaultCyCustomGraphicsFactory.java
       2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DefaultCyCustomGraphicsFactory.java
       2012-09-12 23:51:05 UTC (rev 30360)
@@ -1,77 +0,0 @@
-package org.cytoscape.ding.customgraphics;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-
-import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
-import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
-
-public class DefaultCyCustomGraphicsFactory implements CyCustomGraphicsFactory 
{
-       
-       private final CustomGraphicsManager manager;
-       
-       public DefaultCyCustomGraphicsFactory(final CustomGraphicsManager 
manager) {
-               if(manager == null)
-                       throw new NullPointerException("CustomGraphicsManager 
is null.");
-               
-               this.manager = manager;
-       }
-
-       public CyCustomGraphics parseSerializableString(String string) {
-               return getInstance(string);
-       }
-
-       public CyCustomGraphics getInstance(String entry) {
-               // Check this is URL or not
-               if (entry == null)
-                       return null;
-
-               String[] parts = entry.split(",");
-               if (parts == null || parts.length < 3)
-                       return null;
-
-               final String className = parts[0];
-               final Long id = Long.parseLong(parts[1]);
-               final String name = parts[2];
-
-               CyCustomGraphics cg = null;
-
-               // Create new one by reflection
-               try {
-                       final Class<?> cls = Class.forName(className);
-                       final Constructor<?> ct = cls.getConstructor(Long.class,
-                                       String.class);
-                       cg = (CyCustomGraphics) ct.newInstance(id, name);
-                       cg.setDisplayName(parts[2]);
-                       manager.addCustomGraphics(cg, null);
-               } catch (ClassNotFoundException e) {
-                       e.printStackTrace();
-                       return null;
-               } catch (InstantiationException e) {
-                       e.printStackTrace();
-                       return null;
-               } catch (IllegalAccessException e) {
-                       e.printStackTrace();
-                       return null;
-               } catch (SecurityException e) {
-                       e.printStackTrace();
-                       return null;
-               } catch (NoSuchMethodException e) {
-                       e.printStackTrace();
-                       return null;
-               } catch (IllegalArgumentException e) {
-                       e.printStackTrace();
-                       return null;
-               } catch (InvocationTargetException e) {
-                       e.printStackTrace();
-                       return null;
-               }
-
-               return cg;
-       }
-
-       public Class <? extends CyCustomGraphics> getSupportedClass() {
-               return null;
-       }
-
-}

Copied: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DummyCustomGraphics.java
 (from rev 30353, 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/DummyCustomGraphics.java)
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DummyCustomGraphics.java
                          (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/DummyCustomGraphics.java
  2012-09-12 23:51:05 UTC (rev 30360)
@@ -0,0 +1,23 @@
+package org.cytoscape.ding.customgraphics;
+
+import java.awt.Image;
+
+import org.cytoscape.ding.customgraphics.AbstractDCustomGraphics;
+import org.cytoscape.ding.customgraphics.NullCustomGraphics;
+
+public final class DummyCustomGraphics extends AbstractDCustomGraphics {
+       
+       public DummyCustomGraphics(Long id, String displayName) {
+               super(id, displayName);
+       }
+
+       @Override
+       public Image getRenderedImage() {
+               return NullCustomGraphics.DEF_IMAGE;
+       }
+
+       @Override
+       public String toString() {
+               return "DummyCustomGraphics ("+id+") "+displayName;
+       }
+}

Added: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/NullCustomGraphicsFactory.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/NullCustomGraphicsFactory.java
                            (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/NullCustomGraphicsFactory.java
    2012-09-12 23:51:05 UTC (rev 30360)
@@ -0,0 +1,41 @@
+package org.cytoscape.ding.customgraphics;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.cytoscape.ding.customgraphics.bitmap.URLImageCustomGraphics;
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
+
+/**
+ * Create instance of a NullCustomGraphics
+ * 
+ */
+public class NullCustomGraphicsFactory implements CyCustomGraphicsFactory {
+
+       private static final Class<? extends CyCustomGraphics> TARGET_CLASS = 
NullCustomGraphics.class;
+       private String entry[];
+
+       private final CustomGraphicsManager manager;
+       
+       public NullCustomGraphicsFactory(final CustomGraphicsManager manager) {
+               this.manager = manager;
+       }
+       
+       /**
+        * Generate Custom Graphics object from a string.
+        */
+       public CyCustomGraphics parseSerializableString(String entryStr) {
+               return new NullCustomGraphics();
+       }
+
+       public CyCustomGraphics getInstance(String input) {
+               return new NullCustomGraphics();
+       }
+
+       public Class<? extends CyCustomGraphics> getSupportedClass() { return 
TARGET_CLASS; }
+
+}

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphics.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphics.java
        2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphics.java
        2012-09-12 23:51:05 UTC (rev 30360)
@@ -7,6 +7,7 @@
 import java.io.IOException;
 import java.net.MalformedURLException;
 import java.net.URL;
+import java.util.SortedSet;
 
 import javax.imageio.ImageIO;
 
@@ -43,7 +44,7 @@
        
        public URLImageCustomGraphics(Long id, String url) throws IOException {
                super(id, url);
-               this.tags.add(DEF_TAG);
+               tags.add(DEF_TAG);
                createImage(url);
                buildCustomGraphics(originalImage);
        }
@@ -60,7 +61,8 @@
                if (img == null)
                        throw new IllegalArgumentException("Image cannot be 
null.");
 
-               this.tags.add(DEF_TAG);
+               // System.out.println("URLImageCustomGraphics: name = "+name);
+               tags.add(DEF_TAG);
                this.originalImage = img;
                buildCustomGraphics(originalImage);
        }
@@ -145,10 +147,35 @@
        }
 
        @Override
+       public String toSerializableString() {
+               String tagStr = "";
+               // Build tags as a string
+               if (tags.size() != 0) {
+                       final StringBuilder builder = new StringBuilder();
+                       for (String tag : (SortedSet<String>)tags)
+                               builder.append(tag + LIST_DELIMITER);
+                       String temp = builder.toString();
+                       tagStr = temp.substring(0, temp.length() - 1);
+               }
+
+               String name = sourceUrl.toString();
+               if (name == null)
+                       name = displayName;
+
+               if (name.contains(",")) {
+                       // Replace delimiter
+                       name = name.replace(",", "___");
+               }
+
+               return this.getClass().getCanonicalName() + DELIMITER + 
this.getIdentifier()
+                               + DELIMITER + name + DELIMITER + tagStr;
+       }
+
+       @Override
        public String toString() {
                if (this.sourceUrl == null && displayName == null) {
                        return "Empty image";
-               } else if (this.sourceUrl != null) {
+               } else if (this.sourceUrl != null && 
!this.sourceUrl.toString().startsWith("bundle")) {
                        return "Image: "+this.sourceUrl.toString();
                } else
                        return "Image: "+displayName;

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphicsFactory.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphicsFactory.java
 2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/bitmap/URLImageCustomGraphicsFactory.java
 2012-09-12 23:51:05 UTC (rev 30360)
@@ -45,6 +45,18 @@
                }
 
                final String imageName = entry[1];
+               final String sourceURL = entry[2];
+               // Try using the URL first
+               if (sourceURL != null) {
+                       try {
+                               URL url = new URL(sourceURL);
+                               CyCustomGraphics cg = 
manager.getCustomGraphicsBySourceURL(url);
+                               cg.setDisplayName(entry[2]);
+                               return cg;
+                       } catch (Exception e) {
+                               // This just means that "sourceURL" is 
malformed.  That may be OK.
+                       }
+               }
                CyCustomGraphics cg = 
manager.getCustomGraphicsByID(Long.parseLong(imageName));
                cg.setDisplayName(entry[2]);
                return cg;
@@ -54,6 +66,7 @@
                Long id = manager.getNextAvailableID();
                URL url = null;
                CyCustomGraphics ccg = null;
+               // System.out.println("URLImageCustomGraphicsFactory: input = 
"+input);
 
                try {
                        ccg = new URLImageCustomGraphics(id, input);

Added: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientOvalFactory.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientOvalFactory.java
                           (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientOvalFactory.java
   2012-09-12 23:51:05 UTC (rev 30360)
@@ -0,0 +1,49 @@
+package org.cytoscape.ding.customgraphics.vector;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
+
+/**
+ * Create instance of a GradientOvalLayer
+ * 
+ */
+public class GradientOvalFactory implements CyCustomGraphicsFactory {
+
+       private static final Class<? extends CyCustomGraphics> TARGET_CLASS = 
GradientOvalLayer.class;
+       private String entry[];
+
+       private final CustomGraphicsManager manager;
+       
+       public GradientOvalFactory(final CustomGraphicsManager manager) {
+               this.manager = manager;
+       }
+       
+       /**
+        * Generate Custom Graphics object from a string.
+        */
+       public CyCustomGraphics parseSerializableString(String entryStr) {
+               String[] entry = entryStr.split(",");
+               if (entry == null || entry.length < 3) {
+                       return null;
+               }
+
+               if (entry[0].trim().equals(
+                               GradientOvalLayer.class.getCanonicalName()) == 
false) {
+                       return null;
+               }
+               return new GradientOvalLayer(Long.parseLong(entry[1]));
+       }
+
+       public CyCustomGraphics getInstance(String input) {
+               return new GradientOvalLayer(manager.getNextAvailableID());
+       }
+
+       public Class<? extends CyCustomGraphics> getSupportedClass() { return 
TARGET_CLASS; }
+
+}

Added: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientRoundRectangleFactory.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientRoundRectangleFactory.java
                         (rev 0)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphics/vector/GradientRoundRectangleFactory.java
 2012-09-12 23:51:05 UTC (rev 30360)
@@ -0,0 +1,49 @@
+package org.cytoscape.ding.customgraphics.vector;
+
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URL;
+
+import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
+
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
+
+/**
+ * Create instance of a GradientOvalLayer
+ * 
+ */
+public class GradientRoundRectangleFactory implements CyCustomGraphicsFactory {
+
+       private static final Class<? extends CyCustomGraphics> TARGET_CLASS = 
GradientRoundRectangleLayer.class;
+       private String entry[];
+
+       private final CustomGraphicsManager manager;
+       
+       public GradientRoundRectangleFactory(final CustomGraphicsManager 
manager) {
+               this.manager = manager;
+       }
+       
+       /**
+        * Generate Custom Graphics object from a string.
+        */
+       public CyCustomGraphics parseSerializableString(String entryStr) {
+               String[] entry = entryStr.split(",");
+               if (entry == null || entry.length < 3) {
+                       return null;
+               }
+
+               if (entry[0].trim().equals(
+                               
GradientRoundRectangleLayer.class.getCanonicalName()) == false) {
+                       return null;
+               }
+               return new 
GradientRoundRectangleLayer(Long.parseLong(entry[1]));
+       }
+
+       public CyCustomGraphics getInstance(String input) {
+               return new 
GradientRoundRectangleLayer(manager.getNextAvailableID());
+       }
+
+       public Class<? extends CyCustomGraphics> getSupportedClass() { return 
TARGET_CLASS; }
+
+}

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
        2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/CustomGraphicsManagerImpl.java
        2012-09-12 23:51:05 UTC (rev 30360)
@@ -20,6 +20,7 @@
 import org.cytoscape.application.events.CyShutdownListener;
 import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
 import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
 import org.cytoscape.ding.customgraphics.IDGenerator;
 import org.cytoscape.ding.customgraphics.NullCustomGraphics;
 import org.cytoscape.ding.impl.DGraphView;
@@ -45,7 +46,7 @@
        private static final String IMAGE_DIR_NAME = "images3";
        private static final String APP_NAME = 
"org.cytoscape.ding.customgraphicsmgr";
 
-       protected final Map<Long, CyCustomGraphics> graphicsMap = new 
ConcurrentHashMap<Long, CyCustomGraphics>();
+       private final Map<Long, CyCustomGraphics> graphicsMap = new 
ConcurrentHashMap<Long, CyCustomGraphics>();
 
        // URL to hash code map. For images associated with URL.
        protected final Map<URL, Long> sourceMap = new ConcurrentHashMap<URL, 
Long>();
@@ -54,27 +55,35 @@
        private static final CyCustomGraphics NULL = 
NullCustomGraphics.getNullObject();
 
        private final File imageHomeDirectory;
-       protected final Map<CyCustomGraphics, Boolean> isUsedCustomGraphics;
+       private final Map<CyCustomGraphics, Boolean> isUsedCustomGraphics;
+       private final Map<String, CyCustomGraphicsFactory> factoryMap;
        private final DialogTaskManager taskManager;
 
        private final CyEventHelper eventHelper;
 
        private final VisualMappingManager vmm;
        private final CyApplicationManager applicationManager;
+       private static CustomGraphicsManagerImpl instance = null;
 
        /**
         * Creates an image pool object and restore existing images from user
         * resource directory.
         */
-       public CustomGraphicsManagerImpl(final CyProperty<Properties> 
properties, final DialogTaskManager taskManager,
-                       final CyApplicationConfiguration config, final 
CyEventHelper eventHelper, final VisualMappingManager vmm,
-                       final CyApplicationManager applicationManager, final 
Set<URL> defaultImageURLs) {
+       public CustomGraphicsManagerImpl(final CyProperty<Properties> 
properties, 
+                                        final DialogTaskManager taskManager, 
+                                        final CyApplicationConfiguration 
config, 
+                                        final CyEventHelper eventHelper, 
+                                        final VisualMappingManager vmm, 
+                                        final CyApplicationManager 
applicationManager, 
+                                        final Set<URL> defaultImageURLs) {
 
                this.taskManager = taskManager;
                this.eventHelper = eventHelper;
                this.vmm = vmm;
                this.applicationManager = applicationManager;
                this.isUsedCustomGraphics = new HashMap<CyCustomGraphics, 
Boolean>();
+               this.factoryMap = new HashMap<String, 
CyCustomGraphicsFactory>();
+               // Add build-in factories?
 
                if (properties == null)
                        throw new NullPointerException("Property object is 
null.");
@@ -92,11 +101,41 @@
                this.isUsedCustomGraphics.put(NULL, false);
 
                // Restore Custom Graphics from the directory.
-               final RestoreImageTaskFactory taskFactory = new 
RestoreImageTaskFactory(defaultImageURLs, imageHomeDirectory, this, eventHelper,
-                               vmm, applicationManager);
+               final RestoreImageTaskFactory taskFactory = 
+                                new RestoreImageTaskFactory(defaultImageURLs, 
imageHomeDirectory, this, eventHelper,
+                                                            vmm, 
applicationManager);
                taskManager.execute(taskFactory.createTaskIterator());
+               instance = this;
        }
 
+       public static CustomGraphicsManagerImpl getInstance() { return 
instance; }
+
+       public void addCustomGraphicsFactory(CyCustomGraphicsFactory factory) {
+               if (factory == null) return;
+               factoryMap.put(factory.getSupportedClass().getName(), factory);
+       }
+
+       public void removeCustomGraphicsFactory(CyCustomGraphicsFactory 
factory) {
+               if (factory == null) return;
+               factoryMap.remove(factory.getSupportedClass());
+       }
+
+       public CyCustomGraphicsFactory getCustomGraphicsFactory(Class<? extends 
CyCustomGraphics> cls) {
+               if (factoryMap.containsKey(cls.getName()))
+                       return factoryMap.get(cls.getName());
+               return null;
+       }
+
+       public CyCustomGraphicsFactory getCustomGraphicsFactory(String 
className) {
+               if (factoryMap.containsKey(className))
+                       return factoryMap.get(className);
+               return null;
+       }
+
+       public Collection<CyCustomGraphicsFactory> 
getAllCustomGraphicsFactories() {
+               return factoryMap.values();
+       }
+
        /**
         * Add a custom graphics to current session.
         * 
@@ -205,7 +244,7 @@
                // This means all CyCustomGraphics implementations should have 
a special
                // toString method.
                for (final CyCustomGraphics graphics : graphicsMap.values())
-                       props.setProperty(graphics.getIdentifier().toString(), 
graphics.toString());
+                       props.setProperty(graphics.getIdentifier().toString(), 
graphics.toSerializableString());
                graphicsMap.put(NULL.getIdentifier(), NULL);
                return props;
        }

Deleted: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ReplaceDummyGraphicsTask.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ReplaceDummyGraphicsTask.java
 2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/ReplaceDummyGraphicsTask.java
 2012-09-12 23:51:05 UTC (rev 30360)
@@ -1,68 +0,0 @@
-package org.cytoscape.ding.customgraphicsmgr.internal;
-
-import java.util.Set;
-
-import org.cytoscape.application.CyApplicationManager;
-import org.cytoscape.ding.DVisualLexicon;
-import org.cytoscape.ding.DummyCustomGraphics;
-import org.cytoscape.ding.customgraphics.CustomGraphicsManager;
-import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
-import org.cytoscape.ding.customgraphics.NullCustomGraphics;
-import org.cytoscape.view.model.CyNetworkView;
-import org.cytoscape.view.model.VisualProperty;
-import org.cytoscape.view.vizmap.VisualMappingManager;
-import org.cytoscape.view.vizmap.VisualStyle;
-import org.cytoscape.work.Task;
-import org.cytoscape.work.TaskMonitor;
-
-public class ReplaceDummyGraphicsTask implements Task {
-
-       private final VisualMappingManager vmm;
-       private final CustomGraphicsManager customGraphicsManager;
-
-       private final CyApplicationManager applicationManager;
-
-       public ReplaceDummyGraphicsTask(final VisualMappingManager vmm, final 
CustomGraphicsManager customGraphicsManager,
-                       final CyApplicationManager applicationManager) {
-               this.customGraphicsManager = customGraphicsManager;
-               this.vmm = vmm;
-               this.applicationManager = applicationManager;
-       }
-
-       @Override
-       public void run(TaskMonitor taskMonitor) throws Exception {
-               final Set<VisualStyle> visualStyles = vmm.getAllVisualStyles();
-
-               final Set<VisualProperty<CyCustomGraphics>> cgVisualProps = 
DVisualLexicon.getCustomGraphicsVisualProperties();
-
-               for (final VisualStyle style : visualStyles) {
-
-                       for (final VisualProperty<CyCustomGraphics> vp : 
cgVisualProps) {
-                               // Step 1: Replace all default values.
-                               final CyCustomGraphics defValue = 
style.getDefaultValue(vp);
-                               if (defValue instanceof DummyCustomGraphics) {
-                                       DummyCustomGraphics dummy = 
(DummyCustomGraphics) defValue;
-                                       Long dummyID = dummy.getIdentifier();
-                                       CyCustomGraphics replacement = 
customGraphicsManager.getCustomGraphicsByID(dummyID);
-                                       if (replacement == null) {
-                                               replacement = 
NullCustomGraphics.getNullObject();
-                                       }
-
-                                       // Replace it.
-                                       style.setDefaultValue(vp, replacement);
-                               }
-                       }
-               }
-               // Apply the style and Update view
-
-               final CyNetworkView currentView = 
applicationManager.getCurrentNetworkView();
-               if(currentView != null) {
-                       vmm.getVisualStyle(currentView).apply(currentView);
-                       currentView.updateView();
-               }
-       }
-
-       @Override
-       public void cancel() {}
-
-}

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
 2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTask.java
 2012-09-12 23:51:05 UTC (rev 30360)
@@ -78,7 +78,8 @@
                        DEF_VECTORS_NAMES.add(cls.getName());
        }
        
-       RestoreImageTask(final Set<URL> defaultImageURLs, final File 
imageLocaiton, final CustomGraphicsManagerImpl manager, final CyEventHelper 
eventHelper) {
+       RestoreImageTask(final Set<URL> defaultImageURLs, final File 
imageLocaiton, 
+                        final CustomGraphicsManagerImpl manager, final 
CyEventHelper eventHelper) {
                this.manager = manager;
                this.eventHelper = eventHelper;
 
@@ -117,8 +118,7 @@
                                        }
                                        
                                        if (isExist == false) {
-                                               
manager.graphicsMap.put(cg.getIdentifier(), cg);
-                                               
manager.isUsedCustomGraphics.put(cg, false);
+                                               manager.addCustomGraphics(cg, 
null);
                                        }
                                }
                        } catch (InstantiationException e) {
@@ -255,15 +255,12 @@
                                        if (cg instanceof Taggable && 
metatagMap.get(f) != null)
                                                ((Taggable) 
cg).getTags().addAll(metatagMap.get(f));
 
-                                       
manager.graphicsMap.put(cg.getIdentifier(), cg);
-                                       manager.isUsedCustomGraphics.put(cg, 
false);
-
                                        try {
                                                final URL source = new 
URL(fMap.get(f));
                                                if (source != null)
-                                                       
manager.sourceMap.put(source, cg.getIdentifier());
+                                                       
manager.addCustomGraphics(cg, source);
                                        } catch (MalformedURLException me) {
-                                               continue;
+                                               manager.addCustomGraphics(cg, 
null);
                                        }
                                }
                        } catch (IOException ioe) {
@@ -285,7 +282,7 @@
                long endTime = System.currentTimeMillis();
                double sec = (endTime - startTime) / (1000.0);
                logger.info("Image loading process finished in " + sec + " 
sec.");
-               logger.info("Currently,  " + (manager.graphicsMap.size() - 1) + 
" images are available.");
+               logger.info("Currently,  " + 
(manager.getAllCustomGraphics().size() - 1) + " images are available.");
        }
 
        @Override

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
  2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/customgraphicsmgr/internal/RestoreImageTaskFactory.java
  2012-09-12 23:51:05 UTC (rev 30360)
@@ -34,8 +34,6 @@
        public TaskIterator createTaskIterator() {
                final RestoreImageTask firstTask = new 
RestoreImageTask(defaultImageURLs, imageLocation, manager, eventHelper);
                final TaskIterator itr = new TaskIterator(firstTask);
-               
-               itr.insertTasksAfter(firstTask, new 
ReplaceDummyGraphicsTask(vmm, manager, applicationManager));
                return itr;
        }
 

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/DNodeView.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/DNodeView.java
      2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/DNodeView.java
      2012-09-12 23:51:05 UTC (rev 30360)
@@ -63,7 +63,7 @@
 import org.cytoscape.view.presentation.customgraphics.CustomGraphicLayer;
 import org.cytoscape.ding.customgraphics.NullCustomGraphics;
 import org.cytoscape.ding.customgraphics.vector.VectorCustomGraphics;
-import org.cytoscape.ding.impl.customgraphics.CustomGraphicsPositionCalculator;
+import org.cytoscape.ding.customgraphics.CustomGraphicsPositionCalculator;
 import org.cytoscape.ding.impl.visualproperty.CustomGraphicsVisualProperty;
 import org.cytoscape.ding.impl.visualproperty.ObjectPositionVisualProperty;
 import org.cytoscape.graph.render.immed.GraphGraphics;

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/visualproperty/CustomGraphicsVisualProperty.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/visualproperty/CustomGraphicsVisualProperty.java
    2012-09-12 23:26:21 UTC (rev 30359)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/main/java/org/cytoscape/ding/impl/visualproperty/CustomGraphicsVisualProperty.java
    2012-09-12 23:51:05 UTC (rev 30360)
@@ -1,17 +1,20 @@
 package org.cytoscape.ding.impl.visualproperty;
 
-import org.cytoscape.ding.DummyCustomGraphics;
 import org.cytoscape.ding.customgraphics.CustomGraphicsRange;
+import org.cytoscape.ding.customgraphics.DummyCustomGraphics;
+import org.cytoscape.ding.customgraphicsmgr.internal.CustomGraphicsManagerImpl;
 import org.cytoscape.view.presentation.customgraphics.CyCustomGraphics;
+import org.cytoscape.view.presentation.customgraphics.CyCustomGraphicsFactory;
 import org.cytoscape.view.presentation.customgraphics.CustomGraphicLayer;
 import org.cytoscape.ding.customgraphics.NullCustomGraphics;
 import org.cytoscape.model.CyIdentifiable;
 import org.cytoscape.view.model.AbstractVisualProperty;
 
 public class CustomGraphicsVisualProperty extends 
AbstractVisualProperty<CyCustomGraphics> {
-
        public CustomGraphicsVisualProperty(final 
CyCustomGraphics<CustomGraphicLayer> defaultValue,
-                       final CustomGraphicsRange customGraphicsRange, String 
id, String displayName, Class<? extends CyIdentifiable> targetObjectDataType) {
+                                                       final 
CustomGraphicsRange customGraphicsRange, 
+                                           String id, String displayName, 
+                                           Class<? extends CyIdentifiable> 
targetObjectDataType) {
                super(defaultValue, customGraphicsRange, id, displayName, 
targetObjectDataType);
        }
 
@@ -20,14 +23,29 @@
                return value.toSerializableString();
        }
 
+       // Parse the string associated with our visual property.  Note that we 
depend on the first
+       // part of the string being the class name that was registered with the 
CustomGraphicsManager
        @Override
        public CyCustomGraphics<CustomGraphicLayer> 
parseSerializableString(String value) {
+               // This is hokey, but we've got no other way to get our hands 
on the
+               // CustomGraphicsManager since the DVisualLexicon is created 
statically
+               CustomGraphicsManagerImpl cgMgr = 
CustomGraphicsManagerImpl.getInstance();
                // Return dummy if something is assigned.  This should be 
replaced after loading session.
+               // System.out.println("CustomGraphicsVisualProperty: value = 
"+value);
                if(NullCustomGraphics.getNullObject().toString().equals(value) 
|| value.contains("NullCustomGraphics")) {
+                       // System.out.println("CustomGraphicsVisualProperty: 
returning NullCustomGraphics");
                        return NullCustomGraphics.getNullObject();
                } else {
                        final String[] parts = value.split(",");
-                       return new 
DummyCustomGraphics(Long.parseLong(parts[1]), parts[2]);
+                       // System.out.println("Getting factory for "+parts[0]);
+                       CyCustomGraphicsFactory factory = 
cgMgr.getCustomGraphicsFactory(parts[0]);
+                       if (factory == null) {
+                               // System.out.println("No factory for 
"+parts[0]);
+                               return NullCustomGraphics.getNullObject();
+                       }
+
+                       // System.out.println("Creating new "+parts[0]);
+                       return factory.parseSerializableString(value);
                }
        }
 }

-- 
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.

Reply via email to