43
43
44
44
package org .baderlab .csplugins .enrichmentmap .model ;
45
45
46
- import java .beans .PropertyChangeListener ;
47
- import java .beans .PropertyChangeSupport ;
48
46
import java .util .HashMap ;
49
47
import java .util .LinkedHashMap ;
50
48
import java .util .Map ;
51
49
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 ;
52
53
import org .baderlab .csplugins .enrichmentmap .view .heatmap .HeatMapParams ;
53
54
import org .baderlab .csplugins .enrichmentmap .view .postanalysis .PADialogMediator ;
55
+ import org .cytoscape .event .CyEventHelper ;
54
56
import org .cytoscape .model .CyNetwork ;
57
+ import org .cytoscape .model .CyNetworkManager ;
55
58
import 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 ;
56
63
import org .cytoscape .view .model .CyNetworkView ;
64
+ import org .cytoscape .view .model .events .NetworkViewAddedEvent ;
65
+ import org .cytoscape .view .model .events .NetworkViewAddedListener ;
57
66
58
67
import com .google .inject .Inject ;
59
68
import com .google .inject .Provider ;
60
69
import com .google .inject .Singleton ;
61
70
62
71
63
72
@ Singleton
64
- public class EnrichmentMapManager {
73
+ public class EnrichmentMapManager implements NetworkAboutToBeDestroyedListener , NetworkViewAddedListener {
65
74
66
75
private Map <Long , EnrichmentMap > enrichmentMaps = new LinkedHashMap <>();
67
76
private Map <Long , EnrichmentMap > associatedEnrichmentMaps = new LinkedHashMap <>();
68
77
private Map <Long , HeatMapParams > heatMapParams = new HashMap <>();
69
78
private Map <Long , HeatMapParams > heatMapParamsEdges = new HashMap <>();
70
79
71
80
@ Inject private Provider <PADialogMediator > postAnalysisMediatorProvider ;
81
+
82
+ @ Inject private CyEventHelper eventHelper ;
83
+ @ Inject private CyNetworkManager networkManager ;
84
+ @ Inject private CyRootNetworkManager rootNetworkManager ;
85
+
72
86
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
+
74
120
75
121
/**
76
122
* Registers a newly created Network.
77
123
*/
78
124
public void registerEnrichmentMap (EnrichmentMap map ) {
79
- enrichmentMaps .put (map .getNetworkID (), map );
125
+ if (enrichmentMaps .containsKey (map .getNetworkID ()))
126
+ return ;
80
127
128
+ enrichmentMaps .put (map .getNetworkID (), map );
81
129
for (Long id : map .getAssociatedNetworkIDs ())
82
130
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 ));
83
135
}
84
136
137
+
85
138
public Map <Long , EnrichmentMap > getAllEnrichmentMaps () {
86
139
return new LinkedHashMap <>(enrichmentMaps );
87
140
}
88
141
142
+
89
143
public EnrichmentMap getEnrichmentMap (Long networkId ) {
90
144
EnrichmentMap map = enrichmentMaps .get (networkId );
91
-
92
145
return map != null ? map : associatedEnrichmentMaps .get (networkId );
93
146
}
94
147
148
+
95
149
public EnrichmentMap removeEnrichmentMap (Long networkId ) {
96
150
EnrichmentMap map = enrichmentMaps .remove (networkId );
97
-
98
151
if (map != null )
99
152
postAnalysisMediatorProvider .get ().removeEnrichmentMap (map );
100
153
101
154
// 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
+ }
107
158
return map ;
108
159
}
109
160
@@ -127,10 +178,9 @@ public void addAssociatedAppAttributes(CyNetwork network, EnrichmentMap map, Ass
127
178
Columns .EM_ASSOCIATED_APP .set (table .getRow (network .getSUID ()), app .name ());
128
179
129
180
// 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
+ }
134
184
}
135
185
136
186
public boolean isAssociatedEnrichmentMap (Long networkId ) {
@@ -160,27 +210,9 @@ public HeatMapParams getHeatMapParams(Long networkId, boolean edges) {
160
210
}
161
211
162
212
public void reset () {
163
- for (PropertyChangeListener listener : pcs .getPropertyChangeListeners ())
164
- pcs .removePropertyChangeListener (listener );
165
-
166
213
enrichmentMaps .clear ();
167
214
associatedEnrichmentMaps .clear ();
168
215
heatMapParams .clear ();
169
216
}
170
-
171
- public void addPropertyChangeListener (PropertyChangeListener listener ) {
172
- pcs .addPropertyChangeListener (listener );
173
- }
174
-
175
- public void removePropertyChangeListener (PropertyChangeListener listener ) {
176
- pcs .removePropertyChangeListener (listener );
177
- }
178
217
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
- }
186
218
}
0 commit comments