diff --git a/src/main/kotlin/app/termora/ColorHash.kt b/src/main/kotlin/app/termora/ColorHash.kt index 7e2a8f0..17bfde5 100644 --- a/src/main/kotlin/app/termora/ColorHash.kt +++ b/src/main/kotlin/app/termora/ColorHash.kt @@ -2,7 +2,6 @@ package app.termora import org.apache.commons.codec.digest.MurmurHash3 import java.awt.Color -import kotlin.math.absoluteValue object ColorHash { fun hash(text: String): Color { diff --git a/src/main/kotlin/app/termora/TerminalTabbed.kt b/src/main/kotlin/app/termora/TerminalTabbed.kt index 36c1033..920bf6a 100644 --- a/src/main/kotlin/app/termora/TerminalTabbed.kt +++ b/src/main/kotlin/app/termora/TerminalTabbed.kt @@ -6,7 +6,9 @@ import app.termora.database.DatabaseChangedExtension import app.termora.database.DatabaseManager import app.termora.findeverywhere.BasicFilterFindEverywhereProvider import app.termora.findeverywhere.FindEverywhereProvider +import app.termora.findeverywhere.FindEverywhereProviderExtension import app.termora.findeverywhere.FindEverywhereResult +import app.termora.plugin.internal.extension.DynamicExtensionHandler import app.termora.plugin.internal.sftppty.SFTPPtyProtocolProvider import app.termora.plugin.internal.sftppty.SFTPPtyTerminalTab import app.termora.plugin.internal.ssh.SSHProtocolProvider @@ -71,6 +73,8 @@ class TerminalTabbed( private fun initEvents() { + Disposer.register(this, customizeToolBarAWTEventListener) + // 关闭 tab tabbedPane.setTabCloseCallback { _, i -> removeTabAt(i, true) } @@ -119,36 +123,43 @@ class TerminalTabbed( } }) + // 注册全局搜索 - FindEverywhereProvider.getFindEverywhereProviders(windowScope) - .add(BasicFilterFindEverywhereProvider(object : FindEverywhereProvider { - override fun find(pattern: String): List { - val results = mutableListOf() - for (i in 0 until tabbedPane.tabCount) { - val c = tabbedPane.getComponentAt(i) - if (c is JComponent && c.getClientProperty(FindEverywhereProvider.SKIP_FIND_EVERYWHERE) != null) { - continue - } - results.add( - SwitchFindEverywhereResult( - tabbedPane.getTitleAt(i), - tabbedPane.getIconAt(i), - tabbedPane.getComponentAt(i) + DynamicExtensionHandler.getInstance() + .register(FindEverywhereProviderExtension::class.java, object : FindEverywhereProviderExtension { + val provider = BasicFilterFindEverywhereProvider(object : FindEverywhereProvider { + override fun find(pattern: String, scope: Scope): List { + if (scope != windowScope) return emptyList() + val results = mutableListOf() + for (i in 0 until tabbedPane.tabCount) { + val c = tabbedPane.getComponentAt(i) + if (c is JComponent && c.getClientProperty(FindEverywhereProvider.SKIP_FIND_EVERYWHERE) != null) { + continue + } + results.add( + SwitchFindEverywhereResult( + tabbedPane.getTitleAt(i), + tabbedPane.getIconAt(i), + tabbedPane.getComponentAt(i) + ) ) - ) + } + return results } - return results - } - override fun group(): String { - return I18n.getString("termora.find-everywhere.groups.opened-hosts") - } + override fun group(): String { + return I18n.getString("termora.find-everywhere.groups.opened-hosts") + } - override fun order(): Int { - return Integer.MIN_VALUE + 1 - } - })) + override fun order(): Int { + return Integer.MIN_VALUE + 1 + } + }) + override fun getFindEverywhereProvider(): FindEverywhereProvider { + return provider + } + }).let { Disposer.register(this, it) } // 监听全局事件 toolkit.addAWTEventListener(customizeToolBarAWTEventListener, AWTEvent.MOUSE_EVENT_MASK) @@ -411,10 +422,6 @@ class TerminalTabbed( * 对着 ToolBar 右键 */ private inner class CustomizeToolBarAWTEventListener : AWTEventListener, Disposable { - init { - Disposer.register(this@TerminalTabbed, this) - } - override fun eventDispatched(event: AWTEvent) { if (event !is MouseEvent || event.id != MouseEvent.MOUSE_CLICKED || !SwingUtilities.isRightMouseButton(event)) return // 如果 ToolBar 没有显示 diff --git a/src/main/kotlin/app/termora/WelcomePanel.kt b/src/main/kotlin/app/termora/WelcomePanel.kt index 43cbe99..2842d3a 100644 --- a/src/main/kotlin/app/termora/WelcomePanel.kt +++ b/src/main/kotlin/app/termora/WelcomePanel.kt @@ -4,7 +4,9 @@ package app.termora import app.termora.actions.* import app.termora.database.DatabaseManager import app.termora.findeverywhere.FindEverywhereProvider +import app.termora.findeverywhere.FindEverywhereProviderExtension import app.termora.findeverywhere.FindEverywhereResult +import app.termora.plugin.internal.extension.DynamicExtensionHandler import app.termora.plugin.internal.ssh.SSHProtocolProvider import app.termora.terminal.DataKey import app.termora.tree.* @@ -183,35 +185,6 @@ class WelcomePanel(private val windowScope: WindowScope) : JPanel(BorderLayout() }) - - FindEverywhereProvider.getFindEverywhereProviders(windowScope).add(object : FindEverywhereProvider { - override fun find(pattern: String): List { - var filter = hostTreeModel.root.getAllChildren() - .map { it.host } - .filter { it.isFolder.not() } - - if (pattern.isNotBlank()) { - filter = filter.filter { - if (it.protocol == SSHProtocolProvider.PROTOCOL) { - it.name.contains(pattern, true) || it.host.contains(pattern, true) - } else { - it.name.contains(pattern, true) - } - } - } - - return filter.map { HostFindEverywhereResult(it) } - } - - override fun group(): String { - return I18n.getString("termora.find-everywhere.groups.open-new-hosts") - } - - override fun order(): Int { - return Integer.MIN_VALUE + 2 - } - }) - searchTextField.addKeyListener(object : KeyAdapter() { private val event = ActionEvent(hostTree, ActionEvent.ACTION_PERFORMED, StringUtils.EMPTY) private val openHostAction get() = ActionManager.getInstance().getAction(OpenHostAction.OPEN_HOST) @@ -231,6 +204,45 @@ class WelcomePanel(private val windowScope: WindowScope) : JPanel(BorderLayout() } } }) + + DynamicExtensionHandler.getInstance() + .register(FindEverywhereProviderExtension::class.java, object : FindEverywhereProviderExtension { + private val provider = object : FindEverywhereProvider { + override fun find(pattern: String, scope: Scope): List { + if (scope != windowScope) return emptyList() + + var filter = hostTreeModel.root.getAllChildren() + .map { it.host } + .filter { it.isFolder.not() } + + if (pattern.isNotBlank()) { + filter = filter.filter { + if (it.protocol == SSHProtocolProvider.PROTOCOL) { + it.name.contains(pattern, true) || it.host.contains(pattern, true) + } else { + it.name.contains(pattern, true) + } + } + } + + return filter.map { HostFindEverywhereResult(it) } + } + + override fun group(): String { + return I18n.getString("termora.find-everywhere.groups.open-new-hosts") + } + + override fun order(): Int { + return Integer.MIN_VALUE + 2 + } + } + + override fun getFindEverywhereProvider(): FindEverywhereProvider { + return provider + } + + }).let { Disposer.register(this, it) } + } private fun perform() { diff --git a/src/main/kotlin/app/termora/account/AccountHttp.kt b/src/main/kotlin/app/termora/account/AccountHttp.kt index ace8d88..7d76988 100644 --- a/src/main/kotlin/app/termora/account/AccountHttp.kt +++ b/src/main/kotlin/app/termora/account/AccountHttp.kt @@ -17,7 +17,6 @@ import okhttp3.Response import okio.withLock import org.apache.commons.codec.binary.Base64 import org.apache.commons.io.IOUtils -import org.apache.commons.lang3.SystemUtils import org.apache.commons.lang3.time.DateUtils import org.apache.commons.net.util.SubnetUtils import org.slf4j.LoggerFactory diff --git a/src/main/kotlin/app/termora/findeverywhere/BasicFilterFindEverywhereProvider.kt b/src/main/kotlin/app/termora/findeverywhere/BasicFilterFindEverywhereProvider.kt index 7d7b00c..c95c4d2 100644 --- a/src/main/kotlin/app/termora/findeverywhere/BasicFilterFindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/findeverywhere/BasicFilterFindEverywhereProvider.kt @@ -1,8 +1,10 @@ package app.termora.findeverywhere +import app.termora.Scope + class BasicFilterFindEverywhereProvider(private val provider: FindEverywhereProvider) : FindEverywhereProvider { - override fun find(pattern: String): List { - val results = provider.find(pattern) + override fun find(pattern: String, scope: Scope): List { + val results = provider.find(pattern, scope) if (pattern.isBlank()) { return results } diff --git a/src/main/kotlin/app/termora/findeverywhere/FindEverywhere.kt b/src/main/kotlin/app/termora/findeverywhere/FindEverywhere.kt index f8fc2ab..fa13f78 100644 --- a/src/main/kotlin/app/termora/findeverywhere/FindEverywhere.kt +++ b/src/main/kotlin/app/termora/findeverywhere/FindEverywhere.kt @@ -17,7 +17,7 @@ import javax.swing.* import javax.swing.event.DocumentEvent import javax.swing.event.DocumentListener -class FindEverywhere(owner: Window, windowScope: WindowScope) : DialogWrapper(owner) { +class FindEverywhere(owner: Window, private val windowScope: WindowScope) : DialogWrapper(owner) { private val searchTextField = FlatTextField() private val model = DefaultListModel() private val resultList = FindEverywhereXList(model) @@ -82,7 +82,7 @@ class FindEverywhere(owner: Window, windowScope: WindowScope) : DialogWrapper(ow val map = linkedMapOf>() for (provider in providers) { - val results = provider.find(text) + val results = provider.find(text, windowScope) if (results.isEmpty()) { continue } diff --git a/src/main/kotlin/app/termora/findeverywhere/FindEverywhereAction.kt b/src/main/kotlin/app/termora/findeverywhere/FindEverywhereAction.kt index e4ccd66..76c2591 100644 --- a/src/main/kotlin/app/termora/findeverywhere/FindEverywhereAction.kt +++ b/src/main/kotlin/app/termora/findeverywhere/FindEverywhereAction.kt @@ -47,7 +47,7 @@ class FindEverywhereAction : AnAction(StringUtils.EMPTY, Icons.find) { } val dialog = FindEverywhere(owner, scope) - for (provider in FindEverywhereProvider.getFindEverywhereProviders(scope)) { + for (provider in FindEverywhereProvider.getFindEverywhereProviders()) { dialog.registerProvider(provider) } dialog.setLocationRelativeTo(owner) diff --git a/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProvider.kt b/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProvider.kt index 3c45c12..7816db0 100644 --- a/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProvider.kt @@ -1,6 +1,7 @@ package app.termora.findeverywhere import app.termora.Scope +import app.termora.plugin.ExtensionManager interface FindEverywhereProvider { @@ -8,21 +9,16 @@ interface FindEverywhereProvider { const val SKIP_FIND_EVERYWHERE = "SKIP_FIND_EVERYWHERE" - @Suppress("UNCHECKED_CAST") - fun getFindEverywhereProviders(scope: Scope): MutableList { - var list = scope.getAnyOrNull("FindEverywhereProviders") - if (list == null) { - list = mutableListOf() - scope.putAny("FindEverywhereProviders", list) - } - return list as MutableList + fun getFindEverywhereProviders(): List { + return ExtensionManager.getInstance().getExtensions(FindEverywhereProviderExtension::class.java) + .map { it.getFindEverywhereProvider() } } } /** * 搜索 */ - fun find(pattern: String): List + fun find(pattern: String, scope: Scope): List /** * 如果返回非空,表示单独分组 diff --git a/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProviderExtension.kt b/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProviderExtension.kt new file mode 100644 index 0000000..c18532e --- /dev/null +++ b/src/main/kotlin/app/termora/findeverywhere/FindEverywhereProviderExtension.kt @@ -0,0 +1,7 @@ +package app.termora.findeverywhere + +import app.termora.plugin.Extension + +interface FindEverywhereProviderExtension : Extension { + fun getFindEverywhereProvider(): FindEverywhereProvider +} \ No newline at end of file diff --git a/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt b/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt index 9733fb4..dbe9d47 100644 --- a/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/findeverywhere/QuickActionsFindEverywhereProvider.kt @@ -2,6 +2,7 @@ package app.termora.findeverywhere import app.termora.Actions import app.termora.I18n +import app.termora.Scope import app.termora.WindowScope import app.termora.actions.MultipleAction @@ -14,7 +15,8 @@ class QuickActionsFindEverywhereProvider(private val windowScope: WindowScope) : MultipleAction.MULTIPLE, ) - override fun find(pattern: String): List { + override fun find(pattern: String, scope: Scope): List { + if (scope != windowScope) return emptyList() val actionManager = ActionManager.getInstance() val results = ArrayList() for (action in actions) { diff --git a/src/main/kotlin/app/termora/findeverywhere/QuickCommandFindEverywhereProvider.kt b/src/main/kotlin/app/termora/findeverywhere/QuickCommandFindEverywhereProvider.kt index 899ec9f..8bacc7a 100644 --- a/src/main/kotlin/app/termora/findeverywhere/QuickCommandFindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/findeverywhere/QuickCommandFindEverywhereProvider.kt @@ -3,6 +3,7 @@ package app.termora.findeverywhere import app.termora.Actions import app.termora.I18n import app.termora.Icons +import app.termora.Scope import app.termora.actions.NewHostAction import app.termora.actions.OpenLocalTerminalAction import app.termora.snippet.SnippetAction @@ -13,7 +14,7 @@ import javax.swing.Icon class QuickCommandFindEverywhereProvider : FindEverywhereProvider { private val actionManager get() = ActionManager.getInstance() - override fun find(pattern: String): List { + override fun find(pattern: String, scope: Scope): List { val list = mutableListOf() actionManager.let { list.add(CreateHostFindEverywhereResult()) } diff --git a/src/main/kotlin/app/termora/findeverywhere/SettingsFindEverywhereProvider.kt b/src/main/kotlin/app/termora/findeverywhere/SettingsFindEverywhereProvider.kt index 7e84a94..00a627d 100644 --- a/src/main/kotlin/app/termora/findeverywhere/SettingsFindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/findeverywhere/SettingsFindEverywhereProvider.kt @@ -1,11 +1,12 @@ package app.termora.findeverywhere import app.termora.I18n +import app.termora.Scope class SettingsFindEverywhereProvider : FindEverywhereProvider { - override fun find(pattern: String): List { + override fun find(pattern: String, scope: Scope): List { return emptyList() } diff --git a/src/main/kotlin/app/termora/macro/MacroFindEverywhereProvider.kt b/src/main/kotlin/app/termora/macro/MacroFindEverywhereProvider.kt index 92b49a3..4346437 100644 --- a/src/main/kotlin/app/termora/macro/MacroFindEverywhereProvider.kt +++ b/src/main/kotlin/app/termora/macro/MacroFindEverywhereProvider.kt @@ -3,6 +3,7 @@ package app.termora.macro import app.termora.Actions import app.termora.ApplicationScope import app.termora.I18n +import app.termora.Scope import app.termora.actions.AnAction import app.termora.findeverywhere.ActionFindEverywhereResult import app.termora.findeverywhere.FindEverywhereProvider @@ -16,7 +17,7 @@ import kotlin.math.min class MacroFindEverywhereProvider : FindEverywhereProvider { private val macroManager get() = MacroManager.getInstance() - override fun find(pattern: String): List { + override fun find(pattern: String, scope: Scope): List { val macroAction = ActionManager.getInstance().getAction(Actions.MACRO) ?: return emptyList() if (macroAction !is MacroAction) return emptyList() diff --git a/src/main/kotlin/app/termora/plugin/PluginManager.kt b/src/main/kotlin/app/termora/plugin/PluginManager.kt index 33d3723..0ffd603 100644 --- a/src/main/kotlin/app/termora/plugin/PluginManager.kt +++ b/src/main/kotlin/app/termora/plugin/PluginManager.kt @@ -28,7 +28,6 @@ import java.io.File import java.net.URL import java.net.URLClassLoader import java.util.* -import kotlin.math.cos internal class PluginManager private constructor() { companion object { diff --git a/src/main/kotlin/app/termora/plugin/internal/rdp/RDPHostOptionsPane.kt b/src/main/kotlin/app/termora/plugin/internal/rdp/RDPHostOptionsPane.kt index 5d87a48..f8723da 100644 --- a/src/main/kotlin/app/termora/plugin/internal/rdp/RDPHostOptionsPane.kt +++ b/src/main/kotlin/app/termora/plugin/internal/rdp/RDPHostOptionsPane.kt @@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils import java.awt.BorderLayout import java.awt.Component import java.awt.KeyboardFocusManager -import java.awt.SystemColor.desktop import java.awt.Window import java.awt.event.ComponentAdapter import java.awt.event.ComponentEvent