diff --git a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java index e6f22edb527a..d48f9222bfb0 100644 --- a/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java +++ b/platform/core-impl/src/com/intellij/openapi/components/impl/ComponentManagerImpl.java @@ -100,10 +100,6 @@ public abstract class ComponentManagerImpl extends UserDataHolderBase implements if (componentsRegistered != null) { componentsRegistered.run(); } - - if (indicator != null) { - indicator.setIndeterminate(false); - } createComponents(indicator); myComponentsCreated = true; } diff --git a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java index c6a5c10e64db..4c375399c102 100644 --- a/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java +++ b/platform/platform-impl/src/com/intellij/openapi/fileEditor/impl/EditorsSplitters.java @@ -255,27 +255,25 @@ public class EditorsSplitters extends IdePanePanel implements UISettingsListener } } - private double myProgressMaximum; - private int myCurrentProgress; - - private void initializeProgress() { + private static void initializeProgress() { ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { indicator.setText(IdeBundle.message("loading.editors")); - indicator.setText2(""); - indicator.setIndeterminate(false); - indicator.setFraction(0); - - myProgressMaximum = countFiles(mySplittersElement); - myCurrentProgress = 0; } } + public int getEditorsCount() { + return mySplittersElement == null ? 0 : countFiles(mySplittersElement); + } + + private double myProgressStep; + + public void setProgressStep(double step) { myProgressStep = step; } + private void updateProgress() { ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); if (indicator != null) { - myCurrentProgress++; - indicator.setFraction(myCurrentProgress / myProgressMaximum); + indicator.setFraction(indicator.getFraction() + myProgressStep); } } diff --git a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java index ce1264b644bc..ae7b925e9b87 100644 --- a/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java +++ b/platform/platform-impl/src/com/intellij/openapi/progress/util/ProgressDialog.java @@ -60,7 +60,7 @@ class ProgressDialog implements Disposable { if (myProgressBar.isShowing()) { final int perc = (int)(fraction * 100); - myProgressBar.setIndeterminate(perc == 0 || myProgressWindow.isIndeterminate()); + myProgressBar.setIndeterminate(myProgressWindow.isIndeterminate()); myProgressBar.setValue(perc); } diff --git a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java index b066e9826de9..f07ec3dc35ec 100644 --- a/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java +++ b/platform/platform-impl/src/com/intellij/openapi/project/impl/ProjectImpl.java @@ -30,6 +30,11 @@ import com.intellij.openapi.components.impl.stores.StoreUtil; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.Extensions; +import com.intellij.openapi.fileEditor.FileEditorManager; +import com.intellij.openapi.fileEditor.impl.EditorsSplitters; +import com.intellij.openapi.fileEditor.impl.FileEditorManagerImpl; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.module.impl.ModuleManagerImpl; import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.ProgressIndicatorProvider; import com.intellij.openapi.progress.ProgressManager; @@ -74,6 +79,7 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project private final AtomicBoolean mySavingInProgress = new AtomicBoolean(false); private String myName; private final boolean myLight; + private static boolean ourClassesAreLoaded; /** * @param filePath System-independent path @@ -276,22 +282,15 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project public void init() { long start = System.currentTimeMillis(); - final ProgressIndicator progressIndicator = isDefault() ? null : ProgressIndicatorProvider.getGlobalProgressIndicator(); - if (progressIndicator != null) { - progressIndicator.pushState(); - } - try { - init(progressIndicator); - } - finally { - if (progressIndicator != null) { - progressIndicator.popState(); - } - } + ProgressIndicator progressIndicator = isDefault() ? null : ProgressIndicatorProvider.getGlobalProgressIndicator(); + init(progressIndicator); long time = System.currentTimeMillis() - start; LOG.info(getComponentConfigCount() + " project components initialized in " + time + " ms"); + if (!isDefault()) { + distributeProgress(); + } ApplicationManager.getApplication().getMessageBus().syncPublisher(ProjectLifecycleListener.TOPIC).projectComponentsInitialized(this); //noinspection SynchronizeOnThis @@ -301,6 +300,33 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project } } + @Override + protected void setProgressDuringInit(@NotNull ProgressIndicator indicator) { + indicator.setFraction(getPercentageOfComponentsLoaded() / (ourClassesAreLoaded ? 10 : 2)); + } + + private void distributeProgress() { + ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); + if (indicator == null) return; + + double toDistribute = 1 - indicator.getFraction(); + ModuleManagerImpl moduleManager = (ModuleManagerImpl)ModuleManager.getInstance(this); + int modulesCount = moduleManager.getModulePathsCount(); + EditorsSplitters splitters = ((FileEditorManagerImpl)FileEditorManager.getInstance(this)).getMainSplitters(); + int editors = splitters.getEditorsCount(); + + double modulesPart = (ourClassesAreLoaded || editors == 0) ? toDistribute : toDistribute * 0.5; + if (modulesCount != 0) { + + double step = modulesPart / modulesCount; + moduleManager.setProgressStep(step); + } + + if (editors != 0) { + splitters.setProgressStep(toDistribute - modulesPart / editors); + } + } + @Override public void save() { if (ApplicationManagerEx.getApplicationEx().isDoNotSave()) { @@ -359,6 +385,7 @@ public class ProjectImpl extends PlatformComponentManagerImpl implements Project LOG.error(component.toString(), e); } } + ourClassesAreLoaded = true; } private void projectClosed() { 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 baa66c2d0021..65e0713df9d7 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 @@ -215,7 +215,6 @@ public class ProjectManagerImpl extends ProjectManagerEx implements Disposable { ProgressIndicator indicator = myProgressManager.getProgressIndicator(); if (indicator != null && !project.isDefault()) { indicator.setText(ProjectBundle.message("loading.components.for", project.getName())); - indicator.setIndeterminate(true); } ApplicationManager.getApplication().getMessageBus().syncPublisher(ProjectLifecycleListener.TOPIC).beforeProjectLoaded(project); diff --git a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java index 7930fbf15e1b..69c7375cc495 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/module/impl/ModuleManagerImpl.java @@ -255,10 +255,9 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Project final List modulesWithUnknownTypes = new ArrayList(); List errors = new ArrayList(); - for (int i = 0; i < myModulePaths.size(); i++) { - ModulePath modulePath = myModulePaths.get(i); + for (ModulePath modulePath : myModulePaths) { if (progressIndicator != null) { - progressIndicator.setFraction((double) i / myModulePaths.size()); + progressIndicator.setFraction(progressIndicator.getFraction() + myProgressStep); } try { final Module module = moduleModel.loadModuleInternal(modulePath.getPath()); @@ -274,8 +273,9 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Project myFailedModulePaths.remove(modulePath); } catch (IOException e) { - errors.add(ModuleLoadingErrorDescription.create(ProjectBundle.message("module.cannot.load.error", modulePath.getPath(), e.getMessage()), - modulePath, this)); + errors + .add(ModuleLoadingErrorDescription.create(ProjectBundle.message("module.cannot.load.error", modulePath.getPath(), e.getMessage()), + modulePath, this)); } catch (ModuleWithNameAlreadyExists moduleWithNameAlreadyExists) { errors.add(ModuleLoadingErrorDescription.create(moduleWithNameAlreadyExists.getMessage(), modulePath, this)); @@ -285,12 +285,14 @@ public abstract class ModuleManagerImpl extends ModuleManager implements Project onModuleLoadErrors(errors); showUnknownModuleTypeNotification(modulesWithUnknownTypes); - - if (progressIndicator != null) { - progressIndicator.setIndeterminate(true); - } } + public int getModulePathsCount() { return myModulePaths == null ? 0 : myModulePaths.size(); } + + private double myProgressStep; + + public void setProgressStep(double step) { myProgressStep = step; } + protected boolean isUnknownModuleType(@NotNull Module module) { return false; }