chore: FindEverywhere using extension

This commit is contained in:
hstyi
2025-06-15 12:08:44 +08:00
committed by hstyi
parent 02984bb2a2
commit 51047e60f4
15 changed files with 104 additions and 79 deletions

View File

@@ -2,7 +2,6 @@ package app.termora
import org.apache.commons.codec.digest.MurmurHash3 import org.apache.commons.codec.digest.MurmurHash3
import java.awt.Color import java.awt.Color
import kotlin.math.absoluteValue
object ColorHash { object ColorHash {
fun hash(text: String): Color { fun hash(text: String): Color {

View File

@@ -6,7 +6,9 @@ import app.termora.database.DatabaseChangedExtension
import app.termora.database.DatabaseManager import app.termora.database.DatabaseManager
import app.termora.findeverywhere.BasicFilterFindEverywhereProvider import app.termora.findeverywhere.BasicFilterFindEverywhereProvider
import app.termora.findeverywhere.FindEverywhereProvider import app.termora.findeverywhere.FindEverywhereProvider
import app.termora.findeverywhere.FindEverywhereProviderExtension
import app.termora.findeverywhere.FindEverywhereResult 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.SFTPPtyProtocolProvider
import app.termora.plugin.internal.sftppty.SFTPPtyTerminalTab import app.termora.plugin.internal.sftppty.SFTPPtyTerminalTab
import app.termora.plugin.internal.ssh.SSHProtocolProvider import app.termora.plugin.internal.ssh.SSHProtocolProvider
@@ -71,6 +73,8 @@ class TerminalTabbed(
private fun initEvents() { private fun initEvents() {
Disposer.register(this, customizeToolBarAWTEventListener)
// 关闭 tab // 关闭 tab
tabbedPane.setTabCloseCallback { _, i -> removeTabAt(i, true) } tabbedPane.setTabCloseCallback { _, i -> removeTabAt(i, true) }
@@ -119,36 +123,43 @@ class TerminalTabbed(
} }
}) })
// 注册全局搜索 // 注册全局搜索
FindEverywhereProvider.getFindEverywhereProviders(windowScope) DynamicExtensionHandler.getInstance()
.add(BasicFilterFindEverywhereProvider(object : FindEverywhereProvider { .register(FindEverywhereProviderExtension::class.java, object : FindEverywhereProviderExtension {
override fun find(pattern: String): List<FindEverywhereResult> { val provider = BasicFilterFindEverywhereProvider(object : FindEverywhereProvider {
val results = mutableListOf<FindEverywhereResult>() override fun find(pattern: String, scope: Scope): List<FindEverywhereResult> {
for (i in 0 until tabbedPane.tabCount) { if (scope != windowScope) return emptyList()
val c = tabbedPane.getComponentAt(i) val results = mutableListOf<FindEverywhereResult>()
if (c is JComponent && c.getClientProperty(FindEverywhereProvider.SKIP_FIND_EVERYWHERE) != null) { for (i in 0 until tabbedPane.tabCount) {
continue val c = tabbedPane.getComponentAt(i)
} if (c is JComponent && c.getClientProperty(FindEverywhereProvider.SKIP_FIND_EVERYWHERE) != null) {
results.add( continue
SwitchFindEverywhereResult( }
tabbedPane.getTitleAt(i), results.add(
tabbedPane.getIconAt(i), SwitchFindEverywhereResult(
tabbedPane.getComponentAt(i) tabbedPane.getTitleAt(i),
tabbedPane.getIconAt(i),
tabbedPane.getComponentAt(i)
)
) )
) }
return results
} }
return results
}
override fun group(): String { override fun group(): String {
return I18n.getString("termora.find-everywhere.groups.opened-hosts") return I18n.getString("termora.find-everywhere.groups.opened-hosts")
} }
override fun order(): Int { override fun order(): Int {
return Integer.MIN_VALUE + 1 return Integer.MIN_VALUE + 1
} }
})) })
override fun getFindEverywhereProvider(): FindEverywhereProvider {
return provider
}
}).let { Disposer.register(this, it) }
// 监听全局事件 // 监听全局事件
toolkit.addAWTEventListener(customizeToolBarAWTEventListener, AWTEvent.MOUSE_EVENT_MASK) toolkit.addAWTEventListener(customizeToolBarAWTEventListener, AWTEvent.MOUSE_EVENT_MASK)
@@ -411,10 +422,6 @@ class TerminalTabbed(
* 对着 ToolBar 右键 * 对着 ToolBar 右键
*/ */
private inner class CustomizeToolBarAWTEventListener : AWTEventListener, Disposable { private inner class CustomizeToolBarAWTEventListener : AWTEventListener, Disposable {
init {
Disposer.register(this@TerminalTabbed, this)
}
override fun eventDispatched(event: AWTEvent) { override fun eventDispatched(event: AWTEvent) {
if (event !is MouseEvent || event.id != MouseEvent.MOUSE_CLICKED || !SwingUtilities.isRightMouseButton(event)) return if (event !is MouseEvent || event.id != MouseEvent.MOUSE_CLICKED || !SwingUtilities.isRightMouseButton(event)) return
// 如果 ToolBar 没有显示 // 如果 ToolBar 没有显示

View File

@@ -4,7 +4,9 @@ package app.termora
import app.termora.actions.* import app.termora.actions.*
import app.termora.database.DatabaseManager import app.termora.database.DatabaseManager
import app.termora.findeverywhere.FindEverywhereProvider import app.termora.findeverywhere.FindEverywhereProvider
import app.termora.findeverywhere.FindEverywhereProviderExtension
import app.termora.findeverywhere.FindEverywhereResult import app.termora.findeverywhere.FindEverywhereResult
import app.termora.plugin.internal.extension.DynamicExtensionHandler
import app.termora.plugin.internal.ssh.SSHProtocolProvider import app.termora.plugin.internal.ssh.SSHProtocolProvider
import app.termora.terminal.DataKey import app.termora.terminal.DataKey
import app.termora.tree.* 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<FindEverywhereResult> {
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() { searchTextField.addKeyListener(object : KeyAdapter() {
private val event = ActionEvent(hostTree, ActionEvent.ACTION_PERFORMED, StringUtils.EMPTY) private val event = ActionEvent(hostTree, ActionEvent.ACTION_PERFORMED, StringUtils.EMPTY)
private val openHostAction get() = ActionManager.getInstance().getAction(OpenHostAction.OPEN_HOST) 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<FindEverywhereResult> {
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() { private fun perform() {

View File

@@ -17,7 +17,6 @@ import okhttp3.Response
import okio.withLock import okio.withLock
import org.apache.commons.codec.binary.Base64 import org.apache.commons.codec.binary.Base64
import org.apache.commons.io.IOUtils import org.apache.commons.io.IOUtils
import org.apache.commons.lang3.SystemUtils
import org.apache.commons.lang3.time.DateUtils import org.apache.commons.lang3.time.DateUtils
import org.apache.commons.net.util.SubnetUtils import org.apache.commons.net.util.SubnetUtils
import org.slf4j.LoggerFactory import org.slf4j.LoggerFactory

View File

@@ -1,8 +1,10 @@
package app.termora.findeverywhere package app.termora.findeverywhere
import app.termora.Scope
class BasicFilterFindEverywhereProvider(private val provider: FindEverywhereProvider) : FindEverywhereProvider { class BasicFilterFindEverywhereProvider(private val provider: FindEverywhereProvider) : FindEverywhereProvider {
override fun find(pattern: String): List<FindEverywhereResult> { override fun find(pattern: String, scope: Scope): List<FindEverywhereResult> {
val results = provider.find(pattern) val results = provider.find(pattern, scope)
if (pattern.isBlank()) { if (pattern.isBlank()) {
return results return results
} }

View File

@@ -17,7 +17,7 @@ import javax.swing.*
import javax.swing.event.DocumentEvent import javax.swing.event.DocumentEvent
import javax.swing.event.DocumentListener 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 searchTextField = FlatTextField()
private val model = DefaultListModel<FindEverywhereResult>() private val model = DefaultListModel<FindEverywhereResult>()
private val resultList = FindEverywhereXList(model) private val resultList = FindEverywhereXList(model)
@@ -82,7 +82,7 @@ class FindEverywhere(owner: Window, windowScope: WindowScope) : DialogWrapper(ow
val map = linkedMapOf<String, MutableList<FindEverywhereResult>>() val map = linkedMapOf<String, MutableList<FindEverywhereResult>>()
for (provider in providers) { for (provider in providers) {
val results = provider.find(text) val results = provider.find(text, windowScope)
if (results.isEmpty()) { if (results.isEmpty()) {
continue continue
} }

View File

@@ -47,7 +47,7 @@ class FindEverywhereAction : AnAction(StringUtils.EMPTY, Icons.find) {
} }
val dialog = FindEverywhere(owner, scope) val dialog = FindEverywhere(owner, scope)
for (provider in FindEverywhereProvider.getFindEverywhereProviders(scope)) { for (provider in FindEverywhereProvider.getFindEverywhereProviders()) {
dialog.registerProvider(provider) dialog.registerProvider(provider)
} }
dialog.setLocationRelativeTo(owner) dialog.setLocationRelativeTo(owner)

View File

@@ -1,6 +1,7 @@
package app.termora.findeverywhere package app.termora.findeverywhere
import app.termora.Scope import app.termora.Scope
import app.termora.plugin.ExtensionManager
interface FindEverywhereProvider { interface FindEverywhereProvider {
@@ -8,21 +9,16 @@ interface FindEverywhereProvider {
const val SKIP_FIND_EVERYWHERE = "SKIP_FIND_EVERYWHERE" const val SKIP_FIND_EVERYWHERE = "SKIP_FIND_EVERYWHERE"
@Suppress("UNCHECKED_CAST") fun getFindEverywhereProviders(): List<FindEverywhereProvider> {
fun getFindEverywhereProviders(scope: Scope): MutableList<FindEverywhereProvider> { return ExtensionManager.getInstance().getExtensions(FindEverywhereProviderExtension::class.java)
var list = scope.getAnyOrNull("FindEverywhereProviders") .map { it.getFindEverywhereProvider() }
if (list == null) {
list = mutableListOf<FindEverywhereProvider>()
scope.putAny("FindEverywhereProviders", list)
}
return list as MutableList<FindEverywhereProvider>
} }
} }
/** /**
* 搜索 * 搜索
*/ */
fun find(pattern: String): List<FindEverywhereResult> fun find(pattern: String, scope: Scope): List<FindEverywhereResult>
/** /**
* 如果返回非空,表示单独分组 * 如果返回非空,表示单独分组

View File

@@ -0,0 +1,7 @@
package app.termora.findeverywhere
import app.termora.plugin.Extension
interface FindEverywhereProviderExtension : Extension {
fun getFindEverywhereProvider(): FindEverywhereProvider
}

View File

@@ -2,6 +2,7 @@ package app.termora.findeverywhere
import app.termora.Actions import app.termora.Actions
import app.termora.I18n import app.termora.I18n
import app.termora.Scope
import app.termora.WindowScope import app.termora.WindowScope
import app.termora.actions.MultipleAction import app.termora.actions.MultipleAction
@@ -14,7 +15,8 @@ class QuickActionsFindEverywhereProvider(private val windowScope: WindowScope) :
MultipleAction.MULTIPLE, MultipleAction.MULTIPLE,
) )
override fun find(pattern: String): List<FindEverywhereResult> { override fun find(pattern: String, scope: Scope): List<FindEverywhereResult> {
if (scope != windowScope) return emptyList()
val actionManager = ActionManager.getInstance() val actionManager = ActionManager.getInstance()
val results = ArrayList<FindEverywhereResult>() val results = ArrayList<FindEverywhereResult>()
for (action in actions) { for (action in actions) {

View File

@@ -3,6 +3,7 @@ package app.termora.findeverywhere
import app.termora.Actions import app.termora.Actions
import app.termora.I18n import app.termora.I18n
import app.termora.Icons import app.termora.Icons
import app.termora.Scope
import app.termora.actions.NewHostAction import app.termora.actions.NewHostAction
import app.termora.actions.OpenLocalTerminalAction import app.termora.actions.OpenLocalTerminalAction
import app.termora.snippet.SnippetAction import app.termora.snippet.SnippetAction
@@ -13,7 +14,7 @@ import javax.swing.Icon
class QuickCommandFindEverywhereProvider : FindEverywhereProvider { class QuickCommandFindEverywhereProvider : FindEverywhereProvider {
private val actionManager get() = ActionManager.getInstance() private val actionManager get() = ActionManager.getInstance()
override fun find(pattern: String): List<FindEverywhereResult> { override fun find(pattern: String, scope: Scope): List<FindEverywhereResult> {
val list = mutableListOf<FindEverywhereResult>() val list = mutableListOf<FindEverywhereResult>()
actionManager.let { list.add(CreateHostFindEverywhereResult()) } actionManager.let { list.add(CreateHostFindEverywhereResult()) }

View File

@@ -1,11 +1,12 @@
package app.termora.findeverywhere package app.termora.findeverywhere
import app.termora.I18n import app.termora.I18n
import app.termora.Scope
class SettingsFindEverywhereProvider : FindEverywhereProvider { class SettingsFindEverywhereProvider : FindEverywhereProvider {
override fun find(pattern: String): List<FindEverywhereResult> { override fun find(pattern: String, scope: Scope): List<FindEverywhereResult> {
return emptyList() return emptyList()
} }

View File

@@ -3,6 +3,7 @@ package app.termora.macro
import app.termora.Actions import app.termora.Actions
import app.termora.ApplicationScope import app.termora.ApplicationScope
import app.termora.I18n import app.termora.I18n
import app.termora.Scope
import app.termora.actions.AnAction import app.termora.actions.AnAction
import app.termora.findeverywhere.ActionFindEverywhereResult import app.termora.findeverywhere.ActionFindEverywhereResult
import app.termora.findeverywhere.FindEverywhereProvider import app.termora.findeverywhere.FindEverywhereProvider
@@ -16,7 +17,7 @@ import kotlin.math.min
class MacroFindEverywhereProvider : FindEverywhereProvider { class MacroFindEverywhereProvider : FindEverywhereProvider {
private val macroManager get() = MacroManager.getInstance() private val macroManager get() = MacroManager.getInstance()
override fun find(pattern: String): List<FindEverywhereResult> { override fun find(pattern: String, scope: Scope): List<FindEverywhereResult> {
val macroAction = ActionManager.getInstance().getAction(Actions.MACRO) ?: return emptyList() val macroAction = ActionManager.getInstance().getAction(Actions.MACRO) ?: return emptyList()
if (macroAction !is MacroAction) return emptyList() if (macroAction !is MacroAction) return emptyList()

View File

@@ -28,7 +28,6 @@ import java.io.File
import java.net.URL import java.net.URL
import java.net.URLClassLoader import java.net.URLClassLoader
import java.util.* import java.util.*
import kotlin.math.cos
internal class PluginManager private constructor() { internal class PluginManager private constructor() {
companion object { companion object {

View File

@@ -11,7 +11,6 @@ import org.apache.commons.lang3.StringUtils
import java.awt.BorderLayout import java.awt.BorderLayout
import java.awt.Component import java.awt.Component
import java.awt.KeyboardFocusManager import java.awt.KeyboardFocusManager
import java.awt.SystemColor.desktop
import java.awt.Window import java.awt.Window
import java.awt.event.ComponentAdapter import java.awt.event.ComponentAdapter
import java.awt.event.ComponentEvent import java.awt.event.ComponentEvent