mirror of
https://github.com/TermoraDev/termora.git
synced 2026-01-16 10:22: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
|
package app.termora
|
||||||
|
|
||||||
|
import app.termora.actions.DataProvider
|
||||||
|
import app.termora.terminal.DataKey
|
||||||
import app.termora.transport.TransportDataProviders
|
import app.termora.transport.TransportDataProviders
|
||||||
import app.termora.transport.TransportPanel
|
import app.termora.transport.TransportPanel
|
||||||
import java.beans.PropertyChangeListener
|
import java.beans.PropertyChangeListener
|
||||||
@@ -8,7 +10,7 @@ import javax.swing.JComponent
|
|||||||
import javax.swing.JOptionPane
|
import javax.swing.JOptionPane
|
||||||
import javax.swing.SwingUtilities
|
import javax.swing.SwingUtilities
|
||||||
|
|
||||||
class SFTPTerminalTab : Disposable, TerminalTab {
|
class SFTPTerminalTab : Disposable, TerminalTab, DataProvider {
|
||||||
|
|
||||||
private val transportPanel by lazy {
|
private val transportPanel by lazy {
|
||||||
TransportPanel().apply {
|
TransportPanel().apply {
|
||||||
@@ -54,4 +56,12 @@ class SFTPTerminalTab : Disposable, TerminalTab {
|
|||||||
) == JOptionPane.OK_OPTION
|
) == 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
|
package app.termora.transport
|
||||||
|
|
||||||
|
import app.termora.Host
|
||||||
import app.termora.Icons
|
import app.termora.Icons
|
||||||
import app.termora.SFTPTerminalTab
|
import app.termora.SFTPTerminalTab
|
||||||
|
import app.termora.SSHTerminalTab
|
||||||
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.actions.DataProviders
|
||||||
@@ -9,15 +11,61 @@ import app.termora.actions.DataProviders
|
|||||||
class SFTPAction : AnAction("SFTP", Icons.folder) {
|
class SFTPAction : AnAction("SFTP", Icons.folder) {
|
||||||
override fun actionPerformed(evt: AnActionEvent) {
|
override fun actionPerformed(evt: AnActionEvent) {
|
||||||
val terminalTabbedManager = evt.getData(DataProviders.TerminalTabbedManager) ?: return
|
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()
|
val tabs = terminalTabbedManager.getTerminalTabs()
|
||||||
for (tab in tabs) {
|
for (tab in tabs) {
|
||||||
if (tab is SFTPTerminalTab) {
|
if (tab is SFTPTerminalTab) {
|
||||||
terminalTabbedManager.setSelectedTerminalTab(tab)
|
terminalTabbedManager.setSelectedTerminalTab(tab)
|
||||||
|
if (host != null) {
|
||||||
|
connectHost(host, tab)
|
||||||
|
}
|
||||||
return
|
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.*
|
import javax.swing.*
|
||||||
|
|
||||||
class SftpFileSystemPanel(
|
class SftpFileSystemPanel(
|
||||||
private var host: Host? = null
|
var host: Host? = null
|
||||||
) : JPanel(BorderLayout()), Disposable {
|
) : JPanel(BorderLayout()), Disposable {
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
|
|||||||
Reference in New Issue
Block a user