@Override
  public void selectNode(final ProcessTreeNode node) {
    SelectionModel<ProcessTreeNode> selectionModel = processTree.getSelectionModel();

    if (node == null) {
      selectionModel.clearSelections();
      return;
    } else {
      selectionModel.setTreeActive(true);
      selectionModel.clearSelections();
      selectionModel.selectSingleNode(node);

      node.getTreeNodeElement().scrollIntoView();
    }

    Scheduler.get()
        .scheduleDeferred(
            new Scheduler.ScheduledCommand() {
              @Override
              public void execute() {
                delegate.onTreeNodeSelected(node);
              }
            });
  }
  /** {@inheritDoc} */
  @Override
  public void onNodeSelected(final TreeNode<?> node, final SelectionModel<?> model) {
    final List<?> allSelected = model.getSelectedNodes();
    final List<Object> newSelection = new ArrayList<>();
    for (final Object item : allSelected) {
      newSelection.add(item);
    }
    if (newSelection.contains(node)) {
      setSelection(new Selection<>(newSelection, node));
    } else {
      setSelection(new Selection<>(newSelection));
    }

    if (node != null && node instanceof StorableNode && appContext.getCurrentProject() != null) {
      appContext
          .getCurrentProject()
          .setProjectDescription(node.getProject().getProjectDescriptor());
    }
  }