boolean (@NotNull ModalityState modality, @NotNull Runnable action) { ThreadingAssertions.assertEventDispatchThread(); assertWeAreOutsideAfterCommitHandler(); assert !myProject.isDisposed() : "Already disposed: " + myProject; if (!hasEventSystemEnabledUncommittedDocuments()) { action.run(); return true; } CompositeRunnable actions = (CompositeRunnable)actionsWhenAllDocumentsAreCommitted.get(PERFORM_ALWAYS_KEY); if (actions == null) { actions = new CompositeRunnable(); actionsWhenAllDocumentsAreCommitted.put(PERFORM_ALWAYS_KEY, actions); } actions.add(ThreadContext.captureThreadContext(ClientId.decorateRunnable(action))); if (modality != ModalityState.nonModal() && TransactionGuard.getInstance().isWriteSafeModality(modality)) { // this client obviously expects all documents to be committed ASAP even inside modal dialog for (Document document : myUncommittedDocuments) { retainProviderAndCommitAsync(document, "re-added because performWhenAllCommitted(" + modality + ") was called", modality); } } return false; }