IDEA-333998 multi-page dialog refactoring

GitOrigin-RevId: 1c4ad7493ac55487ac20fbce2c95ffeb86d60cae
This commit is contained in:
anna.gromova
2023-10-05 21:26:11 +02:00
committed by intellij-monorepo-bot
parent 06145574e5
commit 99b2dbb308
13 changed files with 91 additions and 99 deletions

View File

@@ -1,7 +1,7 @@
package com.intellij.ide.startup.importSettings
import com.intellij.ide.startup.importSettings.chooser.productChooser.ProductChooserDialog
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.ide.startup.importSettings.chooser.ui.MultiplePageDialog
import com.intellij.openapi.application.EDT
import com.intellij.openapi.extensions.ExtensionNotApplicableException
import com.intellij.platform.ide.bootstrap.IdeStartupWizard
@@ -17,7 +17,8 @@ private class IdeStartupWizardImpl : IdeStartupWizard {
override suspend fun run() {
withContext(Dispatchers.EDT) {
ImportSettingsDialogWrapper.show(ProductChooserDialog())
MultiplePageDialog.show(ProductChooserDialog())
}
}
}

View File

@@ -1,15 +1,14 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.ide.startup.importSettings.chooser.settingChooser.SettingChooserDialog
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.JBrActionsDataProvider
import com.intellij.ide.startup.importSettings.data.SettingsService
import com.intellij.ide.startup.importSettings.chooser.settingChooser.SettingChooserDialog
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.ui.DialogWrapper
class ConfigAction(val callback: (Int) -> Unit) : DumbAwareAction() {
class ConfigAction(val callback: (PageProvider) -> Unit) : DumbAwareAction() {
val service = SettingsService.getInstance().getJbService()
val config
get() = service.getConfig()
@@ -30,8 +29,6 @@ class ConfigAction(val callback: (Int) -> Unit) : DumbAwareAction() {
}
override fun actionPerformed(e: AnActionEvent) {
callback(DialogWrapper.OK_EXIT_CODE)
ImportSettingsDialogWrapper.show(SettingChooserDialog(JBrActionsDataProvider.getInstance(), config))
callback(SettingChooserDialog(JBrActionsDataProvider.getInstance(), config))
}
}

View File

@@ -2,21 +2,22 @@
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.icons.AllIcons
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.*
import com.intellij.openapi.actionSystem.AnActionEvent
import java.awt.Component
import java.awt.Graphics
import javax.swing.Icon
class JbChooserAction(callback: (Int) -> Unit) : MainChooserAction<JbService>(JBrActionsDataProvider.getInstance(), callback) {
class JbChooserAction(callback: (PageProvider) -> Unit) : MainChooserAction<JbService>(JBrActionsDataProvider.getInstance(), callback) {
override fun getIcon(products: List<Product>): Icon? {
return ImportJbIcon(products) { provider.getProductIcon(it) }
}
}
class ExpChooserAction(callback: (Int) -> Unit) : MainChooserAction<ExternalService>(ExtActionsDataProvider.getInstance(), callback)
class ExpChooserAction(callback: (PageProvider) -> Unit) : MainChooserAction<ExternalService>(ExtActionsDataProvider.getInstance(), callback)
class SyncChooserAction(callback: (Int) -> Unit) : MainChooserAction<SyncService>(SyncActionsDataProvider.getInstance(), callback) {
class SyncChooserAction(callback: (PageProvider) -> Unit) : MainChooserAction<SyncService>(SyncActionsDataProvider.getInstance(), callback) {
private val service = SettingsService.getInstance().getSyncService()
override fun getIcon(products: List<Product>): Icon? {

View File

@@ -1,6 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.ActionsDataProvider
import com.intellij.ide.startup.importSettings.data.BaseService
import com.intellij.ide.startup.importSettings.data.Product
@@ -8,7 +9,7 @@ import com.intellij.openapi.actionSystem.AnAction
import com.intellij.openapi.actionSystem.AnActionEvent
import javax.swing.Icon
open class MainChooserAction<T : BaseService>(val provider: ActionsDataProvider<T>, val callback: (Int) -> Unit) : ProductChooserAction() {
open class MainChooserAction<T : BaseService>(val provider: ActionsDataProvider<T>, val callback: (PageProvider) -> Unit) : ProductChooserAction() {
private var array: Array<AnAction> = emptyArray()
override fun displayTextInToolbar(): Boolean {

View File

@@ -2,6 +2,7 @@
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.icons.AllIcons
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.ActionsDataProvider
import com.intellij.ide.startup.importSettings.data.JBrActionsDataProvider
import com.intellij.ide.startup.importSettings.data.Product
@@ -12,7 +13,7 @@ import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.actionSystem.Separator
import javax.swing.JButton
class OtherOptions(val callback: (Int) -> Unit) : ProductChooserAction(), LinkAction {
class OtherOptions(val callback: (PageProvider) -> Unit) : ProductChooserAction(), LinkAction {
private val jbDataProvider = JBrActionsDataProvider.getInstance()
private val syncDataProvider = SyncActionsDataProvider.getInstance()

View File

@@ -2,6 +2,7 @@
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.ide.startup.importSettings.chooser.settingChooser.SettingChooserItemAction
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.chooser.ui.UiUtils
import com.intellij.ide.startup.importSettings.data.ActionsDataProvider
import com.intellij.ide.startup.importSettings.data.Product
@@ -27,7 +28,7 @@ abstract class ProductChooserAction : ChooseProductActionButton(null) {
abstract fun getChildren(e: AnActionEvent?): Array<AnAction>
protected fun productsToActions(products: List<Product>, provider: ActionsDataProvider<*>, callback: (Int) -> Unit): List<AnAction> {
protected fun productsToActions(products: List<Product>, provider: ActionsDataProvider<*>, callback: (PageProvider) -> Unit): List<AnAction> {
return products.map { pr -> SettingChooserItemAction(pr, provider, callback) }
}

View File

@@ -2,7 +2,7 @@
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.icons.AllIcons
import com.intellij.ide.startup.importSettings.chooser.ui.ProductProvider
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.chooser.ui.UiUtils
import com.intellij.openapi.actionSystem.*
import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl
@@ -13,7 +13,7 @@ import com.intellij.util.ui.JBUI
import java.awt.*
import javax.swing.*
class ProductChooserDialog : ProductProvider() {
class ProductChooserDialog : PageProvider() {
private val accountLabel = JLabel("user.name").apply {
icon = AllIcons.General.User
}
@@ -24,12 +24,16 @@ class ProductChooserDialog : ProductProvider() {
})
}
private val callback: (PageProvider)-> Unit = {
parentDialog?.showPage(it) ?: run {
close(OK_EXIT_CODE)
it.show()
}
}
init {
val group = DefaultActionGroup()
group.isPopup = false
val callback: (Int)-> Unit = {
close(OK_EXIT_CODE)
}
group.add(SyncStateAction())
group.add(SyncChooserAction(callback))
@@ -49,7 +53,6 @@ class ProductChooserDialog : ProductProvider() {
act.targetComponent = pane
pane.add(act.component)
init()
}
private fun createActionToolbar(group: ActionGroup, horizontal: Boolean): ActionToolbar {
@@ -86,7 +89,7 @@ class ProductChooserDialog : ProductProvider() {
rightSideButtons: MutableList<out JButton>,
addHelpToLeftSide: Boolean): JPanel {
val group = DefaultActionGroup()
group.add(OtherOptions({}))
group.add(OtherOptions(callback))
val at = createActionToolbar(group, true)
at.targetComponent = pane

View File

@@ -1,18 +1,23 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.startup.importSettings.chooser.productChooser
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.ide.startup.importSettings.chooser.ui.MultiplePageDialog
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareAction
class ProductChooserDialogAction : DumbAwareAction() {
override fun actionPerformed(e: AnActionEvent) {
ImportSettingsDialogWrapper.show(ProductChooserDialog())
MultiplePageDialog.show(ProductChooserDialog())
}
}
class ProductChooserSingleDialogAction : DumbAwareAction() {
override fun actionPerformed(e: AnActionEvent) {
ImportSettingsDialogWrapper.show(ProductChooserDialog())
val dialog = ProductChooserDialog()
dialog.isModal = false
dialog.isResizable = false
dialog.show()
dialog.pack()
}
}

View File

@@ -1,13 +1,12 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.startup.importSettings.chooser.settingChooser
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.ide.startup.importSettings.chooser.ui.ProductProvider
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.*
import java.awt.event.ActionEvent
import javax.swing.Action
fun createDialog(provider: ActionsDataProvider<*>, product: SettingsContributor): ProductProvider {
fun createDialog(provider: ActionsDataProvider<*>, product: SettingsContributor): PageProvider {
if(provider is SyncActionsDataProvider && provider.productService.baseProduct(product.id)) {
return SyncSettingDialog(provider, product)
}
@@ -61,8 +60,7 @@ class SyncSettingDialog(val provider: SyncActionsDataProvider, product: Settings
override fun doAction(e: ActionEvent?) {
provider.productService.importSyncSettings()
close(OK_EXIT_CODE)
ImportSettingsDialogWrapper.doOk()
doAction(OK_EXIT_CODE)
}
}
}

View File

@@ -2,8 +2,7 @@
package com.intellij.ide.startup.importSettings.chooser.settingChooser
import com.intellij.ide.startup.importSettings.chooser.productChooser.ProductChooserDialog
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.ide.startup.importSettings.chooser.ui.ProductProvider
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.ActionsDataProvider
import com.intellij.ide.startup.importSettings.data.IconProductSize
import com.intellij.ide.startup.importSettings.data.SettingsContributor
@@ -25,7 +24,7 @@ import javax.swing.JComponent
import javax.swing.JPanel
import javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER
open class SettingChooserDialog(private val provider: ActionsDataProvider<*>, val product: SettingsContributor) : ProductProvider() {
open class SettingChooserDialog(private val provider: ActionsDataProvider<*>, val product: SettingsContributor) : PageProvider() {
open val configurable = true
protected val settingPanes = mutableListOf<BaseSettingPane>()
@@ -93,31 +92,16 @@ open class SettingChooserDialog(private val provider: ActionsDataProvider<*>, va
)
}
init {
init()
}
override fun createContent(): JComponent? {
return pane
}
override fun doOKAction() {
super.doOKAction()
ImportSettingsDialogWrapper.doOk()
}
override fun doCancelAction() {
super.doCancelAction()
ImportSettingsDialogWrapper.doAction(CANCEL_EXIT_CODE)
}
protected fun getBackAction(): Action {
return object : DialogWrapperAction("Back") {
override fun doAction(e: ActionEvent?) {
ImportSettingsDialogWrapper.show(ProductChooserDialog())
close(CANCEL_EXIT_CODE)
parentDialog?.showPage(ProductChooserDialog())
doAction(CANCEL_EXIT_CODE)
}
}
}

View File

@@ -1,7 +1,7 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.startup.importSettings.chooser.settingChooser
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.ide.startup.importSettings.chooser.ui.MultiplePageDialog
import com.intellij.ide.startup.importSettings.data.JBrActionsDataProvider
import com.intellij.ide.startup.importSettings.data.TestJbService
import com.intellij.openapi.actionSystem.AnActionEvent
@@ -9,7 +9,7 @@ import com.intellij.openapi.project.DumbAwareAction
class SettingChooserDialogAction : DumbAwareAction() {
override fun actionPerformed(e: AnActionEvent) {
ImportSettingsDialogWrapper.show(SettingChooserDialog(JBrActionsDataProvider.getInstance(), TestJbService.main))
MultiplePageDialog.show(SettingChooserDialog(JBrActionsDataProvider.getInstance(), TestJbService.main))
}
}

View File

@@ -1,14 +1,13 @@
// Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license.
package com.intellij.ide.startup.importSettings.chooser.settingChooser
import com.intellij.ide.startup.importSettings.chooser.ui.ImportSettingsDialogWrapper
import com.intellij.ide.startup.importSettings.chooser.ui.PageProvider
import com.intellij.ide.startup.importSettings.data.ActionsDataProvider
import com.intellij.ide.startup.importSettings.data.Product
import com.intellij.openapi.actionSystem.AnActionEvent
import com.intellij.openapi.project.DumbAwareAction
import com.intellij.openapi.ui.DialogWrapper
class SettingChooserItemAction(val product: Product, val provider: ActionsDataProvider<*>, val callback: (Int) -> Unit) : DumbAwareAction() {
class SettingChooserItemAction(val product: Product, val provider: ActionsDataProvider<*>, val callback: (PageProvider) -> Unit) : DumbAwareAction() {
override fun displayTextInToolbar(): Boolean {
return true
@@ -21,10 +20,7 @@ class SettingChooserItemAction(val product: Product, val provider: ActionsDataPr
}
override fun actionPerformed(e: AnActionEvent) {
callback(DialogWrapper.OK_EXIT_CODE)
ImportSettingsDialogWrapper.show(createDialog(provider, product))
callback(createDialog(provider, product))
}
}

View File

@@ -1,48 +1,25 @@
package com.intellij.ide.startup.importSettings.chooser.ui
import com.intellij.openapi.ui.DialogWrapper
import com.intellij.openapi.util.Disposer
import com.intellij.util.ui.JBDimension
import java.awt.GridBagConstraints
import java.awt.GridBagLayout
import javax.swing.JComponent
import javax.swing.JPanel
import javax.swing.SwingUtilities
import javax.swing.JRootPane
class ImportSettingsDialogWrapper private constructor() : DialogWrapper(null) {
class MultiplePageDialog private constructor(): DialogWrapper(null) {
companion object{
private var sdw: ImportSettingsDialogWrapper? = null
fun show(page: PageProvider) {
val dialog = MultiplePageDialog()
dialog.showPage(page)
dialog.isModal = false
dialog.isResizable = false
dialog.show()
fun doOk() {
sdw?.doOk()
}
fun doAction(exitCode: Int) {
sdw?.close(exitCode)
}
fun show(dialog: ProductProvider): DialogWrapper {
var dw = sdw ?: ImportSettingsDialogWrapper()
if(dw.isDisposed) {
dw = ImportSettingsDialogWrapper()
Disposer.register(dw.disposable) { sdw = null }
}
if(!dw.isShowing) {
dw.isResizable = true
dw.isModal = false
dw.show()
}
dw.showDialog(dialog)
SwingUtilities.invokeLater{
dw.pack()
}
sdw = dw
return dw
dialog.pack()
}
}
init {
init()
}
@@ -51,14 +28,9 @@ class ImportSettingsDialogWrapper private constructor() : DialogWrapper(null) {
private lateinit var southPanel: JComponent
private var current: ProductProvider? = null
private var current: PageProvider? = null
fun doOk() {
applyFields()
close(OK_EXIT_CODE)
}
fun showDialog(dialog: ProductProvider) {
fun showPage(dialog: PageProvider) {
val gbc = GridBagConstraints()
gbc.gridx = 0
gbc.gridy = 0
@@ -66,6 +38,8 @@ class ImportSettingsDialogWrapper private constructor() : DialogWrapper(null) {
gbc.weighty = 1.0
gbc.fill = GridBagConstraints.BOTH
dialog.parentDialog = this
dialog.content?.let {
panel.add(it, gbc)
}
@@ -95,9 +69,39 @@ class ImportSettingsDialogWrapper private constructor() : DialogWrapper(null) {
}
}
abstract class ProductProvider : DialogWrapper(null) {
abstract class PageProvider() : DialogWrapper(null) {
var content: JComponent? = null
var southPanel: JComponent = JPanel()
var parentDialog: MultiplePageDialog? = null
set(value) {
field = value
init()
}
override fun getRootPane(): JRootPane {
return parentDialog?.rootPane ?: super.getRootPane()
}
override fun doOKAction() {
super.doOKAction()
parentDialog?.performOKAction()
}
fun doAction(exitCode: Int){
close(exitCode)
}
override fun doCancelAction() {
super.doCancelAction()
parentDialog?.doCancelAction()
}
override fun show() {
if(parentDialog != null) return
init()
super.show()
}
final override fun createCenterPanel(): JComponent? {
content = createContent()
return content