void (@NotNull JList<?> component) { if (getEditor().isDisposed()) return; if (myHighlightingFuture != null && !myHighlightingFuture.isDone()) return; if (myItemsDeque.isEmpty()) return; myHighlightingFuture = ReadAction.nonBlocking(() -> { while (!myItemsDeque.isEmpty()) { ProgressManager.checkCanceled(); RecentLocationItem item = myItemsDeque.removeFirst(); try { myItemHighlights.put(item, Couple.of( calcItemHighlights(item, true), calcItemHighlights(item, false))); } catch (ProcessCanceledException e) { myItemsDeque.addFirst(item); throw e; } } }) .expireWith(this) .finishOnUiThread(ModalityState.stateForComponent(this), __ -> { component.repaint(); }) .submit(AppExecutorUtil.getAppExecutorService()); }