From efd01da6f16b2bb28fd41ea1e1520b454c5c0084 Mon Sep 17 00:00:00 2001 From: hstyi Date: Tue, 24 Jun 2025 12:14:39 +0800 Subject: [PATCH] chore: transfer support contextmenu --- .../app/termora/transfer/TransportPanel.kt | 2 +- .../app/termora/transfer/TransportTabbed.kt | 28 ++++++++++++++++--- .../kotlin/app/termora/tree/NewHostTree.kt | 8 ++++-- 3 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/main/kotlin/app/termora/transfer/TransportPanel.kt b/src/main/kotlin/app/termora/transfer/TransportPanel.kt index df54a4e..ce8d4b1 100644 --- a/src/main/kotlin/app/termora/transfer/TransportPanel.kt +++ b/src/main/kotlin/app/termora/transfer/TransportPanel.kt @@ -63,7 +63,7 @@ import kotlin.time.Duration.Companion.seconds class TransportPanel( private val transferManager: InternalTransferManager, - val host: Host, + var host: Host, val loader: TransportSupportLoader, ) : JPanel(BorderLayout()), DataProvider, Disposable, TransportNavigator { companion object { diff --git a/src/main/kotlin/app/termora/transfer/TransportTabbed.kt b/src/main/kotlin/app/termora/transfer/TransportTabbed.kt index d9bf58a..7e42a58 100644 --- a/src/main/kotlin/app/termora/transfer/TransportTabbed.kt +++ b/src/main/kotlin/app/termora/transfer/TransportTabbed.kt @@ -3,6 +3,8 @@ package app.termora.transfer import app.termora.* import app.termora.actions.AnAction import app.termora.actions.AnActionEvent +import app.termora.database.DatabaseChangedExtension +import app.termora.database.DatabaseManager import app.termora.plugin.internal.local.LocalProtocolProvider import com.formdev.flatlaf.extras.components.FlatPopupMenu import com.formdev.flatlaf.extras.components.FlatTabbedPane @@ -124,28 +126,38 @@ class TransportTabbed( return true } - fun addSelectionTab() { + fun addSelectionTab(): TransportSelectionPanel { val c = TransportSelectionPanel(tabbed, internalTransferManager) addTab(I18n.getString("termora.transport.sftp.select-host"), c) selectedIndex = tabCount - 1 SwingUtilities.invokeLater { c.requestFocusInWindow() } + return c } fun addLocalTab() { val host = Host(name = "Local", protocol = LocalProtocolProvider.PROTOCOL) - val support = TransportSupport(FileSystems.getDefault(), SystemUtils.USER_HOME) + val support = TransportSupport(FileSystems.getDefault(), getDefaultLocalPath()) val panel = TransportPanel(internalTransferManager, host, TransportSupportLoader { support }) addTab(I18n.getString("termora.transport.local"), panel) super.setTabClosable(0, false) } + private fun getDefaultLocalPath(): String { + val defaultDirectory = DatabaseManager.getInstance().sftp.defaultDirectory + if (defaultDirectory.isBlank()) return SystemUtils.USER_HOME + return defaultDirectory + } + private fun showContextMenu(tabIndex: Int, e: MouseEvent) { + val panel = getTransportPanel(tabIndex) ?: return val popupMenu = FlatPopupMenu() + // 克隆 val clone = popupMenu.add(I18n.getString("termora.tabbed.contextmenu.clone")) clone.addActionListener(object : AnAction() { override fun actionPerformed(evt: AnActionEvent) { - + val c = addSelectionTab() + c.connect(panel.host) } }) @@ -153,7 +165,15 @@ class TransportTabbed( val edit = popupMenu.add(I18n.getString("termora.keymgr.edit")) edit.addActionListener(object : AnAction() { override fun actionPerformed(evt: AnActionEvent) { - + val window = evt.window + val dialog = NewHostDialogV2(window, panel.host) + dialog.setLocationRelativeTo(window) + dialog.title = panel.host.name + dialog.isVisible = true + val host = dialog.host ?: return + HostManager.getInstance().addHost(host, DatabaseChangedExtension.Source.Sync) + setTitleAt(tabIndex, host.name) + panel.host = host } }) diff --git a/src/main/kotlin/app/termora/tree/NewHostTree.kt b/src/main/kotlin/app/termora/tree/NewHostTree.kt index d5e0de3..a7262f5 100644 --- a/src/main/kotlin/app/termora/tree/NewHostTree.kt +++ b/src/main/kotlin/app/termora/tree/NewHostTree.kt @@ -8,9 +8,11 @@ import app.termora.database.DatabaseManager import app.termora.plugin.ExtensionManager import app.termora.plugin.internal.sftppty.SFTPPtyProtocolProvider import app.termora.plugin.internal.ssh.SSHProtocolProvider +import app.termora.protocol.TransferProtocolProvider import app.termora.tag.TagDialog import app.termora.tag.TagManager import app.termora.tag.TagSimpleTreeCellRendererExtension +import app.termora.transfer.TransferActionEvent import com.formdev.flatlaf.extras.components.FlatPopupMenu import kotlinx.serialization.Serializable import kotlinx.serialization.json.* @@ -471,12 +473,12 @@ class NewHostTree : SimpleTree(), Disposable { } private fun openWithSFTP(evt: EventObject) { - val nodes = - getSelectionSimpleTreeNodes(true).map { it.host }.filter { it.protocol == SSHProtocolProvider.PROTOCOL } + val nodes = getSelectionSimpleTreeNodes(true) + .map { it.host }.filter { TransferProtocolProvider.valueOf(it.protocol) != null } if (nodes.isEmpty()) return for (node in nodes) { -// sftpAction.actionPerformed(SFTPActionEvent(this, node.id, evt)) + sftpAction.actionPerformed(TransferActionEvent(this, node.id, evt)) } }