1818 */
1919package net.sourceforge.ganttproject.importer
2020
21- import biz.ganttproject.app.RootLocalizer
21+ import biz.ganttproject.app.*
2222import biz.ganttproject.core.option.GPOptionGroup
2323import com.github.michaelbull.result.Err
2424import com.github.michaelbull.result.Ok
2525import com.github.michaelbull.result.Result
2626import com.github.michaelbull.result.andThen
2727import javafx.beans.property.SimpleObjectProperty
2828import javafx.scene.Node
29- import javafx.scene.control.Label
3029import net.sourceforge.ganttproject.IGanttProject
3130import net.sourceforge.ganttproject.filter.ExtensionBasedFileFilter
3231import net.sourceforge.ganttproject.gui.FileChooserPageBase
3332import net.sourceforge.ganttproject.gui.UIFacade
3433import net.sourceforge.ganttproject.gui.projectwizard.WizardModel
3534import net.sourceforge.ganttproject.gui.projectwizard.WizardPage
3635import net.sourceforge.ganttproject.gui.projectwizard.showWizard
37- import net.sourceforge.ganttproject.plugins.PluginManager.*
36+ import net.sourceforge.ganttproject.plugins.PluginManager.getExtensions
3837import org.osgi.service.prefs.Preferences
3938import java.awt.Component
4039import java.io.File
@@ -52,7 +51,7 @@ class ImportFileWizard(uiFacade: UIFacade, project: IGanttProject, pluginPrefere
5251 filePage.selectedFileProperty.addListener { _, _, _ ->
5352 wizardModel.needsRefresh.set(true , this )
5453 }
55- wizardModel.addPage(ImporterChooserPage (importers, uiFacade, pluginPreferences , wizardModel))
54+ wizardModel.addPage(ImporterChooserPageFx (importers, wizardModel))
5655 wizardModel.addPage(filePage)
5756 wizardModel.customPageProperty.addListener { _, oldValue, newValue ->
5857 if (oldValue == null && newValue != null ) {
@@ -68,6 +67,9 @@ class ImportFileWizard(uiFacade: UIFacade, project: IGanttProject, pluginPrefere
6867 }
6968}
7069
70+ // --------------------------------------------------------------------------------------------------------------------
71+ // --------------------------------------------------------------------------------------------------------------------
72+
7173/* *
7274 * Model for the import wizard, managing importer and file selection.
7375 */
@@ -78,6 +80,7 @@ class ImporterWizardModel: WizardModel() {
7880 field = value
7981 customPageProperty.set(null )
8082 value?.customPage?.let { customPageProperty.set(it) }
83+ needsRefresh.set(true , this )
8184 }
8285
8386 // Selected file.
@@ -105,36 +108,57 @@ private fun getImporters(): MutableList<Importer> {
105108 return getExtensions(Importer .EXTENSION_POINT_ID , Importer ::class .java)
106109}
107110
108- private class ImporterChooserPageFx (
109- importers : List <Importer >,
110- uiFacade : UIFacade ,
111- pluginPreferences : Preferences ,
112- wizardModel : ImporterWizardModel
113- ) : WizardPage {
114- override val title: String = i18n.formatText(" importerChooserPageTitle" )
115- override val component: Component ?
116- get() = null
111+ // --------------------------------------------------------------------------------------------------------------------
112+ // --------------------------------------------------------------------------------------------------------------------
117113
118- override fun setActive (b : Boolean ) {
114+ /* *
115+ * The first page in the import wizard that allows the user to choose an importer.
116+ */
117+ private class ImporterChooserPageFx (importers : List <Importer >, model : ImporterWizardModel ) : WizardPage {
118+ override val title: String = RootLocalizer .formatText(" importerChooserPageTitle" )
119+
120+ private val titles = importers.flatMapIndexed { index, importer -> listOf (
121+ " title.$index " to { LocalizedString (importer.fileTypeDescription, DummyLocalizer )},
122+ " title.$index .help" to { LocalizedString (" " , DummyLocalizer )}
123+ )}.toMap()
124+
125+ override val fxComponent: Node ? by lazy {
126+ val optionPaneBuilder = OptionPaneBuilder <Importer >().apply {
127+ this .i18n = MappingLocalizer (titles, DummyLocalizer ::create)
128+ this .styleClass = " exporter-chooser-page"
129+ elements = importers.mapIndexed { index, importer ->
130+ OptionElementData (" title.${index} " , importer, isSelected = (index == 0 ),
131+ customContent = null )
132+ }
133+ onSelect = { model.importer = it }
134+ }
135+ optionPaneBuilder.buildPane()
119136 }
120137
121- override val fxComponent: Node by lazy {
122- Label (" foo" )
138+ override val component: Component ? = null
139+
140+ override fun setActive (b : Boolean ) {
123141 }
124142}
143+
144+ // --------------------------------------------------------------------------------------------------------------------
145+ // --------------------------------------------------------------------------------------------------------------------
146+
125147/* *
126148 * Wizard page for choosing a file to import from.
127149 */
128150private class ImportFileChooserPage (
129- private val state : ImporterWizardModel , project : IGanttProject , prefs : Preferences , uiFacade : UIFacade )
130- : FileChooserPageBase (prefs, project.document, uiFacade, fileChooserTitle = " " ,
151+ private val state : ImporterWizardModel , project : IGanttProject , private val prefs : Preferences , uiFacade : UIFacade )
152+ : FileChooserPageBase (project.document, uiFacade, fileChooserTitle = " " ,
131153 pageTitle = i18n.formatText(" importerFileChooserPageTitle" )) {
132154
133155 val importer get() = state.importer
134156
157+ override val preferences: Preferences get() = prefs.node(state.importer?.id ? : " " )
158+
135159 init {
136160 hasOverwriteOption = false
137- selectedFileProperty.addListener { value, file , newValue ->
161+ selectedFileProperty.addListener { _, _ , newValue ->
138162 state.file = newValue
139163 }
140164 }
@@ -144,7 +168,6 @@ private class ImportFileChooserPage(
144168 return ExtensionBasedFileFilter (it.getFileNamePattern(), it.getFileTypeDescription())
145169 }
146170
147-
148171 override val optionGroups: List <GPOptionGroup > = emptyList()
149172
150173 override fun validateFile (file : File ? ): Result <File ?, String ?> {
0 commit comments