EN · DE · RU · FR · ES

#331: SwingSetupWizard.kt

projectforge-application/src/main/kotlin/org/projectforge/setup/wizard/swing/SwingSetupWizard.kt Тип: Kotlin · Роль: Мастер настройки · Исходник: projectforge-application/src/main/kotlin/org/projectforge/setup/wizard/swing/SwingSetupWizard.kt 149 строк · 107 кода · 26 комментариев · 16 пустых
Файл исходного кода projectforge-application/src/main/kotlin/org/projectforge/setup/wizard/swing/SwingSetupWizard.kt, содержащий код Kotlin для слоя мастера настройки.

Структура кода

Аннотации: return, JvmStatic

Классы: SwingSetupWizard

Супертип(ы): AbstractSetupWizard

Функции (6): windowClosing, run, setActiveWindow, finish, run, main

Свойства (18): context, chooseDirectoryScreen, finalizeScreen, frame, cardLayout, cards, lock, condition, applicationClass, quitStrategyClass, getApplicationMethod, setQuitStrategyMethod, disableSuddenTerminationMethod, application, quitStrategy, scrPane, window, cl

Импорты: 16 пакетов

Пакет: org.projectforge.setup.wizard.swing

Исходный код (сокращённый)

package org.projectforge.setup.wizard.swing

import org.projectforge.common.CanonicalFileUtils
import org.projectforge.common.EmphasizedLogSupport
import org.projectforge.setup.SetupData
import org.projectforge.setup.wizard.AbstractSetupWizard
import java.awt.CardLayout
import java.awt.GridBagConstraints
import java.awt.GridBagLayout
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import java.io.File
import java.io.IOException
import java.util.concurrent.locks.ReentrantLock
import javax.swing.JFrame
import javax.swing.JPanel
import javax.swing.JScrollPane
import kotlin.concurrent.withLock

class SwingSetupWizard(presetAppHomeDir: File? = null) : AbstractSetupWizard() {
    override val context: SwingGUIContext
    private val chooseDirectoryScreen: SwingChooseDirectoryScreen
    private val finalizeScreen: SwingFinalizeScreen
    private val frame = JFrame("Настройка ProjectForge")
    private val cardLayout: CardLayout
    private val cards: JPanel
    private val lock = ReentrantLock()
    private val condition = lock.newCondition()

    init {
        frame.setSize(1024, 600)
        frame.layout = GridBagLayout()
        frame.defaultCloseOperation = JFrame.DO_NOTHING_ON_CLOSE
        try {
            // Требуется рефлексия, так как классы Apple могут быть недоступны:
            val applicationClass = Class.forName("com.apple.eawt.Application")
            val quitStrategyClass = Class.forName("com.apple.eawt.QuitStrategy")
            val getApplicationMethod = applicationClass.getDeclaredMethod("getApplication")
            val setQuitStrategyMethod = applicationClass.getDeclaredMethod("setQuitStrategy", quitStrategyClass)
            val disableSuddenTerminationMethod = applicationClass.getDeclaredMethod("disableSuddenTermination")

            val application = getApplicationMethod.invoke(null)
            val quitStrategy = quitStrategyClass.enumConstants.find { it.toString() == "CLOSE_ALL_WINDOWS" }//.QuitStrategy.CLOSE_ALL_WINDOWS
            setQuitStrategyMethod.invoke(application, quitStrategy)  //Application.getApplication().setQuitStrategy(QuitStrategy.CLOSE_ALL_WINDOWS)
            disableSuddenTerminationMethod.invoke(application) // Application.getApplication().disableSuddenTermination()
        } catch (ex: Exception) {
            log.debug("Не система MacOS или JVM MacOS не поддерживает com.apple.eawt.Application (нормально).")
        }
        frame.addWindowListener(object : WindowAdapter() {
            override fun windowClosing(e: WindowEvent?) {
                exit()
            }
        })

        context = SwingGUIContext(this, frame)
        context.setupData.applicationHomeDir = presetAppHomeDir

        chooseDirectoryScreen = SwingChooseDirectoryScreen(context)
        finalizeScreen = SwingFinalizeScreen(context)

        cardLayout = CardLayout()
        cards = JPanel(cardLayout)
        cards.add(chooseDirectoryScreen.mainPanel, ScreenID.CHOOSE_DIR.name)
        cards.add(finalizeScreen.mainPanel, ScreenID.FINALIZE.name)
        val scrPane = JScrollPane(cards)
        frame.contentPane.add(scrPane, SwingUtils.constraints(0, 0, fill = GridBagConstraints.BOTH, weightx = 1.0, weighty = 1.0))

        frame.isVisible = true
    }

    /**
     * @return Настройки пользователя или null, если пользователь отменил мастер через выход.
     */
    override fun run(): SetupData? {
        super.initialize()
        lock.withLock {
            condition.await()
        }
        return super.run()
    }

    override fun setActiveWindow(nextScreen: ScreenID) {
        val window = when (nextScreen) {
            ScreenID.CHOOSE_DIR -> chooseDirectoryScreen
            else -> finalizeScreen
        }
        window.redraw()
        val cl = cards.layout as CardLayout
        cl.show(cards, nextScreen.name)
    }


    override fun finish() {
        frame.dispose()
        lock.withLock {
            condition.signal()
        }
    }

    companion object {
        private val log = org.slf4j.LoggerFactory.getLogger(SwingSetupWizard::class.java)

        @JvmStatic
        fun run(appHomeDir: File? = null): SetupData? {
            log.info("Запуск графического мастера...")
            return try {
                SwingSetupWizard(appHomeDir).run()
            } catch (ex: IOException) {
                EmphasizedLogSupport(log)
                        .log("Не удалось запустить графический мастер настройки, рабочий стол, похоже, недоступен.")
                        .logEnd()
                return null
            }
        }

        @JvmStatic
        fun main(args: Array<String>) {
            try {
                val result = SwingSetupWizard().run()
// ... (сокращено, всего 127 строк)

История Git

868d6abb7 2025 -> 2026
63081666f Заголовки исходных файлов: 2024-> 2025.
b6092df09 Авторские права 2023 -> 2024
ab45d51fa Авторские права 2001-2022 -> 2001-2023.
5f7ef41b8 Авторские права 2021 -> 2022