make IdeStarter more clear

GitOrigin-RevId: e45d609ffa8c5c6a4cae3a939ad3621174a3c4fe
This commit is contained in:
Vladimir Krivosheev
2021-04-06 19:24:46 +00:00
committed by intellij-monorepo-bot
parent f04c12457a
commit f83a2e1c93
2 changed files with 86 additions and 57 deletions
@@ -32,6 +32,7 @@ import com.intellij.ui.AnimatedIcon
import com.intellij.ui.AppIcon
import com.intellij.ui.mac.foundation.Foundation
import com.intellij.ui.mac.touchbar.TouchBarsManager
import com.intellij.util.PlatformUtils
import com.intellij.util.TimeoutUtil
import com.intellij.util.io.createDirectories
import com.intellij.util.io.storage.HeavyProcessLatch
@@ -106,7 +107,8 @@ private fun executeInitAppInEdt(args: List<String>,
// `ApplicationStarter` is an extension, so to find a starter extensions must be registered first
registerComponentFuture
.thenRun {
val starter = findStarter(args.first()) ?: IdeStarter()
val starter = findStarter(args.first())
?: if (PlatformUtils.getPlatformPrefix() == "LightEdit") IdeStarter.StandaloneLightEditStarter() else IdeStarter()
if (Main.isHeadless() && !starter.isHeadless) {
val commandName = starter.commandName
val message = IdeBundle.message(
@@ -1,4 +1,5 @@
// Copyright 2000-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
@file:Suppress("ReplaceNegatedIsEmptyWithIsNotEmpty")
package com.intellij.idea
import com.intellij.diagnostic.*
@@ -20,6 +21,7 @@ import com.intellij.notification.NotificationType
import com.intellij.openapi.actionSystem.ActionManager
import com.intellij.openapi.actionSystem.IdeActions
import com.intellij.openapi.application.*
import com.intellij.openapi.application.ex.ApplicationEx
import com.intellij.openapi.application.ex.ApplicationManagerEx
import com.intellij.openapi.application.impl.ApplicationInfoImpl
import com.intellij.openapi.diagnostic.Logger
@@ -33,9 +35,7 @@ import com.intellij.openapi.wm.impl.SystemDock
import com.intellij.openapi.wm.impl.welcomeScreen.WelcomeFrame
import com.intellij.ui.AppUIUtil
import com.intellij.ui.mac.touchbar.TouchBarsManager
import com.intellij.util.PlatformUtils
import com.intellij.util.concurrency.AppExecutorUtil
import com.intellij.util.concurrency.NonUrgentExecutor
import com.intellij.util.ui.accessibility.ScreenReader
import java.awt.EventQueue
import java.beans.PropertyChangeListener
@@ -88,60 +88,7 @@ open class IdeStarter : ApplicationStarter {
}
val lifecyclePublisher = app.messageBus.syncPublisher(AppLifecycleListener.TOPIC)
val isStandaloneLightEdit = PlatformUtils.getPlatformPrefix() == "LightEdit"
val needToOpenProject: Boolean
if (isStandaloneLightEdit) {
needToOpenProject = true
}
else {
frameInitActivity.runChild("app frame created callback") {
lifecyclePublisher.appFrameCreated(args)
}
// must be after appFrameCreated because some listeners can mutate state of RecentProjectsManager
if (app.isHeadlessEnvironment) {
needToOpenProject = false
}
else {
val willOpenProject = (args.isNotEmpty() || filesToLoad.isNotEmpty() || RecentProjectsManager.getInstance().willReopenProjectOnStart())
&& JetBrainsProtocolHandler.getCommand() == null
needToOpenProject = showWizardAndWelcomeFrame(lifecyclePublisher, willOpenProject)
}
frameInitActivity.end()
NonUrgentExecutor.getInstance().execute {
LifecycleUsageTriggerCollector.onIdeStart()
}
}
val project = when {
!needToOpenProject -> null
filesToLoad.isNotEmpty() -> ProjectUtil.tryOpenFiles(null, filesToLoad, "MacMenu")
args.isNotEmpty() -> loadProjectFromExternalCommandLine(args)
else -> null
}
lifecyclePublisher.appStarting(project)
if (needToOpenProject && project == null && !JetBrainsProtocolHandler.appStartedWithCommand()) {
val recentProjectManager = RecentProjectsManager.getInstance()
var openLightEditFrame = isStandaloneLightEdit
if (recentProjectManager.willReopenProjectOnStart()) {
if (recentProjectManager.reopenLastProjectsOnStart()) {
openLightEditFrame = false
}
else if (!isStandaloneLightEdit) {
WelcomeFrame.showIfNoProjectOpened()
}
}
if (openLightEditFrame) {
ApplicationManager.getApplication().invokeLater {
LightEditService.getInstance().showEditorWindow()
}
}
}
openProjectIfNeeded(args, app, frameInitActivity, lifecyclePublisher)
reportPluginErrors()
@@ -157,6 +104,64 @@ open class IdeStarter : ApplicationStarter {
}
}
protected open fun openProjectIfNeeded(args: List<String>,
app: ApplicationEx,
frameInitActivity: Activity,
lifecyclePublisher: AppLifecycleListener) {
frameInitActivity.runChild("app frame created callback") {
lifecyclePublisher.appFrameCreated(args)
}
// must be after appFrameCreated because some listeners can mutate state of RecentProjectsManager
if (app.isHeadlessEnvironment) {
frameInitActivity.end()
LifecycleUsageTriggerCollector.onIdeStart()
lifecyclePublisher.appStarting(null)
return
}
if (JetBrainsProtocolHandler.appStartedWithCommand()) {
val needToOpenProject = showWizardAndWelcomeFrame(lifecyclePublisher, willOpenProject = false)
frameInitActivity.end()
LifecycleUsageTriggerCollector.onIdeStart()
val project = when {
!needToOpenProject -> null
!filesToLoad.isEmpty() -> ProjectUtil.tryOpenFiles(null, filesToLoad, "MacMenu")
!args.isEmpty() -> loadProjectFromExternalCommandLine(args)
else -> null
}
lifecyclePublisher.appStarting(project)
}
else {
val recentProjectManager = RecentProjectsManager.getInstance()
val willReopenRecentProjectOnStart = recentProjectManager.willReopenProjectOnStart()
val willOpenProject = willReopenRecentProjectOnStart || !args.isEmpty() || !filesToLoad.isEmpty()
val needToOpenProject = showWizardAndWelcomeFrame(lifecyclePublisher, willOpenProject)
frameInitActivity.end()
ForkJoinPool.commonPool().execute {
LifecycleUsageTriggerCollector.onIdeStart()
}
if (needToOpenProject) {
val project = when {
!filesToLoad.isEmpty() -> ProjectUtil.tryOpenFiles(null, filesToLoad, "MacMenu")
!args.isEmpty() -> loadProjectFromExternalCommandLine(args)
else -> null
}
lifecyclePublisher.appStarting(project)
if (project == null && willReopenRecentProjectOnStart && !recentProjectManager.reopenLastProjectsOnStart()) {
WelcomeFrame.showIfNoProjectOpened()
}
}
else {
lifecyclePublisher.appStarting(null)
}
}
}
private fun showWizardAndWelcomeFrame(lifecyclePublisher: AppLifecycleListener, willOpenProject: Boolean): Boolean {
val doShowWelcomeFrame = if (willOpenProject) null else WelcomeFrame.prepareToShow()
// do not show Customize IDE Wizard [IDEA-249516]
@@ -201,6 +206,28 @@ open class IdeStarter : ApplicationStarter {
}
return false
}
internal class StandaloneLightEditStarter : IdeStarter() {
override fun openProjectIfNeeded(args: List<String>,
app: ApplicationEx,
frameInitActivity: Activity,
lifecyclePublisher: AppLifecycleListener) {
val project = when {
!filesToLoad.isEmpty() -> ProjectUtil.tryOpenFiles(null, filesToLoad, "MacMenu")
!args.isEmpty() -> loadProjectFromExternalCommandLine(args)
else -> null
}
if (project == null && !JetBrainsProtocolHandler.appStartedWithCommand()) {
val recentProjectManager = RecentProjectsManager.getInstance()
if (!recentProjectManager.willReopenProjectOnStart() || !recentProjectManager.reopenLastProjectsOnStart()) {
ApplicationManager.getApplication().invokeLater {
LightEditService.getInstance().showEditorWindow()
}
}
}
}
}
}
private fun loadProjectFromExternalCommandLine(commandLineArgs: List<String>): Project? {