ProgressIndicator (@NotNull Collection<? extends SearchEverywhereContributor<?>> contributors, @NotNull String pattern, @NotNull Function<? super ProgressIndicator, ? extends ResultsAccumulator> accumulatorSupplier) { ProgressIndicator indicator; ResultsAccumulator accumulator; if (!contributors.isEmpty()) { CountDownLatch latch = new CountDownLatch(contributors.size()); ProgressIndicatorWithCancelListener indicatorWithCancelListener = new ProgressIndicatorWithCancelListener(); accumulator = accumulatorSupplier.apply(indicatorWithCancelListener); accumulator.searchStarted(pattern); for (SearchEverywhereContributor<?> contributor : contributors) { Runnable task = createSearchTask(pattern, accumulator, indicatorWithCancelListener, contributor, () -> latch.countDown()); ApplicationManager.getApplication().executeOnPooledThread(task); } Runnable finisherTask = createFinisherTask(latch, accumulator, indicatorWithCancelListener); Future<?> finisherFeature = ApplicationManager.getApplication().executeOnPooledThread(finisherTask); indicatorWithCancelListener.setCancelCallback(() -> { accumulator.stop(); finisherFeature.cancel(true); }); indicator = indicatorWithCancelListener; } else { indicator = new ProgressIndicatorBase(); accumulator = accumulatorSupplier.apply(indicator); accumulator.searchStarted(pattern); } indicator.start(); if (contributors.isEmpty()) { indicator.stop(); accumulator.searchFinished(); } return indicator; }