@RequiresEdt
  public void updateRequest(final boolean force, boolean useCache, @Nullable final ScrollToPolicy scrollToChangePolicy) {
    ThreadingAssertions.assertEventDispatchThread();
    if (isDisposed()) return;

    final T requestProvider = getCurrentRequestProvider();
    if (requestProvider == null) {
      myQueue.abort();
      finishUpdate(NoDiffRequest.INSTANCE, force, scrollToChangePolicy);
      return;
    }

    DiffRequest cachedRequest = useCache ? loadRequestFast(requestProvider) : null;
    if (cachedRequest != null) {
      myQueue.abort();
      finishUpdate(cachedRequest, force, scrollToChangePolicy);
      return;
    }

    if (useCache && !force && Objects.equals(myQueuedProvider, requestProvider)) {
      // Let the ongoing computation to finish - high chance, it will be up-to-date with our request.
      // Schedule double-check in case 'loadRequestFast' implements additional validation.
      myValidateQueuedProvider = true;
      return;
    }

    myQueuedProvider = requestProvider;
    myValidateQueuedProvider = false;

    myQueue.executeAndTryWait(
      indicator -> {
        final DiffRequest request = doLoadRequest(requestProvider, indicator);
        return () -> finishRequestLoading(request, force, scrollToChangePolicy, requestProvider);
      },
      () -> applyRequest(new LoadingDiffRequest(getRequestName(requestProvider)), force, scrollToChangePolicy),
      getFastLoadingTimeMillis()
    );
  }
@RequiresEdt
  public void updateRequest(final boolean force, boolean useCache, @Nullable final ScrollToPolicy scrollToChangePolicy)