@Override
  public void updateSelection(ViewState options) {
    NETWORK cyNetwork = cytoscapeUtils.getCurrentNetwork();
    if (cyNetwork == null) {
      return;
    }
    int totalEnabled = 0;
    NetworkGroupDetailPanel<NETWORK, NODE, EDGE> mostRecent = null;
    Group<?, ?> mostRecentGroup = options.getMostRecentGroup();
    for (NetworkGroupDetailPanel<NETWORK, NODE, EDGE> panel : dataModel) {
      Group<?, ?> group = panel.getSubject();
      boolean enabled = options.getGroupHighlighted(group);
      if (enabled) {
        totalEnabled++;
        panel.showDetails(true, 1);
      }

      panel.setItemEnabled(options.getEnabled(group));

      panel.setSelected(enabled);
      if (group.equals(mostRecentGroup)) {
        mostRecent = panel;
      }
      panel.getNetworkInfoPanel().updateSelection(options);
    }
    if (totalEnabled == 0) {
      cytoscapeUtils.setHighlighted(options, cyNetwork, false);
      options.clearHighlightedNetworks();
      mostRecent = null;
    }
    if (mostRecent != null) {
      ensureVisible(mostRecent);
      mostRecent.showDetails(true, 1);
    }
  }
  @Override
  public void applyOptions(final ViewState options) {
    removeAll();
    if (selectionListener != null) {
      removeSelectionListener(selectionListener);
    }

    selectionListener =
        new SelectionListener<Group<?, ?>>() {
          public void selectionChanged(SelectionEvent<Group<?, ?>> event) {
            // Only handle deselections
            if (event.selected) {
              return;
            }

            for (Group<?, ?> group : event.items) {
              for (Network<?> network : group.getNetworks()) {
                options.setNetworkHighlighted(network, false);
              }
            }
            for (NetworkGroupDetailPanel<NETWORK, NODE, EDGE> panel : dataModel) {
              panel.getNetworkInfoPanel().updateSelection(options);
            }
          }
        };

    addSelectionListener(selectionListener);

    int index = 0;
    NETWORK network = cytoscapeUtils.getCurrentNetwork();
    for (Group<?, ?> group : options.getAllGroups()) {
      if (group.getWeight() == 0) {
        continue;
      }

      boolean enabledByDefault = options.getEnabled(group);
      NetworkGroupDetailPanel<NETWORK, NODE, EDGE> panel =
          new NetworkGroupDetailPanel<NETWORK, NODE, EDGE>(
              group, this, plugin, networkUtils, uiUtils, enabledByDefault, options);
      addDetailPanel(panel, index);
      index++;

      cytoscapeUtils.setHighlight(options, group, network, enabledByDefault);
    }
    add(
        uiUtils.createFillerPanel(),
        new GridBagConstraints(
            0,
            index,
            1,
            1,
            1,
            1,
            GridBagConstraints.FIRST_LINE_START,
            GridBagConstraints.BOTH,
            new Insets(0, 0, 0, 0),
            0,
            0));

    sort(1, true);
    invalidate();
  }