pull/1586/head^2
kunfei 3 years ago
parent 9c6b3caf18
commit 313ca3c2d3
  1. 105
      app/src/main/java/io/legado/app/ui/widget/code/CodeView.kt

@ -20,7 +20,9 @@ import java.util.regex.Pattern
import kotlin.math.roundToInt
@Suppress("unused")
class CodeView : AppCompatMultiAutoCompleteTextView {
class CodeView @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) :
AppCompatMultiAutoCompleteTextView(context, attrs) {
private var tabWidth = 0
private var tabWidthInCharacters = 0
private var mUpdateDelayTime = 500
@ -35,23 +37,53 @@ class CodeView : AppCompatMultiAutoCompleteTextView {
private val mSyntaxPatternMap: MutableMap<Pattern, Int> = HashMap()
private var mIndentCharacterList = mutableListOf('{', '+', '-', '*', '/', '=')
constructor(context: Context?) : super(context!!) {
initEditorView()
private val mUpdateRunnable = Runnable {
val source = text
highlightWithoutChange(source)
}
constructor(context: Context?, attrs: AttributeSet?) : super(
context!!, attrs
) {
initEditorView()
}
private val mEditorTextWatcher: TextWatcher = object : TextWatcher {
private var start = 0
private var count = 0
override fun beforeTextChanged(
charSequence: CharSequence,
start: Int,
before: Int,
count: Int
) {
this.start = start
this.count = count
}
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context!!, attrs, defStyleAttr
) {
initEditorView()
override fun onTextChanged(
charSequence: CharSequence,
start: Int,
before: Int,
count: Int
) {
if (!modified) return
if (highlightWhileTextChanging) {
if (mSyntaxPatternMap.isNotEmpty()) {
convertTabs(editableText, start, count)
mUpdateHandler.postDelayed(mUpdateRunnable, mUpdateDelayTime.toLong())
}
}
if (mRemoveErrorsWhenTextChanged) removeAllErrorLines()
}
override fun afterTextChanged(editable: Editable) {
if (!highlightWhileTextChanging) {
if (!modified) return
cancelHighlighterRender()
if (mSyntaxPatternMap.isNotEmpty()) {
convertTabs(editableText, start, count)
mUpdateHandler.postDelayed(mUpdateRunnable, mUpdateDelayTime.toLong())
}
}
}
}
private fun initEditorView() {
init {
if (mAutoCompleteTokenizer == null) {
mAutoCompleteTokenizer = KeywordTokenizer()
}
@ -170,7 +202,7 @@ class CodeView : AppCompatMultiAutoCompleteTextView {
private fun highlight(editable: Editable): Editable {
// if (editable.isEmpty() || editable.length > 1024) return editable
if (editable.length !in 1 .. 1024) {
if (editable.length !in 1..1024) {
return editable
}
try {
@ -348,51 +380,6 @@ class CodeView : AppCompatMultiAutoCompleteTextView {
super.showDropDown()
}
private val mUpdateRunnable = Runnable {
val source = text
highlightWithoutChange(source)
}
private val mEditorTextWatcher: TextWatcher = object : TextWatcher {
private var start = 0
private var count = 0
override fun beforeTextChanged(
charSequence: CharSequence,
start: Int,
before: Int,
count: Int
) {
this.start = start
this.count = count
}
override fun onTextChanged(
charSequence: CharSequence,
start: Int,
before: Int,
count: Int
) {
if (!modified) return
if (highlightWhileTextChanging) {
if (mSyntaxPatternMap.isNotEmpty()) {
convertTabs(editableText, start, count)
mUpdateHandler.postDelayed(mUpdateRunnable, mUpdateDelayTime.toLong())
}
}
if (mRemoveErrorsWhenTextChanged) removeAllErrorLines()
}
override fun afterTextChanged(editable: Editable) {
if (!highlightWhileTextChanging) {
if (!modified) return
cancelHighlighterRender()
if (mSyntaxPatternMap.isNotEmpty()) {
convertTabs(editableText, start, count)
mUpdateHandler.postDelayed(mUpdateRunnable, mUpdateDelayTime.toLong())
}
}
}
}
private inner class TabWidthSpan : ReplacementSpan() {
override fun getSize(
paint: Paint,

Loading…
Cancel
Save