|
18 | 18 | import java.util.HashSet;
|
19 | 19 | import java.util.List;
|
20 | 20 | import java.util.Map;
|
| 21 | +import java.util.Optional; |
21 | 22 | import java.util.Properties;
|
22 | 23 | import java.util.Set;
|
23 | 24 | import java.util.concurrent.ForkJoinPool;
|
|
36 | 37 | import org.baderlab.csplugins.enrichmentmap.model.AbstractDataSet;
|
37 | 38 | import org.baderlab.csplugins.enrichmentmap.model.EMCreationParameters;
|
38 | 39 | import org.baderlab.csplugins.enrichmentmap.model.EMDataSet;
|
| 40 | +import org.baderlab.csplugins.enrichmentmap.model.EMDataSet.Method; |
39 | 41 | import org.baderlab.csplugins.enrichmentmap.model.EMSignatureDataSet;
|
40 | 42 | import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMap;
|
41 | 43 | import org.baderlab.csplugins.enrichmentmap.model.EnrichmentMapManager;
|
@@ -361,187 +363,223 @@ public void handleEvent(NetworkViewAboutToBeDestroyedEvent e) {
|
361 | 363 |
|
362 | 364 | private void setCurrentNetworkView(CyNetworkView netView) {
|
363 | 365 | invokeOnEDT(() -> {
|
| 366 | + EMViewControlPanel viewPanel = null; |
364 | 367 | updating = true;
|
365 | 368 |
|
366 | 369 | try {
|
367 | 370 | if (netView != null && !getControlPanel().contains(netView))
|
368 |
| - addNetworkView(netView); |
| 371 | + viewPanel = addNetworkView(netView); |
369 | 372 |
|
370 | 373 | getControlPanel().update(netView);
|
371 | 374 | } finally {
|
372 | 375 | updating = false;
|
373 | 376 | }
|
| 377 | + |
| 378 | + if (viewPanel != null) |
| 379 | + setDefaults(viewPanel, emManager.getEnrichmentMap(netView.getModel().getSUID())); |
374 | 380 | });
|
375 | 381 | }
|
376 | 382 |
|
| 383 | + /** |
| 384 | + * Call this method on the EDT only! |
| 385 | + */ |
| 386 | + private EMViewControlPanel addNetworkView(CyNetworkView netView) { |
| 387 | + EMViewControlPanel viewPanel = null; |
| 388 | + EnrichmentMap map = emManager.getEnrichmentMap(netView.getModel().getSUID()); |
| 389 | + |
| 390 | + // Is the new view an EnrichmentMap one? |
| 391 | + if (map != null) { |
| 392 | + viewPanel = getControlPanel().addEnrichmentMapView(netView); |
| 393 | + |
| 394 | + if (viewPanel != null) |
| 395 | + addListeners(viewPanel, map); |
| 396 | + } |
| 397 | + |
| 398 | + return viewPanel; |
| 399 | + } |
| 400 | + |
| 401 | + /** |
| 402 | + * Add listeners to the new panel's fields. |
| 403 | + */ |
377 | 404 | @SuppressWarnings("unchecked")
|
378 |
| - private void addNetworkView(CyNetworkView netView) { |
379 |
| - invokeOnEDT(() -> { |
380 |
| - EnrichmentMap map = emManager.getEnrichmentMap(netView.getModel().getSUID()); |
| 405 | + private void addListeners(EMViewControlPanel viewPanel, EnrichmentMap map) { |
| 406 | + CyNetworkView netView = viewPanel.getNetworkView(); |
| 407 | + |
| 408 | + viewPanel.getQValueRadio().addActionListener(evt -> { |
| 409 | + viewPanel.updateFilterPanel(); |
381 | 410 |
|
382 |
| - // Is the new view an EnrichmentMap one? |
383 |
| - if (map != null) { |
384 |
| - EMViewControlPanel viewPanel = getControlPanel().addEnrichmentMapView(netView); |
385 |
| - |
386 |
| - if (viewPanel != null) { |
387 |
| - // Add listeners to the new panel's fields |
388 |
| - viewPanel.getQValueRadio().addActionListener(evt -> { |
389 |
| - viewPanel.updateFilterPanel(); |
390 |
| - |
391 |
| - if (!updating) |
392 |
| - filterNodesAndEdges(viewPanel, map); |
393 |
| - }); |
394 |
| - viewPanel.getPValueRadio().addActionListener(evt -> { |
395 |
| - viewPanel.updateFilterPanel(); |
396 |
| - |
397 |
| - if (!updating) |
398 |
| - filterNodesAndEdges(viewPanel, map); |
399 |
| - }); |
400 |
| - |
401 |
| - SliderBarPanel pvSliderPanel = viewPanel.getPValueSliderPanel(); |
402 |
| - SliderBarPanel qvSliderPanel = viewPanel.getQValueSliderPanel(); |
403 |
| - SliderBarPanel sSliderPanel = viewPanel.getSimilaritySliderPanel(); |
404 |
| - |
405 |
| - if (pvSliderPanel != null) |
406 |
| - pvSliderPanel.addChangeListener(evt -> { |
407 |
| - if (!updating) |
408 |
| - filterNodesAndEdges(viewPanel, map); |
409 |
| - }); |
410 |
| - if (qvSliderPanel != null) |
411 |
| - qvSliderPanel.addChangeListener(evt -> { |
412 |
| - if (!updating) |
413 |
| - filterNodesAndEdges(viewPanel, map); |
414 |
| - }); |
415 |
| - if (sSliderPanel != null) |
416 |
| - sSliderPanel.addChangeListener(evt -> { |
417 |
| - if (!updating) |
418 |
| - filterNodesAndEdges(viewPanel, map); |
419 |
| - }); |
| 411 | + if (!updating) |
| 412 | + filterNodesAndEdges(viewPanel, map); |
| 413 | + }); |
| 414 | + viewPanel.getPValueRadio().addActionListener(evt -> { |
| 415 | + viewPanel.updateFilterPanel(); |
| 416 | + |
| 417 | + if (!updating) |
| 418 | + filterNodesAndEdges(viewPanel, map); |
| 419 | + }); |
| 420 | + |
| 421 | + SliderBarPanel pvSliderPanel = viewPanel.getPValueSliderPanel(); |
| 422 | + SliderBarPanel qvSliderPanel = viewPanel.getQValueSliderPanel(); |
| 423 | + SliderBarPanel sSliderPanel = viewPanel.getSimilaritySliderPanel(); |
| 424 | + |
| 425 | + if (pvSliderPanel != null) |
| 426 | + pvSliderPanel.addChangeListener(evt -> { |
| 427 | + if (!updating) |
| 428 | + filterNodesAndEdges(viewPanel, map); |
| 429 | + }); |
| 430 | + if (qvSliderPanel != null) |
| 431 | + qvSliderPanel.addChangeListener(evt -> { |
| 432 | + if (!updating) |
| 433 | + filterNodesAndEdges(viewPanel, map); |
| 434 | + }); |
| 435 | + if (sSliderPanel != null) |
| 436 | + sSliderPanel.addChangeListener(evt -> { |
| 437 | + if (!updating) |
| 438 | + filterNodesAndEdges(viewPanel, map); |
| 439 | + }); |
420 | 440 |
|
421 |
| - viewPanel.getDataSetSelector().addPropertyChangeListener("checkedData", evt -> { |
422 |
| - if (!updating) { |
423 |
| - viewPanel.updateChartDataCombo(); |
424 |
| - |
425 |
| - filterNodesAndEdges(viewPanel, map); |
426 |
| - ChartData data = (ChartData) viewPanel.getChartDataCombo().getSelectedItem(); |
427 |
| - |
428 |
| - Set<EMDataSet> oldDataSets = filterDataSets( |
429 |
| - (Collection<AbstractDataSet>) evt.getOldValue()); |
430 |
| - Set<EMDataSet> newDataSets = filterDataSets( |
431 |
| - (Collection<AbstractDataSet>) evt.getNewValue()); |
432 |
| - int oldSize = oldDataSets.size(); |
433 |
| - int newSize = newDataSets.size(); |
434 |
| - |
435 |
| - // Cases where changing the number of checked datasets (Signatures excluded) |
436 |
| - // requires the style to be updated: |
437 |
| - // a) Chart data may change: |
438 |
| - boolean updateStyle = data != null && data != ChartData.NONE && oldSize != newSize; |
439 |
| - // b) Node color/shape may change: |
440 |
| - updateStyle = updateStyle || oldSize == 0 && newSize > 0; |
441 |
| - updateStyle = updateStyle || oldSize > 0 && newSize == 0; |
442 |
| - updateStyle = updateStyle || oldSize == 1 && newSize > 1; |
443 |
| - updateStyle = updateStyle || oldSize > 1 && newSize == 1; |
| 441 | + viewPanel.getDataSetSelector().addPropertyChangeListener("checkedData", evt -> { |
| 442 | + if (!updating) { |
| 443 | + viewPanel.updateChartDataCombo(); |
| 444 | + |
| 445 | + filterNodesAndEdges(viewPanel, map); |
| 446 | + ChartData data = (ChartData) viewPanel.getChartDataCombo().getSelectedItem(); |
| 447 | + |
| 448 | + Set<EMDataSet> oldDataSets = filterDataSets((Collection<AbstractDataSet>) evt.getOldValue()); |
| 449 | + Set<EMDataSet> newDataSets = filterDataSets((Collection<AbstractDataSet>) evt.getNewValue()); |
| 450 | + int oldSize = oldDataSets.size(); |
| 451 | + int newSize = newDataSets.size(); |
| 452 | + |
| 453 | + // Cases where changing the number of checked datasets (Signatures excluded) |
| 454 | + // requires the style to be updated: |
| 455 | + // a) Chart data may change: |
| 456 | + boolean updateStyle = data != null && data != ChartData.NONE && oldSize != newSize; |
| 457 | + // b) Node color/shape may change: |
| 458 | + updateStyle = updateStyle || oldSize == 0 && newSize > 0; |
| 459 | + updateStyle = updateStyle || oldSize > 0 && newSize == 0; |
| 460 | + updateStyle = updateStyle || oldSize == 1 && newSize > 1; |
| 461 | + updateStyle = updateStyle || oldSize > 1 && newSize == 1; |
444 | 462 |
|
445 |
| - if (updateStyle) |
446 |
| - updateVisualStyle(map, viewPanel); |
447 |
| - else |
448 |
| - netView.updateView(); |
449 |
| - } |
450 |
| - }); |
451 |
| - |
452 |
| - viewPanel.getDataSetSelector().getAddButton().addActionListener(evt -> { |
453 |
| - postAnalysisPanelMediatorProvider.get().showDialog(viewPanel, netView); |
454 |
| - }); |
455 |
| - viewPanel.getDataSetSelector().getTable().addMouseListener(new MouseAdapter() { |
456 |
| - @Override |
457 |
| - public void mousePressed(final MouseEvent e) { |
458 |
| - maybeShowContextMenu(e); |
459 |
| - } |
460 |
| - @Override |
461 |
| - public void mouseReleased(final MouseEvent e) { |
462 |
| - maybeShowContextMenu(e); |
463 |
| - } |
464 |
| - private void maybeShowContextMenu(final MouseEvent e) { |
465 |
| - if (e.isPopupTrigger()) { |
466 |
| - final JPopupMenu contextMenu = new JPopupMenu(); |
467 |
| - { |
468 |
| - JMenuItem mi = new JMenuItem("Select nodes and edges from selected data sets"); |
469 |
| - mi.addActionListener(evt -> selectNodesEdges(viewPanel.getNetworkView(), |
470 |
| - viewPanel.getDataSetSelector().getSelectedItems())); |
471 |
| - contextMenu.add(mi); |
472 |
| - } |
473 |
| - contextMenu.addSeparator(); |
474 |
| - { |
475 |
| - Set<AbstractDataSet> selected = viewPanel.getDataSetSelector().getSelectedItems(); |
476 |
| - boolean onlySignatureSelected = !selected.isEmpty(); |
477 |
| - |
478 |
| - for (AbstractDataSet ds : selected) { |
479 |
| - if (ds instanceof EMSignatureDataSet == false) { |
480 |
| - onlySignatureSelected = false; |
481 |
| - break; |
482 |
| - } |
483 |
| - } |
484 |
| - |
485 |
| - JMenuItem mi = new JMenuItem("Remove selected signature gene sets"); |
486 |
| - mi.addActionListener(evt -> removeSignatureDataSets(map, viewPanel)); |
487 |
| - mi.setEnabled(onlySignatureSelected); |
488 |
| - contextMenu.add(mi); |
489 |
| - } |
490 |
| - showContextMenu(contextMenu, e); |
491 |
| - } |
492 |
| - } |
493 |
| - }); |
494 |
| - |
495 |
| - viewPanel.getChartDataCombo().addItemListener(evt -> { |
496 |
| - if (!updating && evt.getStateChange() == ItemEvent.SELECTED) { |
497 |
| - updating = true; |
498 |
| - |
499 |
| - try { |
500 |
| - viewPanel.updateChartCombos(); |
501 |
| - } finally { |
502 |
| - updating = false; |
503 |
| - } |
504 |
| - |
505 |
| - updateVisualStyle(map, viewPanel, true); |
506 |
| - } |
507 |
| - }); |
508 |
| - viewPanel.getChartTypeCombo().addItemListener(evt -> { |
509 |
| - if (!updating && evt.getStateChange() == ItemEvent.SELECTED) { |
510 |
| - updating = true; |
511 |
| - |
512 |
| - try { |
513 |
| - viewPanel.updateChartColorsCombo(); |
514 |
| - viewPanel.updateChartLabelsCheck(); |
515 |
| - } finally { |
516 |
| - updating = false; |
| 463 | + if (updateStyle) |
| 464 | + updateVisualStyle(map, viewPanel); |
| 465 | + else |
| 466 | + netView.updateView(); |
| 467 | + } |
| 468 | + }); |
| 469 | + |
| 470 | + viewPanel.getDataSetSelector().getAddButton().addActionListener(evt -> { |
| 471 | + postAnalysisPanelMediatorProvider.get().showDialog(viewPanel, netView); |
| 472 | + }); |
| 473 | + viewPanel.getDataSetSelector().getTable().addMouseListener(new MouseAdapter() { |
| 474 | + @Override |
| 475 | + public void mousePressed(final MouseEvent e) { |
| 476 | + maybeShowContextMenu(e); |
| 477 | + } |
| 478 | + @Override |
| 479 | + public void mouseReleased(final MouseEvent e) { |
| 480 | + maybeShowContextMenu(e); |
| 481 | + } |
| 482 | + private void maybeShowContextMenu(final MouseEvent e) { |
| 483 | + if (e.isPopupTrigger()) { |
| 484 | + final JPopupMenu contextMenu = new JPopupMenu(); |
| 485 | + { |
| 486 | + JMenuItem mi = new JMenuItem("Select nodes and edges from selected data sets"); |
| 487 | + mi.addActionListener(evt -> selectNodesEdges(viewPanel.getNetworkView(), |
| 488 | + viewPanel.getDataSetSelector().getSelectedItems())); |
| 489 | + contextMenu.add(mi); |
| 490 | + } |
| 491 | + contextMenu.addSeparator(); |
| 492 | + { |
| 493 | + Set<AbstractDataSet> selected = viewPanel.getDataSetSelector().getSelectedItems(); |
| 494 | + boolean onlySignatureSelected = !selected.isEmpty(); |
| 495 | + |
| 496 | + for (AbstractDataSet ds : selected) { |
| 497 | + if (ds instanceof EMSignatureDataSet == false) { |
| 498 | + onlySignatureSelected = false; |
| 499 | + break; |
517 | 500 | }
|
518 |
| - |
519 |
| - updateVisualStyle(map, viewPanel, true); |
520 | 501 | }
|
521 |
| - }); |
522 |
| - viewPanel.getChartColorsCombo().addItemListener(evt -> { |
523 |
| - if (!updating && evt.getStateChange() == ItemEvent.SELECTED) |
524 |
| - updateVisualStyle(map, viewPanel, true); |
525 |
| - }); |
526 |
| - viewPanel.getShowChartLabelsCheck().addActionListener(evt -> { |
527 |
| - if (!updating) |
528 |
| - updateVisualStyle(map, viewPanel, true); |
529 |
| - }); |
530 |
| - viewPanel.getPublicationReadyCheck().addActionListener(evt -> { |
531 |
| - if (!updating) |
532 |
| - updateVisualStyle(map, viewPanel); |
533 |
| - }); |
534 |
| - viewPanel.getResetStyleButton().addActionListener(evt -> { |
535 |
| - updateVisualStyle(map, viewPanel); |
536 |
| - }); |
537 |
| - viewPanel.getSetEdgeWidthButton().addActionListener(evt -> { |
538 |
| - showEdgeWidthDialog(); |
539 |
| - }); |
540 |
| - |
541 |
| - viewPanel.updateChartDataCombo(); |
| 502 | + |
| 503 | + JMenuItem mi = new JMenuItem("Remove selected signature gene sets"); |
| 504 | + mi.addActionListener(evt -> removeSignatureDataSets(map, viewPanel)); |
| 505 | + mi.setEnabled(onlySignatureSelected); |
| 506 | + contextMenu.add(mi); |
| 507 | + } |
| 508 | + showContextMenu(contextMenu, e); |
| 509 | + } |
| 510 | + } |
| 511 | + }); |
| 512 | + |
| 513 | + viewPanel.getChartDataCombo().addItemListener(evt -> { |
| 514 | + if (!updating && evt.getStateChange() == ItemEvent.SELECTED) { |
| 515 | + updating = true; |
| 516 | + |
| 517 | + try { |
| 518 | + viewPanel.updateChartCombos(); |
| 519 | + } finally { |
| 520 | + updating = false; |
| 521 | + } |
| 522 | + |
| 523 | + updateVisualStyle(map, viewPanel, true); |
| 524 | + } |
| 525 | + }); |
| 526 | + viewPanel.getChartTypeCombo().addItemListener(evt -> { |
| 527 | + if (!updating && evt.getStateChange() == ItemEvent.SELECTED) { |
| 528 | + updating = true; |
| 529 | + |
| 530 | + try { |
| 531 | + viewPanel.updateChartColorsCombo(); |
| 532 | + viewPanel.updateChartLabelsCheck(); |
| 533 | + } finally { |
| 534 | + updating = false; |
542 | 535 | }
|
| 536 | + |
| 537 | + updateVisualStyle(map, viewPanel, true); |
543 | 538 | }
|
544 | 539 | });
|
| 540 | + viewPanel.getChartColorsCombo().addItemListener(evt -> { |
| 541 | + if (!updating && evt.getStateChange() == ItemEvent.SELECTED) |
| 542 | + updateVisualStyle(map, viewPanel, true); |
| 543 | + }); |
| 544 | + viewPanel.getShowChartLabelsCheck().addActionListener(evt -> { |
| 545 | + if (!updating) |
| 546 | + updateVisualStyle(map, viewPanel, true); |
| 547 | + }); |
| 548 | + viewPanel.getPublicationReadyCheck().addActionListener(evt -> { |
| 549 | + if (!updating) |
| 550 | + updateVisualStyle(map, viewPanel); |
| 551 | + }); |
| 552 | + viewPanel.getResetStyleButton().addActionListener(evt -> { |
| 553 | + updateVisualStyle(map, viewPanel); |
| 554 | + }); |
| 555 | + viewPanel.getSetEdgeWidthButton().addActionListener(evt -> { |
| 556 | + showEdgeWidthDialog(); |
| 557 | + }); |
| 558 | + |
| 559 | + viewPanel.updateChartDataCombo(); |
| 560 | + } |
| 561 | + |
| 562 | + /** |
| 563 | + * Call this method on the EDT only! |
| 564 | + */ |
| 565 | + private void setDefaults(EMViewControlPanel viewPanel, EnrichmentMap map) { |
| 566 | + List<EMDataSet> dataSets = map.getDataSetList(); |
| 567 | + |
| 568 | + if (dataSets.size() > 1) { |
| 569 | + ChartData chartData = ChartData.NES_VALUE; // Default for GSEA data sets |
| 570 | + EMCreationParameters params = map.getParams(); |
| 571 | + |
| 572 | + if (params != null && params.isFDR()) { |
| 573 | + Optional<EMDataSet> nonGsea = dataSets.stream() |
| 574 | + .filter(ds -> ds.getMethod() != Method.GSEA) |
| 575 | + .findFirst(); |
| 576 | + |
| 577 | + if (nonGsea.isPresent()) |
| 578 | + chartData = ChartData.FDR_VALUE; // Default for other data sets |
| 579 | + } |
| 580 | + |
| 581 | + viewPanel.getChartDataCombo().setSelectedItem(chartData); |
| 582 | + } |
545 | 583 | }
|
546 | 584 |
|
547 | 585 | @AfterInjection
|
|
0 commit comments