chore: improve factories

This commit is contained in:
hstyi
2025-03-13 20:44:51 +08:00
committed by hstyi
parent 75c65d9ba8
commit aef44bd0da
17 changed files with 33 additions and 60 deletions

View File

@@ -13,7 +13,7 @@ import javax.swing.Icon
abstract class HostTerminalTab( abstract class HostTerminalTab(
val windowScope: WindowScope, val windowScope: WindowScope,
val host: Host, val host: Host,
protected val terminal: Terminal = TerminalFactory.getInstance(windowScope).createTerminal() protected val terminal: Terminal = TerminalFactory.getInstance().createTerminal()
) : PropertyTerminalTab(), DataProvider { ) : PropertyTerminalTab(), DataProvider {
companion object { companion object {
val Host = DataKey(app.termora.Host::class) val Host = DataKey(app.termora.Host::class)

View File

@@ -9,7 +9,7 @@ class LocalTerminalTab(windowScope: WindowScope, host: Host) :
override suspend fun openPtyConnector(): PtyConnector { override suspend fun openPtyConnector(): PtyConnector {
val winSize = terminalPanel.winSize() val winSize = terminalPanel.winSize()
val ptyConnector = PtyConnectorFactory.getInstance(windowScope).createPtyConnector( val ptyConnector = PtyConnectorFactory.getInstance().createPtyConnector(
winSize.rows, winSize.cols, winSize.rows, winSize.cols,
host.options.envs(), host.options.envs(),
Charsets.toCharset(host.options.encoding, StandardCharsets.UTF_8), Charsets.toCharset(host.options.encoding, StandardCharsets.UTF_8),

View File

@@ -14,9 +14,7 @@ class MultiplePtyConnector(
private val isMultiple get() = ActionManager.getInstance().isSelected(Actions.MULTIPLE) private val isMultiple get() = ActionManager.getInstance().isSelected(Actions.MULTIPLE)
private val ptyConnectors private val ptyConnectors
get() = ApplicationScope.forApplicationScope() get() = PtyConnectorFactory.getInstance().getPtyConnectors()
.windowScopes().map { PtyConnectorFactory.getInstance(it).getPtyConnectors() }
.flatten()
override fun write(buffer: ByteArray, offset: Int, len: Int) { override fun write(buffer: ByteArray, offset: Int, len: Int) {
if (isMultiple) { if (isMultiple) {

View File

@@ -1,7 +1,6 @@
package app.termora package app.termora
import app.termora.actions.AnActionEvent import app.termora.actions.AnActionEvent
import app.termora.actions.DataProvider
import app.termora.actions.DataProviders import app.termora.actions.DataProviders
import com.formdev.flatlaf.extras.components.FlatTabbedPane import com.formdev.flatlaf.extras.components.FlatTabbedPane
import org.apache.commons.lang3.StringUtils import org.apache.commons.lang3.StringUtils
@@ -237,11 +236,8 @@ class MyTabbedPane : FlatTabbedPane() {
private fun dragToAnotherWindow(oldFrame: TermoraFrame, frame: TermoraFrame) { private fun dragToAnotherWindow(oldFrame: TermoraFrame, frame: TermoraFrame) {
val tab = this.terminalTab ?: return val tab = this.terminalTab ?: return
val terminalPanel = (tab as DataProvider?)?.getData(DataProviders.TerminalPanel) ?: return
val tabbedManager = frame.getData(DataProviders.TerminalTabbed) ?: return val tabbedManager = frame.getData(DataProviders.TerminalTabbed) ?: return
val tabbedPane = frame.getData(DataProviders.TabbedPane) ?: return val tabbedPane = frame.getData(DataProviders.TabbedPane) ?: return
val windowScope = frame.getData(DataProviders.WindowScope) ?: return
val oldWindowScope = oldFrame.getData(DataProviders.WindowScope) ?: return
val location = Point(MouseInfo.getPointerInfo().location) val location = Point(MouseInfo.getPointerInfo().location)
SwingUtilities.convertPointFromScreen(location, tabbedPane) SwingUtilities.convertPointFromScreen(location, tabbedPane)
val index = tabbedPane.indexAtLocation(location.x, location.y) val index = tabbedPane.indexAtLocation(location.x, location.y)
@@ -253,11 +249,6 @@ class MyTabbedPane : FlatTabbedPane() {
index index
) )
TerminalPanelFactory.getInstance(oldWindowScope).removeTerminalPanel(terminalPanel)
TerminalPanelFactory.getInstance(windowScope).addTerminalPanel(terminalPanel)
if (frame.hasFocus()) { if (frame.hasFocus()) {
return return
} }

View File

@@ -18,8 +18,8 @@ class PtyConnectorFactory : Disposable {
companion object { companion object {
private val log = LoggerFactory.getLogger(PtyConnectorFactory::class.java) private val log = LoggerFactory.getLogger(PtyConnectorFactory::class.java)
fun getInstance(scope: Scope): PtyConnectorFactory { fun getInstance(): PtyConnectorFactory {
return scope.getOrCreate(PtyConnectorFactory::class) { PtyConnectorFactory() } return ApplicationScope.forApplicationScope().getOrCreate(PtyConnectorFactory::class) { PtyConnectorFactory() }
} }
} }

View File

@@ -13,7 +13,7 @@ import kotlin.time.Duration.Companion.milliseconds
abstract class PtyHostTerminalTab( abstract class PtyHostTerminalTab(
windowScope: WindowScope, windowScope: WindowScope,
host: Host, host: Host,
terminal: Terminal = TerminalFactory.getInstance(windowScope).createTerminal() terminal: Terminal = TerminalFactory.getInstance().createTerminal()
) : HostTerminalTab(windowScope, host, terminal) { ) : HostTerminalTab(windowScope, host, terminal) {
companion object { companion object {
@@ -24,10 +24,10 @@ abstract class PtyHostTerminalTab(
private var readerJob: Job? = null private var readerJob: Job? = null
private val ptyConnectorDelegate = PtyConnectorDelegate() private val ptyConnectorDelegate = PtyConnectorDelegate()
private val terminalPanelFactory = TerminalPanelFactory.getInstance(windowScope) private val terminalPanelFactory = TerminalPanelFactory.getInstance()
protected val terminalPanel = terminalPanelFactory.createTerminalPanel(terminal, ptyConnectorDelegate) protected val terminalPanel = terminalPanelFactory.createTerminalPanel(terminal, ptyConnectorDelegate)
.apply { Disposer.register(this@PtyHostTerminalTab, this) } .apply { Disposer.register(this@PtyHostTerminalTab, this) }
protected val ptyConnectorFactory get() = PtyConnectorFactory.getInstance(windowScope) protected val ptyConnectorFactory get() = PtyConnectorFactory.getInstance()
init { init {
terminal.getTerminalModel().setData(DataKey.PtyConnector, ptyConnectorDelegate) terminal.getTerminalModel().setData(DataKey.PtyConnector, ptyConnectorDelegate)

View File

@@ -340,7 +340,7 @@ class SettingsOptionsPane : OptionsPane() {
floatingToolbarComboBox.addItemListener { e -> floatingToolbarComboBox.addItemListener { e ->
if (e.stateChange == ItemEvent.SELECTED) { if (e.stateChange == ItemEvent.SELECTED) {
terminalSetting.floatingToolbar = floatingToolbarComboBox.selectedItem as Boolean terminalSetting.floatingToolbar = floatingToolbarComboBox.selectedItem as Boolean
TerminalPanelFactory.getAllTerminalPanel().forEach { tp -> TerminalPanelFactory.getInstance().getTerminalPanels().forEach { tp ->
if (terminalSetting.floatingToolbar && FloatingToolbarPanel.isPined) { if (terminalSetting.floatingToolbar && FloatingToolbarPanel.isPined) {
tp.getData(FloatingToolbarPanel.FloatingToolbar)?.triggerShow() tp.getData(FloatingToolbarPanel.FloatingToolbar)?.triggerShow()
} else { } else {
@@ -369,7 +369,7 @@ class SettingsOptionsPane : OptionsPane() {
if (it.stateChange == ItemEvent.SELECTED) { if (it.stateChange == ItemEvent.SELECTED) {
val style = cursorStyleComboBox.selectedItem as CursorStyle val style = cursorStyleComboBox.selectedItem as CursorStyle
terminalSetting.cursor = style terminalSetting.cursor = style
TerminalFactory.getInstance(ApplicationScope.forWindowScope(owner)).getTerminals().forEach { e -> TerminalFactory.getInstance().getTerminals().forEach { e ->
e.getTerminalModel().setData(DataKey.CursorStyle, style) e.getTerminalModel().setData(DataKey.CursorStyle, style)
} }
} }
@@ -379,7 +379,7 @@ class SettingsOptionsPane : OptionsPane() {
debugComboBox.addItemListener { e -> debugComboBox.addItemListener { e ->
if (e.stateChange == ItemEvent.SELECTED) { if (e.stateChange == ItemEvent.SELECTED) {
terminalSetting.debug = debugComboBox.selectedItem as Boolean terminalSetting.debug = debugComboBox.selectedItem as Boolean
TerminalFactory.getInstance(ApplicationScope.forWindowScope(owner)).getTerminals().forEach { TerminalFactory.getInstance().getTerminals().forEach {
it.getTerminalModel().setData(TerminalPanel.Debug, terminalSetting.debug) it.getTerminalModel().setData(TerminalPanel.Debug, terminalSetting.debug)
} }
} }
@@ -408,10 +408,8 @@ class SettingsOptionsPane : OptionsPane() {
} }
private fun fireFontChanged() { private fun fireFontChanged() {
ApplicationScope.windowScopes().forEach { TerminalPanelFactory.getInstance()
TerminalPanelFactory.getInstance(it)
.fireResize() .fireResize()
}
} }
private fun initView() { private fun initView() {

View File

@@ -10,8 +10,8 @@ class TerminalFactory private constructor() : Disposable {
private val terminals = mutableListOf<Terminal>() private val terminals = mutableListOf<Terminal>()
companion object { companion object {
fun getInstance(scope: WindowScope): TerminalFactory { fun getInstance(): TerminalFactory {
return scope.getOrCreate(TerminalFactory::class) { TerminalFactory() } return ApplicationScope.forApplicationScope().getOrCreate(TerminalFactory::class) { TerminalFactory() }
} }
} }

View File

@@ -19,14 +19,9 @@ class TerminalPanelFactory : Disposable {
private val Factory = DataKey(TerminalPanelFactory::class) private val Factory = DataKey(TerminalPanelFactory::class)
fun getInstance(scope: Scope): TerminalPanelFactory { fun getInstance(): TerminalPanelFactory {
return scope.getOrCreate(TerminalPanelFactory::class) { TerminalPanelFactory() } return ApplicationScope.forApplicationScope()
} .getOrCreate(TerminalPanelFactory::class) { TerminalPanelFactory() }
fun getAllTerminalPanel(): Array<TerminalPanel> {
return ApplicationScope.forApplicationScope().windowScopes()
.map { getInstance(it) }
.flatMap { it.terminalPanels }.toTypedArray()
} }
} }
@@ -97,10 +92,7 @@ class TerminalPanelFactory : Disposable {
coroutineScope.launch { coroutineScope.launch {
while (coroutineScope.isActive) { while (coroutineScope.isActive) {
delay(500.milliseconds) delay(500.milliseconds)
SwingUtilities.invokeLater { SwingUtilities.invokeLater { TerminalPanelFactory.getInstance().repaintAll() }
ApplicationScope.forApplicationScope().windowScopes()
.map { getInstance(it) }.forEach { it.repaintAll() }
}
} }
} }
} }

View File

@@ -1,6 +1,8 @@
package app.termora.actions package app.termora.actions
import app.termora.* import app.termora.I18n
import app.termora.Icons
import app.termora.TerminalPanelFactory
class MultipleAction : AnAction( class MultipleAction : AnAction(
I18n.getString("termora.tools.multiple"), I18n.getString("termora.tools.multiple"),
@@ -11,7 +13,6 @@ class MultipleAction : AnAction(
} }
override fun actionPerformed(evt: AnActionEvent) { override fun actionPerformed(evt: AnActionEvent) {
ApplicationScope.windowScopes().map { TerminalPanelFactory.getInstance(it) } TerminalPanelFactory.getInstance().repaintAll()
.forEach { it.repaintAll() }
} }
} }

View File

@@ -1,6 +1,5 @@
package app.termora.actions package app.termora.actions
import app.termora.ApplicationScope
import app.termora.Database import app.termora.Database
import app.termora.TerminalPanelFactory import app.termora.TerminalPanelFactory
@@ -13,10 +12,8 @@ abstract class TerminalZoomAction : AnAction() {
evt.getData(DataProviders.TerminalPanel) ?: return evt.getData(DataProviders.TerminalPanel) ?: return
if (zoom()) { if (zoom()) {
ApplicationScope.windowScopes().forEach { TerminalPanelFactory.getInstance()
TerminalPanelFactory.getInstance(it)
.fireResize() .fireResize()
}
evt.consume() evt.consume()
} }
} }

View File

@@ -1,6 +1,5 @@
package app.termora.highlight package app.termora.highlight
import app.termora.ApplicationScope
import app.termora.DialogWrapper import app.termora.DialogWrapper
import app.termora.TerminalFactory import app.termora.TerminalFactory
import com.formdev.flatlaf.util.SystemInfo import com.formdev.flatlaf.util.SystemInfo
@@ -31,7 +30,7 @@ class ChooseColorTemplateDialog(owner: Window, title: String) : DialogWrapper(ow
override fun createCenterPanel(): JComponent { override fun createCenterPanel(): JComponent {
val panel = JPanel(GridLayout(2, 8, 4, 4)) val panel = JPanel(GridLayout(2, 8, 4, 4))
val colorPalette = TerminalFactory.getInstance(ApplicationScope.forWindowScope(this)) val colorPalette = TerminalFactory.getInstance()
.createTerminal().getTerminalModel().getColorPalette() .createTerminal().getTerminalModel().getColorPalette()
for (i in 1..16) { for (i in 1..16) {
val c = JPanel() val c = JPanel()

View File

@@ -21,7 +21,7 @@ class KeywordHighlightDialog(owner: Window) : DialogWrapper(owner) {
private val table = FlatTable() private val table = FlatTable()
private val keywordHighlightManager by lazy { KeywordHighlightManager.getInstance() } private val keywordHighlightManager by lazy { KeywordHighlightManager.getInstance() }
private val colorPalette by lazy { private val colorPalette by lazy {
TerminalFactory.getInstance(ApplicationScope.forWindowScope(this)).createTerminal().getTerminalModel() TerminalFactory.getInstance().createTerminal().getTerminalModel()
.getColorPalette() .getColorPalette()
} }

View File

@@ -1,8 +1,8 @@
package app.termora.highlight package app.termora.highlight
import app.termora.ApplicationScope import app.termora.ApplicationScope
import app.termora.TerminalPanelFactory
import app.termora.Database import app.termora.Database
import app.termora.TerminalPanelFactory
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory
class KeywordHighlightManager private constructor() { class KeywordHighlightManager private constructor() {
@@ -27,7 +27,7 @@ class KeywordHighlightManager private constructor() {
fun addKeywordHighlight(keywordHighlight: KeywordHighlight) { fun addKeywordHighlight(keywordHighlight: KeywordHighlight) {
database.addKeywordHighlight(keywordHighlight) database.addKeywordHighlight(keywordHighlight)
keywordHighlights[keywordHighlight.id] = keywordHighlight keywordHighlights[keywordHighlight.id] = keywordHighlight
ApplicationScope.windowScopes().forEach { TerminalPanelFactory.getInstance(it).repaintAll() } TerminalPanelFactory.getInstance().repaintAll()
if (log.isDebugEnabled) { if (log.isDebugEnabled) {
log.debug("Keyword highlighter added. {}", keywordHighlight) log.debug("Keyword highlighter added. {}", keywordHighlight)
@@ -37,7 +37,7 @@ class KeywordHighlightManager private constructor() {
fun removeKeywordHighlight(id: String) { fun removeKeywordHighlight(id: String) {
database.removeKeywordHighlight(id) database.removeKeywordHighlight(id)
keywordHighlights.remove(id) keywordHighlights.remove(id)
ApplicationScope.windowScopes().forEach { TerminalPanelFactory.getInstance(it).repaintAll() } TerminalPanelFactory.getInstance().repaintAll()
if (log.isDebugEnabled) { if (log.isDebugEnabled) {
log.debug("Keyword highlighter removed. {}", id) log.debug("Keyword highlighter removed. {}", id)

View File

@@ -4,7 +4,6 @@ import app.termora.*
import app.termora.AES.decodeBase64 import app.termora.AES.decodeBase64
import app.termora.actions.AnAction import app.termora.actions.AnAction
import app.termora.actions.AnActionEvent import app.termora.actions.AnActionEvent
import app.termora.actions.DataProviders
import app.termora.native.FileChooser import app.termora.native.FileChooser
import com.formdev.flatlaf.extras.components.FlatComboBox import com.formdev.flatlaf.extras.components.FlatComboBox
import com.formdev.flatlaf.extras.components.FlatTable import com.formdev.flatlaf.extras.components.FlatTable
@@ -196,7 +195,6 @@ class KeyManagerPanel : JPanel(BorderLayout()) {
} }
private fun sshCopyId(evt: AnActionEvent) { private fun sshCopyId(evt: AnActionEvent) {
val windowScope = evt.getData(DataProviders.WindowScope) ?: return
val keyPairs = keyPairTable.selectedRows.map { keyPairTableModel.getOhKeyPair(it) } val keyPairs = keyPairTable.selectedRows.map { keyPairTableModel.getOhKeyPair(it) }
val publicKeys = mutableListOf<Pair<String, String>>() val publicKeys = mutableListOf<Pair<String, String>>()
for (keyPair in keyPairs) { for (keyPair in keyPairs) {
@@ -220,7 +218,7 @@ class KeyManagerPanel : JPanel(BorderLayout()) {
return return
} }
SSHCopyIdDialog(owner, windowScope, hosts, publicKeys).start() SSHCopyIdDialog(owner, hosts, publicKeys).start()
} }
private fun exportKeyPairs(file: File, keyPairs: List<OhKeyPair>) { private fun exportKeyPairs(file: File, keyPairs: List<OhKeyPair>) {

View File

@@ -23,7 +23,6 @@ import javax.swing.UIManager
class SSHCopyIdDialog( class SSHCopyIdDialog(
owner: Window, owner: Window,
private val windowScope: WindowScope,
private val hosts: List<Host>, private val hosts: List<Host>,
// key: name , value: public key // key: name , value: public key
private val publicKeys: List<Pair<String, String>>, private val publicKeys: List<Pair<String, String>>,
@@ -33,9 +32,9 @@ class SSHCopyIdDialog(
private val log = LoggerFactory.getLogger(SSHCopyIdDialog::class.java) private val log = LoggerFactory.getLogger(SSHCopyIdDialog::class.java)
} }
private val terminalPanelFactory = TerminalPanelFactory.getInstance(windowScope) private val terminalPanelFactory = TerminalPanelFactory.getInstance()
private val terminal by lazy { private val terminal by lazy {
TerminalFactory.getInstance(windowScope).createTerminal().apply { TerminalFactory.getInstance().createTerminal().apply {
getTerminalModel().setData(DataKey.ShowCursor, false) getTerminalModel().setData(DataKey.ShowCursor, false)
getTerminalModel().setData(DataKey.AutoNewline, true) getTerminalModel().setData(DataKey.AutoNewline, true)
} }

View File

@@ -41,13 +41,13 @@ class FloatingToolbarPanel : FlatToolBar(), Disposable {
actionListeners.forEach { it.actionPerformed(evt) } actionListeners.forEach { it.actionPerformed(evt) }
if (isSelected) { if (isSelected) {
TerminalPanelFactory.getAllTerminalPanel().forEach { TerminalPanelFactory.getInstance().getTerminalPanels().forEach {
it.getData(FloatingToolbar)?.triggerShow() it.getData(FloatingToolbar)?.triggerShow()
} }
} else { } else {
// 触发者的不隐藏 // 触发者的不隐藏
val c = evt.getData(FloatingToolbar) val c = evt.getData(FloatingToolbar)
TerminalPanelFactory.getAllTerminalPanel().forEach { TerminalPanelFactory.getInstance().getTerminalPanels().forEach {
val e = it.getData(FloatingToolbar) val e = it.getData(FloatingToolbar)
if (c != e) { if (c != e) {
e?.triggerHide() e?.triggerHide()