Skip to content

Commit 7605d65

Browse files
authored
Merge pull request #16 from neueda/bugfix-query-highlight
Properly highlight query under cursor
2 parents eb04308 + 66d85db commit 7605d65

File tree

6 files changed

+114
-82
lines changed

6 files changed

+114
-82
lines changed

gradle/wrapper/gradle-wrapper.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
33
distributionPath=wrapper/dists
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists
6-
distributionUrl=https\://services.gradle.org/distributions/gradle-3.2-all.zip
6+
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/highlighter/QueryHighlighterComponentImpl.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,28 @@
11
package com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter;
22

3+
import org.jetbrains.annotations.NotNull;
4+
35
import com.intellij.openapi.application.ApplicationManager;
46
import com.intellij.openapi.editor.EditorFactory;
57
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter.listener.QueryHighlighterCaretListener;
6-
import org.jetbrains.annotations.NotNull;
8+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter.listener.QueryHighlighterDocumentListener;
79

810
public class QueryHighlighterComponentImpl implements QueryHighlighterComponent {
911

1012
private QueryHighlighterCaretListener queryHighlighterCaretListener;
11-
//private QueryHighlighterDocumentListener queryHighlighterDocumentListener;
13+
private QueryHighlighterDocumentListener queryHighlighterDocumentListener;
14+
private SyncedElementHighlighter syncedElementHighlighter;
1215

1316
@Override
1417
public void initComponent() {
1518
EditorFactory editorFactory = ApplicationManager.getApplication().getComponent(EditorFactory.class);
1619

17-
queryHighlighterCaretListener = new QueryHighlighterCaretListener();
18-
//queryHighlighterDocumentListener = new QueryHighlighterDocumentListener(editorFactory);
20+
syncedElementHighlighter = new SyncedElementHighlighter();
21+
queryHighlighterCaretListener = new QueryHighlighterCaretListener(syncedElementHighlighter);
22+
queryHighlighterDocumentListener = new QueryHighlighterDocumentListener(syncedElementHighlighter, editorFactory);
1923

2024
editorFactory.getEventMulticaster().addCaretListener(queryHighlighterCaretListener);
21-
//editorFactory.getEventMulticaster().addDocumentListener(queryHighlighterDocumentListener);
25+
editorFactory.getEventMulticaster().addDocumentListener(queryHighlighterDocumentListener);
2226
}
2327

2428
@Override
@@ -27,9 +31,12 @@ public void disposeComponent() {
2731
if (queryHighlighterCaretListener != null) {
2832
editorFactory.getEventMulticaster().removeCaretListener(queryHighlighterCaretListener);
2933
}
30-
//if (queryHighlighterDocumentListener != null) {
31-
// editorFactory.getEventMulticaster().removeDocumentListener(queryHighlighterDocumentListener);
32-
//}
34+
if (queryHighlighterDocumentListener != null) {
35+
editorFactory.getEventMulticaster().removeDocumentListener(queryHighlighterDocumentListener);
36+
}
37+
if (syncedElementHighlighter != null) {
38+
syncedElementHighlighter.dispose();
39+
}
3340
}
3441

3542
@NotNull
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter;
2+
3+
import java.awt.*;
4+
import java.util.HashMap;
5+
import java.util.Map;
6+
7+
import com.intellij.openapi.editor.Caret;
8+
import com.intellij.openapi.editor.Editor;
9+
import com.intellij.openapi.editor.markup.*;
10+
import com.intellij.psi.PsiElement;
11+
import com.intellij.psi.PsiFile;
12+
import com.intellij.ui.Colors;
13+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.psi.PsiTraversalUtilities;
14+
import com.neueda.jetbrains.plugin.graphdb.platform.GraphLanguages;
15+
16+
public class SyncedElementHighlighter {
17+
18+
private final Map<Editor, RangeHighlighter> queryHighlights = new HashMap<>();
19+
20+
public void highlightStatement(Editor editor, PsiFile psiFile) {
21+
if (psiFile == null) {
22+
return;
23+
}
24+
if (psiFile.getLanguage().getID().equals(GraphLanguages.CYPHER)) {
25+
highlightStatementInCypherFile(editor, psiFile);
26+
}
27+
// int offset = lastEditor.getCaretModel().getOffset();
28+
// PsiElement parent = psiFile.findElementAt(offset);
29+
// PsiElement inside = InjectedLanguageUtil.findInside(parent, psiFile, offset, PsiDocumentManager.getInstance(lastEditor.getProject()));
30+
// PsiTraversalUtilities.getParentOfType(inside, CypherStatementItem.class);
31+
// Editor e = InjectedLanguageUtil.getInjectedEditorForInjectedFile(lastEditor, lastEditor.getCaretModel().getPrimaryCaret(), null);
32+
// PsiFile pf = PsiDocumentManager.getInstance(e.getProject()).getPsiFile(e.getDocument());
33+
}
34+
35+
public void dispose() {
36+
queryHighlights.clear();
37+
}
38+
39+
private void highlightStatementInCypherFile(Editor editor, PsiFile psiFile) {
40+
Caret caret = editor.getCaretModel().getPrimaryCaret();
41+
42+
PsiElement element = PsiTraversalUtilities.Cypher.getCypherStatementAtOffset(psiFile, caret.getOffset());
43+
synchronized (this) {
44+
if (queryHighlights.containsKey(editor)) {
45+
editor.getMarkupModel().removeHighlighter(queryHighlights.get(editor));
46+
queryHighlights.remove(editor);
47+
}
48+
49+
if (element == null) {
50+
return;
51+
}
52+
53+
try {
54+
RangeHighlighter rangeHighlighter = editor.getMarkupModel()
55+
.addRangeHighlighter(
56+
element.getTextOffset(),
57+
element.getTextOffset() + element.getTextLength(),
58+
HighlighterLayer.FIRST,
59+
new TextAttributes(null, null, Colors.DARK_GREEN, EffectType.ROUNDED_BOX, Font.PLAIN),
60+
HighlighterTargetArea.EXACT_RANGE);
61+
queryHighlights.put(editor, rangeHighlighter);
62+
} catch (Exception e) {
63+
// Ignore exceptions here.
64+
// Sometimes when we are adding range document already changed it's state
65+
// TODO: find out how exactly we should handle such cases
66+
}
67+
}
68+
}
69+
70+
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/highlighter/listener/AbstractQueryHighlighterListener.java

Lines changed: 0 additions & 55 deletions
This file was deleted.

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/highlighter/listener/QueryHighlighterCaretListener.java

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,14 +7,32 @@
77
import com.intellij.openapi.project.Project;
88
import com.intellij.psi.PsiDocumentManager;
99
import com.intellij.psi.PsiFile;
10+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter.SyncedElementHighlighter;
1011

11-
public class QueryHighlighterCaretListener extends AbstractQueryHighlighterListener implements CaretListener {
12+
public class QueryHighlighterCaretListener implements CaretListener {
1213

13-
public QueryHighlighterCaretListener() {
14+
private final SyncedElementHighlighter syncedElementHighlighter;
15+
16+
public QueryHighlighterCaretListener(SyncedElementHighlighter syncedElementHighlighter) {
17+
this.syncedElementHighlighter = syncedElementHighlighter;
1418
}
1519

1620
@Override
1721
public void caretPositionChanged(CaretEvent e) {
22+
processEvent(e);
23+
}
24+
25+
@Override
26+
public void caretAdded(CaretEvent e) {
27+
processEvent(e);
28+
}
29+
30+
@Override
31+
public void caretRemoved(CaretEvent e) {
32+
processEvent(e);
33+
}
34+
35+
private void processEvent(CaretEvent e) {
1836
Editor editor = e.getEditor();
1937
Project project = editor.getProject();
2038
if (project == null) {
@@ -24,15 +42,6 @@ public void caretPositionChanged(CaretEvent e) {
2442
Document document = editor.getDocument();
2543
PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document);
2644

27-
highlightStatement(editor, psiFile);
28-
}
29-
30-
31-
@Override
32-
public void caretAdded(CaretEvent e) {
33-
}
34-
35-
@Override
36-
public void caretRemoved(CaretEvent e) {
45+
syncedElementHighlighter.highlightStatement(editor, psiFile);
3746
}
3847
}

ui/jetbrains/src/main/java/com/neueda/jetbrains/plugin/graphdb/jetbrains/component/highlighter/listener/QueryHighlighterDocumentListener.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
11
package com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter.listener;
22

3-
import com.intellij.openapi.editor.Document;
4-
import com.intellij.openapi.editor.Editor;
5-
import com.intellij.openapi.editor.EditorFactory;
3+
import com.intellij.openapi.editor.*;
64
import com.intellij.openapi.editor.event.DocumentEvent;
75
import com.intellij.openapi.editor.event.DocumentListener;
86
import com.intellij.openapi.project.Project;
97
import com.intellij.psi.PsiDocumentManager;
108
import com.intellij.psi.PsiFile;
9+
import com.neueda.jetbrains.plugin.graphdb.jetbrains.component.highlighter.SyncedElementHighlighter;
1110

1211
/**
1312
* Not works as expected. Disabled.
1413
*/
15-
public class QueryHighlighterDocumentListener extends AbstractQueryHighlighterListener implements DocumentListener {
14+
public class QueryHighlighterDocumentListener implements DocumentListener {
1615

16+
private final SyncedElementHighlighter syncedElementHighlighter;
1717
private final EditorFactory editorFactory;
1818

19-
public QueryHighlighterDocumentListener(EditorFactory editorFactory) {
19+
public QueryHighlighterDocumentListener(SyncedElementHighlighter syncedElementHighlighter, EditorFactory editorFactory) {
20+
this.syncedElementHighlighter = syncedElementHighlighter;
2021
this.editorFactory = editorFactory;
2122
}
2223

@@ -34,7 +35,7 @@ public void documentChanged(DocumentEvent event) {
3435
return;
3536
}
3637
PsiFile psiFile = PsiDocumentManager.getInstance(project).getPsiFile(document);
37-
highlightStatement(editor, psiFile);
38+
syncedElementHighlighter.highlightStatement(editor, psiFile);
3839
}
3940
}
4041
}

0 commit comments

Comments
 (0)