From bfc2c8872eec64c4a6fc9d1b8126c6375e985af5 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 1 Apr 2016 17:28:27 +0300 Subject: [PATCH] loading project under one progress (take two) --- .../module/impl/ModuleManagerComponent.java | 20 +------- .../project/impl/ProjectManagerImpl.java | 46 +++++++++++++++---- 2 files changed, 39 insertions(+), 27 deletions(-) diff --git a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java index 7ba9ee290946..fb1216283a8d 100644 --- a/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java +++ b/platform/lang-impl/src/com/intellij/openapi/module/impl/ModuleManagerComponent.java @@ -28,7 +28,6 @@ import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.module.UnknownModuleType; -import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; @@ -123,23 +122,8 @@ public class ModuleManagerComponent extends ModuleManagerImpl { @Override protected void fireModulesAdded() { - if (myModuleModel.myModules.isEmpty()) { - return; - } - - Runnable runnableWithProgress = () -> { - for (final Module module : myModuleModel.myModules.values()) { - TransactionGuard.getInstance().submitTransactionAndWait(TransactionKind.ANY_CHANGE, () -> fireModuleAddedInWriteAction(module)); - } - }; - - ProgressIndicator progressIndicator = myProgressManager.getProgressIndicator(); - if (progressIndicator == null) { - myProgressManager.runProcessWithProgressSynchronously(runnableWithProgress, "Initializing Modules", false, myProject); - } - else { - progressIndicator.setText("Initializing modules..."); - runnableWithProgress.run(); + for (final Module module : myModuleModel.myModules.values()) { + TransactionGuard.getInstance().submitTransactionAndWait(TransactionKind.ANY_CHANGE, () -> fireModuleAddedInWriteAction(module)); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java index 0ad16a520d7e..d98473f605dc 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectManagerImpl.java @@ -347,7 +347,6 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { return false; } - fireProjectOpened(project); try (AccessToken ignored = TransactionGuard.getInstance().startSynchronousTransaction(TransactionKind.ANY_CHANGE)) { DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_BACKGROUND, () -> DumbService.getInstance(project).queueTask(new DumbModeTask() { @@ -364,10 +363,17 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { ); } - final StartupManagerImpl startupManager = (StartupManagerImpl)StartupManager.getInstance(project); - boolean ok = myProgressManager.runProcessWithProgressSynchronously(new Runnable() { + Runnable process = new Runnable() { @Override public void run() { + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override + public void run() { + fireProjectOpened(project); + } + }); + + StartupManagerImpl startupManager = (StartupManagerImpl)StartupManager.getInstance(project); startupManager.runStartupActivities(); // Startup activities (e.g. the one in FileBasedIndexProjectHandler) have scheduled dumb mode to begin "later" @@ -391,8 +397,13 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { } }, ModalityState.NON_MODAL); } - }, ProjectBundle.message("project.load.progress"), canCancelProjectLoading(), project); + }; + if (myProgressManager.getProgressIndicator() != null) { + process.run(); + return true; + } + boolean ok = myProgressManager.runProcessWithProgressSynchronously(process, ProjectBundle.message("project.load.progress"), canCancelProjectLoading(), project); if (!ok) { closeProject(project, false, false, true); notifyProjectOpenFailed(); @@ -449,14 +460,28 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { @Override public Project loadAndOpenProject(@NotNull final String filePath) throws IOException { - final Project project = convertAndLoadProject(filePath); + Project project = myProgressManager.run(new Task.WithResult(null, ProjectBundle.message("project.load.progress"), true) { + @Override + protected Project compute(@NotNull ProgressIndicator indicator) throws IOException { + final Project project = convertAndLoadProject(filePath); + if (project == null) { + return null; + } + + UIUtil.invokeAndWaitIfNeeded(new Runnable() { + @Override + public void run() { + openProject(project); + } + }); + return project; + } + }); if (project == null) { WelcomeFrame.showIfNoProjectOpened(); return null; } - - // todo unify this logic with PlatformProjectOpenProcessor - if (!openProject(project)) { + if (!project.isOpen()) { WelcomeFrame.showIfNoProjectOpened(); ApplicationManager.getApplication().runWriteAction(new Runnable() { @Override @@ -465,7 +490,6 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { } }); } - return project; } @@ -514,6 +538,10 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { @Nullable private Project loadProjectWithProgress(@NotNull final String filePath) { final ProjectImpl project = createProject(null, toCanonicalName(filePath), false); + if (myProgressManager.getProgressIndicator() != null) { + initProject(project, null); + return project; + } try { myProgressManager.runProcessWithProgressSynchronously(new ThrowableComputable() { @Override