11package io.github.ethersync.protocol
22
3+ import com.intellij.openapi.application.ApplicationManager
4+ import com.intellij.openapi.application.ModalityState
35import com.intellij.openapi.components.Service
6+ import com.intellij.openapi.editor.LogicalPosition
7+ import com.intellij.openapi.editor.markup.HighlighterLayer
8+ import com.intellij.openapi.editor.markup.HighlighterTargetArea
9+ import com.intellij.openapi.editor.markup.RangeHighlighter
10+ import com.intellij.openapi.editor.markup.TextAttributes
411import com.intellij.openapi.fileEditor.FileEditorManager
12+ import com.intellij.openapi.fileEditor.TextEditor
513import com.intellij.openapi.project.Project
14+ import com.intellij.ui.JBColor
15+ import java.util.LinkedList
616
717@Service(Service .Level .PROJECT )
818class EthersyncEditorProtocolImpl (private val project : Project ) : EthersyncEditorProtocol {
19+
20+ private val highlighter = LinkedList <RangeHighlighter >()
21+
922 override fun cursor (cursorEvent : CursorEvent ) {
10- System .out .printf(" Cursor: %s, %s\n " , cursorEvent.documentUri, cursorEvent.ranges)
1123
12- val fileEditorManager = FileEditorManager .getInstance(project);
13- val editor = fileEditorManager.allEditors
14- .find { editor -> editor.file.url == cursorEvent.documentUri } ? : return
24+ val fileEditorManager = FileEditorManager .getInstance(project)
25+
26+ val fileEditor = fileEditorManager.allEditors
27+ .first { editor -> editor.file.url == cursorEvent.documentUri } ? : return
28+
29+ if (fileEditor is TextEditor ) {
30+ val editor = fileEditor.editor
31+ ApplicationManager .getApplication().invokeLater({
32+ synchronized(highlighter) {
33+ val markupModel = editor.markupModel
34+
35+ for (hl in highlighter) {
36+ markupModel.removeHighlighter(hl)
37+ }
38+ highlighter.clear()
39+
40+ for (range in cursorEvent.ranges) {
41+ val startPosition = editor.logicalPositionToOffset(LogicalPosition (range.start.line, range.start.character))
42+ val endPosition = editor.logicalPositionToOffset(LogicalPosition (range.end.line, range.end.character))
43+
44+ val textAttributes = TextAttributes ().apply {
45+ backgroundColor = JBColor (JBColor .YELLOW , JBColor .DARK_GRAY )
46+ // TODO: unclear which is the best effect type
47+ // effectType = EffectType.LINE_UNDERSCORE
48+ // effectColor = JBColor(JBColor.YELLOW, JBColor.DARK_GRAY)
49+ }
50+
51+ val hl = markupModel.addRangeHighlighter(
52+ startPosition,
53+ endPosition + 1 ,
54+ HighlighterLayer .ADDITIONAL_SYNTAX ,
55+ textAttributes,
56+ HighlighterTargetArea .EXACT_RANGE
57+ )
1558
16- // TODO find a way how to create an additional cursor
59+ highlighter.add(hl)
60+ }
61+ }
62+ }, ModalityState .nonModal())
63+ }
1764 }
18- }
65+ }
0 commit comments