poi/src/ooxml/testcases/org/apache/poi/xslf/usermodel/TestXSLFTextParagraph.java

210 lines
8.8 KiB
Java
Executable File

package org.apache.poi.xslf.usermodel;
import junit.framework.TestCase;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.util.POILogger;
import org.apache.poi.xslf.XSLFTestDataSamples;
import java.awt.*;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: yegor
* Date: Nov 10, 2011
* Time: 1:43:25 PM
* To change this template use File | Settings | File Templates.
*/
public class TestXSLFTextParagraph extends TestCase {
private static POILogger _logger = POILogFactory.getLogger(XSLFTextParagraph.class);
public void testWrappingWidth() throws Exception {
XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide = ppt.createSlide();
XSLFTextShape sh = slide.createAutoShape();
sh.setLineColor(Color.black);
XSLFTextParagraph p = sh.addNewTextParagraph();
p.addNewTextRun().setText(
"Paragraph formatting allows for more granular control " +
"of text within a shape. Properties here apply to all text " +
"residing within the corresponding paragraph.");
Rectangle2D anchor = new Rectangle(50, 50, 300, 200);
sh.setAnchor(anchor);
double leftInset = sh.getLeftInset();
double rightInset = sh.getRightInset();
assertEquals(7.2, leftInset);
assertEquals(7.2, rightInset);
double leftMargin = p.getLeftMargin();
assertEquals(0.0, leftMargin);
double indent = p.getIndent();
assertEquals(0.0, indent); // default
double expectedWidth;
// Case 1: bullet=false, leftMargin=0, indent=0.
expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;
assertEquals(285.6, expectedWidth); // 300 - 7.2 - 7.2 - 0
assertEquals(expectedWidth, p.getWrappingWidth(true));
assertEquals(expectedWidth, p.getWrappingWidth(false));
p.setLeftMargin(36); // 0.5"
leftMargin = p.getLeftMargin();
assertEquals(36.0, leftMargin);
expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;
assertEquals(249.6, expectedWidth, 1E-5); // 300 - 7.2 - 7.2 - 36
assertEquals(expectedWidth, p.getWrappingWidth(true));
assertEquals(expectedWidth, p.getWrappingWidth(false));
// increase insets, the wrapping width should get smaller
sh.setLeftInset(10);
sh.setRightInset(10);
leftInset = sh.getLeftInset();
rightInset = sh.getRightInset();
assertEquals(10.0, leftInset);
assertEquals(10.0, rightInset);
expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;
assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36
assertEquals(expectedWidth, p.getWrappingWidth(true));
assertEquals(expectedWidth, p.getWrappingWidth(false));
// set a positive indent of a 0.5 inch. This means "First Line" indentation:
// |<--- indent -->|Here goes first line of the text
// Here go other lines (second and subsequent)
p.setIndent(36.0); // 0.5"
indent = p.getIndent();
assertEquals(36.0, indent);
expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin - indent;
assertEquals(208.0, expectedWidth); // 300 - 10 - 10 - 36 - 6.4
assertEquals(expectedWidth, p.getWrappingWidth(true)); // first line is indented
// other lines are not indented
expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;
assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36
assertEquals(expectedWidth, p.getWrappingWidth(false));
// set a negative indent of a 1 inch. This means "Hanging" indentation:
// Here goes first line of the text
// |<--- indent -->|Here go other lines (second and subsequent)
p.setIndent(-72.0); // 1"
indent = p.getIndent();
assertEquals(-72.0, indent);
expectedWidth = anchor.getWidth() - leftInset - rightInset;
assertEquals(280.0, expectedWidth); // 300 - 10 - 10
assertEquals(expectedWidth, p.getWrappingWidth(true)); // first line is NOT indented
// other lines are indented by leftMargin (the value of indent is not used)
expectedWidth = anchor.getWidth() - leftInset - rightInset - leftMargin;
assertEquals(244.0, expectedWidth); // 300 - 10 - 10 - 36
assertEquals(expectedWidth, p.getWrappingWidth(false));
}
/**
* test breaking test into lines.
* This test requires that the Arial font is available and will run only on windows
*/
public void testBreakLines(){
String os = System.getProperty("os.name");
if(os == null || !os.contains("Windows")) {
_logger.log(POILogger.WARN, "Skipping testBreakLines(), it is executed only on Windows machines");
return;
}
XMLSlideShow ppt = new XMLSlideShow();
XSLFSlide slide = ppt.createSlide();
XSLFTextShape sh = slide.createAutoShape();
XSLFTextParagraph p = sh.addNewTextParagraph();
XSLFTextRun r = p.addNewTextRun();
r.setFontFamily("Arial"); // this should always be available
r.setFontSize(12);
r.setText(
"Paragraph formatting allows for more granular control " +
"of text within a shape. Properties here apply to all text " +
"residing within the corresponding paragraph.");
sh.setAnchor(new Rectangle(50, 50, 300, 200));
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = img.createGraphics();
List<TextFragment> lines;
lines = p.breakText(graphics);
assertEquals(4, lines.size());
// descrease the shape width from 300 pt to 100 pt
sh.setAnchor(new Rectangle(50, 50, 100, 200));
lines = p.breakText(graphics);
assertEquals(12, lines.size());
// descrease the shape width from 300 pt to 100 pt
sh.setAnchor(new Rectangle(50, 50, 600, 200));
lines = p.breakText(graphics);
assertEquals(2, lines.size());
// set left and right margins to 200pt. This leaves 200pt for wrapping text
sh.setLeftInset(200);
sh.setRightInset(200);
lines = p.breakText(graphics);
assertEquals(5, lines.size());
r.setText("Apache POI");
lines = p.breakText(graphics);
assertEquals(1, lines.size());
assertEquals("Apache POI", lines.get(0).getString());
r.setText("Apache\nPOI");
lines = p.breakText(graphics);
assertEquals(2, lines.size());
assertEquals("Apache", lines.get(0).getString());
assertEquals("POI", lines.get(1).getString());
// trailing newlines are ignored
r.setText("Apache\nPOI\n");
lines = p.breakText(graphics);
assertEquals(2, lines.size());
assertEquals("Apache", lines.get(0).getString());
assertEquals("POI", lines.get(1).getString());
XSLFAutoShape sh2 = slide.createAutoShape();
sh2.setAnchor(new Rectangle(50, 50, 300, 200));
XSLFTextParagraph p2 = sh2.addNewTextParagraph();
XSLFTextRun r2 = p2.addNewTextRun();
r2.setFontFamily("serif"); // this should always be available
r2.setFontSize(30);
r2.setText("Apache\n");
XSLFTextRun r3 = p2.addNewTextRun();
r3.setFontFamily("serif"); // this should always be available
r3.setFontSize(10);
r3.setText("POI");
lines = p2.breakText(graphics);
assertEquals(2, lines.size());
assertEquals("Apache", lines.get(0).getString());
assertEquals("POI", lines.get(1).getString());
// the first line is at least two times higher than the second
assertTrue(lines.get(0).getHeight() > lines.get(1).getHeight()*2);
}
public void testThemeInheritance(){
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("prProps.pptx");
XSLFShape[] shapes = ppt.getSlides()[0].getShapes();
XSLFTextShape sh1 = (XSLFTextShape)shapes[0];
assertEquals("Apache", sh1.getText());
assertEquals(TextAlign.CENTER, sh1.getTextParagraphs().get(0).getTextAlign());
XSLFTextShape sh2 = (XSLFTextShape)shapes[1];
assertEquals("Software", sh2.getText());
assertEquals(TextAlign.CENTER, sh2.getTextParagraphs().get(0).getTextAlign());
XSLFTextShape sh3 = (XSLFTextShape)shapes[2];
assertEquals("Foundation", sh3.getText());
assertEquals(TextAlign.CENTER, sh3.getTextParagraphs().get(0).getTextAlign());
}
}