@Override
  public synchronized void setFile(final Long fileID) {
    if (Objects.equals(fileID, this.fileID) == false) {
      this.fileID = fileID;
      disposeContent();

      if (this.fileID == null || Case.isCaseOpen() == false) {
        if (registered == true) {
          ImageGalleryController.getDefault().getCategoryManager().unregisterListener(this);
          TagUtils.unregisterListener(this);
          registered = false;
        }
        file = null;
        Platform.runLater(
            () -> {
              clearContent();
            });
      } else {
        if (registered == false) {
          ImageGalleryController.getDefault().getCategoryManager().registerListener(this);
          TagUtils.registerListener(this);
          registered = true;
        }
        file = null;
        getFile();
        updateSelectionState();
        updateCategoryBorder();
        updateFollowUpIcon();
        updateUI();
        Platform.runLater(getContentUpdateRunnable());
      }
    }
  }
  @Override
  public JComponent[] getMenuPresenters() {
    List<DataContentTopComponent> newWindowLists = DataContentTopComponent.getNewWindowList();

    // Get DataContent provider to include in the menu
    int totalItems = newWindowLists.size() > 0 ? 2 : 1;
    JComponent[] comps = new JComponent[totalItems];
    int counter = 0;

    TopComponent contentWin = DataContentTopComponent.findInstance();
    JMenuItem defaultItem = new JMenuItem(contentWin.getName()); // set the main name

    defaultItem.addActionListener(new OpenTopComponentAction(contentWin));

    if (!Case.isCaseOpen() || Case.getCurrentCase().hasData() == false) {
      defaultItem.setEnabled(false); // disable the menu items when no case is opened
    } else {
      defaultItem.setEnabled(true); // enable the menu items when there's a case opened / created
    }

    comps[counter++] = defaultItem;

    // add the submenu
    if (newWindowLists != null) {
      if (newWindowLists.size() > 0) {

        JMenu submenu =
            new JMenu(
                NbBundle.getMessage(
                    this.getClass(), "DataContentDynamicMenu.menu.dataContentWin.text"));
        for (int i = 0; i < newWindowLists.size(); i++) {
          DataContentTopComponent dctc = newWindowLists.get(i);
          JMenuItem item = new JMenuItem(dctc.getName());
          item.addActionListener(new OpenTopComponentAction(dctc));
          submenu.add(item);
        }

        comps[counter++] = submenu;
      }
    }

    return comps;
  }
  /**
   * Event handler to run when selection changed
   *
   * <p>TODO this needs to be revised
   *
   * @param oldNodes
   * @param newNodes
   */
  private void respondSelection(final Node[] oldNodes, final Node[] newNodes) {
    if (!Case.isCaseOpen()) {
      // handle in-between condition when case is being closed
      // and legacy selection events are pumped
      return;
    }

    // Some lock that prevents certain Node operations is set during the
    // ExplorerManager selection-change, so we must handle changes after the
    // selection-change event is processed.
    // TODO find a different way to refresh data result viewer, scheduling this
    // to EDT breaks loading of nodes in the background
    EventQueue.invokeLater(
        new Runnable() {
          @Override
          public void run() {
            // change the cursor to "waiting cursor" for this operation
            DirectoryTreeTopComponent.this.setCursor(
                Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
            try {

              // make sure dataResult is open, redundant?
              // dataResult.open();

              Node treeNode = DirectoryTreeTopComponent.this.getSelectedNode();
              if (treeNode != null) {
                OriginalNode origin = treeNode.getLookup().lookup(OriginalNode.class);
                if (origin == null) {
                  return;
                }
                Node originNode = origin.getNode();

                // set node, wrap in filter node first to filter out children
                Node drfn = new DataResultFilterNode(originNode, DirectoryTreeTopComponent.this.em);
                Node kffn =
                    new KnownFileFilterNode(
                        drfn, KnownFileFilterNode.getSelectionContext(originNode));
                dataResult.setNode(new TableFilterNode(kffn, true));

                String displayName = "";
                Content content = originNode.getLookup().lookup(Content.class);
                if (content != null) {
                  try {
                    displayName = content.getUniquePath();
                  } catch (TskCoreException ex) {
                    logger.log(
                        Level.SEVERE,
                        "Exception while calling Content.getUniquePath() for node: "
                            + originNode); // NON-NLS
                  }
                } else if (originNode.getLookup().lookup(String.class) != null) {
                  displayName = originNode.getLookup().lookup(String.class);
                }
                dataResult.setPath(displayName);
              }

              // set the directory listing to be active
              if (oldNodes != null && newNodes != null && (oldNodes.length == newNodes.length)) {
                boolean sameNodes = true;
                for (int i = 0; i < oldNodes.length; i++) {
                  sameNodes = sameNodes && oldNodes[i].getName().equals(newNodes[i].getName());
                }
                if (!sameNodes) {
                  dataResult.requestActive();
                }
              }
            } finally {
              setCursor(null);
            }
          }
        });

    // update the back and forward list
    updateHistory(em.getSelectedNodes());
  }