From 79597d86aff78664fd4ffcbf509e57a4b528b9ca Mon Sep 17 00:00:00 2001 From: peter Date: Fri, 24 Jul 2015 14:20:54 +0200 Subject: [PATCH] diagnostics and allow bg dumb mode in AddCustomLibraryDialog (IDEA-143007) --- .../libraries/AddCustomLibraryDialog.java | 31 ++++++++++++------- .../intellij/openapi/project/DumbService.java | 5 ++- .../openapi/project/DumbServiceImpl.java | 2 +- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/AddCustomLibraryDialog.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/AddCustomLibraryDialog.java index dfa569e24f62..b8cea4eff2c7 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/AddCustomLibraryDialog.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/libraries/AddCustomLibraryDialog.java @@ -22,6 +22,7 @@ import com.intellij.ide.IdeBundle; import com.intellij.openapi.application.Result; import com.intellij.openapi.application.WriteAction; import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.DumbService; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.libraries.Library; @@ -88,19 +89,25 @@ public class AddCustomLibraryDialog extends DialogWrapper { protected void doOKAction() { final LibraryCompositionSettings settings = myPanel.apply(); if (settings != null && settings.downloadFiles(myPanel.getMainPanel())) { - if (myModifiableRootModel == null) { - final ModifiableRootModel model = ModuleRootManager.getInstance(myModule).getModifiableModel(); - new WriteAction() { - @Override - protected void run(@NotNull final Result result) { - addLibraries(model, settings); - model.commit(); + DumbService.getInstance(myModule.getProject()).allowStartingDumbModeInside(DumbService.DumbModePermission.MAY_START_BACKGROUND, new Runnable() { + @Override + public void run() { + if (myModifiableRootModel == null) { + final ModifiableRootModel model = ModuleRootManager.getInstance(myModule).getModifiableModel(); + new WriteAction() { + @Override + protected void run(@NotNull final Result result) { + addLibraries(model, settings); + model.commit(); + } + }.execute(); } - }.execute(); - } - else { - addLibraries(myModifiableRootModel, settings); - } + else { + addLibraries(myModifiableRootModel, settings); + } + + } + }); super.doOKAction(); } } diff --git a/platform/core-api/src/com/intellij/openapi/project/DumbService.java b/platform/core-api/src/com/intellij/openapi/project/DumbService.java index aa899f1c6674..826f09b7eee3 100644 --- a/platform/core-api/src/com/intellij/openapi/project/DumbService.java +++ b/platform/core-api/src/com/intellij/openapi/project/DumbService.java @@ -272,7 +272,10 @@ public abstract class DumbService { * * If the dialog (e.g. Project Structure) starting background dumb mode is an expected situation, the dumb mode should be started inside the runnable * passed to this method. This will suppress the exception and allow either modal or background indexing. Note that this will only affect the invocation time - * modality state, so showing other dialogs from within the runnable and starting dumb mode from them would still result in an assertion failure. + * modality state, so showing other dialogs from within the runnable and starting dumb mode from them would still result in an assertion failure.

+ * + * If this exception occurs inside invokeLater call which happens to run when a modal dialog is shown, the correct fix is supplying an explicit modality state + * in {@link com.intellij.openapi.application.Application#invokeLater(Runnable, ModalityState)}. */ public abstract void allowStartingDumbModeInside(@NotNull DumbModePermission permission, @NotNull Runnable runnable); diff --git a/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java index 28c0cef35537..c4b82fa5ee0e 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/DumbServiceImpl.java @@ -202,7 +202,7 @@ public class DumbServiceImpl extends DumbService implements Disposable, Modifica ModalityState modality = ModalityState.current(); final DumbModePermission permission = getDumbModePermission(modality); if (permission == null) { - LOG.error("Dumb mode not permitted in modal envirnonment; please use DumbService.allowStartingDumbModeInside in your dialog or invokeLater(..., NON_MODAL)", trace); + LOG.error("Dumb mode not permitted in modal environment; see DumbService.allowStartingDumbModeInside documentation. Current modality: " + modality + ", all premissions: " + myPermissions, trace); } myProgresses.put(task, new ProgressIndicatorBase());