diff --git a/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt b/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt
index 6c7f675..c40247d 100644
--- a/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt
+++ b/src/main/kotlin/com/mituuz/fuzzier/FuzzyAction.kt
@@ -183,7 +183,7 @@ abstract class FuzzyAction : AnAction() {
} else {
fuzzierSettingsService.state.filenameType
}
- renderer.text = container.toString(filenameType)
+ renderer.text = container.toString(filenameType, fuzzierSettingsService.state.highlightFilename)
fuzzierSettingsService.state.fileListSpacing.let {
renderer.border = BorderFactory.createEmptyBorder(it, 0, it, 0)
}
@@ -199,4 +199,8 @@ abstract class FuzzyAction : AnAction() {
fun setFiletype(filenameType: FilenameType) {
fuzzierSettingsService.state.filenameType = filenameType
}
+
+ fun setHighlight(highlight: Boolean) {
+ fuzzierSettingsService.state.highlightFilename = highlight
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt b/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt
index 4f3a44b..301b666 100644
--- a/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt
+++ b/src/main/kotlin/com/mituuz/fuzzier/components/FuzzierSettingsComponent.kt
@@ -100,6 +100,16 @@ class FuzzierSettingsComponent {
""".trimIndent(),
false)
+ val highlightFilename = SettingsComponent(JBCheckBox(), "Highlight filename in file list*",
+ """
+ This is still experimental and may cause some performance issues.
+
+ Toggles highlighting of the filename on the file list.
+
+ Only works with styled file list, which supports html styling.
+ """.trimIndent(),
+ false)
+
val fileListLimit = SettingsComponent(JBIntSpinner(50, 1, 5000), "File list limit",
"""
Controls how many files are shown and listed on the popup.
@@ -194,11 +204,12 @@ class FuzzierSettingsComponent {
.addComponent(recentFileModeSelector)
.addComponent(prioritizeShortDirs)
.addComponent(debounceTimerValue)
- .addComponent(filenameTypeSelector)
.addComponent(fileListLimit)
.addSeparator()
.addComponent(JBLabel("Popup styling"))
+ .addComponent(filenameTypeSelector)
+ .addComponent(highlightFilename)
.addComponent(fileListFontSize)
.addComponent(previewFontSize)
.addComponent(fileListSpacing)
@@ -256,6 +267,9 @@ class FuzzierSettingsComponent {
for (filenameType in FilenameType.entries) {
filenameTypeSelector.getFilenameTypeComboBox().addItem(filenameType)
}
+ filenameTypeSelector.getFilenameTypeComboBox().addItemListener {
+ highlightFilename.getCheckBox().isEnabled = it.item == FilenameType.FILENAME_WITH_PATH_STYLED
+ }
startTestBench.getButton().addActionListener {
startTestBench.getButton().isEnabled = false
diff --git a/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt b/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt
index d6c103c..8e85043 100644
--- a/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt
+++ b/src/main/kotlin/com/mituuz/fuzzier/entities/FuzzyMatchContainer.kt
@@ -30,9 +30,10 @@ import java.awt.Color
class FuzzyMatchContainer(val score: FuzzyScore, var filePath: String, var filename: String, private var module: String = "") {
private val color = JBColor.YELLOW
- private val sm: String = ""
- private val em: String = ""
+ private val startStyleTag: String = ""
+ private val endStyleTag: String = ""
private var initialPath: String? = null
+
companion object {
fun createOrderedContainer(order: Int, filePath: String, initialPath:String, filename: String): FuzzyMatchContainer {
val fuzzyScore = FuzzyScore()
@@ -47,13 +48,20 @@ class FuzzyMatchContainer(val score: FuzzyScore, var filePath: String, var filen
}
}
- fun toString(filenameType: FilenameType): String {
+ fun toString(filenameType: FilenameType, highlight: Boolean): String {
return when (filenameType) {
FilenameType.FILENAME_ONLY -> filename
FilenameType.FILE_PATH_ONLY -> filePath
FilenameType.FILENAME_WITH_PATH -> "$filename ($filePath)"
- FilenameType.FILENAME_WITH_PATH_STYLED -> getFilenameWithPathStyled()
+ FilenameType.FILENAME_WITH_PATH_STYLED -> getFilenameWithPathStyled(highlight)
+ }
+ }
+
+ private fun getStyledFilename(highlight: Boolean): String {
+ if (highlight) {
+ return highlight(filename)
}
+ return filename
}
fun highlight(source: String): String {
@@ -62,17 +70,17 @@ class FuzzyMatchContainer(val score: FuzzyScore, var filePath: String, var filen
val hlIndexes = score.highlightCharacters.sorted()
for (i in hlIndexes) {
if (i < source.length) {
- stringBuilder.insert(i + offset, sm)
- offset += sm.length
- stringBuilder.insert(i + offset + 1, em)
- offset += em.length
+ stringBuilder.insert(i + offset, startStyleTag)
+ offset += startStyleTag.length
+ stringBuilder.insert(i + offset + 1, endStyleTag)
+ offset += endStyleTag.length
}
}
return stringBuilder.toString()
}
- private fun getFilenameWithPathStyled(): String {
- return "${highlight(filename)} ($filePath"
+ private fun getFilenameWithPathStyled(highlight: Boolean): String {
+ return "${getStyledFilename(highlight)} ($filePath)"
}
fun getFileUri(): String {
diff --git a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt
index 8f806ae..eab5fac 100644
--- a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt
+++ b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurable.kt
@@ -46,8 +46,10 @@ class FuzzierSettingsConfigurable : Configurable {
component.recentFileModeSelector.getRecentFilesTypeComboBox().selectedIndex = state.recentFilesMode.ordinal
component.prioritizeShortDirs.getCheckBox().isSelected = state.prioritizeShorterDirPaths
component.debounceTimerValue.getIntSpinner().value = state.debouncePeriod
- component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex = state.filenameType.ordinal
component.fileListLimit.getIntSpinner().value = state.fileListLimit
+
+ component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex = state.filenameType.ordinal
+ component.highlightFilename.getCheckBox().isSelected = state.highlightFilename
component.fileListFontSize.getIntSpinner().value = state.fileListFontSize
component.previewFontSize.getIntSpinner().value = state.previewFontSize
component.fileListSpacing.getIntSpinner().value = state.fileListSpacing
@@ -73,8 +75,10 @@ class FuzzierSettingsConfigurable : Configurable {
|| state.recentFilesMode != component.recentFileModeSelector.getRecentFilesTypeComboBox().selectedItem
|| state.prioritizeShorterDirPaths != component.prioritizeShortDirs.getCheckBox().isSelected
|| state.debouncePeriod != component.debounceTimerValue.getIntSpinner().value
- || state.filenameType != component.filenameTypeSelector.getFilenameTypeComboBox().selectedItem
|| state.fileListLimit != component.fileListLimit.getIntSpinner().value
+
+ || state.filenameType != component.filenameTypeSelector.getFilenameTypeComboBox().selectedItem
+ || state.highlightFilename != component.highlightFilename.getCheckBox().isSelected
|| state.fileListFontSize != component.fileListFontSize.getIntSpinner().value
|| state.previewFontSize != component.previewFontSize.getIntSpinner().value
|| state.fileListSpacing != component.fileListSpacing.getIntSpinner().value
@@ -97,8 +101,10 @@ class FuzzierSettingsConfigurable : Configurable {
state.recentFilesMode = RecentFilesMode.entries.toTypedArray()[component.recentFileModeSelector.getRecentFilesTypeComboBox().selectedIndex]
state.prioritizeShorterDirPaths = component.prioritizeShortDirs.getCheckBox().isSelected
state.debouncePeriod = component.debounceTimerValue.getIntSpinner().value as Int
- state.filenameType = FilenameType.entries.toTypedArray()[component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex]
state.fileListLimit = component.fileListLimit.getIntSpinner().value as Int
+
+ state.filenameType = FilenameType.entries.toTypedArray()[component.filenameTypeSelector.getFilenameTypeComboBox().selectedIndex]
+ state.highlightFilename = component.highlightFilename.getCheckBox().isSelected
state.fileListFontSize = component.fileListFontSize.getIntSpinner().value as Int
state.previewFontSize = component.previewFontSize.getIntSpinner().value as Int
state.fileListSpacing = component.fileListSpacing.getIntSpinner().value as Int
diff --git a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt
index aa2522f..66a3264 100644
--- a/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt
+++ b/src/main/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsService.kt
@@ -48,6 +48,7 @@ class FuzzierSettingsService : PersistentStateComponent()
+ val component = renderer.getListCellRendererComponent(dummyList, container, 0, false, false) as JLabel
+ assertNotNull(component)
+ assertEquals("asd (/src/asd)", component.text)
+ }
+
+ @Test
+ fun `Check renderer with styled path, with highlight but no values`() {
+ val action = getAction()
+ action.setFiletype(FILENAME_WITH_PATH_STYLED)
+ action.setHighlight(true)
action.component = SimpleFinderComponent()
val renderer = action.getCellRenderer()
val container = FuzzyMatchContainer(FuzzyScore(), "/src/asd", "asd")
diff --git a/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt b/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt
index 6569b35..4b45f3d 100644
--- a/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt
+++ b/src/test/kotlin/com/mituuz/fuzzier/settings/FuzzierSettingsConfigurableTest.kt
@@ -43,8 +43,10 @@ class FuzzierSettingsConfigurableTest {
state.recentFilesMode = NONE
state.prioritizeShorterDirPaths = false
state.debouncePeriod = 140
- state.filenameType = FILENAME_WITH_PATH_STYLED
state.fileListLimit = 200
+
+ state.filenameType = FILENAME_WITH_PATH_STYLED
+ state.highlightFilename = false
state.fileListFontSize = 15
state.previewFontSize = 0
state.fileListSpacing = 2
@@ -67,8 +69,10 @@ class FuzzierSettingsConfigurableTest {
state.newTab = true
state.recentFilesMode = RECENT_PROJECT_FILES
state.debouncePeriod = 140
- state.filenameType = FILENAME_WITH_PATH_STYLED
state.fileListLimit = 200
+
+ state.filenameType = FILENAME_WITH_PATH_STYLED
+ state.highlightFilename = false
state.fileListFontSize = 15
state.previewFontSize = 0
state.fileListSpacing = 2