@Override
  public void uiDataSnapshot(@NotNull DataSink sink) {
    super.uiDataSnapshot(sink);
    sink.set(DATA_KEY, this);
    sink.set(VcsDataKeys.CHANGES, getSelectedChanges()
      .toArray(Change.EMPTY_CHANGE_ARRAY));
    sink.set(VcsDataKeys.CHANGE_LEAD_SELECTION, VcsTreeModelData.exactlySelected(this)
      .iterateUserObjects(Change.class)
      .toArray(Change.EMPTY_CHANGE_ARRAY));
    sink.set(VcsDataKeys.CHANGE_LISTS, VcsTreeModelData.exactlySelected(this)
      .iterateRawUserObjects(ChangeList.class)
      .toList().toArray(ChangeList[]::new));
    sink.set(VcsDataKeys.FILE_PATHS, VcsTreeModelData.mapToFilePath(VcsTreeModelData.selected(this)));
    // don't try to delete files when only a changelist node is selected
    sink.set(PlatformDataKeys.DELETE_ELEMENT_PROVIDER,
             VcsTreeModelData.exactlySelected(this)
               .iterateRawUserObjects()
               .filter(userObject -> !(userObject instanceof ChangeList))
               .isNotEmpty()
             ? new VirtualFileDeleteProvider()
             : null);
    sink.set(UNVERSIONED_FILE_PATHS_DATA_KEY, getSelectedUnversionedFiles());
    sink.set(IGNORED_FILE_PATHS_DATA_KEY, getSelectedIgnoredFiles());
    sink.set(VcsDataKeys.MODIFIED_WITHOUT_EDITING_DATA_KEY, getSelectedModifiedWithoutEditing().toList());
    sink.set(LOCALLY_DELETED_CHANGES, getSelectedLocallyDeletedChanges().toList());
    sink.set(MISSING_FILES_DATA_KEY, getSelectedLocallyDeletedChanges()
      .map(LocallyDeletedChange::getPath)
      .toList());
    sink.set(PlatformCoreDataKeys.HELP_ID, HELP_ID);

    VcsTreeModelData treeSelection = VcsTreeModelData.selected(this);
    VcsTreeModelData exactSelection = VcsTreeModelData.exactlySelected(this);
    sink.set(PlatformCoreDataKeys.BGT_DATA_PROVIDER,
             slowId -> getSlowData(myProject, treeSelection, exactSelection, slowId));
  }
@Override
  public void uiDataSnapshot(@NotNull DataSink sink)