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(
val windowScope: WindowScope,
val host: Host,
protected val terminal: Terminal = TerminalFactory.getInstance(windowScope).createTerminal()
protected val terminal: Terminal = TerminalFactory.getInstance().createTerminal()
) : PropertyTerminalTab(), DataProvider {
companion object {
val Host = DataKey(app.termora.Host::class)

View File

@@ -9,7 +9,7 @@ class LocalTerminalTab(windowScope: WindowScope, host: Host) :
override suspend fun openPtyConnector(): PtyConnector {
val winSize = terminalPanel.winSize()
val ptyConnector = PtyConnectorFactory.getInstance(windowScope).createPtyConnector(
val ptyConnector = PtyConnectorFactory.getInstance().createPtyConnector(
winSize.rows, winSize.cols,
host.options.envs(),
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 ptyConnectors
get() = ApplicationScope.forApplicationScope()
.windowScopes().map { PtyConnectorFactory.getInstance(it).getPtyConnectors() }
.flatten()
get() = PtyConnectorFactory.getInstance().getPtyConnectors()
override fun write(buffer: ByteArray, offset: Int, len: Int) {
if (isMultiple) {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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