junit fixes
set font size via Double color handling via HSL calculation git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1691117 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
65538c0f71
commit
d8bf3aae84
@ -74,7 +74,7 @@ public final class ApacheconEU08 {
|
|||||||
slide.addShape(box2);
|
slide.addShape(box2);
|
||||||
|
|
||||||
HSLFTextBox box3 = new HSLFTextBox();
|
HSLFTextBox box3 = new HSLFTextBox();
|
||||||
box3.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32);
|
box3.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(32d);
|
||||||
box3.setText(
|
box3.setText(
|
||||||
"Yegor Kozlov\r" +
|
"Yegor Kozlov\r" +
|
||||||
"yegor - apache - org");
|
"yegor - apache - org");
|
||||||
@ -129,10 +129,10 @@ public final class ApacheconEU08 {
|
|||||||
|
|
||||||
List<HSLFTextParagraph> tp = box2.getTextParagraphs();
|
List<HSLFTextParagraph> tp = box2.getTextParagraphs();
|
||||||
for (int i : new byte[]{0,1,2,8}) {
|
for (int i : new byte[]{0,1,2,8}) {
|
||||||
tp.get(i).getTextRuns().get(0).setFontSize(28);
|
tp.get(i).getTextRuns().get(0).setFontSize(28d);
|
||||||
}
|
}
|
||||||
for (int i : new byte[]{3,4,5,6,7}) {
|
for (int i : new byte[]{3,4,5,6,7}) {
|
||||||
tp.get(i).getTextRuns().get(0).setFontSize(24);
|
tp.get(i).getTextRuns().get(0).setFontSize(24d);
|
||||||
tp.get(i).setIndentLevel(1);
|
tp.get(i).setIndentLevel(1);
|
||||||
}
|
}
|
||||||
box2.setAnchor(new Rectangle(36, 80, 648, 400));
|
box2.setAnchor(new Rectangle(36, 80, 648, 400));
|
||||||
@ -152,15 +152,15 @@ public final class ApacheconEU08 {
|
|||||||
HSLFTableCell cell = table1.getCell(i, j);
|
HSLFTableCell cell = table1.getCell(i, j);
|
||||||
cell.setText(txt1[i][j]);
|
cell.setText(txt1[i][j]);
|
||||||
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
|
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
rt.setFontSize(10);
|
rt.setFontSize(10d);
|
||||||
rt.setFontFamily("Arial");
|
rt.setFontFamily("Arial");
|
||||||
rt.setBold(true);
|
rt.setBold(true);
|
||||||
if(i == 0){
|
if(i == 0){
|
||||||
rt.setFontSize(32);
|
rt.setFontSize(32d);
|
||||||
rt.setFontColor(Color.white);
|
rt.setFontColor(Color.white);
|
||||||
cell.getFill().setForegroundColor(new Color(0, 153, 204));
|
cell.getFill().setForegroundColor(new Color(0, 153, 204));
|
||||||
} else {
|
} else {
|
||||||
rt.setFontSize(28);
|
rt.setFontSize(28d);
|
||||||
cell.getFill().setForegroundColor(new Color(235, 239, 241));
|
cell.getFill().setForegroundColor(new Color(235, 239, 241));
|
||||||
}
|
}
|
||||||
cell.setVerticalAlignment(VerticalAlignment.MIDDLE);
|
cell.setVerticalAlignment(VerticalAlignment.MIDDLE);
|
||||||
@ -186,7 +186,7 @@ public final class ApacheconEU08 {
|
|||||||
|
|
||||||
HSLFTextBox box1 = new HSLFTextBox();
|
HSLFTextBox box1 = new HSLFTextBox();
|
||||||
box1.setHorizontalCentered(true);
|
box1.setHorizontalCentered(true);
|
||||||
box1.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24);
|
box1.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(24d);
|
||||||
box1.setText("The source code is available at\r" +
|
box1.setText("The source code is available at\r" +
|
||||||
"http://people.apache.org/~yegor/apachecon_eu08/");
|
"http://people.apache.org/~yegor/apachecon_eu08/");
|
||||||
box1.setAnchor(new Rectangle(80, 356, 553, 65));
|
box1.setAnchor(new Rectangle(80, 356, 553, 65));
|
||||||
@ -225,7 +225,7 @@ public final class ApacheconEU08 {
|
|||||||
slide.addShape(box1);
|
slide.addShape(box1);
|
||||||
|
|
||||||
HSLFTextBox box2 = new HSLFTextBox();
|
HSLFTextBox box2 = new HSLFTextBox();
|
||||||
box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18);
|
box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18d);
|
||||||
box2.setText("Creating a simple presentation from scratch");
|
box2.setText("Creating a simple presentation from scratch");
|
||||||
box2.setAnchor(new Rectangle(170, 100, 364, 30));
|
box2.setAnchor(new Rectangle(170, 100, 364, 30));
|
||||||
slide.addShape(box2);
|
slide.addShape(box2);
|
||||||
@ -233,7 +233,7 @@ public final class ApacheconEU08 {
|
|||||||
HSLFTextBox box3 = new HSLFTextBox();
|
HSLFTextBox box3 = new HSLFTextBox();
|
||||||
HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
|
HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
rt3.setFontFamily("Courier New");
|
rt3.setFontFamily("Courier New");
|
||||||
rt3.setFontSize(8);
|
rt3.setFontSize(8d);
|
||||||
box3.setText(
|
box3.setText(
|
||||||
"SlideShow ppt = new SlideShow();\u000b" +
|
"SlideShow ppt = new SlideShow();\u000b" +
|
||||||
"Slide slide = ppt.createSlide();\u000b" +
|
"Slide slide = ppt.createSlide();\u000b" +
|
||||||
@ -334,7 +334,7 @@ public final class ApacheconEU08 {
|
|||||||
slide.addShape(box1);
|
slide.addShape(box1);
|
||||||
|
|
||||||
HSLFTextBox box2 = new HSLFTextBox();
|
HSLFTextBox box2 = new HSLFTextBox();
|
||||||
box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18);
|
box2.getTextParagraphs().get(0).getTextRuns().get(0).setFontSize(18d);
|
||||||
box2.setText("PPGraphics2D: PowerPoint Graphics2D driver");
|
box2.setText("PPGraphics2D: PowerPoint Graphics2D driver");
|
||||||
box2.setAnchor(new Rectangle(178, 70, 387, 30));
|
box2.setAnchor(new Rectangle(178, 70, 387, 30));
|
||||||
slide.addShape(box2);
|
slide.addShape(box2);
|
||||||
@ -342,7 +342,7 @@ public final class ApacheconEU08 {
|
|||||||
HSLFTextBox box3 = new HSLFTextBox();
|
HSLFTextBox box3 = new HSLFTextBox();
|
||||||
HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
|
HSLFTextRun rt3 = box3.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
rt3.setFontFamily("Courier New");
|
rt3.setFontFamily("Courier New");
|
||||||
rt3.setFontSize(8);
|
rt3.setFontSize(8d);
|
||||||
box3.setText(
|
box3.setText(
|
||||||
"//bar chart data. The first value is the bar color, the second is the width\u000b" +
|
"//bar chart data. The first value is the bar color, the second is the width\u000b" +
|
||||||
"Object[] def = new Object[]{\u000b" +
|
"Object[] def = new Object[]{\u000b" +
|
||||||
@ -446,10 +446,10 @@ public final class ApacheconEU08 {
|
|||||||
|
|
||||||
List<HSLFTextParagraph> tp = box2.getTextParagraphs();
|
List<HSLFTextParagraph> tp = box2.getTextParagraphs();
|
||||||
for (int i : new byte[]{0,1,3}) {
|
for (int i : new byte[]{0,1,3}) {
|
||||||
tp.get(i).getTextRuns().get(0).setFontSize(28);
|
tp.get(i).getTextRuns().get(0).setFontSize(28d);
|
||||||
}
|
}
|
||||||
for (int i : new byte[]{2,4,5}) {
|
for (int i : new byte[]{2,4,5}) {
|
||||||
tp.get(i).getTextRuns().get(0).setFontSize(24);
|
tp.get(i).getTextRuns().get(0).setFontSize(24d);
|
||||||
tp.get(i).setIndentLevel(1);
|
tp.get(i).setIndentLevel(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,7 +37,7 @@ public final class BulletsDemo {
|
|||||||
|
|
||||||
HSLFTextBox shape = new HSLFTextBox();
|
HSLFTextBox shape = new HSLFTextBox();
|
||||||
HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
|
HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
|
||||||
rt.getTextRuns().get(0).setFontSize(42);
|
rt.getTextRuns().get(0).setFontSize(42d);
|
||||||
rt.setBullet(true);
|
rt.setBullet(true);
|
||||||
rt.setIndent(0d); //bullet offset
|
rt.setIndent(0d); //bullet offset
|
||||||
rt.setLeftMargin(50d); //text offset (should be greater than bullet offset)
|
rt.setLeftMargin(50d); //text offset (should be greater than bullet offset)
|
||||||
|
@ -55,7 +55,7 @@ public final class TableDemo {
|
|||||||
HSLFTableCell cell = table1.getCell(i, j);
|
HSLFTableCell cell = table1.getCell(i, j);
|
||||||
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
|
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
rt.setFontFamily("Arial");
|
rt.setFontFamily("Arial");
|
||||||
rt.setFontSize(10);
|
rt.setFontSize(10d);
|
||||||
if(i == 0){
|
if(i == 0){
|
||||||
cell.getFill().setForegroundColor(new Color(227, 227, 227));
|
cell.getFill().setForegroundColor(new Color(227, 227, 227));
|
||||||
} else {
|
} else {
|
||||||
@ -93,17 +93,17 @@ public final class TableDemo {
|
|||||||
for (int j = 0; j < txt2[i].length; j++) {
|
for (int j = 0; j < txt2[i].length; j++) {
|
||||||
HSLFTableCell cell = table2.getCell(i, j);
|
HSLFTableCell cell = table2.getCell(i, j);
|
||||||
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
|
HSLFTextRun rt = cell.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
rt.setFontSize(10);
|
rt.setFontSize(10d);
|
||||||
rt.setFontFamily("Arial");
|
rt.setFontFamily("Arial");
|
||||||
if(i == 0){
|
if(i == 0){
|
||||||
cell.getFill().setForegroundColor(new Color(0, 51, 102));
|
cell.getFill().setForegroundColor(new Color(0, 51, 102));
|
||||||
rt.setFontColor(Color.white);
|
rt.setFontColor(Color.white);
|
||||||
rt.setBold(true);
|
rt.setBold(true);
|
||||||
rt.setFontSize(14);
|
rt.setFontSize(14d);
|
||||||
cell.setHorizontalCentered(true);
|
cell.setHorizontalCentered(true);
|
||||||
} else {
|
} else {
|
||||||
rt.getTextParagraph().setBullet(true);
|
rt.getTextParagraph().setBullet(true);
|
||||||
rt.setFontSize(12);
|
rt.setFontSize(12d);
|
||||||
rt.getTextParagraph().setAlignment(TextAlign.LEFT);
|
rt.getTextParagraph().setAlignment(TextAlign.LEFT);
|
||||||
cell.setHorizontalCentered(false);
|
cell.setHorizontalCentered(false);
|
||||||
}
|
}
|
||||||
|
@ -42,7 +42,7 @@ public class Tutorial2 {
|
|||||||
XSLFTextParagraph p1 = shape1.addNewTextParagraph();
|
XSLFTextParagraph p1 = shape1.addNewTextParagraph();
|
||||||
XSLFTextRun r1 = p1.addNewTextRun();
|
XSLFTextRun r1 = p1.addNewTextRun();
|
||||||
r1.setText("Paragraph Formatting");
|
r1.setText("Paragraph Formatting");
|
||||||
r1.setFontSize(24);
|
r1.setFontSize(24d);
|
||||||
r1.setFontColor(new Color(85, 142, 213));
|
r1.setFontColor(new Color(85, 142, 213));
|
||||||
|
|
||||||
XSLFTextParagraph p2 = shape1.addNewTextParagraph();
|
XSLFTextParagraph p2 = shape1.addNewTextParagraph();
|
||||||
@ -52,20 +52,20 @@ public class Tutorial2 {
|
|||||||
p2.setSpaceAfter(300d); // 3 lines after the paragraph
|
p2.setSpaceAfter(300d); // 3 lines after the paragraph
|
||||||
XSLFTextRun r2 = p2.addNewTextRun();
|
XSLFTextRun r2 = p2.addNewTextRun();
|
||||||
r2.setText("Paragraph properties apply to all text residing within the corresponding paragraph.");
|
r2.setText("Paragraph properties apply to all text residing within the corresponding paragraph.");
|
||||||
r2.setFontSize(16);
|
r2.setFontSize(16d);
|
||||||
|
|
||||||
XSLFTextParagraph p3 = shape1.addNewTextParagraph();
|
XSLFTextParagraph p3 = shape1.addNewTextParagraph();
|
||||||
|
|
||||||
XSLFTextRun r3 = p3.addNewTextRun();
|
XSLFTextRun r3 = p3.addNewTextRun();
|
||||||
r3.setText("Run Formatting");
|
r3.setText("Run Formatting");
|
||||||
r3.setFontSize(24);
|
r3.setFontSize(24d);
|
||||||
r3.setFontColor(new Color(85, 142, 213));
|
r3.setFontColor(new Color(85, 142, 213));
|
||||||
|
|
||||||
XSLFTextParagraph p4 = shape1.addNewTextParagraph();
|
XSLFTextParagraph p4 = shape1.addNewTextParagraph();
|
||||||
p4.setSpaceBefore(-20d); // 20 pt from the previous paragraph
|
p4.setSpaceBefore(-20d); // 20 pt from the previous paragraph
|
||||||
p4.setSpaceAfter(300d); // 3 lines after the paragraph
|
p4.setSpaceAfter(300d); // 3 lines after the paragraph
|
||||||
XSLFTextRun r4 = p4.addNewTextRun();
|
XSLFTextRun r4 = p4.addNewTextRun();
|
||||||
r4.setFontSize(16);
|
r4.setFontSize(16d);
|
||||||
r4.setText(
|
r4.setText(
|
||||||
"Run level formatting is the most granular property level and allows " +
|
"Run level formatting is the most granular property level and allows " +
|
||||||
"for the specifying of all low level text properties. The text run is " +
|
"for the specifying of all low level text properties. The text run is " +
|
||||||
|
@ -142,6 +142,12 @@ public abstract class XSLFShape implements Shape {
|
|||||||
if (pr == null) {
|
if (pr == null) {
|
||||||
pr = shape.getGrpSpPr();
|
pr = shape.getGrpSpPr();
|
||||||
}
|
}
|
||||||
|
if (pr == null) {
|
||||||
|
if (shape.getXmlObject() instanceof CTBackground) {
|
||||||
|
pr = shape.getXmlObject();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (pr == null) {
|
if (pr == null) {
|
||||||
setValue(PaintStyle.TRANSPARENT_PAINT);
|
setValue(PaintStyle.TRANSPARENT_PAINT);
|
||||||
return true;
|
return true;
|
||||||
@ -174,29 +180,7 @@ public abstract class XSLFShape implements Shape {
|
|||||||
if (fillRef == null) {
|
if (fillRef == null) {
|
||||||
fillRef = getBgRef();
|
fillRef = getBgRef();
|
||||||
}
|
}
|
||||||
if (fillRef == null) {
|
paint = selectPaint(fillRef);
|
||||||
return PaintStyle.TRANSPARENT_PAINT;
|
|
||||||
}
|
|
||||||
|
|
||||||
// The idx attribute refers to the index of a fill style or
|
|
||||||
// background fill style within the presentation's style matrix, defined by the fmtScheme element.
|
|
||||||
// value of 0 or 1000 indicates no background,
|
|
||||||
// values 1-999 refer to the index of a fill style within the fillStyleLst element
|
|
||||||
// values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element.
|
|
||||||
int idx = (int)fillRef.getIdx();
|
|
||||||
CTSchemeColor phClr = fillRef.getSchemeClr();
|
|
||||||
XSLFSheet sheet = getSheet();
|
|
||||||
XSLFTheme theme = sheet.getTheme();
|
|
||||||
XmlObject fillProps = null;
|
|
||||||
CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();
|
|
||||||
if(idx >= 1 && idx <= 999){
|
|
||||||
fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1];
|
|
||||||
} else if (idx >= 1001 ){
|
|
||||||
fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001];
|
|
||||||
}
|
|
||||||
if(fillProps != null) {
|
|
||||||
paint = selectPaint(fillProps, phClr, sheet.getPackagePart());
|
|
||||||
}
|
|
||||||
|
|
||||||
return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint;
|
return paint == null ? PaintStyle.TRANSPARENT_PAINT : paint;
|
||||||
}
|
}
|
||||||
@ -250,6 +234,28 @@ public abstract class XSLFShape implements Shape {
|
|||||||
}
|
}
|
||||||
return _ph;
|
return _ph;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies that the corresponding shape should be represented by the generating application
|
||||||
|
* as a placeholder. When a shape is considered a placeholder by the generating application
|
||||||
|
* it can have special properties to alert the user that they may enter content into the shape.
|
||||||
|
* Different types of placeholders are allowed and can be specified by using the placeholder
|
||||||
|
* type attribute for this element
|
||||||
|
*
|
||||||
|
* @param placeholder
|
||||||
|
*/
|
||||||
|
protected void setPlaceholder(Placeholder placeholder) {
|
||||||
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr";
|
||||||
|
CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery);
|
||||||
|
if (nv == null) return;
|
||||||
|
if(placeholder == null) {
|
||||||
|
if (nv.isSetPh()) nv.unsetPh();
|
||||||
|
_ph = null;
|
||||||
|
} else {
|
||||||
|
nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* As there's no xmlbeans hierarchy, but XSLF works with subclassing, not all
|
* As there's no xmlbeans hierarchy, but XSLF works with subclassing, not all
|
||||||
@ -365,6 +371,8 @@ public abstract class XSLFShape implements Shape {
|
|||||||
return selectPaint((CTBlipFillProperties)obj, phClr, parentPart);
|
return selectPaint((CTBlipFillProperties)obj, phClr, parentPart);
|
||||||
} else if (obj instanceof CTGradientFillProperties) {
|
} else if (obj instanceof CTGradientFillProperties) {
|
||||||
return selectPaint((CTGradientFillProperties) obj, phClr, parentPart);
|
return selectPaint((CTGradientFillProperties) obj, phClr, parentPart);
|
||||||
|
} else if (obj instanceof CTStyleMatrixReference) {
|
||||||
|
return selectPaint((CTStyleMatrixReference)obj);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -479,5 +487,25 @@ public abstract class XSLFShape implements Shape {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected PaintStyle selectPaint(CTStyleMatrixReference fillRef) {
|
||||||
|
if (fillRef == null) return null;
|
||||||
|
|
||||||
|
// The idx attribute refers to the index of a fill style or
|
||||||
|
// background fill style within the presentation's style matrix, defined by the fmtScheme element.
|
||||||
|
// value of 0 or 1000 indicates no background,
|
||||||
|
// values 1-999 refer to the index of a fill style within the fillStyleLst element
|
||||||
|
// values 1001 and above refer to the index of a background fill style within the bgFillStyleLst element.
|
||||||
|
int idx = (int)fillRef.getIdx();
|
||||||
|
CTSchemeColor phClr = fillRef.getSchemeClr();
|
||||||
|
XSLFSheet sheet = getSheet();
|
||||||
|
XSLFTheme theme = sheet.getTheme();
|
||||||
|
XmlObject fillProps = null;
|
||||||
|
CTStyleMatrix matrix = theme.getXmlObject().getThemeElements().getFmtScheme();
|
||||||
|
if (idx >= 1 && idx <= 999) {
|
||||||
|
fillProps = matrix.getFillStyleLst().selectPath("*")[idx - 1];
|
||||||
|
} else if (idx >= 1001 ){
|
||||||
|
fillProps = matrix.getBgFillStyleLst().selectPath("*")[idx - 1001];
|
||||||
|
}
|
||||||
|
return (fillProps == null) ? null : selectPaint(fillProps, phClr, theme.getPackagePart());
|
||||||
|
}
|
||||||
}
|
}
|
@ -118,7 +118,7 @@ public class XSLFTableCell extends XSLFTextShape {
|
|||||||
|
|
||||||
private double getBorderWidth(char bltr) {
|
private double getBorderWidth(char bltr) {
|
||||||
CTLineProperties ln = getCTLine(bltr, false);
|
CTLineProperties ln = getCTLine(bltr, false);
|
||||||
return (ln == null) ? defaultBorderWidth : Units.toPoints(ln.getW());
|
return (ln == null || !ln.isSetW()) ? defaultBorderWidth : Units.toPoints(ln.getW());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void setBorderColor(char bltr, Color color) {
|
private void setBorderColor(char bltr, Color color) {
|
||||||
|
@ -23,6 +23,7 @@ import org.apache.poi.sl.usermodel.AutoNumberingScheme;
|
|||||||
import org.apache.poi.sl.usermodel.TextParagraph;
|
import org.apache.poi.sl.usermodel.TextParagraph;
|
||||||
import org.apache.poi.util.*;
|
import org.apache.poi.util.*;
|
||||||
import org.apache.poi.xslf.model.ParagraphPropertyFetcher;
|
import org.apache.poi.xslf.model.ParagraphPropertyFetcher;
|
||||||
|
import org.apache.xmlbeans.XmlCursor;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||||
@ -379,9 +380,9 @@ public class XSLFTextParagraph implements TextParagraph<XSLFTextRun> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setIndent(Double indent){
|
public void setIndent(Double indent){
|
||||||
if ((indent == null || indent == -1d) && !_p.isSetPPr()) return;
|
if ((indent == null) && !_p.isSetPPr()) return;
|
||||||
CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
|
CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
|
||||||
if(indent == -1) {
|
if(indent == null) {
|
||||||
if(pr.isSetIndent()) pr.unsetIndent();
|
if(pr.isSetIndent()) pr.unsetIndent();
|
||||||
} else {
|
} else {
|
||||||
pr.setIndent(Units.toEMU(indent));
|
pr.setIndent(Units.toEMU(indent));
|
||||||
@ -441,7 +442,7 @@ public class XSLFTextParagraph implements TextParagraph<XSLFTextRun> {
|
|||||||
public void setRightMargin(Double rightMargin){
|
public void setRightMargin(Double rightMargin){
|
||||||
if (rightMargin == null && !_p.isSetPPr()) return;
|
if (rightMargin == null && !_p.isSetPPr()) return;
|
||||||
CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
|
CTTextParagraphProperties pr = _p.isSetPPr() ? _p.getPPr() : _p.addNewPPr();
|
||||||
if(rightMargin == -1) {
|
if(rightMargin == null) {
|
||||||
if(pr.isSetMarR()) pr.unsetMarR();
|
if(pr.isSetMarR()) pr.unsetMarR();
|
||||||
} else {
|
} else {
|
||||||
pr.setMarR(Units.toEMU(rightMargin));
|
pr.setMarR(Units.toEMU(rightMargin));
|
||||||
@ -788,69 +789,102 @@ public class XSLFTextParagraph implements TextParagraph<XSLFTextRun> {
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
void copy(XSLFTextParagraph p){
|
void copy(XSLFTextParagraph other){
|
||||||
TextAlign srcAlign = p.getTextAlign();
|
if (other == this) return;
|
||||||
|
|
||||||
|
CTTextParagraph thisP = getXmlObject();
|
||||||
|
CTTextParagraph otherP = other.getXmlObject();
|
||||||
|
|
||||||
|
if (thisP.isSetPPr()) thisP.unsetPPr();
|
||||||
|
if (thisP.isSetEndParaRPr()) thisP.unsetEndParaRPr();
|
||||||
|
|
||||||
|
_runs.clear();
|
||||||
|
for (int i=thisP.sizeOfBrArray(); i>0; i--) {
|
||||||
|
thisP.removeBr(i-1);
|
||||||
|
}
|
||||||
|
for (int i=thisP.sizeOfRArray(); i>0; i--) {
|
||||||
|
thisP.removeR(i-1);
|
||||||
|
}
|
||||||
|
for (int i=thisP.sizeOfFldArray(); i>0; i--) {
|
||||||
|
thisP.removeFld(i-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
XmlCursor thisC = thisP.newCursor();
|
||||||
|
thisC.toEndToken();
|
||||||
|
XmlCursor otherC = otherP.newCursor();
|
||||||
|
otherC.copyXmlContents(thisC);
|
||||||
|
otherC.dispose();
|
||||||
|
thisC.dispose();
|
||||||
|
|
||||||
|
List<XSLFTextRun> otherRs = other.getTextRuns();
|
||||||
|
int i=0;
|
||||||
|
for(CTRegularTextRun rtr : thisP.getRArray()) {
|
||||||
|
XSLFTextRun run = new XSLFTextRun(rtr, this);
|
||||||
|
run.copy(otherRs.get(i++));
|
||||||
|
_runs.add(run);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// set properties again, in case we are based on a different
|
||||||
|
// template
|
||||||
|
TextAlign srcAlign = other.getTextAlign();
|
||||||
if(srcAlign != getTextAlign()){
|
if(srcAlign != getTextAlign()){
|
||||||
setTextAlign(srcAlign);
|
setTextAlign(srcAlign);
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isBullet = p.isBullet();
|
boolean isBullet = other.isBullet();
|
||||||
if(isBullet != isBullet()){
|
if(isBullet != isBullet()){
|
||||||
setBullet(isBullet);
|
setBullet(isBullet);
|
||||||
if(isBullet) {
|
if(isBullet) {
|
||||||
String buFont = p.getBulletFont();
|
String buFont = other.getBulletFont();
|
||||||
if(buFont != null && !buFont.equals(getBulletFont())){
|
if(buFont != null && !buFont.equals(getBulletFont())){
|
||||||
setBulletFont(buFont);
|
setBulletFont(buFont);
|
||||||
}
|
}
|
||||||
String buChar = p.getBulletCharacter();
|
String buChar = other.getBulletCharacter();
|
||||||
if(buChar != null && !buChar.equals(getBulletCharacter())){
|
if(buChar != null && !buChar.equals(getBulletCharacter())){
|
||||||
setBulletCharacter(buChar);
|
setBulletCharacter(buChar);
|
||||||
}
|
}
|
||||||
Color buColor = p.getBulletFontColor();
|
Color buColor = other.getBulletFontColor();
|
||||||
if(buColor != null && !buColor.equals(getBulletFontColor())){
|
if(buColor != null && !buColor.equals(getBulletFontColor())){
|
||||||
setBulletFontColor(buColor);
|
setBulletFontColor(buColor);
|
||||||
}
|
}
|
||||||
double buSize = p.getBulletFontSize();
|
Double buSize = other.getBulletFontSize();
|
||||||
if(buSize != getBulletFontSize()){
|
if(!doubleEquals(buSize, getBulletFontSize())){
|
||||||
setBulletFontSize(buSize);
|
setBulletFontSize(buSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Double leftMargin = p.getLeftMargin();
|
Double leftMargin = other.getLeftMargin();
|
||||||
if(leftMargin != getLeftMargin()){
|
if (!doubleEquals(leftMargin, getLeftMargin())){
|
||||||
setLeftMargin(leftMargin);
|
setLeftMargin(leftMargin);
|
||||||
}
|
}
|
||||||
|
|
||||||
Double indent = p.getIndent();
|
Double indent = other.getIndent();
|
||||||
if(indent != getIndent()){
|
if (!doubleEquals(indent, getIndent())) {
|
||||||
setIndent(indent);
|
setIndent(indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
Double spaceAfter = p.getSpaceAfter();
|
Double spaceAfter = other.getSpaceAfter();
|
||||||
if(spaceAfter != getSpaceAfter()){
|
if (!doubleEquals(spaceAfter, getSpaceAfter())) {
|
||||||
setSpaceAfter(spaceAfter);
|
setSpaceAfter(spaceAfter);
|
||||||
}
|
}
|
||||||
|
|
||||||
Double spaceBefore = p.getSpaceBefore();
|
Double spaceBefore = other.getSpaceBefore();
|
||||||
if(spaceBefore != getSpaceBefore()){
|
if (!doubleEquals(spaceBefore, getSpaceBefore())) {
|
||||||
setSpaceBefore(spaceBefore);
|
setSpaceBefore(spaceBefore);
|
||||||
}
|
}
|
||||||
|
|
||||||
Double lineSpacing = p.getLineSpacing();
|
Double lineSpacing = other.getLineSpacing();
|
||||||
if(lineSpacing != getLineSpacing()){
|
if (!doubleEquals(lineSpacing, getLineSpacing())) {
|
||||||
setLineSpacing(lineSpacing);
|
setLineSpacing(lineSpacing);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<XSLFTextRun> srcR = p.getTextRuns();
|
|
||||||
List<XSLFTextRun> tgtR = getTextRuns();
|
|
||||||
for(int i = 0; i < srcR.size(); i++){
|
|
||||||
XSLFTextRun r1 = srcR.get(i);
|
|
||||||
XSLFTextRun r2 = tgtR.get(i);
|
|
||||||
r2.copy(r1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean doubleEquals(Double d1, Double d2) {
|
||||||
|
return (d1 == d2 || (d1 != null && d1.equals(d2)));
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Double getDefaultFontSize() {
|
public Double getDefaultFontSize() {
|
||||||
CTTextCharacterProperties endPr = _p.getEndParaRPr();
|
CTTextCharacterProperties endPr = _p.getEndParaRPr();
|
||||||
|
@ -82,7 +82,8 @@ public class XSLFTextRun implements TextRun {
|
|||||||
return _r;
|
return _r;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setFontColor(Color color){
|
@Override
|
||||||
|
public void setFontColor(Color color) {
|
||||||
CTTextCharacterProperties rPr = getRPr();
|
CTTextCharacterProperties rPr = getRPr();
|
||||||
CTSolidColorFillProperties fill = rPr.isSetSolidFill() ? rPr.getSolidFill() : rPr.addNewSolidFill();
|
CTSolidColorFillProperties fill = rPr.isSetSolidFill() ? rPr.getSolidFill() : rPr.addNewSolidFill();
|
||||||
CTSRgbColor clr = fill.isSetSrgbClr() ? fill.getSrgbClr() : fill.addNewSrgbClr();
|
CTSRgbColor clr = fill.isSetSrgbClr() ? fill.getSrgbClr() : fill.addNewSrgbClr();
|
||||||
@ -96,6 +97,7 @@ public class XSLFTextRun implements TextRun {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public Color getFontColor(){
|
public Color getFontColor(){
|
||||||
final XSLFTheme theme = _p.getParentShape().getSheet().getTheme();
|
final XSLFTheme theme = _p.getParentShape().getSheet().getTheme();
|
||||||
CTShapeStyle style = _p.getParentShape().getSpStyle();
|
CTShapeStyle style = _p.getParentShape().getSpStyle();
|
||||||
@ -119,17 +121,13 @@ public class XSLFTextRun implements TextRun {
|
|||||||
return fetcher.getValue();
|
return fetcher.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
*
|
public void setFontSize(Double fontSize){
|
||||||
* @param fontSize font size in points.
|
|
||||||
* The value of <code>-1</code> unsets the Sz attribyte from the underlying xml bean
|
|
||||||
*/
|
|
||||||
public void setFontSize(double fontSize){
|
|
||||||
CTTextCharacterProperties rPr = getRPr();
|
CTTextCharacterProperties rPr = getRPr();
|
||||||
if(fontSize == -1.0) {
|
if(fontSize == null) {
|
||||||
if(rPr.isSetSz()) rPr.unsetSz();
|
if (rPr.isSetSz()) rPr.unsetSz();
|
||||||
} else {
|
} else {
|
||||||
if(fontSize < 1.0) {
|
if (fontSize < 1.0) {
|
||||||
throw new IllegalArgumentException("Minimum font size is 1pt but was " + fontSize);
|
throw new IllegalArgumentException("Minimum font size is 1pt but was " + fontSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,9 +135,6 @@ public class XSLFTextRun implements TextRun {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return font size in points or null if font size is not set.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public Double getFontSize(){
|
public Double getFontSize(){
|
||||||
double scale = 1;
|
double scale = 1;
|
||||||
|
@ -433,6 +433,10 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
|
|
||||||
protected abstract CTTextBody getTextBody(boolean create);
|
protected abstract CTTextBody getTextBody(boolean create);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPlaceholder(Placeholder placeholder) {
|
||||||
|
super.setPlaceholder(placeholder);
|
||||||
|
}
|
||||||
|
|
||||||
public Placeholder getTextType(){
|
public Placeholder getTextType(){
|
||||||
CTPlaceholder ph = getCTPlaceholder();
|
CTPlaceholder ph = getCTPlaceholder();
|
||||||
@ -442,27 +446,6 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
return Placeholder.values()[val - 1];
|
return Placeholder.values()[val - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specifies that the corresponding shape should be represented by the generating application
|
|
||||||
* as a placeholder. When a shape is considered a placeholder by the generating application
|
|
||||||
* it can have special properties to alert the user that they may enter content into the shape.
|
|
||||||
* Different types of placeholders are allowed and can be specified by using the placeholder
|
|
||||||
* type attribute for this element
|
|
||||||
*
|
|
||||||
* @param placeholder
|
|
||||||
*/
|
|
||||||
public void setPlaceholder(Placeholder placeholder){
|
|
||||||
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr";
|
|
||||||
CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery);
|
|
||||||
if (nv == null) return;
|
|
||||||
if(placeholder == null) {
|
|
||||||
if (nv.isSetPh()) nv.unsetPh();
|
|
||||||
} else {
|
|
||||||
nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getTextHeight(){
|
public double getTextHeight(){
|
||||||
DrawFactory drawFact = DrawFactory.getInstance(null);
|
DrawFactory drawFact = DrawFactory.getInstance(null);
|
||||||
@ -490,45 +473,55 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void copy(XSLFShape sh){
|
void copy(XSLFShape other){
|
||||||
super.copy(sh);
|
super.copy(other);
|
||||||
|
|
||||||
XSLFTextShape tsh = (XSLFTextShape)sh;
|
XSLFTextShape otherTS = (XSLFTextShape)other;
|
||||||
|
CTTextBody otherTB = otherTS.getTextBody(false);
|
||||||
|
CTTextBody thisTB = getTextBody(true);
|
||||||
|
if (otherTB == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
thisTB.setBodyPr((CTTextBodyProperties)otherTB.getBodyPr().copy());
|
||||||
|
|
||||||
boolean srcWordWrap = tsh.getWordWrap();
|
if (thisTB.isSetLstStyle()) thisTB.unsetLstStyle();
|
||||||
|
if (otherTB.isSetLstStyle()) {
|
||||||
|
thisTB.setLstStyle((CTTextListStyle)otherTB.getLstStyle().copy());
|
||||||
|
}
|
||||||
|
|
||||||
|
boolean srcWordWrap = otherTS.getWordWrap();
|
||||||
if(srcWordWrap != getWordWrap()){
|
if(srcWordWrap != getWordWrap()){
|
||||||
setWordWrap(srcWordWrap);
|
setWordWrap(srcWordWrap);
|
||||||
}
|
}
|
||||||
|
|
||||||
double leftInset = tsh.getLeftInset();
|
double leftInset = otherTS.getLeftInset();
|
||||||
if(leftInset != getLeftInset()) {
|
if(leftInset != getLeftInset()) {
|
||||||
setLeftInset(leftInset);
|
setLeftInset(leftInset);
|
||||||
}
|
}
|
||||||
double rightInset = tsh.getRightInset();
|
double rightInset = otherTS.getRightInset();
|
||||||
if(rightInset != getRightInset()) {
|
if(rightInset != getRightInset()) {
|
||||||
setRightInset(rightInset);
|
setRightInset(rightInset);
|
||||||
}
|
}
|
||||||
double topInset = tsh.getTopInset();
|
double topInset = otherTS.getTopInset();
|
||||||
if(topInset != getTopInset()) {
|
if(topInset != getTopInset()) {
|
||||||
setTopInset(topInset);
|
setTopInset(topInset);
|
||||||
}
|
}
|
||||||
double bottomInset = tsh.getBottomInset();
|
double bottomInset = otherTS.getBottomInset();
|
||||||
if(bottomInset != getBottomInset()) {
|
if(bottomInset != getBottomInset()) {
|
||||||
setBottomInset(bottomInset);
|
setBottomInset(bottomInset);
|
||||||
}
|
}
|
||||||
|
|
||||||
VerticalAlignment vAlign = tsh.getVerticalAlignment();
|
VerticalAlignment vAlign = otherTS.getVerticalAlignment();
|
||||||
if(vAlign != getVerticalAlignment()) {
|
if(vAlign != getVerticalAlignment()) {
|
||||||
setVerticalAlignment(vAlign);
|
setVerticalAlignment(vAlign);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<XSLFTextParagraph> srcP = tsh.getTextParagraphs();
|
clearText();
|
||||||
List<XSLFTextParagraph> tgtP = getTextParagraphs();
|
|
||||||
for(int i = 0; i < srcP.size(); i++){
|
for (XSLFTextParagraph srcP : otherTS.getTextParagraphs()) {
|
||||||
XSLFTextParagraph p1 = srcP.get(i);
|
XSLFTextParagraph tgtP = addNewTextParagraph();
|
||||||
XSLFTextParagraph p2 = tgtP.get(i);
|
tgtP.copy(srcP);
|
||||||
p2.copy(p1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -125,7 +125,7 @@ public class TestXSLFAutoShape {
|
|||||||
p.setIndent(2.0);
|
p.setIndent(2.0);
|
||||||
assertEquals(2.0, p.getIndent(), 0);
|
assertEquals(2.0, p.getIndent(), 0);
|
||||||
assertTrue(p.getXmlObject().getPPr().isSetIndent());
|
assertTrue(p.getXmlObject().getPPr().isSetIndent());
|
||||||
p.setIndent(-1d);
|
p.setIndent(null);
|
||||||
assertNull(p.getIndent());
|
assertNull(p.getIndent());
|
||||||
assertFalse(p.getXmlObject().getPPr().isSetIndent());
|
assertFalse(p.getXmlObject().getPPr().isSetIndent());
|
||||||
p.setIndent(10.0);
|
p.setIndent(10.0);
|
||||||
@ -225,7 +225,7 @@ public class TestXSLFAutoShape {
|
|||||||
assertEquals(1000, r.getXmlObject().getRPr().getSz());
|
assertEquals(1000, r.getXmlObject().getRPr().getSz());
|
||||||
r.setFontSize(12.5);
|
r.setFontSize(12.5);
|
||||||
assertEquals(1250, r.getXmlObject().getRPr().getSz());
|
assertEquals(1250, r.getXmlObject().getRPr().getSz());
|
||||||
r.setFontSize(-1);
|
r.setFontSize(null);
|
||||||
assertFalse(r.getXmlObject().getRPr().isSetSz());
|
assertFalse(r.getXmlObject().getRPr().isSetSz());
|
||||||
|
|
||||||
assertFalse(r.getXmlObject().getRPr().isSetLatin());
|
assertFalse(r.getXmlObject().getRPr().isSetLatin());
|
||||||
|
@ -143,7 +143,7 @@ public class TestXSLFSlide {
|
|||||||
assertFalse(r2.isItalic());
|
assertFalse(r2.isItalic());
|
||||||
assertEquals(Color.white, r2.getFontColor());
|
assertEquals(Color.white, r2.getFontColor());
|
||||||
assertEquals(new Color(148, 198, 0), sh2.getFillColor());
|
assertEquals(new Color(148, 198, 0), sh2.getFillColor());
|
||||||
assertEquals(new Color(74, 99, 0), sh2.getLineColor()); // slightly different from PowerPoint!
|
assertEquals(new Color(148, 198, 0), sh2.getLineColor()); // slightly different from PowerPoint!
|
||||||
|
|
||||||
// the 5th slide has a picture and a texture fill
|
// the 5th slide has a picture and a texture fill
|
||||||
XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides().get(4));
|
XSLFSlide slide2 = ppt.createSlide().importContent(src.getSlides().get(4));
|
||||||
|
@ -78,7 +78,6 @@ public class TestXSLFTextBox {
|
|||||||
assertEquals(20.0, r.getFontSize(), 0);
|
assertEquals(20.0, r.getFontSize(), 0);
|
||||||
|
|
||||||
pPr.unsetSz(); // Should never be
|
pPr.unsetSz(); // Should never be
|
||||||
assertEquals(-1.0, r.getFontSize(), 0);
|
assertNull(r.getFontSize());
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -30,6 +30,7 @@ import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
|
|||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
|
import org.junit.Assume;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -74,16 +75,16 @@ public class TestXSLFTextParagraph {
|
|||||||
|
|
||||||
DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p);
|
DrawTextParagraphProxy dtp = new DrawTextParagraphProxy(p);
|
||||||
|
|
||||||
double leftInset = sh.getLeftInset();
|
Double leftInset = sh.getLeftInset();
|
||||||
double rightInset = sh.getRightInset();
|
Double rightInset = sh.getRightInset();
|
||||||
assertEquals(7.2, leftInset, 0);
|
assertEquals(7.2, leftInset, 0);
|
||||||
assertEquals(7.2, rightInset, 0);
|
assertEquals(7.2, rightInset, 0);
|
||||||
|
|
||||||
double leftMargin = p.getLeftMargin();
|
Double leftMargin = p.getLeftMargin();
|
||||||
assertEquals(0.0, leftMargin, 0);
|
assertEquals(0.0, leftMargin, 0);
|
||||||
|
|
||||||
double indent = p.getIndent();
|
Double indent = p.getIndent();
|
||||||
assertEquals(0.0, indent, 0); // default
|
assertNull(indent); // default
|
||||||
|
|
||||||
double expectedWidth;
|
double expectedWidth;
|
||||||
|
|
||||||
@ -150,10 +151,7 @@ public class TestXSLFTextParagraph {
|
|||||||
@Test
|
@Test
|
||||||
public void testBreakLines(){
|
public void testBreakLines(){
|
||||||
String os = System.getProperty("os.name");
|
String os = System.getProperty("os.name");
|
||||||
if(os == null || !os.contains("Windows")) {
|
Assume.assumeTrue("Skipping testBreakLines(), it is executed only on Windows machines", (os != null && os.contains("Windows")));
|
||||||
_logger.log(POILogger.WARN, "Skipping testBreakLines(), it is executed only on Windows machines");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
XMLSlideShow ppt = new XMLSlideShow();
|
XMLSlideShow ppt = new XMLSlideShow();
|
||||||
XSLFSlide slide = ppt.createSlide();
|
XSLFSlide slide = ppt.createSlide();
|
||||||
@ -162,7 +160,7 @@ public class TestXSLFTextParagraph {
|
|||||||
XSLFTextParagraph p = sh.addNewTextParagraph();
|
XSLFTextParagraph p = sh.addNewTextParagraph();
|
||||||
XSLFTextRun r = p.addNewTextRun();
|
XSLFTextRun r = p.addNewTextRun();
|
||||||
r.setFontFamily("Arial"); // this should always be available
|
r.setFontFamily("Arial"); // this should always be available
|
||||||
r.setFontSize(12);
|
r.setFontSize(12d);
|
||||||
r.setText(
|
r.setText(
|
||||||
"Paragraph formatting allows for more granular control " +
|
"Paragraph formatting allows for more granular control " +
|
||||||
"of text within a shape. Properties here apply to all text " +
|
"of text within a shape. Properties here apply to all text " +
|
||||||
@ -179,13 +177,13 @@ public class TestXSLFTextParagraph {
|
|||||||
lines = dtp.getLines();
|
lines = dtp.getLines();
|
||||||
assertEquals(4, lines.size());
|
assertEquals(4, lines.size());
|
||||||
|
|
||||||
// descrease the shape width from 300 pt to 100 pt
|
// decrease the shape width from 300 pt to 100 pt
|
||||||
sh.setAnchor(new Rectangle(50, 50, 100, 200));
|
sh.setAnchor(new Rectangle(50, 50, 100, 200));
|
||||||
dtp.breakText(graphics);
|
dtp.breakText(graphics);
|
||||||
lines = dtp.getLines();
|
lines = dtp.getLines();
|
||||||
assertEquals(12, lines.size());
|
assertEquals(12, lines.size());
|
||||||
|
|
||||||
// descrease the shape width from 300 pt to 100 pt
|
// decrease the shape width from 300 pt to 100 pt
|
||||||
sh.setAnchor(new Rectangle(50, 50, 600, 200));
|
sh.setAnchor(new Rectangle(50, 50, 600, 200));
|
||||||
dtp.breakText(graphics);
|
dtp.breakText(graphics);
|
||||||
lines = dtp.getLines();
|
lines = dtp.getLines();
|
||||||
@ -224,12 +222,13 @@ public class TestXSLFTextParagraph {
|
|||||||
XSLFTextParagraph p2 = sh2.addNewTextParagraph();
|
XSLFTextParagraph p2 = sh2.addNewTextParagraph();
|
||||||
XSLFTextRun r2 = p2.addNewTextRun();
|
XSLFTextRun r2 = p2.addNewTextRun();
|
||||||
r2.setFontFamily("serif"); // this should always be available
|
r2.setFontFamily("serif"); // this should always be available
|
||||||
r2.setFontSize(30);
|
r2.setFontSize(30d);
|
||||||
r2.setText("Apache\n");
|
r2.setText("Apache\n");
|
||||||
XSLFTextRun r3 = p2.addNewTextRun();
|
XSLFTextRun r3 = p2.addNewTextRun();
|
||||||
r3.setFontFamily("serif"); // this should always be available
|
r3.setFontFamily("serif"); // this should always be available
|
||||||
r3.setFontSize(10);
|
r3.setFontSize(10d);
|
||||||
r3.setText("POI");
|
r3.setText("POI");
|
||||||
|
dtp = new DrawTextParagraphProxy(p2);
|
||||||
dtp.breakText(graphics);
|
dtp.breakText(graphics);
|
||||||
lines = dtp.getLines();
|
lines = dtp.getLines();
|
||||||
assertEquals(2, lines.size());
|
assertEquals(2, lines.size());
|
||||||
@ -278,7 +277,7 @@ public class TestXSLFTextParagraph {
|
|||||||
p.setBulletFontColor(Color.red);
|
p.setBulletFontColor(Color.red);
|
||||||
assertEquals(Color.red, p.getBulletFontColor());
|
assertEquals(Color.red, p.getBulletFontColor());
|
||||||
|
|
||||||
assertEquals(100.0, p.getBulletFontSize(), 0);
|
assertNull(p.getBulletFontSize());
|
||||||
p.setBulletFontSize(200.);
|
p.setBulletFontSize(200.);
|
||||||
assertEquals(200., p.getBulletFontSize(), 0);
|
assertEquals(200., p.getBulletFontSize(), 0);
|
||||||
p.setBulletFontSize(-20.);
|
p.setBulletFontSize(-20.);
|
||||||
@ -286,17 +285,21 @@ public class TestXSLFTextParagraph {
|
|||||||
|
|
||||||
assertEquals(72.0, p.getDefaultTabSize(), 0);
|
assertEquals(72.0, p.getDefaultTabSize(), 0);
|
||||||
|
|
||||||
assertEquals(0.0, p.getIndent(), 0);
|
assertNull(p.getIndent());
|
||||||
p.setIndent(72.0);
|
p.setIndent(72.0);
|
||||||
assertEquals(72.0, p.getIndent(), 0);
|
assertEquals(72.0, p.getIndent(), 0);
|
||||||
p.setIndent(-1.0); // the value of -1.0 resets to the defaults
|
p.setIndent(-1d); // the value of -1.0 resets to the defaults (not any more ...)
|
||||||
assertEquals(0.0, p.getIndent(), 0);
|
assertEquals(-1d, p.getIndent(), 0);
|
||||||
|
p.setIndent(null);
|
||||||
|
assertNull(p.getIndent());
|
||||||
|
|
||||||
assertEquals(0.0, p.getLeftMargin(), 0);
|
assertEquals(0.0, p.getLeftMargin(), 0);
|
||||||
p.setLeftMargin(72.0);
|
p.setLeftMargin(72.0);
|
||||||
assertEquals(72.0, p.getLeftMargin(), 0);
|
assertEquals(72.0, p.getLeftMargin(), 0);
|
||||||
p.setLeftMargin(-1.0); // the value of -1.0 resets to the defaults
|
p.setLeftMargin(-1.0); // the value of -1.0 resets to the defaults
|
||||||
assertEquals(0.0, p.getLeftMargin(), 0);
|
assertEquals(-1.0, p.getLeftMargin(), 0);
|
||||||
|
p.setLeftMargin(null);
|
||||||
|
assertEquals(0d, p.getLeftMargin(), 0); // default will be taken from master
|
||||||
|
|
||||||
assertEquals(0, p.getIndentLevel());
|
assertEquals(0, p.getIndentLevel());
|
||||||
p.setIndentLevel(1);
|
p.setIndentLevel(1);
|
||||||
@ -304,19 +307,19 @@ public class TestXSLFTextParagraph {
|
|||||||
p.setIndentLevel(2);
|
p.setIndentLevel(2);
|
||||||
assertEquals(2, p.getIndentLevel());
|
assertEquals(2, p.getIndentLevel());
|
||||||
|
|
||||||
assertEquals(100., p.getLineSpacing(), 0);
|
assertNull(p.getLineSpacing());
|
||||||
p.setLineSpacing(200.);
|
p.setLineSpacing(200.);
|
||||||
assertEquals(200.0, p.getLineSpacing(), 0);
|
assertEquals(200.0, p.getLineSpacing(), 0);
|
||||||
p.setLineSpacing(-15.);
|
p.setLineSpacing(-15.);
|
||||||
assertEquals(-15.0, p.getLineSpacing(), 0);
|
assertEquals(-15.0, p.getLineSpacing(), 0);
|
||||||
|
|
||||||
assertEquals(0., p.getSpaceAfter(), 0);
|
assertNull(p.getSpaceAfter());
|
||||||
p.setSpaceAfter(200.);
|
p.setSpaceAfter(200.);
|
||||||
assertEquals(200.0, p.getSpaceAfter(), 0);
|
assertEquals(200.0, p.getSpaceAfter(), 0);
|
||||||
p.setSpaceAfter(-15.);
|
p.setSpaceAfter(-15.);
|
||||||
assertEquals(-15.0, p.getSpaceAfter(), 0);
|
assertEquals(-15.0, p.getSpaceAfter(), 0);
|
||||||
|
|
||||||
assertEquals(0., p.getSpaceBefore(), 0);
|
assertNull(p.getSpaceBefore());
|
||||||
p.setSpaceBefore(200.);
|
p.setSpaceBefore(200.);
|
||||||
assertEquals(200.0, p.getSpaceBefore(), 0);
|
assertEquals(200.0, p.getSpaceBefore(), 0);
|
||||||
p.setSpaceBefore(-15.);
|
p.setSpaceBefore(-15.);
|
||||||
|
@ -24,6 +24,7 @@ import java.util.List;
|
|||||||
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
|
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
|
||||||
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
|
import org.junit.Test;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
||||||
@ -33,6 +34,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|||||||
*/
|
*/
|
||||||
public class TestXSLFTextShape {
|
public class TestXSLFTextShape {
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testLayouts(){
|
public void testLayouts(){
|
||||||
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("layouts.pptx");
|
XMLSlideShow ppt = XSLFTestDataSamples.openSampleDocument("layouts.pptx");
|
||||||
|
|
||||||
@ -612,7 +614,7 @@ public class TestXSLFTextShape {
|
|||||||
assertEquals("10", sldNum.getText());
|
assertEquals("10", sldNum.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testTitleStyles(){
|
public void testTitleStyles(){
|
||||||
XMLSlideShow ppt = new XMLSlideShow();
|
XMLSlideShow ppt = new XMLSlideShow();
|
||||||
|
|
||||||
@ -693,6 +695,7 @@ public class TestXSLFTextShape {
|
|||||||
assertEquals(TextAlign.CENTER, paragraph.getTextAlign());
|
assertEquals(TextAlign.CENTER, paragraph.getTextAlign());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
public void testBodyStyles(){
|
public void testBodyStyles(){
|
||||||
XMLSlideShow ppt = new XMLSlideShow();
|
XMLSlideShow ppt = new XMLSlideShow();
|
||||||
|
|
||||||
|
@ -59,7 +59,7 @@ public class TestXSLFTheme {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void slide1(XSLFSlide slide){
|
void slide1(XSLFSlide slide){
|
||||||
assertEquals(Color.white, slide.getBackground().getFillColor());
|
assertEquals(Color.WHITE, slide.getBackground().getFillColor());
|
||||||
|
|
||||||
XSLFTheme theme = slide.getTheme();
|
XSLFTheme theme = slide.getTheme();
|
||||||
assertEquals("Office Theme", theme.getName());
|
assertEquals("Office Theme", theme.getName());
|
||||||
@ -75,7 +75,7 @@ public class TestXSLFTheme {
|
|||||||
void slide2(XSLFSlide slide){
|
void slide2(XSLFSlide slide){
|
||||||
// Background 2, darker 10%
|
// Background 2, darker 10%
|
||||||
// YK: PPT shows slightly different color: new Color(221, 217, 195)
|
// YK: PPT shows slightly different color: new Color(221, 217, 195)
|
||||||
assertEquals(new Color(214, 212, 203), slide.getBackground().getFillColor());
|
assertEquals(new Color(221, 217, 195), slide.getBackground().getFillColor());
|
||||||
}
|
}
|
||||||
|
|
||||||
void slide3(XSLFSlide slide){
|
void slide3(XSLFSlide slide){
|
||||||
@ -133,7 +133,7 @@ public class TestXSLFTheme {
|
|||||||
void slide7(XSLFSlide slide){
|
void slide7(XSLFSlide slide){
|
||||||
|
|
||||||
//YK: PPT reports a slightly different color: r=189,g=239,b=87
|
//YK: PPT reports a slightly different color: r=189,g=239,b=87
|
||||||
assertEquals(new Color(182, 218, 108), slide.getBackground().getFillColor());
|
assertEquals(new Color(189, 239, 87), slide.getBackground().getFillColor());
|
||||||
|
|
||||||
assertFalse(slide.getFollowMasterGraphics());
|
assertFalse(slide.getFollowMasterGraphics());
|
||||||
}
|
}
|
||||||
|
@ -256,7 +256,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
|||||||
txt.setText(s);
|
txt.setText(s);
|
||||||
|
|
||||||
HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0);
|
HSLFTextRun rt = txt.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
rt.setFontSize(_font.getSize());
|
rt.setFontSize((double)_font.getSize());
|
||||||
rt.setFontFamily(_font.getFamily());
|
rt.setFontFamily(_font.getFamily());
|
||||||
|
|
||||||
if (getColor() != null) rt.setFontColor(getColor());
|
if (getColor() != null) rt.setFontColor(getColor());
|
||||||
|
@ -141,7 +141,7 @@ public final class HSLFTextRun implements TextRun {
|
|||||||
* @param propName The name of the Paragraph TextProp
|
* @param propName The name of the Paragraph TextProp
|
||||||
* @param val The value to set for the TextProp
|
* @param val The value to set for the TextProp
|
||||||
*/
|
*/
|
||||||
public void setCharTextPropVal(String propName, int val) {
|
public void setCharTextPropVal(String propName, Integer val) {
|
||||||
setPropVal(characterStyle, propName, val);
|
setPropVal(characterStyle, propName, val);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,20 +251,17 @@ public final class HSLFTextRun implements TextRun {
|
|||||||
setPropVal(characterStyle, "superscript", val);
|
setPropVal(characterStyle, "superscript", val);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Gets the font size
|
|
||||||
*/
|
|
||||||
public Double getFontSize() {
|
public Double getFontSize() {
|
||||||
TextProp tp = getPropVal(characterStyle, "font.size", parentParagraph);
|
TextProp tp = getPropVal(characterStyle, "font.size", parentParagraph);
|
||||||
return tp == null ? null : (double)tp.getValue();
|
return tp == null ? null : (double)tp.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Sets the font size
|
public void setFontSize(Double fontSize) {
|
||||||
*/
|
Integer iFontSize = (fontSize == null) ? null : fontSize.intValue();
|
||||||
public void setFontSize(int fontSize) {
|
setCharTextPropVal("font.size", iFontSize);
|
||||||
setCharTextPropVal("font.size", fontSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -18,12 +18,11 @@
|
|||||||
package org.apache.poi.sl.draw;
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT;
|
import static org.apache.poi.sl.usermodel.PaintStyle.TRANSPARENT_PAINT;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.MultipleGradientPaint.ColorSpaceType;
|
import java.awt.MultipleGradientPaint.ColorSpaceType;
|
||||||
import java.awt.MultipleGradientPaint.CycleMethod;
|
import java.awt.MultipleGradientPaint.CycleMethod;
|
||||||
import java.awt.Shape;
|
|
||||||
import java.awt.geom.*;
|
import java.awt.geom.*;
|
||||||
import java.awt.image.*;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
@ -35,7 +34,13 @@ import org.apache.poi.util.POILogFactory;
|
|||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This class handles color transformations
|
||||||
|
*
|
||||||
|
* @see HSL code taken from <a href="https://tips4java.wordpress.com/2009/07/05/hsl-color/">Java Tips Weblog</a>
|
||||||
|
*/
|
||||||
public class DrawPaint {
|
public class DrawPaint {
|
||||||
|
// HSL code is public domain - see https://tips4java.wordpress.com/contact-us/
|
||||||
|
|
||||||
private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class);
|
private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class);
|
||||||
|
|
||||||
@ -126,7 +131,7 @@ public class DrawPaint {
|
|||||||
}
|
}
|
||||||
|
|
||||||
result = applyAlpha(result, color);
|
result = applyAlpha(result, color);
|
||||||
result = applyLuminanace(result, color);
|
result = applyLuminance(result, color);
|
||||||
result = applyShade(result, color);
|
result = applyShade(result, color);
|
||||||
result = applyTint(result, color);
|
result = applyTint(result, color);
|
||||||
|
|
||||||
@ -135,7 +140,7 @@ public class DrawPaint {
|
|||||||
|
|
||||||
protected static Color applyAlpha(Color c, ColorStyle fc) {
|
protected static Color applyAlpha(Color c, ColorStyle fc) {
|
||||||
int alpha = c.getAlpha();
|
int alpha = c.getAlpha();
|
||||||
return (alpha == 0 || alpha == -1) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha);
|
return (alpha == 255) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -145,8 +150,10 @@ public class DrawPaint {
|
|||||||
* @param lumMod luminance modulation in the range [0..100000]
|
* @param lumMod luminance modulation in the range [0..100000]
|
||||||
* @param lumOff luminance offset in the range [0..100000]
|
* @param lumOff luminance offset in the range [0..100000]
|
||||||
* @return modified color
|
* @return modified color
|
||||||
|
*
|
||||||
|
* @see <a href="https://msdn.microsoft.com/en-us/library/dd560821%28v=office.12%29.aspx">Using Office Open XML to Customize Document Formatting in the 2007 Office System</a>
|
||||||
*/
|
*/
|
||||||
protected static Color applyLuminanace(Color c, ColorStyle fc) {
|
protected static Color applyLuminance(Color c, ColorStyle fc) {
|
||||||
int lumMod = fc.getLumMod();
|
int lumMod = fc.getLumMod();
|
||||||
if (lumMod == -1) lumMod = 100000;
|
if (lumMod == -1) lumMod = 100000;
|
||||||
|
|
||||||
@ -155,24 +162,33 @@ public class DrawPaint {
|
|||||||
|
|
||||||
if (lumMod == 100000 && lumOff == 0) return c;
|
if (lumMod == 100000 && lumOff == 0) return c;
|
||||||
|
|
||||||
int r = c.getRed();
|
// The lumMod value is the percent luminance. A lumMod value of "60000",
|
||||||
int g = c.getGreen();
|
// is 60% of the luminance of the original color.
|
||||||
int b = c.getBlue();
|
// When the color is a shade of the original theme color, the lumMod
|
||||||
|
// attribute is the only one of the tags shown here that appears.
|
||||||
|
// The <a:lumOff> tag appears after the <a:lumMod> tag when the color is a
|
||||||
|
// tint of the original. The lumOff value always equals 1-lumMod, which is used in the tint calculation
|
||||||
|
//
|
||||||
|
// Despite having different ways to display the tint and shade percentages,
|
||||||
|
// all of the programs use the same method to calculate the resulting color.
|
||||||
|
// Convert the original RGB value to HSL ... and then adjust the luminance (L)
|
||||||
|
// with one of the following equations before converting the HSL value back to RGB.
|
||||||
|
// (The % tint in the following equations refers to the tint, themetint, themeshade,
|
||||||
|
// or lumMod values, as applicable.)
|
||||||
|
//
|
||||||
|
// For a shade, the equation is luminance * %tint.
|
||||||
|
//
|
||||||
|
// For a tint, the equation is luminance * %tint + (1-%tint).
|
||||||
|
// (Note that 1-%tint is equal to the lumOff value in DrawingML.)
|
||||||
|
|
||||||
float red,green,blue;
|
double fLumOff = lumOff / 100000d;
|
||||||
|
double fLumMod = lumMod / 100000d;
|
||||||
|
|
||||||
if (lumOff > 0) {
|
double hsl[] = RGB2HSL(c);
|
||||||
float flumOff = lumOff / 100000.f;
|
hsl[2] = hsl[2]*fLumMod+fLumOff;
|
||||||
red = (255.f - r) * (1.f - flumOff) + r;
|
|
||||||
green = (255.f - g) * flumOff + g;
|
Color c2 = HSL2RGB(hsl[0], hsl[1], hsl[2], c.getAlpha()/255d);
|
||||||
blue = (255.f - b) * flumOff + b;
|
return c2;
|
||||||
} else {
|
|
||||||
float flumMod = lumMod / 100000.f;
|
|
||||||
red = r * flumMod;
|
|
||||||
green = g * flumMod;
|
|
||||||
blue = b * flumMod;
|
|
||||||
}
|
|
||||||
return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -302,165 +318,127 @@ public class DrawPaint {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class PathGradientPaint implements Paint {
|
/**
|
||||||
|
* Convert HSL values to a RGB Color.
|
||||||
// http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html
|
*
|
||||||
protected final Color colors[];
|
* @param h Hue is specified as degrees in the range 0 - 360.
|
||||||
protected final float fractions[];
|
* @param s Saturation is specified as a percentage in the range 1 - 100.
|
||||||
protected final int capStyle;
|
* @param l Luminance is specified as a percentage in the range 1 - 100.
|
||||||
protected final int joinStyle;
|
* @param alpha the alpha value between 0 - 1
|
||||||
protected final int transparency;
|
*
|
||||||
|
* @returns the RGB Color object
|
||||||
|
*/
|
||||||
public PathGradientPaint(Color colors[], float fractions[]) {
|
private static Color HSL2RGB(double h, double s, double l, double alpha) {
|
||||||
this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
|
if (s <0.0f || s > 100.0f) {
|
||||||
}
|
String message = "Color parameter outside of expected range - Saturation";
|
||||||
|
throw new IllegalArgumentException( message );
|
||||||
public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) {
|
|
||||||
this.colors = colors;
|
|
||||||
this.fractions = fractions;
|
|
||||||
this.capStyle = capStyle;
|
|
||||||
this.joinStyle = joinStyle;
|
|
||||||
|
|
||||||
// determine transparency
|
|
||||||
boolean opaque = true;
|
|
||||||
for (int i = 0; i < colors.length; i++){
|
|
||||||
opaque = opaque && (colors[i].getAlpha() == 0xff);
|
|
||||||
}
|
|
||||||
this.transparency = opaque ? OPAQUE : TRANSLUCENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PaintContext createContext(ColorModel cm,
|
|
||||||
Rectangle deviceBounds,
|
|
||||||
Rectangle2D userBounds,
|
|
||||||
AffineTransform transform,
|
|
||||||
RenderingHints hints) {
|
|
||||||
return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getTransparency() {
|
|
||||||
return transparency;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class PathGradientContext implements PaintContext {
|
if (l <0.0f || l > 100.0f) {
|
||||||
protected final Rectangle deviceBounds;
|
String message = "Color parameter outside of expected range - Luminance";
|
||||||
protected final Rectangle2D userBounds;
|
throw new IllegalArgumentException( message );
|
||||||
protected final AffineTransform xform;
|
|
||||||
protected final RenderingHints hints;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* for POI: the shape will be only known when the subclasses determines the concrete implementation
|
|
||||||
* in the draw/-content method, so we need to postpone the setting/creation as long as possible
|
|
||||||
**/
|
|
||||||
protected final Shape shape;
|
|
||||||
protected final PaintContext pCtx;
|
|
||||||
protected final int gradientSteps;
|
|
||||||
WritableRaster raster;
|
|
||||||
|
|
||||||
public PathGradientContext(
|
|
||||||
ColorModel cm
|
|
||||||
, Rectangle deviceBounds
|
|
||||||
, Rectangle2D userBounds
|
|
||||||
, AffineTransform xform
|
|
||||||
, RenderingHints hints
|
|
||||||
) {
|
|
||||||
shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE);
|
|
||||||
if (shape == null) {
|
|
||||||
throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE.");
|
|
||||||
}
|
|
||||||
|
|
||||||
this.deviceBounds = deviceBounds;
|
|
||||||
this.userBounds = userBounds;
|
|
||||||
this.xform = xform;
|
|
||||||
this.hints = hints;
|
|
||||||
|
|
||||||
gradientSteps = getGradientSteps(shape);
|
|
||||||
|
|
||||||
Point2D start = new Point2D.Double(0, 0);
|
|
||||||
Point2D end = new Point2D.Double(gradientSteps, 0);
|
|
||||||
LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform());
|
|
||||||
|
|
||||||
Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1);
|
|
||||||
pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void dispose() {}
|
|
||||||
|
|
||||||
public ColorModel getColorModel() {
|
|
||||||
return pCtx.getColorModel();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Raster getRaster(int xOffset, int yOffset, int w, int h) {
|
|
||||||
ColorModel cm = getColorModel();
|
|
||||||
if (raster == null) createRaster();
|
|
||||||
|
|
||||||
// TODO: eventually use caching here
|
|
||||||
WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h);
|
|
||||||
Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h);
|
|
||||||
if (!childRect.intersects(deviceBounds)) {
|
|
||||||
// usually doesn't happen ...
|
|
||||||
return childRaster;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle2D destRect = new Rectangle2D.Double();
|
|
||||||
Rectangle2D.intersect(childRect, deviceBounds, destRect);
|
|
||||||
int dx = (int)(destRect.getX()-deviceBounds.getX());
|
|
||||||
int dy = (int)(destRect.getY()-deviceBounds.getY());
|
|
||||||
int dw = (int)destRect.getWidth();
|
|
||||||
int dh = (int)destRect.getHeight();
|
|
||||||
Object data = raster.getDataElements(dx, dy, dw, dh, null);
|
|
||||||
dx = (int)(destRect.getX()-childRect.getX());
|
|
||||||
dy = (int)(destRect.getY()-childRect.getY());
|
|
||||||
childRaster.setDataElements(dx, dy, dw, dh, data);
|
|
||||||
|
|
||||||
return childRaster;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected int getGradientSteps(Shape shape) {
|
|
||||||
Rectangle rect = shape.getBounds();
|
|
||||||
int lower = 1;
|
|
||||||
int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0);
|
|
||||||
while (lower < upper-1) {
|
|
||||||
int mid = lower + (upper - lower) / 2;
|
|
||||||
BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle);
|
|
||||||
Area area = new Area(bs.createStrokedShape(shape));
|
|
||||||
if (area.isSingular()) {
|
|
||||||
upper = mid;
|
|
||||||
} else {
|
|
||||||
lower = mid;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return upper;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
protected void createRaster() {
|
|
||||||
ColorModel cm = getColorModel();
|
|
||||||
raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight());
|
|
||||||
BufferedImage img = new BufferedImage(cm, raster, false, null);
|
|
||||||
Graphics2D graphics = img.createGraphics();
|
|
||||||
graphics.setRenderingHints(hints);
|
|
||||||
graphics.translate(-deviceBounds.getX(), -deviceBounds.getY());
|
|
||||||
graphics.transform(xform);
|
|
||||||
|
|
||||||
Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1);
|
|
||||||
int rgb[] = new int[cm.getNumComponents()];
|
|
||||||
|
|
||||||
for (int i = gradientSteps-1; i>=0; i--) {
|
|
||||||
img2.getPixel(i, 0, rgb);
|
|
||||||
Color c = new Color(rgb[0],rgb[1],rgb[2]);
|
|
||||||
if (rgb.length == 4) {
|
|
||||||
// it doesn't work to use just a color with transparency ...
|
|
||||||
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f));
|
|
||||||
}
|
|
||||||
graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle));
|
|
||||||
graphics.setColor(c);
|
|
||||||
graphics.draw(shape);
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics.dispose();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (alpha <0.0f || alpha > 1.0f) {
|
||||||
|
String message = "Color parameter outside of expected range - Alpha";
|
||||||
|
throw new IllegalArgumentException( message );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Formula needs all values between 0 - 1.
|
||||||
|
|
||||||
|
h = h % 360.0f;
|
||||||
|
h /= 360f;
|
||||||
|
s /= 100f;
|
||||||
|
l /= 100f;
|
||||||
|
|
||||||
|
double q = (l < 0.5d)
|
||||||
|
? l * (1d + s)
|
||||||
|
: (l + s) - (s * l);
|
||||||
|
|
||||||
|
double p = 2d * l - q;
|
||||||
|
|
||||||
|
double r = Math.max(0, HUE2RGB(p, q, h + (1.0d / 3.0d)));
|
||||||
|
double g = Math.max(0, HUE2RGB(p, q, h));
|
||||||
|
double b = Math.max(0, HUE2RGB(p, q, h - (1.0d / 3.0d)));
|
||||||
|
|
||||||
|
r = Math.min(r, 1.0d);
|
||||||
|
g = Math.min(g, 1.0d);
|
||||||
|
b = Math.min(b, 1.0d);
|
||||||
|
|
||||||
|
return new Color((float)r, (float)g, (float)b, (float)alpha);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
private static double HUE2RGB(double p, double q, double h) {
|
||||||
|
if (h < 0d) h += 1d;
|
||||||
|
|
||||||
|
if (h > 1d) h -= 1d;
|
||||||
|
|
||||||
|
if (6d * h < 1d) {
|
||||||
|
return p + ((q - p) * 6d * h);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (2d * h < 1d) {
|
||||||
|
return q;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (3d * h < 2d) {
|
||||||
|
return p + ( (q - p) * 6d * ((2.0d / 3.0d) - h) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert a RGB Color to it corresponding HSL values.
|
||||||
|
*
|
||||||
|
* @return an array containing the 3 HSL values.
|
||||||
|
*/
|
||||||
|
private static double[] RGB2HSL(Color color)
|
||||||
|
{
|
||||||
|
// Get RGB values in the range 0 - 1
|
||||||
|
|
||||||
|
float[] rgb = color.getRGBColorComponents( null );
|
||||||
|
double r = rgb[0];
|
||||||
|
double g = rgb[1];
|
||||||
|
double b = rgb[2];
|
||||||
|
|
||||||
|
// Minimum and Maximum RGB values are used in the HSL calculations
|
||||||
|
|
||||||
|
double min = Math.min(r, Math.min(g, b));
|
||||||
|
double max = Math.max(r, Math.max(g, b));
|
||||||
|
|
||||||
|
// Calculate the Hue
|
||||||
|
|
||||||
|
double h = 0;
|
||||||
|
|
||||||
|
if (max == min) {
|
||||||
|
h = 0;
|
||||||
|
} else if (max == r) {
|
||||||
|
h = ((60d * (g - b) / (max - min)) + 360d) % 360d;
|
||||||
|
} else if (max == g) {
|
||||||
|
h = (60d * (b - r) / (max - min)) + 120d;
|
||||||
|
} else if (max == b) {
|
||||||
|
h = (60d * (r - g) / (max - min)) + 240d;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calculate the Luminance
|
||||||
|
|
||||||
|
double l = (max + min) / 2d;
|
||||||
|
|
||||||
|
// Calculate the Saturation
|
||||||
|
|
||||||
|
double s = 0;
|
||||||
|
|
||||||
|
if (max == min) {
|
||||||
|
s = 0;
|
||||||
|
} else if (l <= .5d) {
|
||||||
|
s = (max - min) / (max + min);
|
||||||
|
} else {
|
||||||
|
s = (max - min) / (2d - max - min);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new double[] {h, s * 100, l * 100};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -34,7 +34,6 @@ import org.apache.poi.util.Units;
|
|||||||
public class DrawTextParagraph<T extends TextRun> implements Drawable {
|
public class DrawTextParagraph<T extends TextRun> implements Drawable {
|
||||||
protected TextParagraph<T> paragraph;
|
protected TextParagraph<T> paragraph;
|
||||||
double x, y;
|
double x, y;
|
||||||
protected Insets2D insets = new Insets2D(0,0,0,0);
|
|
||||||
protected List<DrawTextFragment> lines = new ArrayList<DrawTextFragment>();
|
protected List<DrawTextFragment> lines = new ArrayList<DrawTextFragment>();
|
||||||
protected String rawText;
|
protected String rawText;
|
||||||
protected DrawTextFragment bullet;
|
protected DrawTextFragment bullet;
|
||||||
@ -49,14 +48,6 @@ public class DrawTextParagraph<T extends TextRun> implements Drawable {
|
|||||||
this.paragraph = paragraph;
|
this.paragraph = paragraph;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Insets2D getInsets() {
|
|
||||||
return insets;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setInsets(Insets2D insets) {
|
|
||||||
this.insets.set(insets.top, insets.left, insets.bottom, insets.right);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setPosition(double x, double y) {
|
public void setPosition(double x, double y) {
|
||||||
// TODO: replace it, by applyTransform????
|
// TODO: replace it, by applyTransform????
|
||||||
this.x = x;
|
this.x = x;
|
||||||
@ -78,6 +69,7 @@ public class DrawTextParagraph<T extends TextRun> implements Drawable {
|
|||||||
public void draw(Graphics2D graphics){
|
public void draw(Graphics2D graphics){
|
||||||
if (lines.isEmpty()) return;
|
if (lines.isEmpty()) return;
|
||||||
|
|
||||||
|
Insets2D insets = paragraph.getParentShape().getInsets();
|
||||||
double leftInset = insets.left;
|
double leftInset = insets.left;
|
||||||
double rightInset = insets.right;
|
double rightInset = insets.right;
|
||||||
double penY = y;
|
double penY = y;
|
||||||
@ -336,6 +328,7 @@ public class DrawTextParagraph<T extends TextRun> implements Drawable {
|
|||||||
protected double getWrappingWidth(boolean firstLine, Graphics2D graphics){
|
protected double getWrappingWidth(boolean firstLine, Graphics2D graphics){
|
||||||
// internal margins for the text box
|
// internal margins for the text box
|
||||||
|
|
||||||
|
Insets2D insets = paragraph.getParentShape().getInsets();
|
||||||
double leftInset = insets.left;
|
double leftInset = insets.left;
|
||||||
double rightInset = insets.right;
|
double rightInset = insets.right;
|
||||||
|
|
||||||
|
@ -119,7 +119,6 @@ public class DrawTextShape<T extends TextShape<? extends TextParagraph<? extends
|
|||||||
if (startAt > autoNbrIdx) autoNbrIdx = startAt;
|
if (startAt > autoNbrIdx) autoNbrIdx = startAt;
|
||||||
}
|
}
|
||||||
dp.setAutoNumberingIdx(autoNbrIdx);
|
dp.setAutoNumberingIdx(autoNbrIdx);
|
||||||
dp.setInsets(shapePadding);
|
|
||||||
dp.breakText(graphics);
|
dp.breakText(graphics);
|
||||||
|
|
||||||
if (!isFirstLine) {
|
if (!isFirstLine) {
|
||||||
|
186
src/scratchpad/src/org/apache/poi/sl/draw/PathGradientPaint.java
Normal file
186
src/scratchpad/src/org/apache/poi/sl/draw/PathGradientPaint.java
Normal file
@ -0,0 +1,186 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.MultipleGradientPaint.ColorSpaceType;
|
||||||
|
import java.awt.MultipleGradientPaint.CycleMethod;
|
||||||
|
import java.awt.geom.*;
|
||||||
|
import java.awt.image.*;
|
||||||
|
|
||||||
|
class PathGradientPaint implements Paint {
|
||||||
|
|
||||||
|
// http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html
|
||||||
|
protected final Color colors[];
|
||||||
|
protected final float fractions[];
|
||||||
|
protected final int capStyle;
|
||||||
|
protected final int joinStyle;
|
||||||
|
protected final int transparency;
|
||||||
|
|
||||||
|
|
||||||
|
public PathGradientPaint(Color colors[], float fractions[]) {
|
||||||
|
this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) {
|
||||||
|
this.colors = colors;
|
||||||
|
this.fractions = fractions;
|
||||||
|
this.capStyle = capStyle;
|
||||||
|
this.joinStyle = joinStyle;
|
||||||
|
|
||||||
|
// determine transparency
|
||||||
|
boolean opaque = true;
|
||||||
|
for (int i = 0; i < colors.length; i++){
|
||||||
|
opaque = opaque && (colors[i].getAlpha() == 0xff);
|
||||||
|
}
|
||||||
|
this.transparency = opaque ? OPAQUE : TRANSLUCENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaintContext createContext(ColorModel cm,
|
||||||
|
Rectangle deviceBounds,
|
||||||
|
Rectangle2D userBounds,
|
||||||
|
AffineTransform transform,
|
||||||
|
RenderingHints hints) {
|
||||||
|
return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTransparency() {
|
||||||
|
return transparency;
|
||||||
|
}
|
||||||
|
|
||||||
|
class PathGradientContext implements PaintContext {
|
||||||
|
protected final Rectangle deviceBounds;
|
||||||
|
protected final Rectangle2D userBounds;
|
||||||
|
protected final AffineTransform xform;
|
||||||
|
protected final RenderingHints hints;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for POI: the shape will be only known when the subclasses determines the concrete implementation
|
||||||
|
* in the draw/-content method, so we need to postpone the setting/creation as long as possible
|
||||||
|
**/
|
||||||
|
protected final Shape shape;
|
||||||
|
protected final PaintContext pCtx;
|
||||||
|
protected final int gradientSteps;
|
||||||
|
WritableRaster raster;
|
||||||
|
|
||||||
|
public PathGradientContext(
|
||||||
|
ColorModel cm
|
||||||
|
, Rectangle deviceBounds
|
||||||
|
, Rectangle2D userBounds
|
||||||
|
, AffineTransform xform
|
||||||
|
, RenderingHints hints
|
||||||
|
) {
|
||||||
|
shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE);
|
||||||
|
if (shape == null) {
|
||||||
|
throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE.");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.deviceBounds = deviceBounds;
|
||||||
|
this.userBounds = userBounds;
|
||||||
|
this.xform = xform;
|
||||||
|
this.hints = hints;
|
||||||
|
|
||||||
|
gradientSteps = getGradientSteps(shape);
|
||||||
|
|
||||||
|
Point2D start = new Point2D.Double(0, 0);
|
||||||
|
Point2D end = new Point2D.Double(gradientSteps, 0);
|
||||||
|
LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform());
|
||||||
|
|
||||||
|
Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1);
|
||||||
|
pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {}
|
||||||
|
|
||||||
|
public ColorModel getColorModel() {
|
||||||
|
return pCtx.getColorModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Raster getRaster(int xOffset, int yOffset, int w, int h) {
|
||||||
|
ColorModel cm = getColorModel();
|
||||||
|
if (raster == null) createRaster();
|
||||||
|
|
||||||
|
// TODO: eventually use caching here
|
||||||
|
WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h);
|
||||||
|
Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h);
|
||||||
|
if (!childRect.intersects(deviceBounds)) {
|
||||||
|
// usually doesn't happen ...
|
||||||
|
return childRaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle2D destRect = new Rectangle2D.Double();
|
||||||
|
Rectangle2D.intersect(childRect, deviceBounds, destRect);
|
||||||
|
int dx = (int)(destRect.getX()-deviceBounds.getX());
|
||||||
|
int dy = (int)(destRect.getY()-deviceBounds.getY());
|
||||||
|
int dw = (int)destRect.getWidth();
|
||||||
|
int dh = (int)destRect.getHeight();
|
||||||
|
Object data = raster.getDataElements(dx, dy, dw, dh, null);
|
||||||
|
dx = (int)(destRect.getX()-childRect.getX());
|
||||||
|
dy = (int)(destRect.getY()-childRect.getY());
|
||||||
|
childRaster.setDataElements(dx, dy, dw, dh, data);
|
||||||
|
|
||||||
|
return childRaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getGradientSteps(Shape shape) {
|
||||||
|
Rectangle rect = shape.getBounds();
|
||||||
|
int lower = 1;
|
||||||
|
int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0);
|
||||||
|
while (lower < upper-1) {
|
||||||
|
int mid = lower + (upper - lower) / 2;
|
||||||
|
BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle);
|
||||||
|
Area area = new Area(bs.createStrokedShape(shape));
|
||||||
|
if (area.isSingular()) {
|
||||||
|
upper = mid;
|
||||||
|
} else {
|
||||||
|
lower = mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected void createRaster() {
|
||||||
|
ColorModel cm = getColorModel();
|
||||||
|
raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight());
|
||||||
|
BufferedImage img = new BufferedImage(cm, raster, false, null);
|
||||||
|
Graphics2D graphics = img.createGraphics();
|
||||||
|
graphics.setRenderingHints(hints);
|
||||||
|
graphics.translate(-deviceBounds.getX(), -deviceBounds.getY());
|
||||||
|
graphics.transform(xform);
|
||||||
|
|
||||||
|
Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1);
|
||||||
|
int rgb[] = new int[cm.getNumComponents()];
|
||||||
|
|
||||||
|
for (int i = gradientSteps-1; i>=0; i--) {
|
||||||
|
img2.getPixel(i, 0, rgb);
|
||||||
|
Color c = new Color(rgb[0],rgb[1],rgb[2]);
|
||||||
|
if (rgb.length == 4) {
|
||||||
|
// it doesn't work to use just a color with transparency ...
|
||||||
|
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f));
|
||||||
|
}
|
||||||
|
graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle));
|
||||||
|
graphics.setColor(c);
|
||||||
|
graphics.draw(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,18 @@ public interface TextRun {
|
|||||||
TextCap getTextCap();
|
TextCap getTextCap();
|
||||||
|
|
||||||
Color getFontColor();
|
Color getFontColor();
|
||||||
|
void setFontColor(Color color);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return font size in points or null if font size is not set.
|
||||||
|
*/
|
||||||
Double getFontSize();
|
Double getFontSize();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param fontSize font size in points, if null the underlying fontsize will be unset
|
||||||
|
*/
|
||||||
|
void setFontSize(Double fontSize);
|
||||||
String getFontFamily();
|
String getFontFamily();
|
||||||
|
|
||||||
boolean isBold();
|
boolean isBold();
|
||||||
|
@ -47,7 +47,7 @@ public final class TestSetBoldItalic {
|
|||||||
HSLFTextBox txtbox = new HSLFTextBox();
|
HSLFTextBox txtbox = new HSLFTextBox();
|
||||||
rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
|
rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
txtbox.setText(val);
|
txtbox.setText(val);
|
||||||
rt.setFontSize(42);
|
rt.setFontSize(42d);
|
||||||
rt.setBold(true);
|
rt.setBold(true);
|
||||||
rt.setItalic(true);
|
rt.setItalic(true);
|
||||||
rt.setUnderlined(false);
|
rt.setUnderlined(false);
|
||||||
|
@ -194,7 +194,7 @@ public final class TestShapes {
|
|||||||
rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
|
rt = txtbox.getTextParagraphs().get(0).getTextRuns().get(0);
|
||||||
txtbox.setText(val);
|
txtbox.setText(val);
|
||||||
rt.setFontFamily("Arial");
|
rt.setFontFamily("Arial");
|
||||||
rt.setFontSize(42);
|
rt.setFontSize(42d);
|
||||||
rt.setBold(true);
|
rt.setBold(true);
|
||||||
rt.setItalic(true);
|
rt.setItalic(true);
|
||||||
rt.setUnderlined(false);
|
rt.setUnderlined(false);
|
||||||
|
@ -168,7 +168,7 @@ public final class TestRichTextRun {
|
|||||||
|
|
||||||
// Change 2nd to different size and font
|
// Change 2nd to different size and font
|
||||||
assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR
|
assertEquals(2, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR
|
||||||
rtrRb.setFontSize(18);
|
rtrRb.setFontSize(18d);
|
||||||
rtrRb.setFontFamily("Courier");
|
rtrRb.setFontFamily("Courier");
|
||||||
assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier
|
assertEquals(3, ssRichB.getFontCollection().getChildRecords().length); // Default + TNR + Courier
|
||||||
assertEquals(18, rtrRb.getFontSize(), 0);
|
assertEquals(18, rtrRb.getFontSize(), 0);
|
||||||
@ -183,7 +183,7 @@ public final class TestRichTextRun {
|
|||||||
assertNotNull(rtr.getTextParagraph().getParagraphStyle());
|
assertNotNull(rtr.getTextParagraph().getParagraphStyle());
|
||||||
|
|
||||||
// Change Font size
|
// Change Font size
|
||||||
rtr.setFontSize(99);
|
rtr.setFontSize(99d);
|
||||||
assertEquals(99, rtr.getFontSize(), 0);
|
assertEquals(99, rtr.getFontSize(), 0);
|
||||||
assertEquals(defaultFont, rtr.getFontFamily());
|
assertEquals(defaultFont, rtr.getFontFamily());
|
||||||
assertNotNull(rtr.getCharacterStyle());
|
assertNotNull(rtr.getCharacterStyle());
|
||||||
@ -191,7 +191,7 @@ public final class TestRichTextRun {
|
|||||||
assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default
|
assertEquals(1, ss.getFontCollection().getChildRecords().length); // Default
|
||||||
|
|
||||||
// Change Font size and name
|
// Change Font size and name
|
||||||
rtr.setFontSize(25);
|
rtr.setFontSize(25d);
|
||||||
rtr.setFontFamily("Times New Roman");
|
rtr.setFontFamily("Times New Roman");
|
||||||
assertEquals(25, rtr.getFontSize(), 0);
|
assertEquals(25, rtr.getFontSize(), 0);
|
||||||
assertEquals("Times New Roman", rtr.getFontFamily());
|
assertEquals("Times New Roman", rtr.getFontFamily());
|
||||||
@ -209,7 +209,7 @@ public final class TestRichTextRun {
|
|||||||
HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0);
|
HSLFTextRun rtr = textParass.get(0).get(0).getTextRuns().get(0);
|
||||||
|
|
||||||
rtr.setBold(true);
|
rtr.setBold(true);
|
||||||
rtr.setFontSize(18);
|
rtr.setFontSize(18d);
|
||||||
rtr.setFontFamily("Courier");
|
rtr.setFontFamily("Courier");
|
||||||
HSLFTextParagraph.storeText(textParass.get(0));
|
HSLFTextParagraph.storeText(textParass.get(0));
|
||||||
|
|
||||||
@ -228,7 +228,7 @@ public final class TestRichTextRun {
|
|||||||
|
|
||||||
// Tweak existing one again, to ensure really worked
|
// Tweak existing one again, to ensure really worked
|
||||||
rtr.setBold(false);
|
rtr.setBold(false);
|
||||||
rtr.setFontSize(17);
|
rtr.setFontSize(17d);
|
||||||
rtr.setFontFamily("CourierZZ");
|
rtr.setFontFamily("CourierZZ");
|
||||||
|
|
||||||
// Check it took those changes
|
// Check it took those changes
|
||||||
@ -511,7 +511,7 @@ public final class TestRichTextRun {
|
|||||||
"Multiline text");
|
"Multiline text");
|
||||||
HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
|
HSLFTextParagraph rt = shape.getTextParagraphs().get(0);
|
||||||
HSLFTextRun tr = rt.getTextRuns().get(0);
|
HSLFTextRun tr = rt.getTextRuns().get(0);
|
||||||
tr.setFontSize(42);
|
tr.setFontSize(42d);
|
||||||
rt.setBullet(true);
|
rt.setBullet(true);
|
||||||
rt.setLeftMargin(50d);
|
rt.setLeftMargin(50d);
|
||||||
rt.setIndent(0d);
|
rt.setIndent(0d);
|
||||||
|
Loading…
Reference in New Issue
Block a user