boolean (boolean exitConfirmed) { boolean hasUnsafeBgTasks = ProgressManager.getInstance().hasUnsafeProgressIndicator(); if (exitConfirmed && !hasUnsafeBgTasks) { return true; } DoNotAskOption option = new DoNotAskOption() { @Override public boolean isToBeShown() { return GeneralSettings.getInstance().isConfirmExit() && ProjectManager.getInstance().getOpenProjects().length > 0; } @Override public void setToBeShown(boolean value, int exitCode) { GeneralSettings.getInstance().setConfirmExit(value); } @Override public boolean canBeHidden() { return !hasUnsafeBgTasks; } @Override public boolean shouldSaveOptionsOnCancel() { return false; } @Override public @NotNull String getDoNotShowMessage() { return IdeBundle.message("do.not.ask.me.again"); } }; if (!hasUnsafeBgTasks && !option.isToBeShown()) { return true; } if (hasUnsafeBgTasks && ApplicationManager.getApplication().isHeadlessEnvironment()) { getLogger().error("Headless application has been completed but background tasks are still running! Application will be terminated." + "\nThread dump:\n" + ThreadDumper.dumpThreadsToString()); return true; } AtomicBoolean alreadyGone = new AtomicBoolean(false); if (hasUnsafeBgTasks) { Runnable dialogRemover = Messages.createMessageDialogRemover(null); Runnable task = new Runnable() { @Override public void run() { if (alreadyGone.get()) return; if (!ProgressManager.getInstance().hasUnsafeProgressIndicator()) { alreadyGone.set(true); dialogRemover.run(); } else { AppExecutorUtil.getAppScheduledExecutorService().schedule(this, 1, TimeUnit.SECONDS); } } }; AppExecutorUtil.getAppScheduledExecutorService().schedule(task, 1, TimeUnit.SECONDS); } String message = ApplicationBundle.message(hasUnsafeBgTasks ? "exit.confirm.prompt.tasks" : "exit.confirm.prompt"); exitConfirmed = MessageDialogBuilder.yesNo(ApplicationBundle.message("exit.confirm.title"), message) .yesText(ApplicationBundle.message("command.exit")) .noText(CommonBundle.getCancelButtonText()) .doNotAsk(option) .guessWindowAndAsk(); if (alreadyGone.getAndSet(true)) { if (!option.isToBeShown()) { return true; } exitConfirmed = MessageDialogBuilder.okCancel(ApplicationBundle.message("exit.confirm.title"), ApplicationBundle.message("exit.confirm.prompt")) .yesText(ApplicationBundle.message("command.exit")) .doNotAsk(option) .guessWindowAndAsk(); } return exitConfirmed; }