Author: jm
Date: 2012-06-29 08:50:42 -0700 (Fri, 29 Jun 2012)
New Revision: 29726

Added:
   core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyDisposable.java
Modified:
   core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyNetwork.java
   
core3/api/trunk/presentation-api/src/main/java/org/cytoscape/view/presentation/RenderingEngine.java
   
core3/api/trunk/viewmodel-api/src/main/java/org/cytoscape/view/model/CyNetworkView.java
   
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetwork.java
   
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetworkView.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNetworkViewTest.java
   
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNodeViewTest.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNetworkManagerImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
   
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
   
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/CyActivator.java
   
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/RenderingEngineManagerImpl.java
   
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/BirdsEyeViewHandler.java
   
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkPanel.java
   
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkTreeNode.java
   
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkViewManager.java
   
core3/impl/trunk/viewmodel-impl/impl/src/main/java/org/cytoscape/view/model/internal/CyNetworkViewManagerImpl.java
Log:
Fixes #1165, #53, #628, #1178: Fixed leaks of CyNetwork and CyNetworkView

Added: 
core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyDisposable.java
===================================================================
--- 
core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyDisposable.java   
                            (rev 0)
+++ 
core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyDisposable.java   
    2012-06-29 15:50:42 UTC (rev 29726)
@@ -0,0 +1,41 @@
+/*
+ Copyright (c) 2008, 2010, The Cytoscape Consortium (www.cytoscape.org)
+
+ This library is free software; you can redistribute it and/or modify it
+ under the terms of the GNU Lesser General Public License as published
+ by the Free Software Foundation; either version 2.1 of the License, or
+ any later version.
+
+ This library is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY, WITHOUT EVEN THE IMPLIED WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.  The software and
+ documentation provided hereunder is on an "as is" basis, and the
+ Institute for Systems Biology and the Whitehead Institute
+ have no obligations to provide maintenance, support,
+ updates, enhancements or modifications.  In no event shall the
+ Institute for Systems Biology and the Whitehead Institute
+ be liable to any party for direct, indirect, special,
+ incidental or consequential damages, including lost profits, arising
+ out of the use of this software and its documentation, even if the
+ Institute for Systems Biology and the Whitehead Institute
+ have been advised of the possibility of such damage.  See
+ the GNU Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this library; if not, write to the Free Software Foundation,
+ Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+*/
+package org.cytoscape.model;
+
+/**
+ * An interface for objects that require an explicit clean up at the end of
+ * their lifecycle.  Users of CyDisposable objects must call dispose() when
+ * the instances are no longer required or memory/resource leaks may occur.  
+ * @CyAPI.Api.Interface
+ */
+public interface CyDisposable {
+       /**
+        * Free up any memory or resources used by this object.
+        */
+       void dispose();
+}

Modified: 
core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyNetwork.java
===================================================================
--- core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyNetwork.java  
2012-06-29 15:10:03 UTC (rev 29725)
+++ core3/api/trunk/model-api/src/main/java/org/cytoscape/model/CyNetwork.java  
2012-06-29 15:50:42 UTC (rev 29726)
@@ -39,7 +39,7 @@
  * be directed, undirected, or both.
  * @CyAPI.Api.Interface
  */
-public interface CyNetwork extends CyIdentifiable {
+public interface CyNetwork extends CyIdentifiable, CyDisposable {
        /**
         * A boolean column created by default for every CyNode or CyEdge that
         * holds the selection state of the entry. 

Modified: 
core3/api/trunk/presentation-api/src/main/java/org/cytoscape/view/presentation/RenderingEngine.java
===================================================================
--- 
core3/api/trunk/presentation-api/src/main/java/org/cytoscape/view/presentation/RenderingEngine.java
 2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/api/trunk/presentation-api/src/main/java/org/cytoscape/view/presentation/RenderingEngine.java
 2012-06-29 15:50:42 UTC (rev 29726)
@@ -7,6 +7,7 @@
 
 import javax.swing.Icon;
 
+import org.cytoscape.model.CyDisposable;
 import org.cytoscape.view.model.View;
 import org.cytoscape.view.model.VisualLexicon;
 import org.cytoscape.view.model.VisualProperty;
@@ -21,7 +22,7 @@
  *            can be anything, including {@link org.cytoscape.model.CyTable}.
  * @CyAPI.Api.Interface
  */
-public interface RenderingEngine<T> {
+public interface RenderingEngine<T> extends CyDisposable {
        
        /**
         * Returns {@linkplain View} being rendered.

Modified: 
core3/api/trunk/viewmodel-api/src/main/java/org/cytoscape/view/model/CyNetworkView.java
===================================================================
--- 
core3/api/trunk/viewmodel-api/src/main/java/org/cytoscape/view/model/CyNetworkView.java
     2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/api/trunk/viewmodel-api/src/main/java/org/cytoscape/view/model/CyNetworkView.java
     2012-06-29 15:50:42 UTC (rev 29726)
@@ -36,6 +36,7 @@
 
 import java.util.Collection;
 
+import org.cytoscape.model.CyDisposable;
 import org.cytoscape.model.CyEdge;
 import org.cytoscape.model.CyNetwork;
 import org.cytoscape.model.CyNode;
@@ -49,7 +50,7 @@
  * Consolidated data structure for graph object views.
  * @CyAPI.Api.Interface
  */
-public interface CyNetworkView extends View<CyNetwork> {
+public interface CyNetworkView extends View<CyNetwork>, CyDisposable {
 
        /**
         * Returns a View for a specified Node.

Modified: 
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetwork.java
===================================================================
--- 
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetwork.java
     2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetwork.java
     2012-06-29 15:50:42 UTC (rev 29726)
@@ -30,4 +30,5 @@
        public CyTable getTable(Class <?extends CyIdentifiable> type, String 
namespace) {return null;}
        public CyRow getRow(CyIdentifiable entry, String tableName) {return 
null;}
        public CyRow getRow(CyIdentifiable entry) {return null;}
+       public void dispose() {}
 }

Modified: 
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetworkView.java
===================================================================
--- 
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetworkView.java
 2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/command-executor-impl/src/main/java/org/cytoscape/command/internal/available/dummies/DummyNetworkView.java
 2012-06-29 15:50:42 UTC (rev 29726)
@@ -25,4 +25,5 @@
        public void clearValueLock(VisualProperty<?> vp) {}
        public CyNetwork getModel() { return null;}
        public Long getSUID() { return null;}
+       public void dispose() {}
 }

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNetworkViewTest.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNetworkViewTest.java
    2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNetworkViewTest.java
    2012-06-29 15:50:42 UTC (rev 29726)
@@ -16,6 +16,7 @@
 import org.cytoscape.model.NetworkTestSupport;
 import org.cytoscape.model.TableTestSupport;
 import org.cytoscape.model.subnetwork.CyRootNetworkManager;
+import org.cytoscape.service.util.CyServiceRegistrar;
 import org.cytoscape.spacial.SpacialIndex2DFactory;
 import org.cytoscape.spacial.internal.rtree.RTreeFactory;
 import org.cytoscape.task.EdgeViewTaskFactory;
@@ -73,6 +74,8 @@
        @Mock
        private HandleFactory handleFactory;
 
+       @Mock
+       private CyServiceRegistrar registrar;
        
        private final TableTestSupport tableSupport = new TableTestSupport();
        private final NetworkTestSupport netSupport = new NetworkTestSupport();
@@ -91,7 +94,7 @@
                                vtfl,
                                /*nodeViewTFs, edgeViewTFs, emptySpaceTFs, 
dropNodeViewTFs, 
                                dropEmptySpaceTFs, */
-                               manager, eventHelper, tableMgr,annMgr, 
dingGRaphLOD, vmm, netViewMgr, handleFactory);
+                               manager, eventHelper, tableMgr,annMgr, 
dingGRaphLOD, vmm, netViewMgr, handleFactory, registrar);
        }
        
        @Override

Modified: 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNodeViewTest.java
===================================================================
--- 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNodeViewTest.java
       2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/ding-impl/ding-presentation-impl/src/test/java/org/cytoscape/view/DNodeViewTest.java
       2012-06-29 15:50:42 UTC (rev 29726)
@@ -31,6 +31,7 @@
 import org.cytoscape.model.NetworkTestSupport;
 import org.cytoscape.model.TableTestSupport;
 import org.cytoscape.model.subnetwork.CyRootNetworkManager;
+import org.cytoscape.service.util.CyServiceRegistrar;
 import org.cytoscape.spacial.SpacialIndex2DFactory;
 import org.cytoscape.spacial.internal.rtree.RTreeFactory;
 import org.cytoscape.task.EdgeViewTaskFactory;
@@ -96,6 +97,9 @@
        private VisualMappingManager vmm;
        
        @Mock
+       private CyServiceRegistrar registrar;
+       
+       @Mock
        private HandleFactory handleFactory;
        
        private final TableTestSupport tableSupport = new TableTestSupport();
@@ -127,7 +131,7 @@
                networkView = new DGraphView(network, dataFactory, cyRoot, 
undo, spacialFactory, lexicon,
                                vtfl,
                                /*nodeViewTFs, edgeViewTFs, emptySpaceTFs, 
dropNodeViewTFs, 
-                               dropEmptySpaceTFs,*/ manager, eventHelper, 
tableMgr, annMgr, dingGraphLOD, vmm, netViewMgr, handleFactory);
+                               dropEmptySpaceTFs,*/ manager, eventHelper, 
tableMgr, annMgr, dingGraphLOD, vmm, netViewMgr, handleFactory, registrar);
                
                dnv1 = (DNodeView) networkView.getDNodeView(node1);
                dnv2 = (DNodeView) networkView.getDNodeView(node2);

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNetworkManagerImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNetworkManagerImpl.java
       2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyNetworkManagerImpl.java
       2012-06-29 15:50:42 UTC (rev 29726)
@@ -116,8 +116,8 @@
                        if (subNetwork != baseNetwork)
                                rootNetwork.removeSubNetwork(subNetwork);
                        
-                       if (rootNetwork instanceof CyRootNetworkImpl && 
!hasRegisteredNetworks(rootNetwork))
-                               ((CyRootNetworkImpl) rootNetwork).dispose();
+                       if (!hasRegisteredNetworks(rootNetwork))
+                               rootNetwork.dispose();
                }
                
            // TODO: remove tables!!

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
  2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CyRootNetworkImpl.java
  2012-06-29 15:50:42 UTC (rev 29726)
@@ -123,6 +123,7 @@
                registerAllTables(networkTableMgr.getTables(this, 
CyEdge.class).values());
        }
 
+       @Override
        public void dispose() {
                serviceRegistrar.unregisterAllServices(columnAdder);
                serviceRegistrar.unregisterAllServices(nameSetListener);

Modified: 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
===================================================================
--- 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
   2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/model-impl/impl/src/main/java/org/cytoscape/model/internal/CySubNetworkImpl.java
   2012-06-29 15:50:42 UTC (rev 29726)
@@ -299,4 +299,8 @@
        public String toString() {
                return "CyNetwork: " + getSUID() + " name: " + 
getRow(this).get("name", String.class); 
        }
+       
+       @Override
+       public void dispose() {
+       }
 }

Modified: 
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/CyActivator.java
===================================================================
--- 
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/CyActivator.java
  2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/CyActivator.java
  2012-06-29 15:50:42 UTC (rev 29726)
@@ -20,7 +20,7 @@
 
                Properties renderingEngineManagerProps = new Properties();
                renderingEngineManagerProps.setProperty("service.type", 
"manager");
-               registerService(bc, renderingEngineManager, 
RenderingEngineManager.class, renderingEngineManagerProps);
+               registerAllServices(bc, renderingEngineManager, 
renderingEngineManagerProps);
 
                registerServiceListener(bc, renderingEngineManager, 
"addRenderingEngineFactory",
                                "removeRenderingEngineFactory", 
RenderingEngineFactory.class);

Modified: 
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/RenderingEngineManagerImpl.java
===================================================================
--- 
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/RenderingEngineManagerImpl.java
   2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/presentation-impl/src/main/java/org/cytoscape/view/presentation/internal/RenderingEngineManagerImpl.java
   2012-06-29 15:50:42 UTC (rev 29726)
@@ -92,6 +92,8 @@
                final View<?> viewModel = renderingEngine.getViewModel();
                final Collection<RenderingEngine<?>> currentEngines = 
renderingEngineMap.get(viewModel);
                currentEngines.remove(renderingEngine);
+               
+               renderingEngine.dispose();
        }
        
 
@@ -141,6 +143,10 @@
 
        @Override
        public void handleEvent(NetworkViewAboutToBeDestroyedEvent e) {
-               renderingEngineMap.remove(e.getNetworkView());
+               Collection<RenderingEngine<?>> engines = 
renderingEngineMap.remove(e.getNetworkView());
+               if (engines == null)
+                       return;
+               for (RenderingEngine<?> engine : engines)
+                       engine.dispose();
        }
 }

Modified: 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/BirdsEyeViewHandler.java
===================================================================
--- 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/BirdsEyeViewHandler.java
  2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/BirdsEyeViewHandler.java
  2012-06-29 15:50:42 UTC (rev 29726)
@@ -179,7 +179,9 @@
 
                for (CyNetworkView view : toBeRemoved) {
                        presentationMap.remove(view);
-                       viewToEngineMap.remove(view);
+                       RenderingEngine<?> engine = 
viewToEngineMap.remove(view);
+                       if (engine != null)
+                               engine.dispose();
                }
 
                toBeRemoved.clear();

Modified: 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkPanel.java
===================================================================
--- 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkPanel.java
 2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkPanel.java
 2012-06-29 15:50:42 UTC (rev 29726)
@@ -331,10 +331,13 @@
         * @param networkId
         */
        private void removeNetwork(final CyNetwork network) {
-               final NetworkTreeNode node = this.network2nodeMap.get(network);
+               final NetworkTreeNode node = 
this.network2nodeMap.remove(network);
+               
                if (node == null)
                        return;
 
+               treeNodeMap.values().remove(node);
+               
                final Enumeration<?> children = node.children();
                if (children.hasMoreElements()) {
                        final List<NetworkTreeNode> removedChildren = new 
ArrayList<NetworkTreeNode>();
@@ -355,7 +358,7 @@
                        // Remove from root node
                        parentNode.removeFromParent();
                }
-
+               
                treeTable.getTree().updateUI();
                treeTable.repaint();
        }

Modified: 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkTreeNode.java
===================================================================
--- 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkTreeNode.java
      2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkTreeNode.java
      2012-06-29 15:50:42 UTC (rev 29726)
@@ -1,6 +1,8 @@
 package org.cytoscape.internal.view;
 
 import java.awt.Color;
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
 
 import javax.swing.tree.DefaultMutableTreeNode;
 
@@ -15,17 +17,17 @@
        private final static long serialVersionUID = 1213748836736485L;
        private static final Color DEF_NODE_COLOR = Color.RED;
 
-       private final CyNetwork network;
+       private final Reference<CyNetwork> network;
        private Color nodeColor;
 
        NetworkTreeNode(final Object userobj, final CyNetwork network) {
                super(userobj.toString());
-               this.network = network;
+               this.network = new WeakReference<CyNetwork>(network);
                this.nodeColor = DEF_NODE_COLOR;
        }
 
        CyNetwork getNetwork() {
-               return network;
+               return network.get();
        }
 
        Color getNodeColor() {

Modified: 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkViewManager.java
===================================================================
--- 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkViewManager.java
   2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/swing-application-impl/src/main/java/org/cytoscape/internal/view/NetworkViewManager.java
   2012-06-29 15:50:42 UTC (rev 29726)
@@ -38,6 +38,7 @@
 
 import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.KeyboardFocusManager;
 import java.awt.Point;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -53,6 +54,7 @@
 import javax.swing.SwingUtilities;
 import javax.swing.event.InternalFrameAdapter;
 import javax.swing.event.InternalFrameEvent;
+import javax.swing.event.InternalFrameListener;
 
 import org.cytoscape.application.CyApplicationManager;
 import org.cytoscape.application.events.SetCurrentNetworkEvent;
@@ -106,6 +108,7 @@
        private final Map<CyNetworkView, RenderingEngine<CyNetwork>> 
presentationMap;
 
        private final Map<JInternalFrame, CyNetworkView> iFrameMap;
+       private final Map<JInternalFrame, InternalFrameListener> frameListeners;
        private final Properties props;
 
        // Supports multiple presentations
@@ -151,6 +154,7 @@
                presentationContainerMap = new WeakHashMap<CyNetworkView, 
JInternalFrame>();
                presentationMap = new WeakHashMap<CyNetworkView, 
RenderingEngine<CyNetwork>>();
                iFrameMap = new WeakHashMap<JInternalFrame, CyNetworkView>();
+               frameListeners = new HashMap<JInternalFrame, 
InternalFrameListener>();
        }
 
        /**
@@ -317,6 +321,16 @@
                                logger.debug("Removing rendering engine: " + 
removed);
                                removed = null;
                                iFrameMap.remove(frame);
+                               
+                               
frame.getRootPane().getLayeredPane().removeAll();
+                               
frame.getRootPane().getContentPane().removeAll();
+                               frame.setClosed(true);
+                               
+                               frame.removeInternalFrameListener(this);
+                               InternalFrameListener frameListener = 
frameListeners.remove(frame);
+                               if (frameListener != null)
+                                       
frame.removeInternalFrameListener(frameListener);
+                               
                                frame.dispose();
                                frame = null;
                        }
@@ -353,20 +367,19 @@
                        }
                });
 
-               iframe.addInternalFrameListener(new InternalFrameAdapter() {
+               final InternalFrameAdapter frameListener = new 
InternalFrameAdapter() {
                        public void internalFrameClosing(InternalFrameEvent e) {
-                               netViewMgr.destroyNetworkView(view);
+                               if 
(netViewMgr.getNetworkViewSet().contains(view))
+                                       netViewMgr.destroyNetworkView(view);
 
-                               Component[] components = iframe.getComponents();
-                               for (Component cp : components) {
-                                       logger.debug("Removing: " + cp);
-                                       cp = null;
-                               }
-                               components = null;
-
+                               // See bug #1178 (item #3)
+                               
KeyboardFocusManager.getCurrentKeyboardFocusManager().clearGlobalFocusOwner();
                        }
-               });
+               };
                
+               iframe.addInternalFrameListener(frameListener);
+               frameListeners.put(iframe, frameListener);
+               
                desktopPane.add(iframe);
                
                synchronized (presentationContainerMap) {

Modified: 
core3/impl/trunk/viewmodel-impl/impl/src/main/java/org/cytoscape/view/model/internal/CyNetworkViewManagerImpl.java
===================================================================
--- 
core3/impl/trunk/viewmodel-impl/impl/src/main/java/org/cytoscape/view/model/internal/CyNetworkViewManagerImpl.java
  2012-06-29 15:10:03 UTC (rev 29725)
+++ 
core3/impl/trunk/viewmodel-impl/impl/src/main/java/org/cytoscape/view/model/internal/CyNetworkViewManagerImpl.java
  2012-06-29 15:50:42 UTC (rev 29726)
@@ -140,6 +140,8 @@
                        views.remove(view);
                        networkViewMap.put(network, views);
                }
+               
+               view.dispose();
 
                cyEventHelper.fireEvent(new NetworkViewDestroyedEvent(this));
                view = null;

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