From 70575d93789a1faeef2c7343706cd62840fed481 Mon Sep 17 00:00:00 2001 From: ugurtafrali Date: Thu, 26 Feb 2026 10:22:21 +0300 Subject: [PATCH 1/3] Fix #3745: use offset-based getLineHeight() in StickyScrollingControl Replace parameterless getLineHeight() calls with the offset-aware getLineHeight(int offset) variant to correctly account for lines containing emoji or other extended characters that increase line height. - In calculateAndSetStickyLinesCanvasBounds(), sum per-line heights using stickyLineText.getLineHeight(offset) so the canvas bounds accurately reflect the actual rendered height of each sticky line. - In limitVisibleStickyLinesToTextWidgetHeight(), use textWidget.getLineHeight(topOffset) so the visible line count estimate respects the actual height of the top visible line. --- .../stickyscroll/StickyScrollingControl.java | 8 ++++++-- .../StickyScrollingControlTest.java | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/bundles/org.eclipse.ui.editors/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControl.java b/bundles/org.eclipse.ui.editors/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControl.java index 12bb922768e..cd483195287 100644 --- a/bundles/org.eclipse.ui.editors/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControl.java +++ b/bundles/org.eclipse.ui.editors/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControl.java @@ -331,7 +331,10 @@ private void calculateAndSetStickyLinesCanvasBounds() { StyledText textWidget= sourceViewer.getTextWidget(); int numberStickyLines= getNumberStickyLines(); - int lineHeight= stickyLineText.getLineHeight() * numberStickyLines; + int lineHeight= 0; + for (int i= 0; i < numberStickyLines; i++) { + lineHeight+= stickyLineText.getLineHeight(stickyLineText.getOffsetAtLine(i)); + } int spacingHeight= stickyLineText.getLineSpacing() * (numberStickyLines - 1); int separatorHeight= bottomSeparator.getBounds().height; @@ -450,7 +453,8 @@ private boolean areStickyLinesOutDated(StyledText textWidget) { } private void limitVisibleStickyLinesToTextWidgetHeight(StyledText textWidget) { - int lineHeight= textWidget.getLineHeight() + textWidget.getLineSpacing(); + int topOffset= textWidget.getOffsetAtLine(textWidget.getTopIndex()); + int lineHeight= textWidget.getLineHeight(topOffset) + textWidget.getLineSpacing(); int textWidgetHeight= textWidget.getBounds().height; int visibleLinesInTextWidget= textWidgetHeight / lineHeight; diff --git a/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java b/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java index babf3580e22..25babdd6cbc 100644 --- a/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java +++ b/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java @@ -236,6 +236,26 @@ void testStyling() { assertEquals(hoverColor, stickyLineText.getForeground()); } + @Test + void testCanvasBoundsHeightMatchesPerLineHeights() { + sourceViewer.getTextWidget().setBounds(0, 0, 200, 200); + List stickyLines = List.of(new StickyLineStub("line 1", 0), new StickyLineStub("line 2", 1)); + stickyScrollingControl.setStickyLines(stickyLines); + + Canvas stickyControlCanvas = getStickyControlCanvas(shell); + StyledText stickyLineText = getStickyLineText(); + Composite stickyLineSeparator = getStickyLineSeparator(); + + int expectedHeight = 0; + for (int i = 0; i < 2; i++) { + expectedHeight += stickyLineText.getLineHeight(stickyLineText.getOffsetAtLine(i)); + } + expectedHeight += stickyLineText.getLineSpacing(); // (2-1) * spacing + expectedHeight += stickyLineSeparator.getBounds().height; + + assertEquals(expectedHeight, stickyControlCanvas.getBounds().height); + } + @Test void testLayoutStickyLinesCanvasOnResize() { sourceViewer.getTextWidget().setBounds(0, 0, 200, 200); From 6ee96b2c0975c02dc5eebe5ebbe1f085e87b50bd Mon Sep 17 00:00:00 2001 From: Eclipse Platform Bot Date: Fri, 27 Feb 2026 19:21:29 +0000 Subject: [PATCH 2/3] Version bump(s) for 4.40 stream --- bundles/org.eclipse.ui.editors/META-INF/MANIFEST.MF | 2 +- tests/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bundles/org.eclipse.ui.editors/META-INF/MANIFEST.MF b/bundles/org.eclipse.ui.editors/META-INF/MANIFEST.MF index 5a78bb6d2b6..4277421c007 100644 --- a/bundles/org.eclipse.ui.editors/META-INF/MANIFEST.MF +++ b/bundles/org.eclipse.ui.editors/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.ui.editors; singleton:=true -Bundle-Version: 3.21.0.qualifier +Bundle-Version: 3.21.100.qualifier Bundle-Activator: org.eclipse.ui.internal.editors.text.EditorsPlugin Bundle-ActivationPolicy: lazy Bundle-Vendor: %providerName diff --git a/tests/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF index d9b8cb75c36..abb30a1d630 100644 --- a/tests/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF +++ b/tests/org.eclipse.ui.editors.tests/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %Plugin.name Bundle-SymbolicName: org.eclipse.ui.editors.tests;singleton:=true -Bundle-Version: 3.14.0.qualifier +Bundle-Version: 3.14.100.qualifier Bundle-Vendor: %Plugin.providerName Bundle-Localization: plugin Export-Package: org.eclipse.jface.text.tests.codemining, From e7953d6e28f3e8e106c30e7f2dc144a91acbdd9d Mon Sep 17 00:00:00 2001 From: ugurtafrali Date: Sat, 28 Feb 2026 17:25:27 +0300 Subject: [PATCH 3/3] Improve test to compare plain vs emoji line heights Replace testCanvasBoundsHeightMatchesPerLineHeights with a comparison-based approach as suggested in review: set plain-text sticky lines first, then replace with emoji text, and assert that the canvas height increases. This avoids hardcoded size assumptions and better documents the actual bug behavior. --- .../StickyScrollingControlTest.java | 30 +++++++++++-------- 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java b/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java index 25babdd6cbc..8ef99ab2872 100644 --- a/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java +++ b/tests/org.eclipse.ui.editors.tests/src/org/eclipse/ui/internal/texteditor/stickyscroll/StickyScrollingControlTest.java @@ -17,6 +17,7 @@ import static org.hamcrest.Matchers.greaterThan; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -237,23 +238,28 @@ void testStyling() { } @Test - void testCanvasBoundsHeightMatchesPerLineHeights() { + void testCanvasBoundsHeightAdjustsForVariableLineHeights() { sourceViewer.getTextWidget().setBounds(0, 0, 200, 200); - List stickyLines = List.of(new StickyLineStub("line 1", 0), new StickyLineStub("line 2", 1)); - stickyScrollingControl.setStickyLines(stickyLines); + // Step 1: Set 2 plain-text sticky lines and record canvas height + List plainLines = List.of( + new StickyLineStub("line 1", 0), + new StickyLineStub("line 2", 1)); + stickyScrollingControl.setStickyLines(plainLines); Canvas stickyControlCanvas = getStickyControlCanvas(shell); - StyledText stickyLineText = getStickyLineText(); - Composite stickyLineSeparator = getStickyLineSeparator(); + int heightWithPlainText = stickyControlCanvas.getBounds().height; - int expectedHeight = 0; - for (int i = 0; i < 2; i++) { - expectedHeight += stickyLineText.getLineHeight(stickyLineText.getOffsetAtLine(i)); - } - expectedHeight += stickyLineText.getLineSpacing(); // (2-1) * spacing - expectedHeight += stickyLineSeparator.getBounds().height; + // Step 2: Replace second sticky line with emoji requiring more vertical space + List emojiLines = List.of( + new StickyLineStub("line 1", 0), + new StickyLineStub("\uD83D\uDE00\uD83D\uDE80\uD83C\uDF1F", 1)); + stickyScrollingControl.setStickyLines(emojiLines); + stickyControlCanvas = getStickyControlCanvas(shell); + int heightWithEmoji = stickyControlCanvas.getBounds().height; - assertEquals(expectedHeight, stickyControlCanvas.getBounds().height); + // Step 3: Assert emoji causes taller canvas (documents the actual bug) + assertTrue(heightWithEmoji > heightWithPlainText, + "Canvas height should increase when sticky lines contain emoji with larger line heights"); } @Test