chore: transfer support contextmenu

This commit is contained in:
hstyi
2025-06-24 12:14:39 +08:00
committed by hstyi
parent c929a794d5
commit efd01da6f1
3 changed files with 30 additions and 8 deletions

View File

@@ -63,7 +63,7 @@ import kotlin.time.Duration.Companion.seconds
class TransportPanel( class TransportPanel(
private val transferManager: InternalTransferManager, private val transferManager: InternalTransferManager,
val host: Host, var host: Host,
val loader: TransportSupportLoader, val loader: TransportSupportLoader,
) : JPanel(BorderLayout()), DataProvider, Disposable, TransportNavigator { ) : JPanel(BorderLayout()), DataProvider, Disposable, TransportNavigator {
companion object { companion object {

View File

@@ -3,6 +3,8 @@ package app.termora.transfer
import app.termora.* import app.termora.*
import app.termora.actions.AnAction import app.termora.actions.AnAction
import app.termora.actions.AnActionEvent import app.termora.actions.AnActionEvent
import app.termora.database.DatabaseChangedExtension
import app.termora.database.DatabaseManager
import app.termora.plugin.internal.local.LocalProtocolProvider import app.termora.plugin.internal.local.LocalProtocolProvider
import com.formdev.flatlaf.extras.components.FlatPopupMenu import com.formdev.flatlaf.extras.components.FlatPopupMenu
import com.formdev.flatlaf.extras.components.FlatTabbedPane import com.formdev.flatlaf.extras.components.FlatTabbedPane
@@ -124,28 +126,38 @@ class TransportTabbed(
return true return true
} }
fun addSelectionTab() { fun addSelectionTab(): TransportSelectionPanel {
val c = TransportSelectionPanel(tabbed, internalTransferManager) val c = TransportSelectionPanel(tabbed, internalTransferManager)
addTab(I18n.getString("termora.transport.sftp.select-host"), c) addTab(I18n.getString("termora.transport.sftp.select-host"), c)
selectedIndex = tabCount - 1 selectedIndex = tabCount - 1
SwingUtilities.invokeLater { c.requestFocusInWindow() } SwingUtilities.invokeLater { c.requestFocusInWindow() }
return c
} }
fun addLocalTab() { fun addLocalTab() {
val host = Host(name = "Local", protocol = LocalProtocolProvider.PROTOCOL) 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 }) val panel = TransportPanel(internalTransferManager, host, TransportSupportLoader { support })
addTab(I18n.getString("termora.transport.local"), panel) addTab(I18n.getString("termora.transport.local"), panel)
super.setTabClosable(0, false) 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) { private fun showContextMenu(tabIndex: Int, e: MouseEvent) {
val panel = getTransportPanel(tabIndex) ?: return
val popupMenu = FlatPopupMenu() val popupMenu = FlatPopupMenu()
// 克隆 // 克隆
val clone = popupMenu.add(I18n.getString("termora.tabbed.contextmenu.clone")) val clone = popupMenu.add(I18n.getString("termora.tabbed.contextmenu.clone"))
clone.addActionListener(object : AnAction() { clone.addActionListener(object : AnAction() {
override fun actionPerformed(evt: AnActionEvent) { 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")) val edit = popupMenu.add(I18n.getString("termora.keymgr.edit"))
edit.addActionListener(object : AnAction() { edit.addActionListener(object : AnAction() {
override fun actionPerformed(evt: AnActionEvent) { 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
} }
}) })

View File

@@ -8,9 +8,11 @@ import app.termora.database.DatabaseManager
import app.termora.plugin.ExtensionManager import app.termora.plugin.ExtensionManager
import app.termora.plugin.internal.sftppty.SFTPPtyProtocolProvider import app.termora.plugin.internal.sftppty.SFTPPtyProtocolProvider
import app.termora.plugin.internal.ssh.SSHProtocolProvider import app.termora.plugin.internal.ssh.SSHProtocolProvider
import app.termora.protocol.TransferProtocolProvider
import app.termora.tag.TagDialog import app.termora.tag.TagDialog
import app.termora.tag.TagManager import app.termora.tag.TagManager
import app.termora.tag.TagSimpleTreeCellRendererExtension import app.termora.tag.TagSimpleTreeCellRendererExtension
import app.termora.transfer.TransferActionEvent
import com.formdev.flatlaf.extras.components.FlatPopupMenu import com.formdev.flatlaf.extras.components.FlatPopupMenu
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import kotlinx.serialization.json.* import kotlinx.serialization.json.*
@@ -471,12 +473,12 @@ class NewHostTree : SimpleTree(), Disposable {
} }
private fun openWithSFTP(evt: EventObject) { private fun openWithSFTP(evt: EventObject) {
val nodes = val nodes = getSelectionSimpleTreeNodes(true)
getSelectionSimpleTreeNodes(true).map { it.host }.filter { it.protocol == SSHProtocolProvider.PROTOCOL } .map { it.host }.filter { TransferProtocolProvider.valueOf(it.protocol) != null }
if (nodes.isEmpty()) return if (nodes.isEmpty()) return
for (node in nodes) { for (node in nodes) {
// sftpAction.actionPerformed(SFTPActionEvent(this, node.id, evt)) sftpAction.actionPerformed(TransferActionEvent(this, node.id, evt))
} }
} }