PY-50536 [NPW] Added an adapter to covert GeneratorNewProjectWizard into a DirectoryProjectGenerator for new project dialogs in minor IDEs

GitOrigin-RevId: f045b92226a36aac498b60f3da4981bed29db213
This commit is contained in:
Andrey Vlasovskikh
2021-10-12 17:06:01 +03:00
committed by intellij-monorepo-bot
parent ca954ebf09
commit d7393c78f8
2 changed files with 98 additions and 4 deletions

View File

@@ -5,9 +5,8 @@ import com.intellij.ide.util.projectWizard.AbstractNewProjectStep;
import com.intellij.ide.util.projectWizard.ProjectSettingsStepBase;
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.platform.DirectoryProjectGenerator;
import com.jetbrains.python.newProject.PyFrameworkProjectGenerator;
import com.jetbrains.python.newProject.PyNewProjectSettings;
import com.jetbrains.python.newProject.PythonProjectGenerator;
import com.intellij.util.ObjectUtils;
import com.jetbrains.python.newProject.*;
import one.util.streamex.StreamEx;
import org.jetbrains.annotations.NotNull;
@@ -37,7 +36,14 @@ public final class PyCharmNewProjectStep extends AbstractNewProjectStep<PyNewPro
@Override
protected ProjectSettingsStepBase<PyNewProjectSettings> createProjectSpecificSettingsStep(@NotNull DirectoryProjectGenerator<PyNewProjectSettings> projectGenerator,
@NotNull AbstractCallback<PyNewProjectSettings> callback) {
return new ProjectSpecificSettingsStep<>(projectGenerator, callback);
var npwGenerator = ObjectUtils.tryCast(projectGenerator, NewProjectWizardDirectoryGeneratorAdapter.class);
if (npwGenerator != null) {
//noinspection unchecked
return new NewProjectWizardProjectSettingsStep<PyNewProjectSettings>(npwGenerator);
}
else {
return new ProjectSpecificSettingsStep<>(projectGenerator, callback);
}
}
@Override

View File

@@ -0,0 +1,88 @@
// Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.jetbrains.python.newProject
import com.intellij.ide.util.projectWizard.AbstractNewProjectStep
import com.intellij.ide.util.projectWizard.ModuleWizardStep
import com.intellij.ide.util.projectWizard.ProjectSettingsStepBase
import com.intellij.ide.util.projectWizard.WizardContext
import com.intellij.ide.wizard.AbstractNewProjectWizardBuilder
import com.intellij.ide.wizard.GeneratorNewProjectWizard
import com.intellij.ide.wizard.NewProjectWizardStep
import com.intellij.openapi.module.Module
import com.intellij.openapi.module.ModuleType
import com.intellij.openapi.project.Project
import com.intellij.openapi.ui.VerticalFlowLayout
import com.intellij.openapi.vfs.VirtualFile
import com.intellij.platform.DirectoryProjectGeneratorBase
import com.intellij.platform.GeneratorPeerImpl
import com.intellij.platform.ProjectGeneratorPeer
import javax.swing.Icon
import javax.swing.JButton
import javax.swing.JComponent
import javax.swing.JPanel
/**
* A base adapter class to turn a [GeneratorNewProjectWizard] into a
* [com.intellij.platform.DirectoryProjectGenerator] and register as an extension point.
*
* @see NewProjectWizardProjectSettingsStep
*/
open class NewProjectWizardDirectoryGeneratorAdapter<T>(val wizard: GeneratorNewProjectWizard) : DirectoryProjectGeneratorBase<T>() {
internal lateinit var step: NewProjectWizardStep
internal lateinit var moduleWizardStep: ModuleWizardStep
@Suppress("DialogTitleCapitalization")
override fun getName(): String = wizard.name
override fun getLogo(): Icon = wizard.icon
override fun generateProject(project: Project, baseDir: VirtualFile, settings: T, module: Module) {
step.setupProject(project)
}
override fun createPeer(): ProjectGeneratorPeer<T> {
val context = WizardContext(null) {}
val builder = object : AbstractNewProjectWizardBuilder() {
override fun getModuleType(): ModuleType<*>? = null
override fun createStep(context: WizardContext): NewProjectWizardStep =
wizard.createStep(context).also {
step = it
}
}
return object : GeneratorPeerImpl<T>() {
override fun getComponent(): JComponent =
builder.getCustomOptionsStep(context, context.disposable).also {
moduleWizardStep = it
}.component
}
}
}
/**
* A wizard-enabled project settings step that you should use for your [projectGenerator] in your
* [AbstractNewProjectStep.Customization.createProjectSpecificSettingsStep] to provide the project wizard UI and actions.
*/
@Suppress("ComponentNotRegistered")
class NewProjectWizardProjectSettingsStep<T>(val projectGenerator: NewProjectWizardDirectoryGeneratorAdapter<T>)
: ProjectSettingsStepBase<T>(projectGenerator, null) {
init {
myCallback = AbstractNewProjectStep.AbstractCallback()
}
override fun createAndFillContentPanel(): JPanel =
JPanel(VerticalFlowLayout()).apply {
add(peer.component)
}
override fun registerValidators() {}
override fun getProjectLocation(): String =
projectGenerator.step.context.projectFileDirectory
override fun getActionButton(): JButton =
super.getActionButton().apply {
addActionListener {
projectGenerator.moduleWizardStep.updateDataModel()
}
}
}