diff --git a/src/main/kotlin/app/termora/FramePlugin.kt b/src/main/kotlin/app/termora/FramePlugin.kt new file mode 100644 index 0000000..05e9b6f --- /dev/null +++ b/src/main/kotlin/app/termora/FramePlugin.kt @@ -0,0 +1,21 @@ +package app.termora + +import app.termora.database.DatabaseChangedExtension +import app.termora.database.DatabasePropertiesChangedExtension +import app.termora.plugin.Extension +import app.termora.plugin.InternalPlugin + +internal class FramePlugin : InternalPlugin() { + init { + support.addExtension(DatabasePropertiesChangedExtension::class.java) { KeymapRefresher.getInstance() } + support.addExtension(DatabaseChangedExtension::class.java) { KeymapRefresher.getInstance() } + } + + override fun getName(): String { + return "Frame" + } + + override fun getExtensions(clazz: Class): List { + return support.getExtensions(clazz) + } +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/KeymapRefresher.kt b/src/main/kotlin/app/termora/KeymapRefresher.kt new file mode 100644 index 0000000..1effdfd --- /dev/null +++ b/src/main/kotlin/app/termora/KeymapRefresher.kt @@ -0,0 +1,65 @@ +package app.termora + +import app.termora.database.DatabaseChangedExtension +import app.termora.database.DatabasePropertiesChangedExtension +import app.termora.keymap.KeymapManager + +internal class KeymapRefresher private constructor() : DatabasePropertiesChangedExtension, DatabaseChangedExtension { + companion object { + fun getInstance(): KeymapRefresher { + return ApplicationScope.forApplicationScope() + .getOrCreate(KeymapRefresher::class) { KeymapRefresher() } + } + } + + private val listeners = mutableListOf<() -> Unit>() + private var currentKeymap: String? = null + private val keymapManager get() = KeymapManager.getInstance() + private val activeKeymapName get() = keymapManager.getActiveKeymap().name + + override fun onDataChanged( + id: String, + type: String, + action: DatabaseChangedExtension.Action, + source: DatabaseChangedExtension.Source + ) { + if (type != "Keymap") return + refresh() + } + + override fun onPropertyChanged(name: String, key: String, value: String) { + if (name != "Setting.Properties") return + if (key != "Keymap.Active") return + refresh() + } + + private fun refresh() { + synchronized(this) { + if (currentKeymap == activeKeymapName) { + return + } + + currentKeymap = activeKeymapName + + for (function in listeners) { + function.invoke() + } + } + } + + fun addRefreshListener(listener: () -> Unit): Disposable { + synchronized(this) { + listeners.add(listener) + return object : Disposable { + override fun dispose() { + removeRefreshListener(listener) + } + } + } + } + + fun removeRefreshListener(listener: () -> Unit) { + synchronized(this) { listeners.remove(listener) } + } + +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/SettingsDialog.kt b/src/main/kotlin/app/termora/SettingsDialog.kt index 2de5933..f37d9e6 100644 --- a/src/main/kotlin/app/termora/SettingsDialog.kt +++ b/src/main/kotlin/app/termora/SettingsDialog.kt @@ -9,7 +9,7 @@ import javax.swing.JComponent import javax.swing.JPanel import javax.swing.UIManager -class SettingsDialog(owner: Window) : DialogWrapper(owner) { +internal class SettingsDialog(owner: Window) : DialogWrapper(owner) { private val optionsPane = SettingsOptionsPane() private val properties get() = DatabaseManager.getInstance().properties diff --git a/src/main/kotlin/app/termora/TermoraFrame.kt b/src/main/kotlin/app/termora/TermoraFrame.kt index 62ef89c..b7b2768 100644 --- a/src/main/kotlin/app/termora/TermoraFrame.kt +++ b/src/main/kotlin/app/termora/TermoraFrame.kt @@ -2,8 +2,6 @@ package app.termora import app.termora.actions.* -import app.termora.database.DatabaseChangedExtension -import app.termora.database.DatabasePropertiesChangedExtension import app.termora.findeverywhere.FindEverywhereProvider import app.termora.findeverywhere.FindEverywhereProviderExtension import app.termora.findeverywhere.FindEverywhereResult @@ -73,12 +71,8 @@ class TermoraFrame : JFrame(), DataProvider { } // 快捷键变动时重新监听 - val refresher = KeymapRefresher() - dynamicExtensionHandler.register(DatabasePropertiesChangedExtension::class.java, refresher) + KeymapRefresher.getInstance().addRefreshListener { initKeymap() } .let { Disposer.register(windowScope, it) } - dynamicExtensionHandler.register(DatabaseChangedExtension::class.java, refresher) - .let { Disposer.register(windowScope, it) } - // FindEverywhere dynamicExtensionHandler @@ -418,29 +412,6 @@ class TermoraFrame : JFrame(), DataProvider { return object : MouseAdapter() {} } - private inner class KeymapRefresher : DatabasePropertiesChangedExtension, DatabaseChangedExtension { - - override fun onDataChanged( - id: String, - type: String, - action: DatabaseChangedExtension.Action, - source: DatabaseChangedExtension.Source - ) { - if (type != "Keymap") return - refresh() - } - - override fun onPropertyChanged(name: String, key: String, value: String) { - if (name != "Setting.Properties") return - if (key != "Keymap.Active") return - refresh() - } - - private fun refresh() { - initKeymap() - } - - } private inner class RedirectAnActionEvent( source: Any, diff --git a/src/main/kotlin/app/termora/plugin/PluginManager.kt b/src/main/kotlin/app/termora/plugin/PluginManager.kt index 5561f44..16999ad 100644 --- a/src/main/kotlin/app/termora/plugin/PluginManager.kt +++ b/src/main/kotlin/app/termora/plugin/PluginManager.kt @@ -2,6 +2,7 @@ package app.termora.plugin import app.termora.Application import app.termora.ApplicationScope +import app.termora.FramePlugin import app.termora.account.AccountPlugin import app.termora.plugin.internal.badge.BadgePlugin import app.termora.plugin.internal.extension.DynamicExtensionPlugin @@ -111,6 +112,8 @@ internal class PluginManager private constructor() { plugins.add(PluginDescriptor(BadgePlugin(), origin = PluginOrigin.Internal, version = version)) // update plugin plugins.add(PluginDescriptor(UpdatePlugin(), origin = PluginOrigin.Internal, version = version)) + // frame plugin + plugins.add(PluginDescriptor(FramePlugin(), origin = PluginOrigin.Internal, version = version)) // ssh plugin plugins.add(PluginDescriptor(SSHInternalPlugin(), origin = PluginOrigin.Internal, version = version))