From 0627161bf853e39aaa8645e6a26298c7011c4d72 Mon Sep 17 00:00:00 2001 From: angelozerr Date: Thu, 15 Mar 2018 23:24:17 +0100 Subject: Bug 530019 - StyledText.setStyleRange resets less cache Change-Id: Iaa4e0177de4e9d962fcdd4ea1aeeae6d6e8f2e54 Signed-off-by: angelozerr --- .../eclipse/swt/tests/junit/AllWidgetTests.java | 5 +- ...e_swt_custom_StyledText_VariableLineHeight.java | 258 +++++++++++++++++++++ 2 files changed, 261 insertions(+), 2 deletions(-) create mode 100644 tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText_VariableLineHeight.java (limited to 'tests') diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java index 7b01385b8b..fbd30f6de3 100644 --- a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/AllWidgetTests.java @@ -41,8 +41,9 @@ import org.junit.runners.Suite; Test_org_eclipse_swt_custom_StyleRange.class, Test_org_eclipse_swt_custom_CCombo.class, Test_org_eclipse_swt_custom_TableTreeItem.class, Test_org_eclipse_swt_custom_CLabel.class, Test_org_eclipse_swt_custom_CTabItem.class, Test_org_eclipse_swt_custom_StyledText.class, - Test_org_eclipse_swt_custom_StyledTextLineSpacingProvider.class, Test_org_eclipse_swt_custom_CTabFolder.class, - Test_org_eclipse_swt_widgets_Spinner.class, Test_org_eclipse_swt_widgets_ScrolledComposite.class}) + Test_org_eclipse_swt_custom_StyledText_VariableLineHeight.class, Test_org_eclipse_swt_custom_StyledTextLineSpacingProvider.class, + Test_org_eclipse_swt_custom_CTabFolder.class, Test_org_eclipse_swt_widgets_Spinner.class, + Test_org_eclipse_swt_widgets_ScrolledComposite.class}) public class AllWidgetTests { public static void main(String[] args) { JUnitCore.main(AllWidgetTests.class.getName()); diff --git a/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText_VariableLineHeight.java b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText_VariableLineHeight.java new file mode 100644 index 0000000000..dc0018a3eb --- /dev/null +++ b/tests/org.eclipse.swt.tests/JUnit Tests/org/eclipse/swt/tests/junit/Test_org_eclipse_swt_custom_StyledText_VariableLineHeight.java @@ -0,0 +1,258 @@ +/** + * Copyright (c) 2018 Angelo ZERR. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Angelo Zerr - StyledText.setStyleRange resets less cache - Bug 530019 + */ +package org.eclipse.swt.tests.junit; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.custom.StyleRange; +import org.eclipse.swt.custom.StyledText; +import org.eclipse.swt.graphics.Font; +import org.eclipse.swt.graphics.FontData; +import org.eclipse.swt.graphics.TextLayout; +import org.eclipse.swt.widgets.Shell; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +/** + * Automated Test Suite for class org.eclipse.swt.custom.StyledText to check there is no regression with Bug 530019 + * + * @see org.eclipse.swt.custom.StyledText + */ +public class Test_org_eclipse_swt_custom_StyledText_VariableLineHeight { + + Shell shell; + StyledText styledText; + + @Before + public void setUp() { + shell = new Shell(); + styledText = new StyledText(shell, SWT.NULL); + styledText.setLineSpacingProvider(l -> 0); + } + + @After + public void tearDown() { + shell.dispose(); + } + + @Test + public void testRise() { + styledText.setText("a\nb\nc\nd"); + int length = styledText.getCharCount(); + + // No style + assertVariableLineHeightEquals(0, 0); + + // style with rise=1 + StyleRange style = new StyleRange(); + style.start = 0; + style.length = length; + style.rise = 1; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(1, 0); + + // style with rise=0 + style = new StyleRange(); + style.start = 0; + style.length = length; + style.rise = 0; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0); + + // style with rise=2 + style = new StyleRange(); + style.start = 0; + style.length = length; + style.rise = 2; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(2, 0); + + // style with rise=2 again + style = new StyleRange(); + style.start = 0; + style.length = length; + style.rise = 2; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(2, 0); + } + + @Test + public void testFont() { + styledText.setText("a\nb\nc\nd"); + + // Create little, big font + Font initialFont = styledText.getFont(); + FontData[] fontData = initialFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(24); + } + Font bigFont = new Font(styledText.getDisplay(), fontData); + fontData = initialFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontData[i].getHeight() - 1); + } + Font littleFont = new Font(styledText.getDisplay(), fontData); + + int length = styledText.getCharCount(); + + // No style + assertVariableLineHeightEquals(0, 0); + + // style with big font + StyleRange style = new StyleRange(); + style.start = 0; + style.length = length; + style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE); + style.font = bigFont; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0, bigFont); + + // style with no font + style = new StyleRange(); + style.start = 0; + style.length = length; + style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE); + style.font = null; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0); + + // style with big font + style = new StyleRange(); + style.start = 0; + style.length = length; + style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE); + style.font = bigFont; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0, bigFont); + + // style with little font + style = new StyleRange(); + style.start = 0; + style.length = length; + style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE); + style.font = littleFont; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0); + + // style with no font + style = new StyleRange(); + style.start = 0; + style.length = length; + style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE); + style.font = null; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0); + + // style with little font + style = new StyleRange(); + style.start = 0; + style.length = length; + style.foreground = styledText.getDisplay().getSystemColor(SWT.COLOR_BLUE); + style.font = littleFont; + styledText.replaceStyleRanges(0, length, new StyleRange[] { style }); + assertVariableLineHeightEquals(0, 0); + + bigFont.dispose(); + littleFont.dispose(); + } + + @Test + public void testLittleFontSeveralRanges() { + styledText.setText("abc\nd"); + + // Create little, big font + Font initialFont = styledText.getFont(); + FontData[] fontData = initialFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontData[i].getHeight() / 2); + } + Font littleFont1 = new Font(styledText.getDisplay(), fontData); + fontData = initialFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontData[i].getHeight() / 4); + } + Font littleFont2 = new Font(styledText.getDisplay(), fontData); + + StyleRange[] ranges = new StyleRange[2]; + ranges[0] = new StyleRange(); + ranges[0].start = 0; + ranges[0].length = 1; + ranges[0].font = littleFont1; + + ranges[1] = new StyleRange(); + ranges[1].start = 1; + ranges[1].length = 1; + ranges[1].font = littleFont2; + + styledText.replaceStyleRanges(0, 3,ranges); + // 2 little fonts, line height is the height of the default font of StyledText + assertVariableLineHeightEquals(0, 0); + + littleFont1.dispose(); + littleFont2.dispose(); + } + + @Test + public void testBigFontSeveralRanges() { + styledText.setText("abc\nd"); + + // Create little, big font + Font initialFont = styledText.getFont(); + FontData[] fontData = initialFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontData[i].getHeight() * 2); + } + Font bigFont = new Font(styledText.getDisplay(), fontData); + fontData = initialFont.getFontData(); + for (int i = 0; i < fontData.length; i++) { + fontData[i].setHeight(fontData[i].getHeight() / 2); + } + Font littleFont = new Font(styledText.getDisplay(), fontData); + + + StyleRange[] ranges = new StyleRange[2]; + ranges[0] = new StyleRange(); + ranges[0].start = 0; + ranges[0].length = 1; + ranges[0].font = bigFont; + + ranges[1] = new StyleRange(); + ranges[1].start = 1; + ranges[1].length = 1; + ranges[1].font = littleFont; + + styledText.replaceStyleRanges(0, 3,ranges); + // line height is the height of the big font + assertVariableLineHeightEquals(0, 0, bigFont); + + bigFont.dispose(); + littleFont.dispose(); + } + + private void assertVariableLineHeightEquals(int expected, int lineIndex) { + assertVariableLineHeightEquals(expected, lineIndex, null); + } + + private void assertVariableLineHeightEquals(int expected, int lineIndex, Font font) { + int fontHeight = styledText.getLineHeight(); + if (font != null) { + TextLayout layout = new TextLayout(font.getDevice()); + layout.setFont(font); + layout.setText("a"); + fontHeight = layout.getBounds().height; + layout.dispose(); + } + int actual = styledText.getLinePixel(lineIndex + 1) - styledText.getLinePixel(lineIndex) - fontHeight; + Assert.assertEquals(expected, actual); + } + +} \ No newline at end of file -- cgit v1.2.1