From 8e1dca71c0ceffbcc8d5fc6dbcd33c5017bf51dd Mon Sep 17 00:00:00 2001 From: Rasarts Date: Fri, 10 May 2019 11:11:41 +0300 Subject: [PATCH 1/2] Render braces in gutter. --- .../component/HighlightEditorComponent.java | 12 +++ .../qeesung/highlighter/BraceHighlighter.java | 95 +++++++++++++++++-- 2 files changed, 100 insertions(+), 7 deletions(-) diff --git a/src/main/java/io/github/qeesung/component/HighlightEditorComponent.java b/src/main/java/io/github/qeesung/component/HighlightEditorComponent.java index 0842087..95456b8 100644 --- a/src/main/java/io/github/qeesung/component/HighlightEditorComponent.java +++ b/src/main/java/io/github/qeesung/component/HighlightEditorComponent.java @@ -21,6 +21,7 @@ public class HighlightEditorComponent implements CaretListener { private final Editor editor; private List highlighterList = new ArrayList<>(); + private List gutterHighlighterList = new ArrayList<>(); private ExtraHighlightTrigger extraHighlightTrigger; public void dispose() { @@ -98,6 +99,9 @@ public void highlightEditorCurrentPair(Editor editor) { // clear the high lighter highlighter.eraseHighlight(highlighterList); + // clear braces in gutter + highlighter.eraseHighlight(gutterHighlighterList); + // find the brace positions BracePair bracePair = highlighter.findClosetBracePair(offset); @@ -105,6 +109,14 @@ public void highlightEditorCurrentPair(Editor editor) { Pair highlighterEntry = highlighter.highlightPair(bracePair); + // show braces in gutter + List showBracesInGutter = + highlighter.showBracesInGutter(bracePair); + + if (showBracesInGutter!= null) { + gutterHighlighterList.addAll(showBracesInGutter); + } + // record the high lighter if (highlighterEntry != null) { highlighterList.add(highlighterEntry.getLeft()); diff --git a/src/main/java/io/github/qeesung/highlighter/BraceHighlighter.java b/src/main/java/io/github/qeesung/highlighter/BraceHighlighter.java index 6c5ef99..a1722b8 100644 --- a/src/main/java/io/github/qeesung/highlighter/BraceHighlighter.java +++ b/src/main/java/io/github/qeesung/highlighter/BraceHighlighter.java @@ -7,10 +7,7 @@ import com.intellij.openapi.editor.ex.MarkupModelEx; import com.intellij.openapi.editor.highlighter.EditorHighlighter; import com.intellij.openapi.editor.highlighter.HighlighterIterator; -import com.intellij.openapi.editor.markup.HighlighterLayer; -import com.intellij.openapi.editor.markup.HighlighterTargetArea; -import com.intellij.openapi.editor.markup.RangeHighlighter; -import com.intellij.openapi.editor.markup.TextAttributes; +import com.intellij.openapi.editor.markup.*; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiDocumentManager; @@ -21,7 +18,11 @@ import io.github.qeesung.brace.BracePair; import io.github.qeesung.setting.HighlightBracketPairSettingsPage; import io.github.qeesung.util.Pair; +import org.jetbrains.annotations.NotNull; +import javax.swing.*; +import java.awt.*; +import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @@ -57,7 +58,6 @@ public BraceHighlighter(Editor editor) { } /** - * * @return */ public List> getSupportedBraceToken() { @@ -82,8 +82,6 @@ public BracePair findClosetBracePairInBraceTokens(int offset) { rightType(braceTokenPair.getRight()). leftIterator(leftTraverseIterator). rightIterator(rightTraverseIterator).build(); - - } } return EMPTY_BRACE_PAIR; @@ -125,6 +123,89 @@ public BracePair findClosetBracePair(int offset) { } } + public List showBracesInGutter(BracePair bracePair) { + final Brace leftBrace = bracePair.getLeftBrace(); + final Brace rightBrace = bracePair.getRightBrace(); + final int leftBraceOffset = leftBrace.getOffset(); + final int rightBraceOffset = rightBrace.getOffset(); + final String leftBraceText = leftBrace.getText(); + final String rightBraceText = rightBrace.getText(); + + if (leftBraceOffset == NON_OFFSET || + rightBraceOffset == NON_OFFSET) + return null; + + // try to get the text attr by element type + TextAttributesKey textAttributesKey = + HighlightBracketPairSettingsPage.getTextAttributesKeyByToken(leftBrace.getElementType()); + // if not found, get the text attr by brace text + if (textAttributesKey == null) { + textAttributesKey = HighlightBracketPairSettingsPage.getTextAttributesKeyByText(leftBraceText); + } + final TextAttributes textAttributes = editor.getColorsScheme().getAttributes(textAttributesKey); + + int openBraceLine = document.getLineNumber(leftBraceOffset); + RangeHighlighter openBraceHighlighter = renderBraceInGutter(openBraceLine, leftBraceText, textAttributes); + + int closeBraceLine = document.getLineNumber(rightBraceOffset); + RangeHighlighter closeBraceHighlighter = renderBraceInGutter(closeBraceLine, rightBraceText, textAttributes); + + List highlighters = new ArrayList(); + highlighters.add(openBraceHighlighter); + highlighters.add(closeBraceHighlighter); + + return highlighters; + } + + public RangeHighlighter renderBraceInGutter(int braceLine, String braceText, TextAttributes textAttributes) { + RangeHighlighter braceHighlighter = editor.getMarkupModel() + .addLineHighlighter(braceLine, HighlighterLayer.SELECTION, null); + + GutterIconRenderer braceGutterIconRenderer = new GutterIconRenderer() { + + @NotNull + @Override + public Icon getIcon() { + return new Icon() { + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + if (braceText.toString().toCharArray().length < 1) { + return; + } + + g.setColor(textAttributes.getForegroundColor()); + g.drawChars(braceText.toString().toCharArray(), 0, braceText.length(), 0, 0); + } + + @Override + public int getIconWidth() { + return 1; + } + + @Override + public int getIconHeight() { + return 1; + } + }; + } + + @Override + public boolean equals(Object obj) { + return false; + } + + @Override + public int hashCode() { + return 1; + } + }; + + braceHighlighter.setGutterIconRenderer(braceGutterIconRenderer); + braceHighlighter.setGreedyToRight(true); + + return braceHighlighter; + } + public Pair highlightPair(BracePair bracePair) { final Brace leftBrace = bracePair.getLeftBrace(); final Brace rightBrace = bracePair.getRightBrace(); From bd30994aea5c7a9f44fdfbeb59127b384261e85d Mon Sep 17 00:00:00 2001 From: Vitaliy Vostrikov Date: Tue, 10 Mar 2020 06:45:45 +0300 Subject: [PATCH 2/2] Add files via upload --- HighlightBracketPair-1.1.2.zip | Bin 0 -> 25510 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 HighlightBracketPair-1.1.2.zip diff --git a/HighlightBracketPair-1.1.2.zip b/HighlightBracketPair-1.1.2.zip new file mode 100644 index 0000000000000000000000000000000000000000..785fa8692a47a86d8259f7bdab53ac5b785ae309 GIT binary patch literal 25510 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