4343
4444package org .baderlab .csplugins .enrichmentmap .model ;
4545
46- import java .beans .PropertyChangeListener ;
47- import java .beans .PropertyChangeSupport ;
4846import java .util .HashMap ;
4947import java .util .LinkedHashMap ;
5048import java .util .Map ;
5149
50+ import org .baderlab .csplugins .enrichmentmap .model .event .AssociatedEnrichmentMapsChangedEvent ;
51+ import org .baderlab .csplugins .enrichmentmap .model .event .EnrichmentMapAddedEvent ;
52+ import org .baderlab .csplugins .enrichmentmap .model .io .ModelSerializer ;
5253import org .baderlab .csplugins .enrichmentmap .view .heatmap .HeatMapParams ;
5354import org .baderlab .csplugins .enrichmentmap .view .postanalysis .PADialogMediator ;
55+ import org .cytoscape .event .CyEventHelper ;
5456import org .cytoscape .model .CyNetwork ;
57+ import org .cytoscape .model .CyNetworkManager ;
5558import org .cytoscape .model .CyTable ;
59+ import org .cytoscape .model .events .NetworkAboutToBeDestroyedEvent ;
60+ import org .cytoscape .model .events .NetworkAboutToBeDestroyedListener ;
61+ import org .cytoscape .model .subnetwork .CyRootNetwork ;
62+ import org .cytoscape .model .subnetwork .CyRootNetworkManager ;
5663import org .cytoscape .view .model .CyNetworkView ;
64+ import org .cytoscape .view .model .events .NetworkViewAddedEvent ;
65+ import org .cytoscape .view .model .events .NetworkViewAddedListener ;
5766
5867import com .google .inject .Inject ;
5968import com .google .inject .Provider ;
6069import com .google .inject .Singleton ;
6170
6271
6372@ Singleton
64- public class EnrichmentMapManager {
73+ public class EnrichmentMapManager implements NetworkAboutToBeDestroyedListener , NetworkViewAddedListener {
6574
6675 private Map <Long , EnrichmentMap > enrichmentMaps = new LinkedHashMap <>();
6776 private Map <Long , EnrichmentMap > associatedEnrichmentMaps = new LinkedHashMap <>();
6877 private Map <Long , HeatMapParams > heatMapParams = new HashMap <>();
6978 private Map <Long , HeatMapParams > heatMapParamsEdges = new HashMap <>();
7079
7180 @ Inject private Provider <PADialogMediator > postAnalysisMediatorProvider ;
81+
82+ @ Inject private CyEventHelper eventHelper ;
83+ @ Inject private CyNetworkManager networkManager ;
84+ @ Inject private CyRootNetworkManager rootNetworkManager ;
85+
7286
73- private final PropertyChangeSupport pcs = new PropertyChangeSupport (this );
87+ /**
88+ * If the user creates a new network under the same network collection, we can just reuse the model.
89+ */
90+ @ Override
91+ public void handleEvent (NetworkViewAddedEvent e ) {
92+ if (isEnrichmentMap (e .getNetworkView ()))
93+ return ;
94+
95+ CyNetwork newNetwork = e .getNetworkView ().getModel ();
96+ CyRootNetwork newNetworkRoot = rootNetworkManager .getRootNetwork (newNetwork );
97+
98+ for (Long networkSuid : enrichmentMaps .keySet ()) {
99+ CyNetwork network = networkManager .getNetwork (networkSuid );
100+ CyRootNetwork root = rootNetworkManager .getRootNetwork (network );
101+ if (root == newNetworkRoot ) {
102+ System .out .println ("Copying EnrichmentMap model" );
103+ // newly created network is under an enrichmentmap network
104+ EnrichmentMap map = getEnrichmentMap (network .getSUID ());
105+ if (map != null ) {
106+ EnrichmentMap newMap = ModelSerializer .deepCopy (map );
107+ newMap .setNetworkID (newNetwork .getSUID ());
108+ registerEnrichmentMap (newMap );
109+ }
110+ return ;
111+ }
112+ }
113+ }
114+
115+ @ Override
116+ public void handleEvent (NetworkAboutToBeDestroyedEvent e ) {
117+ removeEnrichmentMap (e .getNetwork ().getSUID ());
118+ }
119+
74120
75121 /**
76122 * Registers a newly created Network.
77123 */
78124 public void registerEnrichmentMap (EnrichmentMap map ) {
79- enrichmentMaps .put (map .getNetworkID (), map );
125+ if (enrichmentMaps .containsKey (map .getNetworkID ()))
126+ return ;
80127
128+ enrichmentMaps .put (map .getNetworkID (), map );
81129 for (Long id : map .getAssociatedNetworkIDs ())
82130 associatedEnrichmentMaps .put (id , map );
131+
132+ // This event is reentrant (fires on the same thread that called registerEnrichmentMap). But that is safe
133+ // because the only listeners are inside this App so we can control what code is actually being run here.
134+ eventHelper .fireEvent (new EnrichmentMapAddedEvent (this , map ));
83135 }
84136
137+
85138 public Map <Long , EnrichmentMap > getAllEnrichmentMaps () {
86139 return new LinkedHashMap <>(enrichmentMaps );
87140 }
88141
142+
89143 public EnrichmentMap getEnrichmentMap (Long networkId ) {
90144 EnrichmentMap map = enrichmentMaps .get (networkId );
91-
92145 return map != null ? map : associatedEnrichmentMaps .get (networkId );
93146 }
94147
148+
95149 public EnrichmentMap removeEnrichmentMap (Long networkId ) {
96150 EnrichmentMap map = enrichmentMaps .remove (networkId );
97-
98151 if (map != null )
99152 postAnalysisMediatorProvider .get ().removeEnrichmentMap (map );
100153
101154 // Update our internal genemania map and fire an event if it changed
102- Map <Long , EnrichmentMap > oldValue = getAssociatedEnrichmentMaps ();
103-
104- if (associatedEnrichmentMaps .remove (networkId ) != null )
105- pcs .firePropertyChange ("associatedEnrichmentMaps" , oldValue , getAssociatedEnrichmentMaps ());
106-
155+ if (associatedEnrichmentMaps .remove (networkId ) != null ) {
156+ eventHelper .fireEvent (new AssociatedEnrichmentMapsChangedEvent (this , map , getAssociatedEnrichmentMaps ()));
157+ }
107158 return map ;
108159 }
109160
@@ -127,10 +178,9 @@ public void addAssociatedAppAttributes(CyNetwork network, EnrichmentMap map, Ass
127178 Columns .EM_ASSOCIATED_APP .set (table .getRow (network .getSUID ()), app .name ());
128179
129180 // Update our internal map and fire an event if it changed
130- Map <Long , EnrichmentMap > oldValue = getAssociatedEnrichmentMaps ();
131-
132- if (associatedEnrichmentMaps .put (network .getSUID (), map ) == null )
133- pcs .firePropertyChange ("associatedEnrichmentMaps" , oldValue , getAssociatedEnrichmentMaps ());
181+ if (associatedEnrichmentMaps .put (network .getSUID (), map ) == null ) {
182+ eventHelper .fireEvent (new AssociatedEnrichmentMapsChangedEvent (this , map , getAssociatedEnrichmentMaps ()));
183+ }
134184 }
135185
136186 public boolean isAssociatedEnrichmentMap (Long networkId ) {
@@ -160,27 +210,9 @@ public HeatMapParams getHeatMapParams(Long networkId, boolean edges) {
160210 }
161211
162212 public void reset () {
163- for (PropertyChangeListener listener : pcs .getPropertyChangeListeners ())
164- pcs .removePropertyChangeListener (listener );
165-
166213 enrichmentMaps .clear ();
167214 associatedEnrichmentMaps .clear ();
168215 heatMapParams .clear ();
169216 }
170-
171- public void addPropertyChangeListener (PropertyChangeListener listener ) {
172- pcs .addPropertyChangeListener (listener );
173- }
174-
175- public void removePropertyChangeListener (PropertyChangeListener listener ) {
176- pcs .removePropertyChangeListener (listener );
177- }
178217
179- public void addPropertyChangeListener (String propertyName , PropertyChangeListener listener ) {
180- pcs .addPropertyChangeListener (propertyName , listener );
181- }
182-
183- public void removePropertyChangeListener (String propertyName , PropertyChangeListener listener ) {
184- pcs .removePropertyChangeListener (propertyName , listener );
185- }
186218}
0 commit comments