Skip to content

Commit e02781c

Browse files
HeikoKlarefedejeanne
authored andcommitted
Fix change highlight placement in TextMergeViewer after zoom change
The TextMergeViewer caches line heights for painting the change region highlights. That cache is not invalidated upon a zoom change even though the cached line heights are only valid for one specific zoom. In consequence, the highlights are not properly placed after a zoom change anymore. This change clears the line height cached upon zoom change of the according canvas, which fixes the placement of change highlight regions after zoom changes.
1 parent 9202acf commit e02781c

File tree

1 file changed

+12
-8
lines changed

1 file changed

+12
-8
lines changed

team/bundles/org.eclipse.compare/compare/org/eclipse/compare/contentmergeviewer/TextMergeViewer.java

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2737,7 +2737,8 @@ private MergeSourceViewer createPart(Composite parent) {
27372737
createSourceViewer(parent, getDirection()),
27382738
getResourceBundle(), getCompareConfiguration().getContainer());
27392739
final StyledText te= viewer.getSourceViewer().getTextWidget();
2740-
2740+
// Clear cached line heights upon zoom changes, as they are no longer valid
2741+
te.addListener(SWT.ZoomChanged, e -> resetCachedLineHeights(viewer));
27412742
if (!fConfirmSave) {
27422743
viewer.hideSaveAction();
27432744
}
@@ -4398,13 +4399,7 @@ private int getHeightBetweenLines(MergeSourceViewer tp, int fromLine, int toLine
43984399
lineHeights = new ArrayList<>();
43994400
lineHeights.addAll(Collections.nCopies(w.getLineCount(), null));
44004401
this.lineHeightsByViewer.put(tp, lineHeights);
4401-
tp.getSourceViewer().addTextListener(event -> {
4402-
List<Integer> lineHeightsList = lineHeightsByViewer.get(tp);
4403-
if (lineHeightsList != null) {
4404-
lineHeightsList.clear();
4405-
lineHeightsList.addAll(Collections.nCopies(w.getLineCount(), null));
4406-
}
4407-
});
4402+
tp.getSourceViewer().addTextListener(event -> resetCachedLineHeights(tp));
44084403
}
44094404

44104405
int lineSpacing = w.getLineSpacing();
@@ -4429,6 +4424,15 @@ private int getHeightBetweenLines(MergeSourceViewer tp, int fromLine, int toLine
44294424
return height;
44304425
}
44314426

4427+
private void resetCachedLineHeights(MergeSourceViewer mergeViewer) {
4428+
StyledText styledText = mergeViewer.getSourceViewer().getTextWidget();
4429+
List<Integer> lineHeightsList = lineHeightsByViewer.get(mergeViewer);
4430+
if (lineHeightsList != null) {
4431+
lineHeightsList.clear();
4432+
lineHeightsList.addAll(Collections.nCopies(styledText.getLineCount(), null));
4433+
}
4434+
}
4435+
44324436
private void invalidateLines() {
44334437
if (isThreeWay() && isAncestorVisible()) {
44344438
if (Utilities.okToUse(fAncestorCanvas)) {

0 commit comments

Comments
 (0)