loading project under one progress (take two)

This commit is contained in:
Dmitry Avdeev
2016-04-01 17:32:21 +03:00
parent 0f7e621918
commit bfc2c8872e
2 changed files with 39 additions and 27 deletions
@@ -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));
}
}
@@ -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<Project, IOException>(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<Object, RuntimeException>() {
@Override