Skip to content

Commit 34d6889

Browse files
committed
Synchronize data set list with network selection.
Refs #474
1 parent 102e9ff commit 34d6889

File tree

3 files changed

+90
-22
lines changed

3 files changed

+90
-22
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/control/ControlPanelMediator.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
import org.baderlab.csplugins.enrichmentmap.task.SelectNodesEdgesTask;
7777
import org.baderlab.csplugins.enrichmentmap.task.UpdateAssociatedStyleTask;
7878
import org.baderlab.csplugins.enrichmentmap.task.postanalysis.RemoveSignatureDataSetsTask;
79+
import org.baderlab.csplugins.enrichmentmap.util.CoalesceTimer;
7980
import org.baderlab.csplugins.enrichmentmap.util.NetworkUtil;
8081
import org.baderlab.csplugins.enrichmentmap.util.TaskUtil;
8182
import org.baderlab.csplugins.enrichmentmap.view.control.ControlPanel.AbstractViewControlPanel;
@@ -106,6 +107,9 @@
106107
import org.cytoscape.model.CyNode;
107108
import org.cytoscape.model.CyRow;
108109
import org.cytoscape.model.CyTable;
110+
import org.cytoscape.model.CyTableUtil;
111+
import org.cytoscape.model.events.RowsSetEvent;
112+
import org.cytoscape.model.events.RowsSetListener;
109113
import org.cytoscape.service.util.CyServiceRegistrar;
110114
import org.cytoscape.util.swing.LookAndFeelUtil;
111115
import org.cytoscape.util.swing.TextIcon;
@@ -122,7 +126,8 @@
122126
import com.google.inject.Singleton;
123127

124128
@Singleton
125-
public class ControlPanelMediator implements SetCurrentNetworkViewListener, EnrichmentMapAddedListener, EnrichmentMapAboutToBeRemovedListener, AssociatedEnrichmentMapsChangedListener {
129+
public class ControlPanelMediator implements SetCurrentNetworkViewListener, EnrichmentMapAddedListener,
130+
EnrichmentMapAboutToBeRemovedListener, AssociatedEnrichmentMapsChangedListener, RowsSetListener {
126131

127132
@Inject private Provider<ControlPanel> controlPanelProvider;
128133
@Inject private Provider<LegendPanelMediator> legendPanelMediatorProvider;
@@ -151,6 +156,7 @@ public class ControlPanelMediator implements SetCurrentNetworkViewListener, Enri
151156

152157
private FilterMode filterMode = FilterMode.HIDE;
153158

159+
private final CoalesceTimer selectionEventTimer = new CoalesceTimer(200, 1);
154160
private Map<CyNetworkView, Timer> filterTimers = new HashMap<>();
155161

156162
private boolean firstTime = true;
@@ -369,6 +375,45 @@ public void handleEvent(SetCurrentNetworkViewEvent e) {
369375
updateLegends(viewPanel);
370376
});
371377
}
378+
379+
@Override
380+
public void handleEvent(RowsSetEvent e) {
381+
// TODO Auto-generated method stub
382+
if(e.containsColumn(CyNetwork.SELECTED)) {
383+
CyNetworkView networkView = applicationManager.getCurrentNetworkView();
384+
if(networkView != null) {
385+
CyNetwork network = networkView.getModel();
386+
// only handle event if it is a selected node
387+
if(e.getSource() == network.getDefaultEdgeTable() || e.getSource() == network.getDefaultNodeTable()) {
388+
selectionEventTimer.coalesce(() -> updateFromNodeSelection(networkView));
389+
}
390+
}
391+
}
392+
}
393+
394+
private void updateFromNodeSelection(CyNetworkView networkView) {
395+
if(networkView == null)
396+
return;
397+
398+
EnrichmentMap map = getCurrentMap();
399+
if(map == null)
400+
return;
401+
402+
EMViewControlPanel controlPanel = getControlPanel().getViewControlPanel(networkView);
403+
if(controlPanel == null)
404+
return;
405+
406+
CyNetwork network = networkView.getModel();
407+
List<CyNode> selectedNodes = CyTableUtil.getNodesInState(network, CyNetwork.SELECTED, true);
408+
List<CyEdge> selectedEdges = CyTableUtil.getEdgesInState(network, CyNetwork.SELECTED, true);
409+
410+
List<AbstractDataSet> dataSets = new ArrayList<>(map.getDataSetList());
411+
dataSets.addAll(map.getSignatureSetList());
412+
413+
dataSets = HeatMapMediator.filterDataSetsForSelection(dataSets, map, selectedNodes, selectedEdges);
414+
415+
controlPanel.getDataSetSelector().setHighlightedDataSets(dataSets);
416+
}
372417

373418
@Override
374419
public void handleEvent(EnrichmentMapAddedEvent e) {

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/control/DataSetSelector.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.awt.event.MouseEvent;
1515
import java.util.ArrayList;
1616
import java.util.Arrays;
17+
import java.util.Collection;
1718
import java.util.HashMap;
1819
import java.util.HashSet;
1920
import java.util.LinkedHashSet;
@@ -32,6 +33,7 @@
3233
import javax.swing.JScrollPane;
3334
import javax.swing.JTable;
3435
import javax.swing.JTextField;
36+
import javax.swing.ListSelectionModel;
3537
import javax.swing.UIManager;
3638
import javax.swing.border.Border;
3739
import javax.swing.border.EmptyBorder;
@@ -73,10 +75,6 @@ public class DataSetSelector extends JPanel {
7375
private JMenuItem selectNoneMenuItem;
7476
private JMenuItem selectNodesMenuItem;
7577
private JMenuItem deleteSignatureMenuItem;
76-
// private JButton addButton;
77-
// private JButton colorButton;
78-
// private JButton selectAllButton;
79-
// private JButton selectNoneButton;
8078
private JButton optionButton;
8179

8280
private final EnrichmentMap map;
@@ -152,6 +150,19 @@ public void setCheckedItems(Set<AbstractDataSet> newValue) {
152150
firePropertyChange(PROP_CHECKED_DATA_SETS, oldValue, getCheckedItems());
153151
}
154152

153+
public void setHighlightedDataSets(Collection<AbstractDataSet> dataSets) {
154+
ListSelectionModel selectionModel = getTable().getSelectionModel();
155+
selectionModel.clearSelection();
156+
157+
final int rowCount = getTable().getRowCount();
158+
for (int i = 0; i < rowCount; i++) {
159+
AbstractDataSet ds = (AbstractDataSet) getTable().getValueAt(i, NAME_COL_IDX);
160+
if(dataSets != null && dataSets.contains(ds)) {
161+
selectionModel.addSelectionInterval(i, i);
162+
}
163+
}
164+
}
165+
155166
public Set<AbstractDataSet> getSelectedItems() {
156167
Set<AbstractDataSet> set = new HashSet<>();
157168
int[] selectedRows = getTable().getSelectedRows();

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/heatmap/HeatMapMediator.java

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -336,27 +336,39 @@ private List<AbstractDataSet> getEnabledDataSets(
336336

337337
// Remove Data Sets that are not part of the selected nodes/edges
338338
if(propertyManager.isTrue(PropertyManager.HEATMAP_SELECT_SYNC)) {
339-
boolean distinctEdges = map.getParams().getCreateDistinctEdges();
339+
dataSets = filterDataSetsForSelection(dataSets, map, selectedNodes, selectedEdges);
340+
}
341+
342+
return dataSets;
343+
}
344+
345+
/**
346+
* Removes data sets from the dataSets List parameter that are not included by any of the selected nodes or edges.
347+
*/
348+
public static List<AbstractDataSet> filterDataSetsForSelection(
349+
List<AbstractDataSet> dataSets, EnrichmentMap map,
350+
Collection<CyNode> selectedNodes, Collection<CyEdge> selectedEdges
351+
) {
352+
boolean distinctEdges = map.getParams().getCreateDistinctEdges();
353+
List<AbstractDataSet> filteredDataSets = new ArrayList<>(dataSets);
354+
355+
Iterator<AbstractDataSet> iter = filteredDataSets.iterator();
356+
while(iter.hasNext()) {
357+
AbstractDataSet ds = iter.next();
358+
boolean remove = true;
359+
if(ds.containsAnyNode(selectedNodes))
360+
remove = false;
361+
else if(!distinctEdges && !selectedEdges.isEmpty())
362+
remove = false;
363+
else if(distinctEdges && ds.containsAnyEdge(selectedEdges))
364+
remove = false;
340365

341-
Iterator<AbstractDataSet> iter = dataSets.iterator();
342-
while(iter.hasNext()) {
343-
AbstractDataSet ds = iter.next();
344-
345-
boolean remove = true;
346-
if(ds.containsAnyNode(selectedNodes))
347-
remove = false;
348-
else if(!distinctEdges && !selectedEdges.isEmpty())
349-
remove = false;
350-
else if(distinctEdges && ds.containsAnyEdge(selectedEdges))
351-
remove = false;
352-
353-
if(remove) {
354-
iter.remove();
355-
}
366+
if(remove) {
367+
iter.remove();
356368
}
357369
}
358370

359-
return dataSets;
371+
return filteredDataSets;
360372
}
361373

362374

0 commit comments

Comments
 (0)