From e65468b97a52c79fb35b20011b53a91de9948628 Mon Sep 17 00:00:00 2001 From: Skylot Date: Tue, 24 Nov 2020 12:24:15 +0000 Subject: [PATCH] fix(gui): proper reference highlighter remove (#1031) --- .../ui/codearea/MouseHoverHighlighter.java | 41 +++++++++++++------ 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/jadx-gui/src/main/java/jadx/gui/ui/codearea/MouseHoverHighlighter.java b/jadx-gui/src/main/java/jadx/gui/ui/codearea/MouseHoverHighlighter.java index ff1db8a2b..16833ffae 100644 --- a/jadx-gui/src/main/java/jadx/gui/ui/codearea/MouseHoverHighlighter.java +++ b/jadx-gui/src/main/java/jadx/gui/ui/codearea/MouseHoverHighlighter.java @@ -20,7 +20,8 @@ class MouseHoverHighlighter extends MouseMotionAdapter { private final CodeLinkGenerator codeLinkGenerator; private final Highlighter.HighlightPainter highlighter; - private boolean added; + private Object tag; + private int highlightedTokenOffset = -1; public MouseHoverHighlighter(CodeArea codeArea, CodeLinkGenerator codeLinkGenerator) { this.codeArea = codeArea; @@ -30,28 +31,44 @@ class MouseHoverHighlighter extends MouseMotionAdapter { @Override public void mouseMoved(MouseEvent e) { - Highlighter highlighter = codeArea.getHighlighter(); - if (added) { - highlighter.removeAllHighlights(); - added = false; + if (!addHighlight(e)) { + removeHighlight(); } + } + + private boolean addHighlight(MouseEvent e) { if (e.getModifiersEx() != 0) { - return; + return false; } try { Token token = codeArea.viewToToken(e.getPoint()); if (token == null || token.getType() != TokenTypes.IDENTIFIER) { - return; + return false; } - JumpPosition jump = codeLinkGenerator.getJumpLinkAtOffset(codeArea, token.getOffset()); + int tokenOffset = token.getOffset(); + if (tokenOffset == highlightedTokenOffset) { + // don't repaint highlight + return true; + } + JumpPosition jump = codeLinkGenerator.getJumpLinkAtOffset(codeArea, tokenOffset); if (jump == null) { - return; + return false; } - highlighter.removeAllHighlights(); - highlighter.addHighlight(token.getOffset(), token.getEndOffset(), this.highlighter); - added = true; + removeHighlight(); + tag = codeArea.getHighlighter().addHighlight(tokenOffset, token.getEndOffset(), this.highlighter); + highlightedTokenOffset = tokenOffset; + return true; } catch (Exception exc) { LOG.error("Mouse hover highlight error", exc); + return false; + } + } + + private void removeHighlight() { + if (tag != null) { + codeArea.getHighlighter().removeHighlight(tag); + tag = null; + highlightedTokenOffset = -1; } } }