1
0
mirror of https://github.com/chylex/IntelliJ-AceJump.git synced 2025-04-09 17:15:43 +02:00

Slight renaming and show a previously typed visual indicator

This commit is contained in:
breandan 2016-10-20 12:41:16 -02:00
parent 2bc68e366b
commit 658a29175a
8 changed files with 46 additions and 42 deletions

View File

@ -9,7 +9,7 @@ class DefaultKeyCommand(override val aceFinder: AceFinder) : AceKeyCommand() {
if (key == '\b') return
//Find or jump
aceFinder.findText(text, key)
aceFinder.find(text, key)
aceFinder.eventDispatcher.multicaster.stateChanged(ChangeEvent("AceFinder"))
}
}

View File

@ -1,9 +1,9 @@
package com.johnlindquist.acejump.keycommands
import com.johnlindquist.acejump.search.AceFinder
import com.johnlindquist.acejump.search.Regexp.END_OF_LINE
import com.johnlindquist.acejump.search.Pattern.END_OF_LINE
class ShowEndOfLines(override val aceFinder: AceFinder) : AceKeyCommand() {
override fun execute(key: Char, text: String) =
aceFinder.findText(END_OF_LINE)
aceFinder.findPattern(END_OF_LINE)
}

View File

@ -1,9 +1,9 @@
package com.johnlindquist.acejump.keycommands
import com.johnlindquist.acejump.search.AceFinder
import com.johnlindquist.acejump.search.Regexp.CODE_INDENTS
import com.johnlindquist.acejump.search.Pattern.CODE_INDENTS
class ShowFirstLetters(override val aceFinder: AceFinder) : AceKeyCommand() {
override fun execute(key: Char, text: String) =
aceFinder.findText(CODE_INDENTS)
aceFinder.findPattern(CODE_INDENTS)
}

View File

@ -1,9 +1,9 @@
package com.johnlindquist.acejump.keycommands
import com.johnlindquist.acejump.search.AceFinder
import com.johnlindquist.acejump.search.Regexp.BEGINNING_OF_LINE
import com.johnlindquist.acejump.search.Pattern.BEGINNING_OF_LINE
class ShowStartOfLines(override val aceFinder: AceFinder) : AceKeyCommand() {
override fun execute(key: Char, text: String) =
aceFinder.findText(BEGINNING_OF_LINE)
aceFinder.findPattern(BEGINNING_OF_LINE)
}

View File

@ -1,9 +1,9 @@
package com.johnlindquist.acejump.keycommands
import com.johnlindquist.acejump.search.AceFinder
import com.johnlindquist.acejump.search.Regexp.WHITE_SPACE
import com.johnlindquist.acejump.search.Pattern.WHITE_SPACE
class ShowWhiteSpace(override val aceFinder: AceFinder) : AceKeyCommand() {
override fun execute(key: Char, text: String) =
aceFinder.findText(WHITE_SPACE)
aceFinder.findPattern(WHITE_SPACE)
}

View File

@ -15,6 +15,7 @@ import javax.swing.event.ChangeListener
import kotlin.comparisons.compareBy
class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
var queryString: String = ""
val document = editor.document as DocumentImpl
val eventDispatcher = EventDispatcher.create(ChangeListener::class.java)
val findModel: FindModel = findManager.findInFileModel.clone()
@ -46,12 +47,12 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
findModel.setSearchHighlighters(true)
}
fun findText(text: String, key: Char) {
fun find(text: String, key: Char) {
if (key == 0.toChar())
reset()
queryString = text
findModel.stringToFind = text
populateNgrams()
val application = ApplicationManager.getApplication()
application.runReadAction(jump(key))
@ -61,13 +62,6 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
})
}
private fun populateNgrams() {
val a_z = 'a'..'z'
unseen1grams.addAll(a_z.mapTo(linkedSetOf(), { "$it" }))
unseen1grams.addAll(('0'..'9').mapTo(linkedSetOf(), { "$it" }))
a_z.flatMapTo(unseen2grams, { e -> a_z.map { c -> "${e}$c" } })
}
var targetModeEnabled = false
fun toggleTargetMode(): Boolean {
targetModeEnabled = !targetModeEnabled
@ -91,7 +85,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
return {
jumpLocations = determineJumpLocations()
if (jumpLocations.size <= 1) {
val text = findModel.stringToFind.toLowerCase()
val text = queryString.toLowerCase()
if (tagMap.containsKey(text)) {
jumpTo(JumpInfo(text, text, tagMap[text]!!, editor))
} else if (2 <= text.length) {
@ -107,20 +101,26 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
}
}
var sitesToCheck: List<Int> = listOf()
private fun determineJumpLocations(): Collection<JumpInfo> {
populateNgrams()
val fullText = document.charsSequence.toString().toLowerCase()
sitesToCheck = getSitesInView(fullText)
val sitesToCheck = getSitesInView(fullText)
val existingDigraphs = makeMap(fullText, sitesToCheck)
if (existingDigraphs.isEmpty)
tagMap = filterTags(tagMap, findModel.stringToFind)
tagMap = filterTags(tagMap, queryString)
else
tagMap = compact(mapUniqueDigraphs(existingDigraphs))
return plotJumpLocations()
}
fun populateNgrams() {
val a_z = 'a'..'z'
unseen1grams.addAll(a_z.mapTo(linkedSetOf(), { "$it" }))
unseen1grams.addAll(('0'..'9').mapTo(linkedSetOf(), { "$it" }))
a_z.flatMapTo(unseen2grams, { e -> a_z.map { c -> "${e}$c" } })
}
private fun filterTags(tags: BiMap<String, Int>, prefix: String) =
tags.filterTo(HashBiMap.create(tags.size), { e ->
prefix.endsWith(e.key) || prefix.endsWith(e.key[0])
@ -131,15 +131,15 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
val firstCharacter = e.key[0].toString()
if (tagMap.keys.count { it[0] == e.key[0] } == 1 &&
unseen1grams.contains(firstCharacter) &&
!findModel.stringToFind.endsWith(firstCharacter) &&
!findModel.stringToFind.endsWith(e.key))
!queryString.endsWith(firstCharacter) &&
!queryString.endsWith(e.key))
firstCharacter
else e.key
})
private fun getSitesInView(fullText: String): List<Int> {
fun getSitesToCheck(window: String): Iterable<Int> {
if (findModel.stringToFind.isEmpty())
if (queryString.isEmpty())
return 0..(window.length - 2)
val indicesToCheck = arrayListOf<Int>()
@ -162,7 +162,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
for (site in sites) {
var (p1, p2) = Pair(site, site + 1)
var (c1, c2) = Pair(text[p1], text[p2])
val origin = p1 - findModel.stringToFind.length
val origin = p1 - queryString.length
stringToIndex.put("$c1", origin)
stringToIndex.put("$c1$c2", origin)
unseen1grams.remove("$c1")
@ -209,8 +209,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
// Add pre-existing tags where search string and tag are intermingled
for (entry in tagMap) {
val search = findModel.stringToFind
if (search == entry.key || search.last() == entry.key.first()) {
if (queryString == entry.key || queryString.last() == entry.key.first()) {
newTagMap[entry.key] = entry.value
unusedNgrams.remove(entry.key[0].toString())
}
@ -229,7 +228,7 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
}
val remainingSites = remaining.filter {
it.key.first().isLetterOrDigit() || findModel.stringToFind.isNotEmpty()
it.key.first().isLetterOrDigit() || queryString.isNotEmpty()
}.flatMap { it.value }.listIterator()
while (remainingSites.hasNext() && unusedNgrams.isNotEmpty())
@ -238,15 +237,15 @@ class AceFinder(val findManager: FindManager, val editor: EditorImpl) {
return newTagMap
}
fun findText(text: Regexp) {
fun findPattern(text: Pattern) {
findModel.isRegularExpressions = true
findText(text.pattern, 0.toChar())
find(text.pattern, 0.toChar())
findModel.isRegularExpressions = false
}
fun plotJumpLocations(): List<JumpInfo> {
return tagMap.values.map {
JumpInfo(tagMap.inverse()[it]!!, findModel.stringToFind, it, editor)
JumpInfo(tagMap.inverse()[it]!!, queryString, it, editor)
}
}

View File

@ -1,6 +1,6 @@
package com.johnlindquist.acejump.search
enum class Regexp(val pattern: String) {
enum class Pattern(val pattern: String) {
END_OF_LINE("\\n"),
BEGINNING_OF_LINE("^.|\\n(?<!.\\n)"),
CODE_INDENTS("^\\s*\\S"),

View File

@ -4,8 +4,7 @@ import com.intellij.openapi.editor.impl.EditorImpl
import com.johnlindquist.acejump.search.getPointFromVisualPosition
import java.awt.AlphaComposite
import java.awt.Color
import java.awt.Color.BLACK
import java.awt.Color.yellow
import java.awt.Color.*
import java.awt.Graphics2D
import java.awt.RenderingHints
@ -17,6 +16,7 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
var originOffset = editor.offsetToVisualPosition(offset)
var tagOffset = editor.offsetToVisualPosition(offset + search.length)
var tagPoint = getPointFromVisualPosition(editor, originOffset).originalPoint
var srcPoint = getPointFromVisualPosition(editor, originOffset).originalPoint
fun renderTag(): String {
var trueOffset = 0
@ -30,13 +30,11 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
tagOffset = editor.offsetToVisualPosition(offset + trueOffset)
tagPoint = getPointFromVisualPosition(editor, tagOffset).originalPoint
return tag
// .mapIndexed { i, c ->
// if (source.isEmpty() || source[i] == c.toLowerCase()) ' ' else c
// }.joinToString("")
}
fun drawRect(g2d: Graphics2D, fbm: AceCanvas.FontBasedMeasurements, colors: Pair<Color, Color>) {
val text = renderTag()
val origin = srcPoint
val original = tagPoint
val backgroundColor = yellow//if (text[0] == ' ') Color.YELLOW else colors.first
val foregroundColor = yellow//if (text[0] == ' ') Color.YELLOW else colors.second
@ -44,17 +42,24 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
original.translate(0, -fbm.hOffset.toInt())
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON)
g2d.color = green
if (search.isNotEmpty()) {
g2d.drawRect(origin.x - fbm.rectMarginWidth - 1,
origin.y - fbm.rectHOffset.toInt() - 1,
search.length * fbm.fontWidth, fbm.lineHeight.toInt() + 1)
}
//a slight border for "pop" against the background
g2d.color = backgroundColor
if (text.length == 2) {
g2d.drawRect(original.x - fbm.rectMarginWidth - 1,
original.y - fbm.rectHOffset.toInt() - 1,
fbm.rectWidth + fbm.fontWidth + 5, fbm.lineHeight.toInt() + 1)
fbm.rectWidth + fbm.fontWidth, fbm.lineHeight.toInt() + 1)
} else {
g2d.drawRect(original.x - fbm.rectMarginWidth - 1,
original.y - fbm.rectHOffset.toInt() - 1,
fbm.rectWidth + 1, fbm.lineHeight.toInt() + 1)
fbm.rectWidth, fbm.lineHeight.toInt() + 1)
}
//the background rectangle
@ -63,7 +68,7 @@ class JumpInfo(private val tag: String, var search: String, val index: Int, val
if (text.length == 2) {
g2d.fillRect(original.x - fbm.rectMarginWidth,
original.y - fbm.rectHOffset.toInt(),
fbm.rectWidth + fbm.fontWidth + 5, fbm.lineHeight.toInt())
fbm.rectWidth + fbm.fontWidth, fbm.lineHeight.toInt())
} else {
g2d.fillRect(original.x - fbm.rectMarginWidth,
original.y - fbm.rectHOffset.toInt(),