Author: kono
Date: 2009-11-23 19:44:37 -0800 (Mon, 23 Nov 2009)
New Revision: 18556
Modified:
cytoscape/trunk/src/cytoscape/util/NestedNetworkImageManager.java
Log:
Add listener to actually creates module images. Currently, image update timing
is broken, and it always displays default image.
Modified: cytoscape/trunk/src/cytoscape/util/NestedNetworkImageManager.java
===================================================================
--- cytoscape/trunk/src/cytoscape/util/NestedNetworkImageManager.java
2009-11-24 03:43:41 UTC (rev 18555)
+++ cytoscape/trunk/src/cytoscape/util/NestedNetworkImageManager.java
2009-11-24 03:44:37 UTC (rev 18556)
@@ -1,6 +1,19 @@
package cytoscape.util;
+import giny.model.GraphPerspective;
+
+import java.awt.Graphics;
+import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsDevice;
+import java.awt.GraphicsEnvironment;
+import java.awt.HeadlessException;
import java.awt.Image;
+import java.awt.TexturePaint;
+import java.awt.Transparency;
+import java.awt.geom.Rectangle2D;
+import java.awt.image.BufferedImage;
+import java.awt.image.ColorModel;
+import java.awt.image.PixelGrabber;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.HashMap;
@@ -11,11 +24,14 @@
import cytoscape.CyNetwork;
import cytoscape.CyNode;
import cytoscape.Cytoscape;
+import cytoscape.render.stateful.NodeDetails;
import cytoscape.view.CyNetworkView;
+import cytoscape.view.CytoscapeDesktop;
import ding.view.DGraphView;
+import ding.view.DNodeView;
-
public class NestedNetworkImageManager implements PropertyChangeListener {
+
private static final Image DEF_IMAGE;
private static final int DEF_WIDTH = 100;
@@ -29,63 +45,165 @@
networkImageGenerator = new NestedNetworkImageManager();
DEF_IMAGE = (new
ImageIcon(Cytoscape.class.getResource("/cytoscape/images/default_network.png"))).getImage();
}
-
public static NestedNetworkImageManager getNetworkImageGenerator() {
return networkImageGenerator;
}
-
private NestedNetworkImageManager() {
networkToImageMap = new HashMap<CyNetwork,
ImageAndReferenceCount>();
Cytoscape.getPropertyChangeSupport().addPropertyChangeListener(this);
+
}
-
+
public Image getImage(final CyNetwork network) {
- return networkToImageMap.get(network).getImage();
+ if (networkToImageMap.get(network) == null) {
+ return null;
+ } else {
+ return networkToImageMap.get(network).getImage();
+ }
}
-
+
public int getImageCount() {
return this.networkToImageMap.size();
}
- public void propertyChange(final PropertyChangeEvent evt) {
+ public void propertyChange(final PropertyChangeEvent evt) {
if
(evt.getPropertyName().equals(Cytoscape.NESTED_NETWORK_CREATED)) {
- final CyNetwork network = (CyNetwork)evt.getNewValue();
+ final CyNetwork network = (CyNetwork) evt.getNewValue();
if (this.networkToImageMap.containsKey(network)) {
this.networkToImageMap.get(network).incRefCount();
return;
}
-
- final CyNetworkView view =
Cytoscape.getNetworkView(network.getIdentifier());
- if (view == Cytoscape.getNullNetworkView()) {
- // View does not exist
- networkToImageMap.put(network, new
ImageAndReferenceCount(DEF_IMAGE));
- } else {
- // Create image from this view.
- final DGraphView dView = (DGraphView) view;
- networkToImageMap.put(network, new
ImageAndReferenceCount(dView.createImage(DEF_WIDTH, DEF_HEIGHT, 1.0)));
- }
-
+ updateImage(network,
Cytoscape.getNetworkView(network.getIdentifier()));
} else if
(evt.getPropertyName().equals(Cytoscape.NESTED_NETWORK_DESTROYED)) {
- final CyNetwork network = (CyNetwork)evt.getNewValue();
+ final CyNetwork network = (CyNetwork) evt.getNewValue();
final ImageAndReferenceCount imageAndRefCount =
networkToImageMap.get(network);
imageAndRefCount.decRefCount();
if (imageAndRefCount.getRefCount() == 0) {
this.networkToImageMap.remove(network);
}
+ } else
if(CytoscapeDesktop.NETWORK_VIEW_CREATED.equals(evt.getPropertyName())) {
+ //TODO: Need to sync. image update timing.
+ final CyNetworkView view =
(CyNetworkView)evt.getNewValue();
+ final CyNetwork network = view.getNetwork();
+ for(Object node: network.nodesList()) {
+ CyNode cyNode = (CyNode) node;
+ GraphPerspective nestedNetwork =
cyNode.getNestedNetwork();
+ if (nestedNetwork != null) {
+ updateImage((CyNetwork) nestedNetwork,
Cytoscape.getNetworkView(((CyNetwork)nestedNetwork).getIdentifier()));
+
+ addCustomGraphics(network,
Cytoscape.getNetworkView(network.getIdentifier()), cyNode);
+ }
+ }
}
}
-
- private void addCustomGraphics(final CyNetwork network, final CyNode
parentNode) {
+ private void updateImage(CyNetwork network, CyNetworkView view) {
+ if (view == Cytoscape.getNullNetworkView()) {
+ // View does not exist
+ System.out.println("*************View does not exist
for: " + network.getTitle() +" == " + view.getNetwork().getTitle());
+ networkToImageMap.put(network, new
ImageAndReferenceCount(DEF_IMAGE));
+ } else {
+ // Create image from this view.
+ System.out.println("*************View FOUND for: " +
network.getTitle() +" == " + view.getNetwork().getTitle());
+ final DGraphView dView = (DGraphView) view;
+ networkToImageMap.put(network, new
ImageAndReferenceCount(dView.createImage(DEF_WIDTH, DEF_HEIGHT, 1.0)));
+ }
+ }
+
+ private void addCustomGraphics(final CyNetwork network, final
CyNetworkView dView, final CyNode parentNode) {
+ System.out.println("*** Adding custom graphics: Count = " +
dView.getNodeViewCount() + " node = " + parentNode.getIdentifier());
+ Image networkImage = getImage(network);
+ BufferedImage img;
+ if (networkImage == null) {
+ img = toBufferedImage(DEF_IMAGE);
+ } else {
+ img = toBufferedImage(networkImage);
+ }
+ DNodeView nodeView =(DNodeView) dView.getNodeView(parentNode);
+ final Rectangle2D rect = new Rectangle2D.Double(-50.0, -50.0,
50.0, 50.0);
+
+ System.out.println("*** ADD CUSTOM: " + nodeView);
+ if(nodeView !=null)
+ nodeView.addCustomGraphic(rect, new TexturePaint(img, rect),
NodeDetails.ANCHOR_CENTER);
}
+ public BufferedImage toBufferedImage(Image image) {
+ if (image instanceof BufferedImage) {
+ return (BufferedImage)image;
+ }
+
+ // This code ensures that all the pixels in the image are loaded
+ image = new ImageIcon(image).getImage();
+
+ // Determine if the image has transparent pixels; for this
method's
+ // implementation, see e661 Determining If an Image Has
Transparent Pixels
+ boolean hasAlpha = hasAlpha(image);
+
+ // Create a buffered image with a format that's compatible with
the screen
+ BufferedImage bimage = null;
+ GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
+ try {
+ // Determine the type of transparency of the new buffered
image
+ int transparency = Transparency.OPAQUE;
+ if (hasAlpha) {
+ transparency = Transparency.BITMASK;
+ }
+
+ // Create the buffered image
+ GraphicsDevice gs = ge.getDefaultScreenDevice();
+ GraphicsConfiguration gc = gs.getDefaultConfiguration();
+ bimage = gc.createCompatibleImage(
+ image.getWidth(null), image.getHeight(null),
transparency);
+ } catch (HeadlessException e) {
+ // The system does not have a screen
+ }
+
+ if (bimage == null) {
+ // Create a buffered image using the default color model
+ int type = BufferedImage.TYPE_INT_RGB;
+ if (hasAlpha) {
+ type = BufferedImage.TYPE_INT_ARGB;
+ }
+ bimage = new BufferedImage(image.getWidth(null),
image.getHeight(null), type);
+ }
+
+ // Copy image to buffered image
+ Graphics g = bimage.createGraphics();
+
+ // Paint the image onto the buffered image
+ g.drawImage(image, 0, 0, null);
+ g.dispose();
+
+ return bimage;
+ }
+
+ public boolean hasAlpha(Image image) {
+ // If buffered image, the color model is readily available
+ if (image instanceof BufferedImage) {
+ BufferedImage bimage = (BufferedImage)image;
+ return bimage.getColorModel().hasAlpha();
+ }
+
+ // Use a pixel grabber to retrieve the image's color model;
+ // grabbing a single pixel is usually sufficient
+ PixelGrabber pg = new PixelGrabber(image, 0, 0, 1, 1, false);
+ try {
+ pg.grabPixels();
+ } catch (InterruptedException e) {
+ }
+
+ // Get the image's color model
+ ColorModel cm = pg.getColorModel();
+ return cm.hasAlpha();
+ }
+
static class ImageAndReferenceCount {
private Image image;
private int refCount;
--
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.