/******************************************************************************* * Copyright (c) 2004, 2010 IBM Corporation and others. * 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.draw2d.test; import org.eclipse.draw2d.FigureUtilities; import org.eclipse.draw2d.text.BlockFlow; import org.eclipse.draw2d.text.FlowContext; import org.eclipse.draw2d.text.FlowFigure; import org.eclipse.draw2d.text.FlowPage; import org.eclipse.draw2d.text.InlineFlow; import org.eclipse.draw2d.text.TextFlow; import org.eclipse.swt.graphics.Font; /** * @author Pratik Shah * @author Randy Hudson * @since 3.1 */ public class LookAheadTest extends BaseTestCase { Font TIMES_ROMAN = null; TextFlow simpleText; private int[] width; private FlowPage flowpage; private BlockFlow paragraph1; private TextFlow p1text1; private InlineFlow p1inline; private InlineFlow p1NestedInline; private TextFlow p1text2; private BlockFlow paragraph2; private TextFlow p2text1; private TextFlow p1text3; void assertLineBreakFound(boolean b) { assertTrue("Line break should have been found", b); } void assertLineBreakNotFound(boolean b) { assertFalse("Line break should not be found.", b); } void assertLookaheadMatchesString(int[] width, String expected) { assertEquals("Lookahead width did not match expected string:\"" + expected + "\"", getWidth(expected), width[0]); } private int getWidth(String s) { return FigureUtilities.getStringExtents(s, TIMES_ROMAN).width; } protected void setUp() throws Exception { super.setUp(); TIMES_ROMAN = new Font(display, "Times", 14, 0); simpleText = new TextFlow(); simpleText.setFont(TIMES_ROMAN); width = new int[1]; flowpage = new FlowPage(); flowpage.setFont(TIMES_ROMAN); flowpage.add(new TextFlow("Heading 1")); flowpage.add(paragraph1 = new BlockFlow()); flowpage.add(new TextFlow("Heading 2")); flowpage.add(paragraph2 = new BlockFlow()); paragraph1.add(p1text1 = new TextFlow("The quick ")); paragraph1.add(p1inline = new InlineFlow()); p1inline.add(p1NestedInline = new InlineFlow()); p1NestedInline.add(p1text2 = new TextFlow("brown fox")); paragraph1.add(p1text3 = new TextFlow("jumped over")); paragraph2.add(p2text1 = new TextFlow("Hel")); paragraph2.add(new TextFlow("")); paragraph2.add(new InlineFlow()); paragraph2.add(new TextFlow("lo")); } public void testContainerLeadingWord() { p1inline.addLeadingWordRequirements(width); assertLookaheadMatchesString(width, "brown"); } public void testBlockLeadingWord() { paragraph1.addLeadingWordRequirements(width); assertEquals("Blocks should have no leading word", 0, width[0]); } FlowContext getContext(FlowFigure figure) { return (FlowContext) figure.getParent().getLayoutManager(); } int getFollow(FlowFigure figure) { getContext(figure).getWidthLookahead(figure, width); return width[0]; } public void testContextLookaheadPrecedingInline() { assertEquals("Context lookahead into inline flow failed", getFollow(p1text1), getWidth("brown")); } public void testContextLookaheadFromNested() { assertEquals("Context lookahead from nested inline textflow failed", getFollow(p1text2), getWidth("jumped")); } public void testContextLookaheadAtEndOfBlock() { assertTrue("Last figure in a block should have no lookahead", getFollow(p1text3) == 0); } public void testContextLookaheadPastEmptyString() { assertEquals("Context lookahead over empty TextFlow failed", getFollow(p2text1), getWidth("lo")); } public void testContextChineseCharLookahead() { p1text2.setText("\u7325abcdef"); assertTrue("Chinese characters should have no lookahead", getFollow(p1text1) == 0); } public void testContextHyphenLookahead() { p1text2.setText("-abc"); assertEquals("Context lookahead should be hyphen character", getFollow(p1text1), getWidth("-")); } public void testSingleLetter() { simpleText.setText("a"); assertLineBreakNotFound(simpleText.addLeadingWordRequirements(width)); assertLookaheadMatchesString(width, "a"); } public void testSingleSpace() { simpleText.setText(" "); assertTrue("Line break should have been found", simpleText.addLeadingWordRequirements(width)); assertTrue("test21 failed", width[0] == 0); simpleText.setText("\u7325"); width[0] = 0; assertTrue("test22 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test23 failed", width[0] == 0); simpleText.setText("-"); width[0] = 0; assertTrue("test24 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test25 failed", width[0] == getWidth("-")); simpleText.setText("ombudsman"); width[0] = 0; assertTrue("test26 failed", !simpleText.addLeadingWordRequirements(width)); assertTrue("test27 failed", width[0] == getWidth("ombudsman")); simpleText.setText("space bar"); width[0] = 0; assertTrue("test28 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test29 failed", width[0] == getWidth("space")); simpleText.setText("endsInSpace "); width[0] = 0; assertTrue("test30 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test31 failed", width[0] == getWidth("endsInSpace")); simpleText.setText("endsInHyphen-"); width[0] = 0; assertTrue("test32 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test33 failed", width[0] == getWidth("endsInHyphen-")); simpleText.setText("co-operate"); width[0] = 0; assertTrue("test34 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test35 failed", width[0] == getWidth("co-")); simpleText.setText("ab\u7325"); width[0] = 0; assertTrue("test36 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test37 failed", width[0] == getWidth("ab")); simpleText.setText("hey, man."); width[0] = 0; assertTrue("test38 failed", simpleText.addLeadingWordRequirements(width)); assertTrue("test39 failed", width[0] == getWidth("hey,")); } }