mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 02:12:58 +08:00
feat: open SFTP directly to the current SSH server (#216)
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
package app.termora
|
||||
|
||||
import app.termora.actions.DataProvider
|
||||
import app.termora.terminal.DataKey
|
||||
import app.termora.transport.TransportDataProviders
|
||||
import app.termora.transport.TransportPanel
|
||||
import java.beans.PropertyChangeListener
|
||||
@@ -8,7 +10,7 @@ import javax.swing.JComponent
|
||||
import javax.swing.JOptionPane
|
||||
import javax.swing.SwingUtilities
|
||||
|
||||
class SFTPTerminalTab : Disposable, TerminalTab {
|
||||
class SFTPTerminalTab : Disposable, TerminalTab, DataProvider {
|
||||
|
||||
private val transportPanel by lazy {
|
||||
TransportPanel().apply {
|
||||
@@ -54,4 +56,12 @@ class SFTPTerminalTab : Disposable, TerminalTab {
|
||||
) == JOptionPane.OK_OPTION
|
||||
}
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
override fun <T : Any> getData(dataKey: DataKey<T>): T? {
|
||||
if (dataKey == TransportDataProviders.TransportPanel) {
|
||||
return transportPanel as T
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,9 @@
|
||||
package app.termora.transport
|
||||
|
||||
import app.termora.Host
|
||||
import app.termora.Icons
|
||||
import app.termora.SFTPTerminalTab
|
||||
import app.termora.SSHTerminalTab
|
||||
import app.termora.actions.AnAction
|
||||
import app.termora.actions.AnActionEvent
|
||||
import app.termora.actions.DataProviders
|
||||
@@ -9,15 +11,61 @@ import app.termora.actions.DataProviders
|
||||
class SFTPAction : AnAction("SFTP", Icons.folder) {
|
||||
override fun actionPerformed(evt: AnActionEvent) {
|
||||
val terminalTabbedManager = evt.getData(DataProviders.TerminalTabbedManager) ?: return
|
||||
val selectedTerminalTab = terminalTabbedManager.getSelectedTerminalTab()
|
||||
val host = if (selectedTerminalTab is SSHTerminalTab) selectedTerminalTab.host else null
|
||||
|
||||
val tabs = terminalTabbedManager.getTerminalTabs()
|
||||
for (tab in tabs) {
|
||||
if (tab is SFTPTerminalTab) {
|
||||
terminalTabbedManager.setSelectedTerminalTab(tab)
|
||||
if (host != null) {
|
||||
connectHost(host, tab)
|
||||
}
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
// 创建一个新的
|
||||
terminalTabbedManager.addTerminalTab(SFTPTerminalTab())
|
||||
val tab = SFTPTerminalTab()
|
||||
terminalTabbedManager.addTerminalTab(tab)
|
||||
|
||||
if (host != null) {
|
||||
connectHost(host, tab)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 如果当前选中的是 SSH 服务器 Tab,那么直接打开 SFTP 通道
|
||||
*/
|
||||
private fun connectHost(host: Host, tab: SFTPTerminalTab) {
|
||||
val tabbed = tab.getData(TransportDataProviders.TransportPanel)
|
||||
?.getData(TransportDataProviders.RightFileSystemTabbed) ?: return
|
||||
|
||||
// 如果已经有对应的连接
|
||||
for (i in 0 until tabbed.tabCount) {
|
||||
val c = tabbed.getComponentAt(i)
|
||||
if (c is SftpFileSystemPanel) {
|
||||
if (c.host == host) {
|
||||
tabbed.selectedIndex = i
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 寻找空的 Tab,如果有则占用
|
||||
for (i in 0 until tabbed.tabCount) {
|
||||
val c = tabbed.getComponentAt(i)
|
||||
if (c is SftpFileSystemPanel) {
|
||||
if (c.host == null) {
|
||||
c.host = host
|
||||
c.connect()
|
||||
tabbed.selectedIndex = i
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 开启一个新的
|
||||
tabbed.addTab(host.name, SftpFileSystemPanel(host).apply { connect() })
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,7 @@ import java.util.concurrent.atomic.AtomicBoolean
|
||||
import javax.swing.*
|
||||
|
||||
class SftpFileSystemPanel(
|
||||
private var host: Host? = null
|
||||
var host: Host? = null
|
||||
) : JPanel(BorderLayout()), Disposable {
|
||||
|
||||
companion object {
|
||||
|
||||
Reference in New Issue
Block a user