committing intermediate results - xslf now compiles - hslf needs to be migrated to common interface - drawing is not yet tested
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1664935 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
996c9dd93c
commit
a0070048fe
@ -419,7 +419,7 @@ public final class ApacheconEU08 {
|
|||||||
|
|
||||||
Slide slide = ppt.createSlide();
|
Slide slide = ppt.createSlide();
|
||||||
|
|
||||||
ShapeGroup group = new ShapeGroup();
|
HSLFGroupShape group = new HSLFGroupShape();
|
||||||
//define position of the drawing in the slide
|
//define position of the drawing in the slide
|
||||||
Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
|
Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
|
||||||
group.setAnchor(bounds);
|
group.setAnchor(bounds);
|
||||||
|
@ -60,7 +60,7 @@ public final class DataExtraction {
|
|||||||
//extract embedded OLE documents
|
//extract embedded OLE documents
|
||||||
Slide[] slide = ppt.getSlides();
|
Slide[] slide = ppt.getSlides();
|
||||||
for (int i = 0; i < slide.length; i++) {
|
for (int i = 0; i < slide.length; i++) {
|
||||||
Shape[] shape = slide[i].getShapes();
|
HSLFShape[] shape = slide[i].getShapes();
|
||||||
for (int j = 0; j < shape.length; j++) {
|
for (int j = 0; j < shape.length; j++) {
|
||||||
if (shape[j] instanceof OLEShape) {
|
if (shape[j] instanceof OLEShape) {
|
||||||
OLEShape ole = (OLEShape) shape[j];
|
OLEShape ole = (OLEShape) shape[j];
|
||||||
@ -102,7 +102,7 @@ public final class DataExtraction {
|
|||||||
|
|
||||||
//Pictures
|
//Pictures
|
||||||
for (int i = 0; i < slide.length; i++) {
|
for (int i = 0; i < slide.length; i++) {
|
||||||
Shape[] shape = slide[i].getShapes();
|
HSLFShape[] shape = slide[i].getShapes();
|
||||||
for (int j = 0; j < shape.length; j++) {
|
for (int j = 0; j < shape.length; j++) {
|
||||||
if (shape[j] instanceof Picture) {
|
if (shape[j] instanceof Picture) {
|
||||||
Picture p = (Picture) shape[j];
|
Picture p = (Picture) shape[j];
|
||||||
|
@ -46,7 +46,7 @@ public final class Graphics2DDemo {
|
|||||||
|
|
||||||
Slide slide = ppt.createSlide();
|
Slide slide = ppt.createSlide();
|
||||||
|
|
||||||
ShapeGroup group = new ShapeGroup();
|
HSLFGroupShape group = new HSLFGroupShape();
|
||||||
//define position of the drawing in the slide
|
//define position of the drawing in the slide
|
||||||
Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
|
Rectangle bounds = new java.awt.Rectangle(200, 100, 350, 300);
|
||||||
group.setAnchor(bounds);
|
group.setAnchor(bounds);
|
||||||
|
@ -21,7 +21,7 @@ import org.apache.poi.hslf.usermodel.SlideShow;
|
|||||||
import org.apache.poi.hslf.model.Slide;
|
import org.apache.poi.hslf.model.Slide;
|
||||||
import org.apache.poi.hslf.model.TextRun;
|
import org.apache.poi.hslf.model.TextRun;
|
||||||
import org.apache.poi.hslf.model.Hyperlink;
|
import org.apache.poi.hslf.model.Hyperlink;
|
||||||
import org.apache.poi.hslf.model.Shape;
|
import org.apache.poi.hslf.model.HSLFShape;
|
||||||
|
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ public final class Hyperlinks {
|
|||||||
//for example to a Line object. The code below demonstrates how to
|
//for example to a Line object. The code below demonstrates how to
|
||||||
//read such hyperlinks
|
//read such hyperlinks
|
||||||
System.out.println(" reading hyperlinks from the slide's shapes");
|
System.out.println(" reading hyperlinks from the slide's shapes");
|
||||||
Shape[] sh = slide[j].getShapes();
|
HSLFShape[] sh = slide[j].getShapes();
|
||||||
for (int k = 0; k < sh.length; k++) {
|
for (int k = 0; k < sh.length; k++) {
|
||||||
Hyperlink link = sh[k].getHyperlink();
|
Hyperlink link = sh[k].getHyperlink();
|
||||||
if(link != null) {
|
if(link != null) {
|
||||||
|
@ -37,7 +37,7 @@ public class SoundFinder {
|
|||||||
|
|
||||||
Slide[] slide = ppt.getSlides();
|
Slide[] slide = ppt.getSlides();
|
||||||
for (int i = 0; i < slide.length; i++) {
|
for (int i = 0; i < slide.length; i++) {
|
||||||
Shape[] shape = slide[i].getShapes();
|
HSLFShape[] shape = slide[i].getShapes();
|
||||||
for (int j = 0; j < shape.length; j++) {
|
for (int j = 0; j < shape.length; j++) {
|
||||||
int soundRef = getSoundReference(shape[j]);
|
int soundRef = getSoundReference(shape[j]);
|
||||||
if(soundRef != -1) {
|
if(soundRef != -1) {
|
||||||
@ -54,7 +54,7 @@ public class SoundFinder {
|
|||||||
* @return 0-based reference to a sound in the sound collection
|
* @return 0-based reference to a sound in the sound collection
|
||||||
* or -1 if the shape is not associated with a sound
|
* or -1 if the shape is not associated with a sound
|
||||||
*/
|
*/
|
||||||
protected static int getSoundReference(Shape shape){
|
protected static int getSoundReference(HSLFShape shape){
|
||||||
int soundRef = -1;
|
int soundRef = -1;
|
||||||
//dive into the shape container and search for InteractiveInfoAtom
|
//dive into the shape container and search for InteractiveInfoAtom
|
||||||
EscherContainerRecord spContainer = shape.getSpContainer();
|
EscherContainerRecord spContainer = shape.getSpContainer();
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.model;
|
package org.apache.poi.xslf.model;
|
||||||
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFSimpleShape;
|
import org.apache.poi.xslf.usermodel.XSLFShape;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ public abstract class ParagraphPropertyFetcher<T> extends PropertyFetcher<T> {
|
|||||||
_level = level;
|
_level = level;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
public boolean fetch(XSLFShape shape) {
|
||||||
|
|
||||||
XmlObject[] o = shape.getXmlObject().selectPath(
|
XmlObject[] o = shape.getXmlObject().selectPath(
|
||||||
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +
|
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +
|
||||||
|
@ -36,7 +36,7 @@ public abstract class PropertyFetcher<T> {
|
|||||||
* @param shape the shape being examined
|
* @param shape the shape being examined
|
||||||
* @return true if the desired property was fetched
|
* @return true if the desired property was fetched
|
||||||
*/
|
*/
|
||||||
public abstract boolean fetch(XSLFShape shape) ;
|
public abstract boolean fetch(XSLFShape shape);
|
||||||
|
|
||||||
public T getValue(){
|
public T getValue(){
|
||||||
return _value;
|
return _value;
|
||||||
|
@ -19,7 +19,7 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.model;
|
package org.apache.poi.xslf.model;
|
||||||
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFSimpleShape;
|
import org.apache.poi.xslf.usermodel.XSLFShape;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
||||||
|
|
||||||
@ -32,7 +32,7 @@ import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
|||||||
*/
|
*/
|
||||||
public abstract class TextBodyPropertyFetcher<T> extends PropertyFetcher<T> {
|
public abstract class TextBodyPropertyFetcher<T> extends PropertyFetcher<T> {
|
||||||
|
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
public boolean fetch(XSLFShape shape) {
|
||||||
|
|
||||||
XmlObject[] o = shape.getXmlObject().selectPath(
|
XmlObject[] o = shape.getXmlObject().selectPath(
|
||||||
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +
|
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' " +
|
||||||
|
@ -1,29 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
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.xslf.usermodel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents the shape decoration that appears at the ends of lines.
|
|
||||||
*/
|
|
||||||
public enum LineDecoration {
|
|
||||||
NONE,
|
|
||||||
TRIANGLE,
|
|
||||||
STEALTH,
|
|
||||||
DIAMOND,
|
|
||||||
OVAL,
|
|
||||||
ARROW
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
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.xslf.usermodel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public enum LineEndLength {
|
|
||||||
SMALL,
|
|
||||||
MEDIUM,
|
|
||||||
LARGE
|
|
||||||
}
|
|
@ -1,26 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
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.xslf.usermodel;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public enum LineEndWidth {
|
|
||||||
SMALL,
|
|
||||||
MEDIUM,
|
|
||||||
LARGE
|
|
||||||
}
|
|
@ -1,632 +0,0 @@
|
|||||||
/*
|
|
||||||
* ====================================================================
|
|
||||||
* 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.xslf.usermodel;
|
|
||||||
|
|
||||||
import java.awt.AlphaComposite;
|
|
||||||
import java.awt.BasicStroke;
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.GradientPaint;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Paint;
|
|
||||||
import java.awt.Shape;
|
|
||||||
import java.awt.Stroke;
|
|
||||||
import java.awt.TexturePaint;
|
|
||||||
import java.awt.geom.AffineTransform;
|
|
||||||
import java.awt.geom.Point2D;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Comparator;
|
|
||||||
|
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.sl.usermodel.LineCap;
|
|
||||||
import org.apache.poi.sl.usermodel.LineDash;
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.poi.util.Units;
|
|
||||||
import org.apache.poi.xslf.model.PropertyFetcher;
|
|
||||||
import org.apache.poi.xslf.model.geom.Context;
|
|
||||||
import org.apache.poi.xslf.model.geom.CustomGeometry;
|
|
||||||
import org.apache.poi.xslf.model.geom.Guide;
|
|
||||||
import org.apache.poi.xslf.model.geom.IAdjustableShape;
|
|
||||||
import org.apache.poi.xslf.model.geom.Outline;
|
|
||||||
import org.apache.poi.xslf.model.geom.Path;
|
|
||||||
import org.apache.xmlbeans.XmlObject;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGeomGuide;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGradientFillProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGradientStop;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNoFillProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPathShadeProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeStyle;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STPathShadeType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encapsulates logic to translate DrawingML objects to Java2D
|
|
||||||
*/
|
|
||||||
@Internal
|
|
||||||
class RenderableShape {
|
|
||||||
public final static Color NO_PAINT = new Color(0xFF, 0xFF, 0xFF, 0);
|
|
||||||
|
|
||||||
private XSLFSimpleShape _shape;
|
|
||||||
|
|
||||||
public RenderableShape(XSLFSimpleShape shape){
|
|
||||||
_shape = shape;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert shape fill into java.awt.Paint. The result is either Color or
|
|
||||||
* TexturePaint or GradientPaint or null
|
|
||||||
*
|
|
||||||
* @param graphics the target graphics
|
|
||||||
* @param obj the xml to read. Must contain elements from the EG_ColorChoice group:
|
|
||||||
* <code>
|
|
||||||
* a:scrgbClr RGB Color Model - Percentage Variant
|
|
||||||
* a:srgbClr RGB Color Model - Hex Variant
|
|
||||||
* a:hslClr Hue, Saturation, Luminance Color Model
|
|
||||||
* a:sysClr System Color
|
|
||||||
* a:schemeClr Scheme Color
|
|
||||||
* a:prstClr Preset Color
|
|
||||||
* </code>
|
|
||||||
*
|
|
||||||
* @param phClr context color
|
|
||||||
* @param parentPart the parent package part. Any external references (images, etc.) are resolved relative to it.
|
|
||||||
*
|
|
||||||
* @return the applied Paint or null if none was applied
|
|
||||||
*/
|
|
||||||
public Paint selectPaint(Graphics2D graphics, XmlObject obj, CTSchemeColor phClr, PackagePart parentPart) {
|
|
||||||
XSLFTheme theme = _shape.getSheet().getTheme();
|
|
||||||
|
|
||||||
Paint paint = null;
|
|
||||||
if (obj instanceof CTNoFillProperties) {
|
|
||||||
paint = NO_PAINT;
|
|
||||||
|
|
||||||
}
|
|
||||||
else if (obj instanceof CTSolidColorFillProperties) {
|
|
||||||
CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj;
|
|
||||||
XSLFColor c = new XSLFColor(solidFill, theme, phClr);
|
|
||||||
paint = c.getColor();
|
|
||||||
}
|
|
||||||
else if (obj instanceof CTBlipFillProperties) {
|
|
||||||
CTBlipFillProperties blipFill = (CTBlipFillProperties)obj;
|
|
||||||
paint = createTexturePaint(blipFill, graphics, parentPart);
|
|
||||||
}
|
|
||||||
else if (obj instanceof CTGradientFillProperties) {
|
|
||||||
Rectangle2D anchor = getAnchor(graphics);
|
|
||||||
CTGradientFillProperties gradFill = (CTGradientFillProperties) obj;
|
|
||||||
if (gradFill.isSetLin()) {
|
|
||||||
paint = createLinearGradientPaint(graphics, gradFill, anchor, theme, phClr);
|
|
||||||
} else if (gradFill.isSetPath()){
|
|
||||||
CTPathShadeProperties ps = gradFill.getPath();
|
|
||||||
if(ps.getPath() == STPathShadeType.CIRCLE){
|
|
||||||
paint = createRadialGradientPaint(gradFill, anchor, theme, phClr);
|
|
||||||
} else if (ps.getPath() == STPathShadeType.SHAPE){
|
|
||||||
paint = toRadialGradientPaint(gradFill, anchor, theme, phClr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Paint createTexturePaint(CTBlipFillProperties blipFill, Graphics2D graphics,
|
|
||||||
PackagePart parentPart){
|
|
||||||
Paint paint = null;
|
|
||||||
CTBlip blip = blipFill.getBlip();
|
|
||||||
String blipId = blip.getEmbed();
|
|
||||||
PackageRelationship rel = parentPart.getRelationship(blipId);
|
|
||||||
if (rel != null) {
|
|
||||||
XSLFImageRenderer renderer = null;
|
|
||||||
if (graphics != null)
|
|
||||||
renderer = (XSLFImageRenderer) graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER);
|
|
||||||
if (renderer == null) renderer = new XSLFImageRenderer();
|
|
||||||
|
|
||||||
try {
|
|
||||||
BufferedImage img = renderer.readImage(parentPart.getRelatedPart(rel));
|
|
||||||
if (blip.sizeOfAlphaModFixArray() > 0) {
|
|
||||||
float alpha = blip.getAlphaModFixArray(0).getAmt() / 100000.f;
|
|
||||||
AlphaComposite ac = AlphaComposite.getInstance(
|
|
||||||
AlphaComposite.SRC_OVER, alpha);
|
|
||||||
if (graphics != null) graphics.setComposite(ac);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(img != null) {
|
|
||||||
paint = new TexturePaint(
|
|
||||||
img, new Rectangle2D.Double(0, 0, img.getWidth(), img.getHeight()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception e) {
|
|
||||||
e.printStackTrace();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
private Paint createLinearGradientPaint(
|
|
||||||
Graphics2D graphics,
|
|
||||||
CTGradientFillProperties gradFill, Rectangle2D anchor,
|
|
||||||
XSLFTheme theme, CTSchemeColor phClr) {
|
|
||||||
double angle = gradFill.getLin().getAng() / 60000;
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
|
|
||||||
|
|
||||||
Arrays.sort(gs, new Comparator<CTGradientStop>() {
|
|
||||||
public int compare(CTGradientStop o1, CTGradientStop o2) {
|
|
||||||
Integer pos1 = o1.getPos();
|
|
||||||
Integer pos2 = o2.getPos();
|
|
||||||
return pos1.compareTo(pos2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Color[] colors = new Color[gs.length];
|
|
||||||
float[] fractions = new float[gs.length];
|
|
||||||
|
|
||||||
AffineTransform at = AffineTransform.getRotateInstance(
|
|
||||||
Math.toRadians(angle),
|
|
||||||
anchor.getX() + anchor.getWidth() / 2,
|
|
||||||
anchor.getY() + anchor.getHeight() / 2);
|
|
||||||
|
|
||||||
double diagonal = Math.sqrt(anchor.getHeight() * anchor.getHeight() + anchor.getWidth() * anchor.getWidth());
|
|
||||||
Point2D p1 = new Point2D.Double(anchor.getX() + anchor.getWidth() / 2 - diagonal / 2,
|
|
||||||
anchor.getY() + anchor.getHeight() / 2);
|
|
||||||
p1 = at.transform(p1, null);
|
|
||||||
|
|
||||||
Point2D p2 = new Point2D.Double(anchor.getX() + anchor.getWidth(), anchor.getY() + anchor.getHeight() / 2);
|
|
||||||
p2 = at.transform(p2, null);
|
|
||||||
|
|
||||||
snapToAnchor(p1, anchor);
|
|
||||||
snapToAnchor(p2, anchor);
|
|
||||||
|
|
||||||
for (int i = 0; i < gs.length; i++) {
|
|
||||||
CTGradientStop stop = gs[i];
|
|
||||||
colors[i] = new XSLFColor(stop, theme, phClr).getColor();
|
|
||||||
fractions[i] = stop.getPos() / 100000.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
AffineTransform grAt = new AffineTransform();
|
|
||||||
if(gradFill.isSetRotWithShape() || !gradFill.getRotWithShape()) {
|
|
||||||
double rotation = _shape.getRotation();
|
|
||||||
if (rotation != 0.) {
|
|
||||||
double centerX = anchor.getX() + anchor.getWidth() / 2;
|
|
||||||
double centerY = anchor.getY() + anchor.getHeight() / 2;
|
|
||||||
|
|
||||||
grAt.translate(centerX, centerY);
|
|
||||||
grAt.rotate(Math.toRadians(-rotation));
|
|
||||||
grAt.translate(-centerX, -centerY);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trick to return GradientPaint on JDK 1.5 and LinearGradientPaint on JDK 1.6+
|
|
||||||
Paint paint;
|
|
||||||
try {
|
|
||||||
Class clz = Class.forName("java.awt.LinearGradientPaint");
|
|
||||||
Class clzCycleMethod = Class.forName("java.awt.MultipleGradientPaint$CycleMethod");
|
|
||||||
Class clzColorSpaceType = Class.forName("java.awt.MultipleGradientPaint$ColorSpaceType");
|
|
||||||
Constructor c =
|
|
||||||
clz.getConstructor(Point2D.class, Point2D.class, float[].class, Color[].class,
|
|
||||||
clzCycleMethod, clzColorSpaceType, AffineTransform.class);
|
|
||||||
paint = (Paint) c.newInstance(p1, p2, fractions, colors,
|
|
||||||
Enum.valueOf(clzCycleMethod, "NO_CYCLE"),
|
|
||||||
Enum.valueOf(clzColorSpaceType, "SRGB"), grAt);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
paint = new GradientPaint(p1, colors[0], p2, colors[colors.length - 1]);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
return paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* gradients with type=shape are enot supported by Java graphics.
|
|
||||||
* We approximate it with a radial gradient.
|
|
||||||
*/
|
|
||||||
private static Paint toRadialGradientPaint(
|
|
||||||
CTGradientFillProperties gradFill, Rectangle2D anchor,
|
|
||||||
XSLFTheme theme, CTSchemeColor phClr) {
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
|
|
||||||
Arrays.sort(gs, new Comparator<CTGradientStop>() {
|
|
||||||
public int compare(CTGradientStop o1, CTGradientStop o2) {
|
|
||||||
Integer pos1 = o1.getPos();
|
|
||||||
Integer pos2 = o2.getPos();
|
|
||||||
return pos1.compareTo(pos2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
gs[1].setPos(50000);
|
|
||||||
|
|
||||||
CTGradientFillProperties g = CTGradientFillProperties.Factory.newInstance();
|
|
||||||
g.set(gradFill);
|
|
||||||
g.getGsLst().setGsArray(new CTGradientStop[]{gs[0], gs[1]});
|
|
||||||
return createRadialGradientPaint(g, anchor, theme, phClr);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Paint createRadialGradientPaint(
|
|
||||||
CTGradientFillProperties gradFill, Rectangle2D anchor,
|
|
||||||
XSLFTheme theme, CTSchemeColor phClr) {
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
|
|
||||||
|
|
||||||
Point2D pCenter = new Point2D.Double(anchor.getX() + anchor.getWidth()/2,
|
|
||||||
anchor.getY() + anchor.getHeight()/2);
|
|
||||||
|
|
||||||
float radius = (float)Math.max(anchor.getWidth(), anchor.getHeight());
|
|
||||||
|
|
||||||
Arrays.sort(gs, new Comparator<CTGradientStop>() {
|
|
||||||
public int compare(CTGradientStop o1, CTGradientStop o2) {
|
|
||||||
Integer pos1 = o1.getPos();
|
|
||||||
Integer pos2 = o2.getPos();
|
|
||||||
return pos1.compareTo(pos2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Color[] colors = new Color[gs.length];
|
|
||||||
float[] fractions = new float[gs.length];
|
|
||||||
|
|
||||||
|
|
||||||
for (int i = 0; i < gs.length; i++) {
|
|
||||||
CTGradientStop stop = gs[i];
|
|
||||||
colors[i] = new XSLFColor(stop, theme, phClr).getColor();
|
|
||||||
fractions[i] = stop.getPos() / 100000.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Trick to return GradientPaint on JDK 1.5 and RadialGradientPaint on JDK 1.6+
|
|
||||||
Paint paint;
|
|
||||||
try {
|
|
||||||
Class clz = Class.forName("java.awt.RadialGradientPaint");
|
|
||||||
Constructor c =
|
|
||||||
clz.getConstructor(Point2D.class, float.class,
|
|
||||||
float[].class, Color[].class);
|
|
||||||
paint = (Paint) c.newInstance(pCenter, radius, fractions, colors);
|
|
||||||
} catch (ClassNotFoundException e) {
|
|
||||||
// the result on JDK 1.5 is incorrect, but it is better than nothing
|
|
||||||
paint = new GradientPaint(
|
|
||||||
new Point2D.Double(anchor.getX(), anchor.getY()),
|
|
||||||
colors[0], pCenter, colors[colors.length - 1]);
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
return paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void snapToAnchor(Point2D p, Rectangle2D anchor) {
|
|
||||||
if (p.getX() < anchor.getX()) {
|
|
||||||
p.setLocation(anchor.getX(), p.getY());
|
|
||||||
} else if (p.getX() > (anchor.getX() + anchor.getWidth())) {
|
|
||||||
p.setLocation(anchor.getX() + anchor.getWidth(), p.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (p.getY() < anchor.getY()) {
|
|
||||||
p.setLocation(p.getX(), anchor.getY());
|
|
||||||
} else if (p.getY() > (anchor.getY() + anchor.getHeight())) {
|
|
||||||
p.setLocation(p.getX(), anchor.getY() + anchor.getHeight());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Paint getPaint(Graphics2D graphics, XmlObject spPr, CTSchemeColor phClr) {
|
|
||||||
|
|
||||||
Paint paint = null;
|
|
||||||
for (XmlObject obj : spPr.selectPath("*")) {
|
|
||||||
paint = selectPaint(graphics, obj, phClr, _shape.getSheet().getPackagePart());
|
|
||||||
if(paint != null) break;
|
|
||||||
}
|
|
||||||
return paint == NO_PAINT ? null : paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* fetch shape fill as a java.awt.Paint
|
|
||||||
*
|
|
||||||
* @return either Color or GradientPaint or TexturePaint or null
|
|
||||||
*/
|
|
||||||
Paint getFillPaint(final Graphics2D graphics) {
|
|
||||||
PropertyFetcher<Paint> fetcher = new PropertyFetcher<Paint>() {
|
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
|
||||||
CTShapeProperties spPr = shape.getSpPr();
|
|
||||||
if (spPr.isSetNoFill()) {
|
|
||||||
setValue(RenderableShape.NO_PAINT); // use it as 'nofill' value
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Paint paint = getPaint(graphics, spPr, null);
|
|
||||||
if (paint != null) {
|
|
||||||
setValue(paint);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_shape.fetchShapeProperty(fetcher);
|
|
||||||
|
|
||||||
Paint paint = fetcher.getValue();
|
|
||||||
if (paint == null) {
|
|
||||||
// fill color was not found, check if it is defined in the theme
|
|
||||||
CTShapeStyle style = _shape.getSpStyle();
|
|
||||||
if (style != null) {
|
|
||||||
// get a reference to a fill style within the style matrix.
|
|
||||||
CTStyleMatrixReference fillRef = style.getFillRef();
|
|
||||||
// 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 = _shape.getSheet();
|
|
||||||
XSLFTheme theme = sheet.getTheme();
|
|
||||||
XmlObject fillProps = null;
|
|
||||||
if(idx >= 1 && idx <= 999){
|
|
||||||
fillProps = theme.getXmlObject().
|
|
||||||
getThemeElements().getFmtScheme().getFillStyleLst().selectPath("*")[idx - 1];
|
|
||||||
} else if (idx >= 1001 ){
|
|
||||||
fillProps = theme.getXmlObject().
|
|
||||||
getThemeElements().getFmtScheme().getBgFillStyleLst().selectPath("*")[idx - 1001];
|
|
||||||
}
|
|
||||||
if(fillProps != null) {
|
|
||||||
paint = selectPaint(graphics, fillProps, phClr, sheet.getPackagePart());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return paint == RenderableShape.NO_PAINT ? null : paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Paint getLinePaint(final Graphics2D graphics) {
|
|
||||||
PropertyFetcher<Paint> fetcher = new PropertyFetcher<Paint>() {
|
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
|
||||||
CTLineProperties spPr = shape.getSpPr().getLn();
|
|
||||||
if (spPr != null) {
|
|
||||||
if (spPr.isSetNoFill()) {
|
|
||||||
setValue(NO_PAINT); // use it as 'nofill' value
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
Paint paint = getPaint(graphics, spPr, null);
|
|
||||||
if (paint != null) {
|
|
||||||
setValue(paint);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
}
|
|
||||||
};
|
|
||||||
_shape.fetchShapeProperty(fetcher);
|
|
||||||
|
|
||||||
Paint paint = fetcher.getValue();
|
|
||||||
if (paint == null) {
|
|
||||||
// line color was not found, check if it is defined in the theme
|
|
||||||
CTShapeStyle style = _shape.getSpStyle();
|
|
||||||
if (style != null) {
|
|
||||||
// get a reference to a line style within the style matrix.
|
|
||||||
CTStyleMatrixReference lnRef = style.getLnRef();
|
|
||||||
int idx = (int)lnRef.getIdx();
|
|
||||||
CTSchemeColor phClr = lnRef.getSchemeClr();
|
|
||||||
if(idx > 0){
|
|
||||||
XSLFTheme theme = _shape.getSheet().getTheme();
|
|
||||||
XmlObject lnProps = theme.getXmlObject().
|
|
||||||
getThemeElements().getFmtScheme().getLnStyleLst().selectPath("*")[idx - 1];
|
|
||||||
paint = getPaint(graphics, lnProps, phClr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return paint == NO_PAINT ? null : paint;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* convert PPT dash into java.awt.BasicStroke
|
|
||||||
*
|
|
||||||
* The mapping is derived empirically on PowerPoint 2010
|
|
||||||
*/
|
|
||||||
private static float[] getDashPattern(LineDash lineDash, float lineWidth) {
|
|
||||||
float[] dash = null;
|
|
||||||
switch (lineDash) {
|
|
||||||
case SYS_DOT:
|
|
||||||
dash = new float[]{lineWidth, lineWidth};
|
|
||||||
break;
|
|
||||||
case SYS_DASH:
|
|
||||||
dash = new float[]{2 * lineWidth, 2 * lineWidth};
|
|
||||||
break;
|
|
||||||
case DASH:
|
|
||||||
dash = new float[]{3 * lineWidth, 4 * lineWidth};
|
|
||||||
break;
|
|
||||||
case DASH_DOT:
|
|
||||||
dash = new float[]{4 * lineWidth, 3 * lineWidth, lineWidth,
|
|
||||||
3 * lineWidth};
|
|
||||||
break;
|
|
||||||
case LG_DASH:
|
|
||||||
dash = new float[]{8 * lineWidth, 3 * lineWidth};
|
|
||||||
break;
|
|
||||||
case LG_DASH_DOT:
|
|
||||||
dash = new float[]{8 * lineWidth, 3 * lineWidth, lineWidth,
|
|
||||||
3 * lineWidth};
|
|
||||||
break;
|
|
||||||
case LG_DASH_DOT_DOT:
|
|
||||||
dash = new float[]{8 * lineWidth, 3 * lineWidth, lineWidth,
|
|
||||||
3 * lineWidth, lineWidth, 3 * lineWidth};
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return dash;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public Stroke applyStroke(Graphics2D graphics) {
|
|
||||||
|
|
||||||
float lineWidth = (float) _shape.getLineWidth();
|
|
||||||
if(lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt
|
|
||||||
|
|
||||||
LineDash lineDash = _shape.getLineDash();
|
|
||||||
float[] dash = null;
|
|
||||||
float dash_phase = 0;
|
|
||||||
if (lineDash != null) {
|
|
||||||
dash = getDashPattern(lineDash, lineWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
int cap = BasicStroke.CAP_BUTT;
|
|
||||||
LineCap lineCap = _shape.getLineCap();
|
|
||||||
if (lineCap != null) {
|
|
||||||
switch (lineCap) {
|
|
||||||
case ROUND:
|
|
||||||
cap = BasicStroke.CAP_ROUND;
|
|
||||||
break;
|
|
||||||
case SQUARE:
|
|
||||||
cap = BasicStroke.CAP_SQUARE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
cap = BasicStroke.CAP_BUTT;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int meter = BasicStroke.JOIN_ROUND;
|
|
||||||
|
|
||||||
Stroke stroke = new BasicStroke(lineWidth, cap, meter, Math.max(1, lineWidth), dash,
|
|
||||||
dash_phase);
|
|
||||||
graphics.setStroke(stroke);
|
|
||||||
return stroke;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void render(Graphics2D graphics){
|
|
||||||
Collection<Outline> elems = computeOutlines(graphics);
|
|
||||||
|
|
||||||
// shadow
|
|
||||||
XSLFShadow shadow = _shape.getShadow();
|
|
||||||
|
|
||||||
// first fill
|
|
||||||
Paint fill = getFillPaint(graphics);
|
|
||||||
Paint line = getLinePaint(graphics);
|
|
||||||
applyStroke(graphics); // the stroke applies both to the shadow and the shape
|
|
||||||
|
|
||||||
// first paint the shadow
|
|
||||||
if(shadow != null) for(Outline o : elems){
|
|
||||||
if(o.getPath().isFilled()){
|
|
||||||
if(fill != null) shadow.fill(graphics, o.getOutline());
|
|
||||||
else if(line != null) shadow.draw(graphics, o.getOutline());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// then fill the shape interior
|
|
||||||
if(fill != null) for(Outline o : elems){
|
|
||||||
if(o.getPath().isFilled()){
|
|
||||||
graphics.setPaint(fill);
|
|
||||||
graphics.fill(o.getOutline());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// then draw any content within this shape (text, image, etc.)
|
|
||||||
_shape.drawContent(graphics);
|
|
||||||
|
|
||||||
// then stroke the shape outline
|
|
||||||
if(line != null) for(Outline o : elems){
|
|
||||||
if(o.getPath().isStroked()){
|
|
||||||
graphics.setPaint(line);
|
|
||||||
graphics.draw(o.getOutline());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
private Collection<Outline> computeOutlines(Graphics2D graphics) {
|
|
||||||
|
|
||||||
Collection<Outline> lst = new ArrayList<Outline>();
|
|
||||||
CustomGeometry geom = _shape.getGeometry();
|
|
||||||
if(geom == null) {
|
|
||||||
return lst;
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle2D anchor = getAnchor(graphics);
|
|
||||||
for (Path p : geom) {
|
|
||||||
|
|
||||||
double w = p.getW() == -1 ? anchor.getWidth() * Units.EMU_PER_POINT : p.getW();
|
|
||||||
double h = p.getH() == -1 ? anchor.getHeight() * Units.EMU_PER_POINT : p.getH();
|
|
||||||
|
|
||||||
// the guides in the shape definitions are all defined relative to each other,
|
|
||||||
// so we build the path starting from (0,0).
|
|
||||||
final Rectangle2D pathAnchor = new Rectangle2D.Double(
|
|
||||||
0,
|
|
||||||
0,
|
|
||||||
w,
|
|
||||||
h
|
|
||||||
);
|
|
||||||
|
|
||||||
Context ctx = new Context(geom, pathAnchor, new IAdjustableShape() {
|
|
||||||
|
|
||||||
public Guide getAdjustValue(String name) {
|
|
||||||
CTPresetGeometry2D prst = _shape.getSpPr().getPrstGeom();
|
|
||||||
if (prst.isSetAvLst()) {
|
|
||||||
for (CTGeomGuide g : prst.getAvLst().getGdArray()) {
|
|
||||||
if (g.getName().equals(name)) {
|
|
||||||
return new Guide(g);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}) ;
|
|
||||||
|
|
||||||
Shape gp = p.getPath(ctx);
|
|
||||||
|
|
||||||
// translate the result to the canvas coordinates in points
|
|
||||||
AffineTransform at = new AffineTransform();
|
|
||||||
at.translate(anchor.getX(), anchor.getY());
|
|
||||||
|
|
||||||
double scaleX, scaleY;
|
|
||||||
if (p.getW() != -1) {
|
|
||||||
scaleX = anchor.getWidth() / p.getW();
|
|
||||||
} else {
|
|
||||||
scaleX = 1.0 / Units.EMU_PER_POINT;
|
|
||||||
}
|
|
||||||
if (p.getH() != -1) {
|
|
||||||
scaleY = anchor.getHeight() / p.getH();
|
|
||||||
} else {
|
|
||||||
scaleY = 1.0 / Units.EMU_PER_POINT;
|
|
||||||
}
|
|
||||||
|
|
||||||
at.scale(scaleX, scaleY);
|
|
||||||
|
|
||||||
Shape canvasShape = at.createTransformedShape(gp);
|
|
||||||
|
|
||||||
lst.add(new Outline(canvasShape, p));
|
|
||||||
}
|
|
||||||
|
|
||||||
return lst;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rectangle2D getAnchor(Graphics2D graphics) {
|
|
||||||
Rectangle2D anchor = _shape.getAnchor();
|
|
||||||
if(graphics == null) {
|
|
||||||
return anchor;
|
|
||||||
}
|
|
||||||
|
|
||||||
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM);
|
|
||||||
if(tx != null) {
|
|
||||||
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
|
||||||
}
|
|
||||||
return anchor;
|
|
||||||
}
|
|
||||||
}
|
|
@ -496,11 +496,11 @@ public class XMLSlideShow extends POIXMLDocument implements SlideShow {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public MasterSheet<XSLFShape>[] getMasterSheet() {
|
public XSLFSlideMaster[] getMasterSheet() {
|
||||||
return getSlideMasters();
|
return getSlideMasters();
|
||||||
}
|
}
|
||||||
|
|
||||||
public MasterSheet<XSLFShape> createMasterSheet() throws IOException {
|
public MasterSheet createMasterSheet() throws IOException {
|
||||||
// TODO: implement!
|
// TODO: implement!
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFAutoShape extends XSLFTextShape implements AutoShape {
|
public class XSLFAutoShape extends XSLFTextShape implements AutoShape<XSLFTextParagraph> {
|
||||||
|
|
||||||
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
|
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
|
||||||
super(shape, sheet);
|
super(shape, sheet);
|
||||||
@ -72,7 +72,7 @@ public class XSLFAutoShape extends XSLFTextShape implements AutoShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected CTTextBody getTextBody(boolean create){
|
protected CTTextBody getTextBody(boolean create){
|
||||||
CTShape shape = (CTShape) getXmlObject();
|
CTShape shape = (CTShape)getXmlObject();
|
||||||
CTTextBody txBody = shape.getTxBody();
|
CTTextBody txBody = shape.getTxBody();
|
||||||
if (txBody == null && create) {
|
if (txBody == null && create) {
|
||||||
txBody = shape.addNewTxBody();
|
txBody = shape.addNewTxBody();
|
||||||
|
@ -20,9 +20,10 @@ package org.apache.poi.xslf.usermodel;
|
|||||||
import java.awt.*;
|
import java.awt.*;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.Background;
|
import org.apache.poi.sl.draw.DrawPaint;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,48 +43,14 @@ public class XSLFBackground extends XSLFSimpleShape implements Background {
|
|||||||
return new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());
|
return new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(Graphics2D graphics) {
|
|
||||||
Rectangle2D anchor = getAnchor();
|
|
||||||
|
|
||||||
Paint fill = getPaint(graphics);
|
|
||||||
if(fill != null) {
|
|
||||||
graphics.setPaint(fill);
|
|
||||||
graphics.fill(anchor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the Paint object to fill
|
|
||||||
*/
|
|
||||||
Paint getPaint(Graphics2D graphics){
|
|
||||||
RenderableShape rShape = new RenderableShape(this);
|
|
||||||
|
|
||||||
Paint fill = null;
|
|
||||||
CTBackground bg = (CTBackground)getXmlObject();
|
|
||||||
if(bg.isSetBgPr()){
|
|
||||||
XmlObject spPr = bg.getBgPr();
|
|
||||||
fill = rShape.getPaint(graphics, spPr, null);
|
|
||||||
} else if (bg.isSetBgRef()){
|
|
||||||
CTStyleMatrixReference bgRef= bg.getBgRef();
|
|
||||||
CTSchemeColor phClr = bgRef.getSchemeClr();
|
|
||||||
|
|
||||||
int idx = (int)bgRef.getIdx() - 1001;
|
|
||||||
XSLFTheme theme = getSheet().getTheme();
|
|
||||||
CTBackgroundFillStyleList bgStyles =
|
|
||||||
theme.getXmlObject().getThemeElements().getFmtScheme().getBgFillStyleLst();
|
|
||||||
|
|
||||||
XmlObject bgStyle = bgStyles.selectPath("*")[idx];
|
|
||||||
fill = rShape.selectPaint(graphics, bgStyle, phClr, theme.getPackagePart());
|
|
||||||
}
|
|
||||||
|
|
||||||
return fill;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Color getFillColor(){
|
public Color getFillColor(){
|
||||||
Paint p = getPaint(null);
|
FillStyle fs = getFillStyle();
|
||||||
if(p instanceof Color){
|
PaintStyle ps = fs.getPaint();
|
||||||
return (Color)p;
|
if (ps instanceof SolidPaint) {
|
||||||
|
SolidPaint sp = (SolidPaint)ps;
|
||||||
|
ColorStyle cs = sp.getSolidColor();
|
||||||
|
return DrawPaint.applyColorTransform(cs);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -95,7 +62,7 @@ public class XSLFBackground extends XSLFSimpleShape implements Background {
|
|||||||
* @return dummy CTTransform2D bean
|
* @return dummy CTTransform2D bean
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
CTTransform2D getXfrm() {
|
protected CTTransform2D getXfrm() {
|
||||||
return CTTransform2D.Factory.newInstance();
|
return CTTransform2D.Factory.newInstance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,10 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
@ -28,52 +32,24 @@ import org.apache.poi.util.Beta;
|
|||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
import org.apache.xmlbeans.XmlCursor;
|
import org.apache.xmlbeans.XmlCursor;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGraphicalObjectData;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFGraphicFrame extends XSLFShape {
|
public class XSLFGraphicFrame extends XSLFShape {
|
||||||
private final CTGraphicalObjectFrame _shape;
|
|
||||||
private final XSLFSheet _sheet;
|
|
||||||
|
|
||||||
/*package*/ XSLFGraphicFrame(CTGraphicalObjectFrame shape, XSLFSheet sheet){
|
/*package*/ XSLFGraphicFrame(CTGraphicalObjectFrame shape, XSLFSheet sheet){
|
||||||
_shape = shape;
|
super(shape,sheet);
|
||||||
_sheet = sheet;
|
|
||||||
}
|
|
||||||
|
|
||||||
public CTGraphicalObjectFrame getXmlObject(){
|
|
||||||
return _shape;
|
|
||||||
}
|
|
||||||
|
|
||||||
public XSLFSheet getSheet(){
|
|
||||||
return _sheet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShapeType getShapeType(){
|
public ShapeType getShapeType(){
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getShapeId(){
|
|
||||||
return (int)_shape.getNvGraphicFramePr().getCNvPr().getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getShapeName(){
|
|
||||||
return _shape.getNvGraphicFramePr().getCNvPr().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
public Rectangle2D getAnchor(){
|
public Rectangle2D getAnchor(){
|
||||||
CTTransform2D xfrm = _shape.getXfrm();
|
CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm();
|
||||||
CTPoint2D off = xfrm.getOff();
|
CTPoint2D off = xfrm.getOff();
|
||||||
long x = off.getX();
|
long x = off.getX();
|
||||||
long y = off.getY();
|
long y = off.getY();
|
||||||
@ -86,7 +62,7 @@ public class XSLFGraphicFrame extends XSLFShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void setAnchor(Rectangle2D anchor){
|
public void setAnchor(Rectangle2D anchor){
|
||||||
CTTransform2D xfrm = _shape.getXfrm();
|
CTTransform2D xfrm = ((CTGraphicalObjectFrame)getXmlObject()).getXfrm();
|
||||||
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
||||||
long x = Units.toEMU(anchor.getX());
|
long x = Units.toEMU(anchor.getX());
|
||||||
long y = Units.toEMU(anchor.getY());
|
long y = Units.toEMU(anchor.getY());
|
||||||
@ -157,15 +133,11 @@ public class XSLFGraphicFrame extends XSLFShape {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void draw(Graphics2D graphics){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void copy(XSLFShape sh){
|
void copy(XSLFShape sh){
|
||||||
super.copy(sh);
|
super.copy(sh);
|
||||||
|
|
||||||
CTGraphicalObjectData data = _shape.getGraphic().getGraphicData();
|
CTGraphicalObjectData data = ((CTGraphicalObjectFrame)getXmlObject()).getGraphic().getGraphicData();
|
||||||
String uri = data.getUri();
|
String uri = data.getUri();
|
||||||
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
|
if(uri.equals("http://schemas.openxmlformats.org/drawingml/2006/diagram")){
|
||||||
copyDiagram(data, (XSLFGraphicFrame)sh);
|
copyDiagram(data, (XSLFGraphicFrame)sh);
|
||||||
@ -187,22 +159,22 @@ public class XSLFGraphicFrame extends XSLFShape {
|
|||||||
String dm = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "dm"));
|
String dm = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "dm"));
|
||||||
PackageRelationship dmRel = sheet.getPackagePart().getRelationship(dm);
|
PackageRelationship dmRel = sheet.getPackagePart().getRelationship(dm);
|
||||||
PackagePart dmPart = sheet.getPackagePart().getRelatedPart(dmRel);
|
PackagePart dmPart = sheet.getPackagePart().getRelatedPart(dmRel);
|
||||||
_sheet.importPart(dmRel, dmPart);
|
getSheet().importPart(dmRel, dmPart);
|
||||||
|
|
||||||
String lo = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "lo"));
|
String lo = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "lo"));
|
||||||
PackageRelationship loRel = sheet.getPackagePart().getRelationship(lo);
|
PackageRelationship loRel = sheet.getPackagePart().getRelationship(lo);
|
||||||
PackagePart loPart = sheet.getPackagePart().getRelatedPart(loRel);
|
PackagePart loPart = sheet.getPackagePart().getRelatedPart(loRel);
|
||||||
_sheet.importPart(loRel, loPart);
|
getSheet().importPart(loRel, loPart);
|
||||||
|
|
||||||
String qs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "qs"));
|
String qs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "qs"));
|
||||||
PackageRelationship qsRel = sheet.getPackagePart().getRelationship(qs);
|
PackageRelationship qsRel = sheet.getPackagePart().getRelationship(qs);
|
||||||
PackagePart qsPart = sheet.getPackagePart().getRelatedPart(qsRel);
|
PackagePart qsPart = sheet.getPackagePart().getRelatedPart(qsRel);
|
||||||
_sheet.importPart(qsRel, qsPart);
|
getSheet().importPart(qsRel, qsPart);
|
||||||
|
|
||||||
String cs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "cs"));
|
String cs = c.getAttributeText(new QName("http://schemas.openxmlformats.org/officeDocument/2006/relationships", "cs"));
|
||||||
PackageRelationship csRel = sheet.getPackagePart().getRelationship(cs);
|
PackageRelationship csRel = sheet.getPackagePart().getRelationship(cs);
|
||||||
PackagePart csPart = sheet.getPackagePart().getRelatedPart(csRel);
|
PackagePart csPart = sheet.getPackagePart().getRelatedPart(csRel);
|
||||||
_sheet.importPart(csRel, csPart);
|
getSheet().importPart(csRel, csPart);
|
||||||
|
|
||||||
} catch (InvalidFormatException e){
|
} catch (InvalidFormatException e){
|
||||||
throw new POIXMLException(e);
|
throw new POIXMLException(e);
|
||||||
|
@ -29,15 +29,11 @@ import java.util.regex.Pattern;
|
|||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
import org.apache.poi.openxml4j.opc.TargetMode;
|
||||||
import org.apache.poi.sl.usermodel.ShapeType;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
||||||
@ -49,29 +45,33 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer, PlaceableShape {
|
||||||
private final CTGroupShape _shape;
|
|
||||||
private final XSLFSheet _sheet;
|
|
||||||
private final List<XSLFShape> _shapes;
|
private final List<XSLFShape> _shapes;
|
||||||
private final CTGroupShapeProperties _spPr;
|
private final CTGroupShapeProperties _grpSpPr;
|
||||||
private XSLFDrawing _drawing;
|
private XSLFDrawing _drawing;
|
||||||
|
|
||||||
/*package*/ XSLFGroupShape(CTGroupShape shape, XSLFSheet sheet){
|
protected XSLFGroupShape(CTGroupShape shape, XSLFSheet sheet){
|
||||||
_shape = shape;
|
super(shape,sheet);
|
||||||
_sheet = sheet;
|
_shapes = sheet.buildShapes(shape);
|
||||||
|
_grpSpPr = shape.getGrpSpPr();
|
||||||
_shapes = _sheet.buildShapes(_shape);
|
|
||||||
_spPr = shape.getGrpSpPr();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected CTGroupShapeProperties getGrpSpPr() {
|
||||||
public CTGroupShape getXmlObject(){
|
return _grpSpPr;
|
||||||
return _shape;
|
}
|
||||||
|
|
||||||
|
protected CTGroupTransform2D getSafeXfrm() {
|
||||||
|
CTGroupTransform2D xfrm = getXfrm();
|
||||||
|
return (xfrm == null ? getGrpSpPr().addNewXfrm() : xfrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CTGroupTransform2D getXfrm() {
|
||||||
|
return getGrpSpPr().getXfrm();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Rectangle2D getAnchor(){
|
public Rectangle2D getAnchor(){
|
||||||
CTGroupTransform2D xfrm = _spPr.getXfrm();
|
CTGroupTransform2D xfrm = getXfrm();
|
||||||
CTPoint2D off = xfrm.getOff();
|
CTPoint2D off = xfrm.getOff();
|
||||||
long x = off.getX();
|
long x = off.getX();
|
||||||
long y = off.getY();
|
long y = off.getY();
|
||||||
@ -85,7 +85,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setAnchor(Rectangle2D anchor){
|
public void setAnchor(Rectangle2D anchor){
|
||||||
CTGroupTransform2D xfrm = _spPr.isSetXfrm() ? _spPr.getXfrm() : _spPr.addNewXfrm();
|
CTGroupTransform2D xfrm = getSafeXfrm();
|
||||||
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
||||||
long x = Units.toEMU(anchor.getX());
|
long x = Units.toEMU(anchor.getX());
|
||||||
long y = Units.toEMU(anchor.getY());
|
long y = Units.toEMU(anchor.getY());
|
||||||
@ -105,7 +105,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
* behavior of shapes placed within a group.
|
* behavior of shapes placed within a group.
|
||||||
*/
|
*/
|
||||||
public Rectangle2D getInteriorAnchor(){
|
public Rectangle2D getInteriorAnchor(){
|
||||||
CTGroupTransform2D xfrm = _spPr.getXfrm();
|
CTGroupTransform2D xfrm = getXfrm();
|
||||||
CTPoint2D off = xfrm.getChOff();
|
CTPoint2D off = xfrm.getChOff();
|
||||||
long x = off.getX();
|
long x = off.getX();
|
||||||
long y = off.getY();
|
long y = off.getY();
|
||||||
@ -124,7 +124,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
* behavior of shapes placed within a group.
|
* behavior of shapes placed within a group.
|
||||||
*/
|
*/
|
||||||
public void setInteriorAnchor(Rectangle2D anchor){
|
public void setInteriorAnchor(Rectangle2D anchor){
|
||||||
CTGroupTransform2D xfrm = _spPr.isSetXfrm() ? _spPr.getXfrm() : _spPr.addNewXfrm();
|
CTGroupTransform2D xfrm = getSafeXfrm();
|
||||||
CTPoint2D off = xfrm.isSetChOff() ? xfrm.getChOff() : xfrm.addNewChOff();
|
CTPoint2D off = xfrm.isSetChOff() ? xfrm.getChOff() : xfrm.addNewChOff();
|
||||||
long x = Units.toEMU(anchor.getX());
|
long x = Units.toEMU(anchor.getX());
|
||||||
long y = Units.toEMU(anchor.getY());
|
long y = Units.toEMU(anchor.getY());
|
||||||
@ -159,28 +159,19 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
*/
|
*/
|
||||||
public boolean removeShape(XSLFShape xShape) {
|
public boolean removeShape(XSLFShape xShape) {
|
||||||
XmlObject obj = xShape.getXmlObject();
|
XmlObject obj = xShape.getXmlObject();
|
||||||
|
CTGroupShape grpSp = (CTGroupShape)getXmlObject();
|
||||||
if(obj instanceof CTShape){
|
if(obj instanceof CTShape){
|
||||||
_shape.getSpList().remove(obj);
|
grpSp.getSpList().remove(obj);
|
||||||
} else if (obj instanceof CTGroupShape){
|
} else if (obj instanceof CTGroupShape){
|
||||||
_shape.getGrpSpList().remove(obj);
|
grpSp.getGrpSpList().remove(obj);
|
||||||
} else if (obj instanceof CTConnector){
|
} else if (obj instanceof CTConnector){
|
||||||
_shape.getCxnSpList().remove(obj);
|
grpSp.getCxnSpList().remove(obj);
|
||||||
} else {
|
} else {
|
||||||
throw new IllegalArgumentException("Unsupported shape: " + xShape);
|
throw new IllegalArgumentException("Unsupported shape: " + xShape);
|
||||||
}
|
}
|
||||||
return _shapes.remove(xShape);
|
return _shapes.remove(xShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getShapeName(){
|
|
||||||
return _shape.getNvGrpSpPr().getCNvPr().getName();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getShapeId(){
|
|
||||||
return (int)_shape.getNvGrpSpPr().getCNvPr().getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param shapeId 1-based shapeId
|
* @param shapeId 1-based shapeId
|
||||||
*/
|
*/
|
||||||
@ -200,7 +191,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
// shape factory methods
|
// shape factory methods
|
||||||
private XSLFDrawing getDrawing(){
|
private XSLFDrawing getDrawing(){
|
||||||
if(_drawing == null) {
|
if(_drawing == null) {
|
||||||
_drawing = new XSLFDrawing(_sheet, _shape);
|
_drawing = new XSLFDrawing(getSheet(), (CTGroupShape)getXmlObject());
|
||||||
}
|
}
|
||||||
return _drawing;
|
return _drawing;
|
||||||
}
|
}
|
||||||
@ -242,7 +233,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
|
|
||||||
public XSLFPictureShape createPicture(int pictureIndex){
|
public XSLFPictureShape createPicture(int pictureIndex){
|
||||||
|
|
||||||
List<PackagePart> pics = _sheet.getPackagePart().getPackage()
|
List<PackagePart> pics = getSheet().getPackagePart().getPackage()
|
||||||
.getPartsByName(Pattern.compile("/ppt/media/image" + (pictureIndex + 1) + ".*?"));
|
.getPartsByName(Pattern.compile("/ppt/media/image" + (pictureIndex + 1) + ".*?"));
|
||||||
|
|
||||||
if(pics.size() == 0) {
|
if(pics.size() == 0) {
|
||||||
@ -251,7 +242,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
|
|
||||||
PackagePart pic = pics.get(0);
|
PackagePart pic = pics.get(0);
|
||||||
|
|
||||||
PackageRelationship rel = _sheet.getPackagePart().addRelationship(
|
PackageRelationship rel = getSheet().getPackagePart().addRelationship(
|
||||||
pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());
|
pic.getPartName(), TargetMode.INTERNAL, XSLFRelation.IMAGES.getRelation());
|
||||||
|
|
||||||
XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
|
XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
|
||||||
@ -263,67 +254,35 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFlipHorizontal(boolean flip){
|
public void setFlipHorizontal(boolean flip){
|
||||||
_spPr.getXfrm().setFlipH(flip);
|
getSafeXfrm().setFlipH(flip);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFlipVertical(boolean flip){
|
public void setFlipVertical(boolean flip){
|
||||||
_spPr.getXfrm().setFlipV(flip);
|
getSafeXfrm().setFlipV(flip);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getFlipHorizontal(){
|
public boolean getFlipHorizontal(){
|
||||||
return _spPr.getXfrm().getFlipH();
|
CTGroupTransform2D xfrm = getXfrm();
|
||||||
|
return (xfrm == null || !xfrm.isSetFlipH()) ? false : xfrm.getFlipH();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getFlipVertical(){
|
public boolean getFlipVertical(){
|
||||||
return _spPr.getXfrm().getFlipV();
|
CTGroupTransform2D xfrm = getXfrm();
|
||||||
|
return (xfrm == null || !xfrm.isSetFlipV()) ? false : xfrm.getFlipV();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRotation(double theta){
|
public void setRotation(double theta){
|
||||||
_spPr.getXfrm().setRot((int)(theta*60000));
|
getSafeXfrm().setRot((int) (theta * 60000));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getRotation(){
|
public double getRotation(){
|
||||||
return (double)_spPr.getXfrm().getRot()/60000;
|
CTGroupTransform2D xfrm = getXfrm();
|
||||||
}
|
return (xfrm == null || !xfrm.isSetRot()) ? 0 : (xfrm.getRot() / 60000.d);
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(Graphics2D graphics){
|
|
||||||
|
|
||||||
// the coordinate system of this group of shape
|
|
||||||
Rectangle2D interior = getInteriorAnchor();
|
|
||||||
// anchor of this group relative to the parent shape
|
|
||||||
Rectangle2D exterior = getAnchor();
|
|
||||||
|
|
||||||
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM);
|
|
||||||
AffineTransform tx0 = new AffineTransform(tx);
|
|
||||||
|
|
||||||
double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth();
|
|
||||||
double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight();
|
|
||||||
|
|
||||||
tx.translate(exterior.getX(), exterior.getY());
|
|
||||||
tx.scale(scaleX, scaleY);
|
|
||||||
tx.translate(-interior.getX(), -interior.getY());
|
|
||||||
|
|
||||||
for (XSLFShape shape : getShapes()) {
|
|
||||||
// remember the initial transform and restore it after we are done with the drawing
|
|
||||||
AffineTransform at = graphics.getTransform();
|
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GSAVE, true);
|
|
||||||
|
|
||||||
shape.applyTransform(graphics);
|
|
||||||
shape.draw(graphics);
|
|
||||||
|
|
||||||
// restore the coordinate system
|
|
||||||
graphics.setTransform(at);
|
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, tx0);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -350,13 +309,9 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShapeType getShapeType(){
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void addShape(XSLFShape shape) {
|
public void addShape(XSLFShape shape) {
|
||||||
throw new UnsupportedOperationException(
|
throw new UnsupportedOperationException(
|
||||||
"Adding a shape from a different container is not supported -"
|
"Adding a shape from a different container is not supported -"
|
||||||
+ " create it from scratch witht XSLFGroupShape.create* methods");
|
+ " create it from scratch with XSLFGroupShape.create* methods");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,12 +20,12 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.*;
|
||||||
import org.apache.poi.POIXMLException;
|
|
||||||
import org.apache.poi.POIXMLRelation;
|
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.apache.poi.sl.usermodel.PictureData;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
|
|
||||||
@ -35,7 +35,7 @@ import org.apache.poi.util.IOUtils;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public final class XSLFPictureData extends POIXMLDocumentPart {
|
public final class XSLFPictureData extends POIXMLDocumentPart implements PictureData {
|
||||||
/**
|
/**
|
||||||
* Extended windows meta file
|
* Extended windows meta file
|
||||||
*/
|
*/
|
||||||
@ -215,4 +215,17 @@ public final class XSLFPictureData extends POIXMLDocumentPart {
|
|||||||
protected void prepareForCommit() {
|
protected void prepareForCommit() {
|
||||||
// do not clear the part here
|
// do not clear the part here
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getContentType() {
|
||||||
|
POIXMLRelation rel = RELATIONS[getPictureType()];
|
||||||
|
return (rel == null) ? null : rel.getContentType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setData(byte[] data) throws IOException {
|
||||||
|
OutputStream os = getPackagePart().getOutputStream();
|
||||||
|
os.write(data);
|
||||||
|
os.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -179,30 +179,13 @@ public class XSLFPictureShape extends XSLFSimpleShape {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Insets getBlipClip(){
|
public Insets getClipping(){
|
||||||
CTPicture ct = (CTPicture)getXmlObject();
|
CTPicture ct = (CTPicture)getXmlObject();
|
||||||
CTRelativeRect r = ct.getBlipFill().getSrcRect();
|
CTRelativeRect r = ct.getBlipFill().getSrcRect();
|
||||||
return (r == null) ? null : new Insets(r.getT(), r.getL(), r.getB(), r.getR());
|
return (r == null) ? null : new Insets(r.getT(), r.getL(), r.getB(), r.getR());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@SuppressWarnings("deprecation")
|
||||||
public void drawContent(Graphics2D graphics) {
|
|
||||||
|
|
||||||
XSLFPictureData data = getPictureData();
|
|
||||||
if(data == null) return;
|
|
||||||
|
|
||||||
XSLFImageRenderer renderer = (XSLFImageRenderer)graphics.getRenderingHint(XSLFRenderingHint.IMAGE_RENDERER);
|
|
||||||
if(renderer == null) renderer = new XSLFImageRenderer();
|
|
||||||
|
|
||||||
RenderableShape rShape = new RenderableShape(this);
|
|
||||||
Rectangle2D anchor = rShape.getAnchor(graphics);
|
|
||||||
|
|
||||||
Insets insets = getBlipClip();
|
|
||||||
|
|
||||||
renderer.drawImage(graphics, data, anchor, insets);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void copy(XSLFShape sh){
|
void copy(XSLFShape sh){
|
||||||
super.copy(sh);
|
super.copy(sh);
|
||||||
|
@ -17,22 +17,22 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.Shadow;
|
import java.awt.Color;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.DrawPaint;
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Shape;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a shadow of a shape. For now supports only outer shadows.
|
* Represents a shadow of a shape. For now supports only outer shadows.
|
||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public class XSLFShadow extends XSLFSimpleShape implements Shadow {
|
public class XSLFShadow extends XSLFShape implements Shadow {
|
||||||
|
|
||||||
private XSLFSimpleShape _parent;
|
private XSLFSimpleShape _parent;
|
||||||
|
|
||||||
@ -42,54 +42,15 @@ public class XSLFShadow extends XSLFSimpleShape implements Shadow {
|
|||||||
_parent = parentShape;
|
_parent = parentShape;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void fill(Graphics2D graphics, Shape outline) {
|
|
||||||
|
|
||||||
double shapeRotation = _parent.getRotation();
|
|
||||||
if(_parent.getFlipVertical()){
|
|
||||||
shapeRotation += 180;
|
|
||||||
}
|
|
||||||
double angle = getAngle() - shapeRotation;
|
|
||||||
double dist = getDistance();
|
|
||||||
double dx = dist * Math.cos(Math.toRadians(angle));
|
|
||||||
double dy = dist * Math.sin(Math.toRadians(angle));
|
|
||||||
|
|
||||||
graphics.translate(dx, dy);
|
|
||||||
|
|
||||||
Color fillColor = getFillColor();
|
|
||||||
if (fillColor != null) {
|
|
||||||
graphics.setColor(fillColor);
|
|
||||||
graphics.fill(outline);
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics.translate(-dx, -dy);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void draw(Graphics2D graphics, Shape outline) {
|
|
||||||
|
|
||||||
double angle = getAngle();
|
|
||||||
double dist = getDistance();
|
|
||||||
double dx = dist * Math.cos(Math.toRadians(angle));
|
|
||||||
double dy = dist * Math.sin(Math.toRadians(angle));
|
|
||||||
|
|
||||||
graphics.translate(dx, dy);
|
|
||||||
|
|
||||||
Color fillColor = getFillColor();
|
|
||||||
if (fillColor != null) {
|
|
||||||
graphics.setColor(fillColor);
|
|
||||||
graphics.draw(outline);
|
|
||||||
}
|
|
||||||
|
|
||||||
graphics.translate(-dx, -dy);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
public XSLFSimpleShape getShadowParent() {
|
||||||
|
return _parent;
|
||||||
|
}
|
||||||
|
|
||||||
public Rectangle2D getAnchor(){
|
public Rectangle2D getAnchor(){
|
||||||
return _parent.getAnchor();
|
return _parent.getAnchor();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setAnchor(Rectangle2D anchor){
|
public void setAnchor(Rectangle2D anchor){
|
||||||
throw new IllegalStateException("You can't set anchor of a shadow");
|
throw new IllegalStateException("You can't set anchor of a shadow");
|
||||||
}
|
}
|
||||||
@ -125,15 +86,25 @@ public class XSLFShadow extends XSLFSimpleShape implements Shadow {
|
|||||||
* @return the color of this shadow.
|
* @return the color of this shadow.
|
||||||
* Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow
|
* Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow
|
||||||
*/
|
*/
|
||||||
@Override
|
|
||||||
public Color getFillColor() {
|
public Color getFillColor() {
|
||||||
|
SolidPaint ps = getFillStyle();
|
||||||
|
if (ps == TRANSPARENT_PAINT) return null;
|
||||||
|
Color col = DrawPaint.applyColorTransform(ps.getSolidColor());
|
||||||
|
return col;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SolidPaint getFillStyle() {
|
||||||
XSLFTheme theme = getSheet().getTheme();
|
XSLFTheme theme = getSheet().getTheme();
|
||||||
CTOuterShadowEffect ct = (CTOuterShadowEffect)getXmlObject();
|
CTOuterShadowEffect ct = (CTOuterShadowEffect)getXmlObject();
|
||||||
if(ct == null) {
|
if(ct == null) return TRANSPARENT_PAINT;
|
||||||
return null;
|
|
||||||
} else {
|
CTSchemeColor phClr = ct.getSchemeClr();
|
||||||
CTSchemeColor phClr = ct.getSchemeClr();
|
final XSLFColor xc = new XSLFColor(ct, theme, phClr);
|
||||||
return new XSLFColor(ct, theme, phClr).getColor();
|
return new SolidPaint(){
|
||||||
}
|
public ColorStyle getSolidColor() {
|
||||||
|
return xc.getColorStyle();
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,7 +20,6 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
@ -30,14 +29,16 @@ import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
import org.apache.poi.sl.draw.DrawPaint;
|
import org.apache.poi.sl.draw.DrawPaint;
|
||||||
import org.apache.poi.sl.draw.geom.CustomGeometry;
|
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.util.*;
|
import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint;
|
||||||
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
|
import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;
|
||||||
|
import org.apache.poi.util.Beta;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.poi.xslf.model.PropertyFetcher;
|
import org.apache.poi.xslf.model.PropertyFetcher;
|
||||||
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.*;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base super-class class for all shapes in PresentationML
|
* Base super-class class for all shapes in PresentationML
|
||||||
@ -46,16 +47,16 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFShape implements Shape {
|
public abstract class XSLFShape implements Shape {
|
||||||
protected final XmlObject _shape;
|
private final XmlObject _shape;
|
||||||
protected final XSLFSheet _sheet;
|
private final XSLFSheet _sheet;
|
||||||
protected XSLFShapeContainer _parent;
|
private XSLFShapeContainer _parent;
|
||||||
|
|
||||||
private CTShapeProperties _spPr;
|
private CTShapeProperties _spPr;
|
||||||
private CTShapeStyle _spStyle;
|
private CTShapeStyle _spStyle;
|
||||||
private CTNonVisualDrawingProps _nvPr;
|
private CTNonVisualDrawingProps _nvPr;
|
||||||
private CTPlaceholder _ph;
|
private CTPlaceholder _ph;
|
||||||
|
|
||||||
private static final PaintStyle TRANSPARENT_PAINT = new SolidPaint() {
|
protected static final SolidPaint TRANSPARENT_PAINT = new SolidPaint() {
|
||||||
public ColorStyle getSolidColor() {
|
public ColorStyle getSolidColor() {
|
||||||
return new ColorStyle(){
|
return new ColorStyle(){
|
||||||
public Color getColor() { return DrawPaint.NO_PAINT; }
|
public Color getColor() { return DrawPaint.NO_PAINT; }
|
||||||
@ -68,24 +69,30 @@ public abstract class XSLFShape implements Shape {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
protected XSLFShape(XmlObject shape, XSLFSheet sheet) {
|
protected XSLFShape(XmlObject shape, XSLFSheet sheet) {
|
||||||
_shape = shape;
|
_shape = shape;
|
||||||
_sheet = sheet;
|
_sheet = sheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the xml bean holding this shape's data
|
* @return the xml bean holding this shape's data
|
||||||
*/
|
*/
|
||||||
public XmlObject getXmlObject() {
|
public final XmlObject getXmlObject() {
|
||||||
|
// it's final because the xslf inheritance hierarchy is not necessary the same as
|
||||||
|
// the (not existing) xmlbeans hierarchy and subclasses shouldn't narrow it's return value
|
||||||
return _shape;
|
return _shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public XSLFSheet getSheet() {
|
||||||
|
return _sheet;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return human-readable name of this shape, e.g. "Rectange 3"
|
* @return human-readable name of this shape, e.g. "Rectange 3"
|
||||||
*/
|
*/
|
||||||
public abstract String getShapeName();
|
public String getShapeName(){
|
||||||
|
return getCNvPr().getName();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a unique identifier for this shape within the current document.
|
* Returns a unique identifier for this shape within the current document.
|
||||||
@ -98,55 +105,9 @@ public abstract class XSLFShape implements Shape {
|
|||||||
*
|
*
|
||||||
* @return unique id of this shape
|
* @return unique id of this shape
|
||||||
*/
|
*/
|
||||||
public abstract int getShapeId();
|
public int getShapeId() {
|
||||||
|
return (int)getCNvPr().getId();
|
||||||
/**
|
}
|
||||||
* Rotate this shape.
|
|
||||||
* <p>
|
|
||||||
* Positive angles are clockwise (i.e., towards the positive y axis);
|
|
||||||
* negative angles are counter-clockwise (i.e., towards the negative y axis).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param theta the rotation angle in degrees.
|
|
||||||
*/
|
|
||||||
public abstract void setRotation(double theta);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Rotation angle in degrees
|
|
||||||
* <p>
|
|
||||||
* Positive angles are clockwise (i.e., towards the positive y axis);
|
|
||||||
* negative angles are counter-clockwise (i.e., towards the negative y axis).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @return rotation angle in degrees
|
|
||||||
*/
|
|
||||||
public abstract double getRotation();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param flip whether the shape is horizontally flipped
|
|
||||||
*/
|
|
||||||
public abstract void setFlipHorizontal(boolean flip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the shape is vertically flipped
|
|
||||||
*
|
|
||||||
* @param flip whether the shape is vertically flipped
|
|
||||||
*/
|
|
||||||
public abstract void setFlipVertical(boolean flip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the shape is horizontally flipped
|
|
||||||
*
|
|
||||||
* @return whether the shape is horizontally flipped
|
|
||||||
*/
|
|
||||||
public abstract boolean getFlipHorizontal();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the shape is vertically flipped
|
|
||||||
*
|
|
||||||
* @return whether the shape is vertically flipped
|
|
||||||
*/
|
|
||||||
public abstract boolean getFlipVertical();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the contents of this shape to be a copy of the source shape.
|
* Set the contents of this shape to be a copy of the source shape.
|
||||||
@ -162,7 +123,12 @@ public abstract class XSLFShape implements Shape {
|
|||||||
"Can't copy " + sh.getClass().getSimpleName() + " into " + getClass().getSimpleName());
|
"Can't copy " + sh.getClass().getSimpleName() + " into " + getClass().getSimpleName());
|
||||||
}
|
}
|
||||||
|
|
||||||
setAnchor(sh.getAnchor());
|
if (this instanceof PlaceableShape) {
|
||||||
|
PlaceableShape ps = (PlaceableShape)this;
|
||||||
|
ps.setAnchor(((PlaceableShape)sh).getAnchor());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setParent(XSLFShapeContainer parent) {
|
public void setParent(XSLFShapeContainer parent) {
|
||||||
@ -173,93 +139,148 @@ public abstract class XSLFShape implements Shape {
|
|||||||
return this._parent;
|
return this._parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlaceholder() {
|
protected PaintStyle getFillPaint() {
|
||||||
return false;
|
PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {
|
||||||
|
public boolean fetch(XSLFShape shape) {
|
||||||
|
XmlObject pr = null;
|
||||||
|
try {
|
||||||
|
pr = shape.getSpPr();
|
||||||
|
if (((CTShapeProperties)pr).isSetNoFill()) {
|
||||||
|
setValue(TRANSPARENT_PAINT);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
} catch (IllegalStateException e) {}
|
||||||
|
// trying background properties now
|
||||||
|
if (pr == null) {
|
||||||
|
pr = shape.getBgPr();
|
||||||
|
}
|
||||||
|
if (pr == null) {
|
||||||
|
pr = shape.getGrpSpPr();
|
||||||
|
}
|
||||||
|
if (pr == null) {
|
||||||
|
setValue(TRANSPARENT_PAINT);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
PaintStyle paint = null;
|
||||||
|
for (XmlObject obj : pr.selectPath("*")) {
|
||||||
|
paint = selectPaint(obj, null, getSheet().getPackagePart());
|
||||||
|
if (paint != null) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (paint == null) return false;
|
||||||
|
|
||||||
|
setValue(paint);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchShapeProperty(fetcher);
|
||||||
|
|
||||||
|
PaintStyle paint = fetcher.getValue();
|
||||||
|
if (paint != null) return paint;
|
||||||
|
|
||||||
|
// fill color was not found, check if it is defined in the theme
|
||||||
|
// get a reference to a fill style within the style matrix.
|
||||||
|
CTStyleMatrixReference fillRef = null;
|
||||||
|
if (fillRef == null) {
|
||||||
|
CTShapeStyle style = getSpStyle();
|
||||||
|
if (style != null) fillRef = style.getFillRef();
|
||||||
|
}
|
||||||
|
if (fillRef == null) {
|
||||||
|
fillRef = getBgRef();
|
||||||
|
}
|
||||||
|
if (fillRef == null) {
|
||||||
|
return 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 ? TRANSPARENT_PAINT : paint;
|
||||||
}
|
}
|
||||||
|
|
||||||
public StrokeStyle getStrokeStyle() {
|
protected CTBackgroundProperties getBgPr() {
|
||||||
// TODO Auto-generated method stub
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:bgPr";
|
||||||
return null;
|
return selectProperty(CTBackgroundProperties.class, xquery);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CTStyleMatrixReference getBgRef() {
|
||||||
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:bgRef";
|
||||||
|
return selectProperty(CTStyleMatrixReference.class, xquery);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CTGroupShapeProperties getGrpSpPr() {
|
||||||
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:grpSpPr";
|
||||||
|
return selectProperty(CTGroupShapeProperties.class, xquery);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CTNonVisualDrawingProps getCNvPr() {
|
||||||
|
if (_nvPr == null) {
|
||||||
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr";
|
||||||
|
_nvPr = selectProperty(CTNonVisualDrawingProps.class, xquery);
|
||||||
|
}
|
||||||
|
return _nvPr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public CustomGeometry getGeometry() {
|
protected CTShapeProperties getSpPr() {
|
||||||
// TODO Auto-generated method stub
|
if (_spPr == null) {
|
||||||
return null;
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:spPr";
|
||||||
|
_spPr = selectProperty(CTShapeProperties.class, xquery);
|
||||||
|
}
|
||||||
|
if (_spPr == null) {
|
||||||
|
throw new IllegalStateException("CTShapeProperties was not found.");
|
||||||
|
}
|
||||||
|
return _spPr;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShapeType getShapeType() {
|
protected CTShapeStyle getSpStyle() {
|
||||||
// TODO Auto-generated method stub
|
if (_spStyle == null) {
|
||||||
return null;
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:style";
|
||||||
|
_spStyle = selectProperty(CTShapeStyle.class, xquery);
|
||||||
|
}
|
||||||
|
return _spStyle;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFSheet getSheet() {
|
protected CTPlaceholder getCTPlaceholder() {
|
||||||
// TODO Auto-generated method stub
|
if (_ph == null) {
|
||||||
return null;
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph";
|
||||||
|
_ph = selectProperty(CTPlaceholder.class, xquery);
|
||||||
|
}
|
||||||
|
return _ph;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch shape fill as a java.awt.Paint
|
* As there's no xmlbeans hierarchy, but XSLF works with subclassing, not all
|
||||||
|
* child classes work with a {@link CTShape} object, but often contain the same
|
||||||
|
* properties. This method is the generalized form of selecting and casting those
|
||||||
|
* properties.
|
||||||
*
|
*
|
||||||
* @return either Color or GradientPaint or TexturePaint or null
|
* @param resultClass
|
||||||
|
* @param xquery
|
||||||
|
* @return
|
||||||
*/
|
*/
|
||||||
@Override
|
@SuppressWarnings("unchecked")
|
||||||
public FillStyle getFillStyle() {
|
protected <T extends XmlObject> T selectProperty(Class<T> resultClass, String xquery) {
|
||||||
return new FillStyle() {
|
XmlObject[] rs = getXmlObject().selectPath(xquery);
|
||||||
public PaintStyle getPaint() {
|
if (rs.length == 0) return null;
|
||||||
PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {
|
return (resultClass.isInstance(rs[0])) ? (T)rs[0] : null;
|
||||||
public boolean fetch(XSLFShape shape) {
|
|
||||||
CTShapeProperties spPr = shape.getSpPr();
|
|
||||||
if (spPr.isSetNoFill()) {
|
|
||||||
setValue(TRANSPARENT_PAINT);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
PaintStyle paint = null;
|
|
||||||
for (XmlObject obj : spPr.selectPath("*")) {
|
|
||||||
paint = selectPaint(obj, null, getSheet().getPackagePart());
|
|
||||||
if (paint != null) break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (paint == null) return false;
|
|
||||||
|
|
||||||
setValue(paint);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fetchShapeProperty(fetcher);
|
|
||||||
|
|
||||||
PaintStyle paint = fetcher.getValue();
|
|
||||||
|
|
||||||
if (paint != null) return paint;
|
|
||||||
|
|
||||||
// fill color was not found, check if it is defined in the theme
|
|
||||||
CTShapeStyle style = getSpStyle();
|
|
||||||
if (style != null) {
|
|
||||||
// get a reference to a fill style within the style matrix.
|
|
||||||
CTStyleMatrixReference fillRef = style.getFillRef();
|
|
||||||
// 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 = _sheet;
|
|
||||||
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 == RenderableShape.NO_PAINT ? null : paint;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -320,108 +341,15 @@ public abstract class XSLFShape implements Shape {
|
|||||||
return ok;
|
return ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CTPlaceholder getCTPlaceholder() {
|
protected PaintStyle getPaint(XmlObject spPr, CTSchemeColor phClr) {
|
||||||
if (_ph == null) {
|
PaintStyle paint = null;
|
||||||
XmlObject[] obj = _shape.selectPath(
|
PackagePart pp = getSheet().getPackagePart();
|
||||||
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph");
|
for (XmlObject obj : spPr.selectPath("*")) {
|
||||||
if (obj.length == 1) {
|
paint = selectPaint(obj, phClr, pp);
|
||||||
_ph = (CTPlaceholder) obj[0];
|
if(paint != null) break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return _ph;
|
return paint == null ? TRANSPARENT_PAINT : paint;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected CTShapeStyle getSpStyle() {
|
|
||||||
if (_spStyle == null) {
|
|
||||||
for (XmlObject obj : _shape.selectPath("*")) {
|
|
||||||
if (obj instanceof CTShapeStyle) {
|
|
||||||
_spStyle = (CTShapeStyle) obj;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _spStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected CTNonVisualDrawingProps getNvPr() {
|
|
||||||
if (_nvPr == null) {
|
|
||||||
XmlObject[] rs = _shape
|
|
||||||
.selectPath("declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:cNvPr");
|
|
||||||
if (rs.length != 0) {
|
|
||||||
_nvPr = (CTNonVisualDrawingProps) rs[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _nvPr;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected CTShapeProperties getSpPr() {
|
|
||||||
if (_spPr == null) {
|
|
||||||
for (XmlObject obj : _shape.selectPath("*")) {
|
|
||||||
if (obj instanceof CTShapeProperties) {
|
|
||||||
_spPr = (CTShapeProperties) obj;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (_spPr == null) {
|
|
||||||
throw new IllegalStateException("CTShapeProperties was not found.");
|
|
||||||
}
|
|
||||||
return _spPr;
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTransform2D getXfrm() {
|
|
||||||
PropertyFetcher<CTTransform2D> fetcher = new PropertyFetcher<CTTransform2D>() {
|
|
||||||
public boolean fetch(XSLFShape shape) {
|
|
||||||
CTShapeProperties pr = shape.getSpPr();
|
|
||||||
if (pr.isSetXfrm()) {
|
|
||||||
setValue(pr.getXfrm());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fetchShapeProperty(fetcher);
|
|
||||||
return fetcher.getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the position of this shape within the drawing canvas.
|
|
||||||
* The coordinates are expressed in points
|
|
||||||
*/
|
|
||||||
public Rectangle2D getAnchor() {
|
|
||||||
CTTransform2D xfrm = getXfrm();
|
|
||||||
if (xfrm == null) return null;
|
|
||||||
|
|
||||||
CTPoint2D off = xfrm.getOff();
|
|
||||||
long x = off.getX();
|
|
||||||
long y = off.getY();
|
|
||||||
CTPositiveSize2D ext = xfrm.getExt();
|
|
||||||
long cx = ext.getCx();
|
|
||||||
long cy = ext.getCy();
|
|
||||||
return new Rectangle2D.Double(
|
|
||||||
Units.toPoints(x), Units.toPoints(y),
|
|
||||||
Units.toPoints(cx), Units.toPoints(cy));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param anchor the position of this shape within the drawing canvas.
|
|
||||||
* The coordinates are expressed in points
|
|
||||||
*/
|
|
||||||
public void setAnchor(Rectangle2D anchor) {
|
|
||||||
CTShapeProperties spPr = getSpPr();
|
|
||||||
if (spPr == null) return;
|
|
||||||
|
|
||||||
CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();
|
|
||||||
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
|
||||||
long x = Units.toEMU(anchor.getX());
|
|
||||||
long y = Units.toEMU(anchor.getY());
|
|
||||||
off.setX(x);
|
|
||||||
off.setY(y);
|
|
||||||
CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm
|
|
||||||
.addNewExt();
|
|
||||||
long cx = Units.toEMU(anchor.getWidth());
|
|
||||||
long cy = Units.toEMU(anchor.getHeight());
|
|
||||||
ext.setCx(cx);
|
|
||||||
ext.setCy(cy);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert shape fill into java.awt.Paint. The result is either Color or
|
* Convert shape fill into java.awt.Paint. The result is either Color or
|
||||||
@ -444,122 +372,126 @@ public abstract class XSLFShape implements Shape {
|
|||||||
* @return the applied Paint or null if none was applied
|
* @return the applied Paint or null if none was applied
|
||||||
*/
|
*/
|
||||||
protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) {
|
protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) {
|
||||||
final XSLFTheme theme = getSheet().getTheme();
|
|
||||||
|
|
||||||
if (obj instanceof CTNoFillProperties) {
|
if (obj instanceof CTNoFillProperties) {
|
||||||
return TRANSPARENT_PAINT;
|
return TRANSPARENT_PAINT;
|
||||||
|
} else if (obj instanceof CTSolidColorFillProperties) {
|
||||||
|
return selectPaint((CTSolidColorFillProperties)obj, phClr, parentPart);
|
||||||
|
} else if (obj instanceof CTBlipFillProperties) {
|
||||||
|
return selectPaint((CTBlipFillProperties)obj, phClr, parentPart);
|
||||||
|
} else if (obj instanceof CTGradientFillProperties) {
|
||||||
|
return selectPaint((CTGradientFillProperties) obj, phClr, parentPart);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (obj instanceof CTSolidColorFillProperties) {
|
|
||||||
CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj;
|
protected PaintStyle selectPaint(final CTSolidColorFillProperties solidFill, final CTSchemeColor phClr, final PackagePart parentPart) {
|
||||||
final XSLFColor c = new XSLFColor(solidFill, theme, phClr);
|
final XSLFTheme theme = getSheet().getTheme();
|
||||||
return new SolidPaint() {
|
final XSLFColor c = new XSLFColor(solidFill, theme, phClr);
|
||||||
public ColorStyle getSolidColor() {
|
return new SolidPaint() {
|
||||||
return c.getColorStyle();
|
public ColorStyle getSolidColor() {
|
||||||
|
return c.getColorStyle();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected PaintStyle selectPaint(final CTBlipFillProperties blipFill, final CTSchemeColor phClr, final PackagePart parentPart) {
|
||||||
|
final CTBlip blip = blipFill.getBlip();
|
||||||
|
return new TexturePaint() {
|
||||||
|
private PackagePart getPart() {
|
||||||
|
try {
|
||||||
|
String blipId = blip.getEmbed();
|
||||||
|
PackageRelationship rel = parentPart.getRelationship(blipId);
|
||||||
|
return parentPart.getRelatedPart(rel);
|
||||||
|
} catch (InvalidFormatException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
|
|
||||||
|
public InputStream getImageData() {
|
||||||
|
try {
|
||||||
|
return getPart().getInputStream();
|
||||||
|
} catch (IOException e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getContentType() {
|
||||||
|
/* TOOD: map content-type */
|
||||||
|
return getPart().getContentType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getAlpha() {
|
||||||
|
return (blip.sizeOfAlphaModFixArray() > 0)
|
||||||
|
? blip.getAlphaModFixArray(0).getAmt()
|
||||||
|
: 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
protected PaintStyle selectPaint(final CTGradientFillProperties gradFill, final CTSchemeColor phClr, final PackagePart parentPart) {
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
final CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
|
||||||
|
|
||||||
|
Arrays.sort(gs, new Comparator<CTGradientStop>() {
|
||||||
|
public int compare(CTGradientStop o1, CTGradientStop o2) {
|
||||||
|
Integer pos1 = o1.getPos();
|
||||||
|
Integer pos2 = o2.getPos();
|
||||||
|
return pos1.compareTo(pos2);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
final ColorStyle cs[] = new ColorStyle[gs.length];
|
||||||
|
final float fractions[] = new float[gs.length];
|
||||||
|
XSLFTheme theme = getSheet().getTheme();
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
for (CTGradientStop cgs : gs) {
|
||||||
|
cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle();
|
||||||
|
fractions[i] = cgs.getPos() / 100000.f;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (obj instanceof CTBlipFillProperties) {
|
return new GradientPaint() {
|
||||||
CTBlipFillProperties blipFill = (CTBlipFillProperties)obj;
|
|
||||||
final CTBlip blip = blipFill.getBlip();
|
public double getGradientAngle() {
|
||||||
return new TexturePaint() {
|
return (gradFill.isSetLin())
|
||||||
private PackagePart getPart() {
|
? gradFill.getLin().getAng() / 60000.d
|
||||||
try {
|
: 0;
|
||||||
String blipId = blip.getEmbed();
|
}
|
||||||
PackageRelationship rel = parentPart.getRelationship(blipId);
|
|
||||||
return parentPart.getRelatedPart(rel);
|
public ColorStyle[] getGradientColors() {
|
||||||
} catch (InvalidFormatException e) {
|
return cs;
|
||||||
throw new RuntimeException(e);
|
}
|
||||||
|
|
||||||
|
public float[] getGradientFractions() {
|
||||||
|
return fractions;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isRotatedWithShape() {
|
||||||
|
// TODO: is this correct???
|
||||||
|
return (gradFill.isSetRotWithShape() || !gradFill.getRotWithShape());
|
||||||
|
}
|
||||||
|
|
||||||
|
public GradientType getGradientType() {
|
||||||
|
if (gradFill.isSetLin()) {
|
||||||
|
return GradientType.linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gradFill.isSetPath()) {
|
||||||
|
/* TODO: handle rect path */
|
||||||
|
STPathShadeType.Enum ps = gradFill.getPath().getPath();
|
||||||
|
if (ps == STPathShadeType.CIRCLE) {
|
||||||
|
return GradientType.circular;
|
||||||
|
} else if (ps == STPathShadeType.SHAPE) {
|
||||||
|
return GradientType.shape;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public InputStream getImageData() {
|
return GradientType.linear;
|
||||||
try {
|
|
||||||
return getPart().getInputStream();
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getContentType() {
|
|
||||||
/* TOOD: map content-type */
|
|
||||||
return getPart().getContentType();
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getAlpha() {
|
|
||||||
return (blip.sizeOfAlphaModFixArray() > 0)
|
|
||||||
? blip.getAlphaModFixArray(0).getAmt()
|
|
||||||
: 0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (obj instanceof CTGradientFillProperties) {
|
|
||||||
final CTGradientFillProperties gradFill = (CTGradientFillProperties) obj;
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
final CTGradientStop[] gs = gradFill.getGsLst().getGsArray();
|
|
||||||
|
|
||||||
Arrays.sort(gs, new Comparator<CTGradientStop>() {
|
|
||||||
public int compare(CTGradientStop o1, CTGradientStop o2) {
|
|
||||||
Integer pos1 = o1.getPos();
|
|
||||||
Integer pos2 = o2.getPos();
|
|
||||||
return pos1.compareTo(pos2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
final ColorStyle cs[] = new ColorStyle[gs.length];
|
|
||||||
final float fractions[] = new float[gs.length];
|
|
||||||
|
|
||||||
int i=0;
|
|
||||||
for (CTGradientStop cgs : gs) {
|
|
||||||
cs[i] = new XSLFColor(cgs, theme, phClr).getColorStyle();
|
|
||||||
fractions[i] = cgs.getPos() / 100000.f;
|
|
||||||
}
|
}
|
||||||
|
};
|
||||||
return new GradientPaint() {
|
|
||||||
|
|
||||||
public double getGradientAngle() {
|
|
||||||
return (gradFill.isSetLin())
|
|
||||||
? gradFill.getLin().getAng() / 60000.d
|
|
||||||
: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public ColorStyle[] getGradientColors() {
|
|
||||||
return cs;
|
|
||||||
}
|
|
||||||
|
|
||||||
public float[] getGradientFractions() {
|
|
||||||
return fractions;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isRotatedWithShape() {
|
|
||||||
// TODO: is this correct???
|
|
||||||
return (gradFill.isSetRotWithShape() || !gradFill.getRotWithShape());
|
|
||||||
}
|
|
||||||
|
|
||||||
public GradientType getGradientType() {
|
|
||||||
if (gradFill.isSetLin()) {
|
|
||||||
return GradientType.linear;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (gradFill.isSetPath()) {
|
|
||||||
/* TODO: handle rect path */
|
|
||||||
STPathShadeType.Enum ps = gradFill.getPath().getPath();
|
|
||||||
if (ps == STPathShadeType.CIRCLE) {
|
|
||||||
return GradientType.circular;
|
|
||||||
} else if (ps == STPathShadeType.SHAPE) {
|
|
||||||
return GradientType.shape;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return GradientType.linear;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRANSPARENT_PAINT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -24,7 +24,7 @@ import org.apache.poi.sl.usermodel.ShapeContainer;
|
|||||||
/**
|
/**
|
||||||
* Common interface for shape containers, e.g. sheets or groups of shapes
|
* Common interface for shape containers, e.g. sheets or groups of shapes
|
||||||
*/
|
*/
|
||||||
public interface XSLFShapeContainer extends ShapeContainer {
|
public interface XSLFShapeContainer extends ShapeContainer<XSLFShape> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create a new shape with a predefined geometry and add it to this shape container
|
* create a new shape with a predefined geometry and add it to this shape container
|
||||||
|
@ -16,47 +16,28 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import java.awt.Graphics2D;
|
||||||
import org.apache.poi.POIXMLException;
|
import java.io.*;
|
||||||
import org.apache.poi.openxml4j.opc.OPCPackage;
|
import java.util.*;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import java.util.regex.Pattern;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
|
||||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|
||||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
|
||||||
import org.apache.poi.sl.usermodel.Sheet;
|
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.IOUtils;
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.xmlbeans.XmlObject;
|
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
|
||||||
import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
|
||||||
|
|
||||||
import com.sun.org.apache.xml.internal.utils.UnImplNode;
|
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
import javax.xml.namespace.QName;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import java.awt.geom.AffineTransform;
|
import org.apache.poi.POIXMLException;
|
||||||
import java.io.IOException;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import java.io.InputStream;
|
import org.apache.poi.openxml4j.opc.*;
|
||||||
import java.io.OutputStream;
|
import org.apache.poi.sl.draw.DrawFactory;
|
||||||
import java.util.ArrayList;
|
import org.apache.poi.sl.draw.Drawable;
|
||||||
import java.util.HashMap;
|
import org.apache.poi.sl.usermodel.Sheet;
|
||||||
import java.util.Iterator;
|
import org.apache.poi.util.*;
|
||||||
import java.util.List;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import java.util.Map;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import java.util.regex.Pattern;
|
import org.openxmlformats.schemas.officeDocument.x2006.relationships.STRelationshipId;
|
||||||
|
import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet {
|
public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet<XSLFShape> {
|
||||||
private XSLFCommonSlideData _commonSlideData;
|
private XSLFCommonSlideData _commonSlideData;
|
||||||
private XSLFDrawing _drawing;
|
private XSLFDrawing _drawing;
|
||||||
private List<XSLFShape> _shapes;
|
private List<XSLFShape> _shapes;
|
||||||
@ -498,31 +479,9 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
* @param graphics
|
* @param graphics
|
||||||
*/
|
*/
|
||||||
public void draw(Graphics2D graphics){
|
public void draw(Graphics2D graphics){
|
||||||
XSLFSheet master = (XSLFSheet)getMasterSheet();
|
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
||||||
if(getFollowMasterGraphics() && master != null) master.draw(graphics);
|
Drawable draw = drawFact.getDrawable(this);
|
||||||
|
draw.draw(graphics);
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform());
|
|
||||||
for(XSLFShape shape : getShapeList()) {
|
|
||||||
if(!canDraw(shape)) continue;
|
|
||||||
|
|
||||||
// remember the initial transform and restore it after we are done with drawing
|
|
||||||
AffineTransform at = graphics.getTransform();
|
|
||||||
|
|
||||||
// concrete implementations can make sense of this hint,
|
|
||||||
// for example PSGraphics2D or PDFGraphics2D would call gsave() / grestore
|
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GSAVE, true);
|
|
||||||
|
|
||||||
// apply rotation and flipping
|
|
||||||
shape.applyTransform(graphics);
|
|
||||||
// draw stuff
|
|
||||||
shape.draw(graphics);
|
|
||||||
|
|
||||||
// restore the coordinate system
|
|
||||||
graphics.setTransform(at);
|
|
||||||
|
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GRESTORE, true);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,17 +19,18 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.*;
|
import java.awt.Color;
|
||||||
import java.awt.Shape;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.geom.*;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.xml.stream.XMLStreamException;
|
import javax.xml.stream.XMLStreamException;
|
||||||
import javax.xml.stream.XMLStreamReader;
|
import javax.xml.stream.XMLStreamReader;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.DrawPaint;
|
||||||
import org.apache.poi.sl.draw.geom.*;
|
import org.apache.poi.sl.draw.geom.*;
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
import org.apache.poi.sl.usermodel.LineDecoration.DecorationShape;
|
||||||
|
import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;
|
||||||
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
import org.apache.poi.sl.usermodel.StrokeStyle.LineCap;
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineCap;
|
||||||
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
@ -37,7 +38,7 @@ import org.apache.poi.util.Units;
|
|||||||
import org.apache.poi.xslf.model.PropertyFetcher;
|
import org.apache.poi.xslf.model.PropertyFetcher;
|
||||||
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.*;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a single (non-group) shape in a .pptx slide show
|
* Represents a single (non-group) shape in a .pptx slide show
|
||||||
@ -52,77 +53,106 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
super(shape,sheet);
|
super(shape,sheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return the sheet this shape belongs to
|
|
||||||
*/
|
|
||||||
public XSLFSheet getSheet() {
|
|
||||||
return _sheet;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param type
|
* @param type
|
||||||
*/
|
*/
|
||||||
public void setShapeType(ShapeType type){
|
public void setShapeType(ShapeType type){
|
||||||
CTShape shape = (CTShape) getXmlObject();
|
|
||||||
STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId);
|
STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId);
|
||||||
shape.getSpPr().getPrstGeom().setPrst(geom);
|
getSpPr().getPrstGeom().setPrst(geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShapeType getShapeType(){
|
public ShapeType getShapeType(){
|
||||||
CTShape shape = (CTShape) getXmlObject();
|
STShapeType.Enum geom = getSpPr().getPrstGeom().getPrst();
|
||||||
STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst();
|
|
||||||
return ShapeType.forId(geom.intValue(), true);
|
return ShapeType.forId(geom.intValue(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
protected CTTransform2D getSafeXfrm() {
|
||||||
public String getShapeName() {
|
CTTransform2D xfrm = getXfrm();
|
||||||
return getNvPr().getName();
|
return (xfrm == null ? getSpPr().addNewXfrm() : xfrm);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CTTransform2D getXfrm() {
|
||||||
|
PropertyFetcher<CTTransform2D> fetcher = new PropertyFetcher<CTTransform2D>() {
|
||||||
|
public boolean fetch(XSLFShape shape) {
|
||||||
|
CTShapeProperties pr = getSpPr();
|
||||||
|
if (pr.isSetXfrm()) {
|
||||||
|
setValue(pr.getXfrm());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchShapeProperty(fetcher);
|
||||||
|
return fetcher.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getShapeId() {
|
public Rectangle2D getAnchor() {
|
||||||
return (int) getNvPr().getId();
|
|
||||||
|
CTTransform2D xfrm = getXfrm();
|
||||||
|
|
||||||
|
CTPoint2D off = xfrm.getOff();
|
||||||
|
long x = off.getX();
|
||||||
|
long y = off.getY();
|
||||||
|
CTPositiveSize2D ext = xfrm.getExt();
|
||||||
|
long cx = ext.getCx();
|
||||||
|
long cy = ext.getCy();
|
||||||
|
return new Rectangle2D.Double(
|
||||||
|
Units.toPoints(x), Units.toPoints(y),
|
||||||
|
Units.toPoints(cx), Units.toPoints(cy));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setAnchor(Rectangle2D anchor) {
|
||||||
|
CTTransform2D xfrm = getSafeXfrm();
|
||||||
|
CTPoint2D off = xfrm.isSetOff() ? xfrm.getOff() : xfrm.addNewOff();
|
||||||
|
long x = Units.toEMU(anchor.getX());
|
||||||
|
long y = Units.toEMU(anchor.getY());
|
||||||
|
off.setX(x);
|
||||||
|
off.setY(y);
|
||||||
|
CTPositiveSize2D ext = xfrm.isSetExt() ? xfrm.getExt() : xfrm
|
||||||
|
.addNewExt();
|
||||||
|
long cx = Units.toEMU(anchor.getWidth());
|
||||||
|
long cy = Units.toEMU(anchor.getHeight());
|
||||||
|
ext.setCx(cx);
|
||||||
|
ext.setCy(cy);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRotation(double theta) {
|
public void setRotation(double theta) {
|
||||||
CTShapeProperties spPr = getSpPr();
|
getSafeXfrm().setRot((int) (theta * 60000));
|
||||||
CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();
|
|
||||||
xfrm.setRot((int) (theta * 60000));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public double getRotation() {
|
public double getRotation() {
|
||||||
CTTransform2D xfrm = getXfrm();
|
CTTransform2D xfrm = getXfrm();
|
||||||
return (double) xfrm.getRot() / 60000;
|
return (xfrm == null || !xfrm.isSetRot()) ? 0 : (xfrm.getRot() / 60000.d);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFlipHorizontal(boolean flip) {
|
public void setFlipHorizontal(boolean flip) {
|
||||||
CTShapeProperties spPr = getSpPr();
|
getSafeXfrm().setFlipH(flip);
|
||||||
CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();
|
|
||||||
xfrm.setFlipH(flip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setFlipVertical(boolean flip) {
|
public void setFlipVertical(boolean flip) {
|
||||||
CTShapeProperties spPr = getSpPr();
|
getSafeXfrm().setFlipV(flip);
|
||||||
CTTransform2D xfrm = spPr.isSetXfrm() ? spPr.getXfrm() : spPr.addNewXfrm();
|
|
||||||
xfrm.setFlipV(flip);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getFlipHorizontal() {
|
public boolean getFlipHorizontal() {
|
||||||
return getXfrm().getFlipH();
|
CTTransform2D xfrm = getXfrm();
|
||||||
|
return (xfrm == null || !xfrm.isSetFlipH()) ? false : getXfrm().getFlipH();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean getFlipVertical() {
|
public boolean getFlipVertical() {
|
||||||
return getXfrm().getFlipV();
|
CTTransform2D xfrm = getXfrm();
|
||||||
|
return (xfrm == null || !xfrm.isSetFlipV()) ? false : getXfrm().getFlipV();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get default line properties defined in the theme (if any).
|
* Get default line properties defined in the theme (if any).
|
||||||
* Used internally to resolve shape properties.
|
* Used internally to resolve shape properties.
|
||||||
@ -135,7 +165,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
if (style != null) {
|
if (style != null) {
|
||||||
// 1-based index of a line style within the style matrix
|
// 1-based index of a line style within the style matrix
|
||||||
int idx = (int) style.getLnRef().getIdx();
|
int idx = (int) style.getLnRef().getIdx();
|
||||||
CTStyleMatrix styleMatrix = _sheet.getTheme().getXmlObject().getThemeElements().getFmtScheme();
|
CTStyleMatrix styleMatrix = getSheet().getTheme().getXmlObject().getThemeElements().getFmtScheme();
|
||||||
ln = styleMatrix.getLnStyleLst().getLnArray(idx - 1);
|
ln = styleMatrix.getLnStyleLst().getLnArray(idx - 1);
|
||||||
}
|
}
|
||||||
return ln;
|
return ln;
|
||||||
@ -175,14 +205,57 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
* if outline is turned off
|
* if outline is turned off
|
||||||
*/
|
*/
|
||||||
public Color getLineColor() {
|
public Color getLineColor() {
|
||||||
RenderableShape rShape = new RenderableShape(this);
|
PaintStyle ps = getLinePaint();
|
||||||
Paint paint = rShape.getLinePaint(null);
|
if (ps == null || ps == TRANSPARENT_PAINT) return null;
|
||||||
if (paint instanceof Color) {
|
if (ps instanceof SolidPaint) {
|
||||||
return (Color) paint;
|
Color col = ((SolidPaint)ps).getSolidColor().getColor();
|
||||||
|
return (col == DrawPaint.NO_PAINT) ? null : col;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected PaintStyle getLinePaint() {
|
||||||
|
PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {
|
||||||
|
public boolean fetch(XSLFShape shape) {
|
||||||
|
CTLineProperties spPr = shape.getSpPr().getLn();
|
||||||
|
if (spPr != null) {
|
||||||
|
if (spPr.isSetNoFill()) {
|
||||||
|
setValue(TRANSPARENT_PAINT); // use it as 'nofill' value
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
PaintStyle paint = getPaint(spPr, null);
|
||||||
|
if (paint != null) {
|
||||||
|
setValue(paint);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchShapeProperty(fetcher);
|
||||||
|
|
||||||
|
PaintStyle paint = fetcher.getValue();
|
||||||
|
if (paint != null) return paint;
|
||||||
|
|
||||||
|
// line color was not found, check if it is defined in the theme
|
||||||
|
CTShapeStyle style = getSpStyle();
|
||||||
|
if (style == null) return TRANSPARENT_PAINT;
|
||||||
|
|
||||||
|
// get a reference to a line style within the style matrix.
|
||||||
|
CTStyleMatrixReference lnRef = style.getLnRef();
|
||||||
|
int idx = (int)lnRef.getIdx();
|
||||||
|
CTSchemeColor phClr = lnRef.getSchemeClr();
|
||||||
|
if(idx > 0){
|
||||||
|
XSLFTheme theme = getSheet().getTheme();
|
||||||
|
XmlObject lnProps = theme.getXmlObject().
|
||||||
|
getThemeElements().getFmtScheme().getLnStyleLst().selectPath("*")[idx - 1];
|
||||||
|
paint = getPaint(lnProps, phClr);
|
||||||
|
}
|
||||||
|
|
||||||
|
return paint == null ? TRANSPARENT_PAINT : paint;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param width line width in points. <code>0</code> means no line
|
* @param width line width in points. <code>0</code> means no line
|
||||||
@ -377,10 +450,11 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
* is not solid (pattern or gradient)
|
* is not solid (pattern or gradient)
|
||||||
*/
|
*/
|
||||||
public Color getFillColor() {
|
public Color getFillColor() {
|
||||||
RenderableShape rShape = new RenderableShape(this);
|
PaintStyle ps = getFillPaint();
|
||||||
Paint paint = rShape.getFillPaint(null);
|
if (ps == null || ps == TRANSPARENT_PAINT) return null;
|
||||||
if (paint instanceof Color) {
|
if (ps instanceof SolidPaint) {
|
||||||
return (Color) paint;
|
Color col = ((SolidPaint)ps).getSolidColor().getColor();
|
||||||
|
return (col == DrawPaint.NO_PAINT) ? null : col;
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -410,7 +484,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
// 1-based index of a shadow style within the style matrix
|
// 1-based index of a shadow style within the style matrix
|
||||||
int idx = (int) style.getEffectRef().getIdx();
|
int idx = (int) style.getEffectRef().getIdx();
|
||||||
if(idx != 0) {
|
if(idx != 0) {
|
||||||
CTStyleMatrix styleMatrix = _sheet.getTheme().getXmlObject().getThemeElements().getFmtScheme();
|
CTStyleMatrix styleMatrix = getSheet().getTheme().getXmlObject().getThemeElements().getFmtScheme();
|
||||||
CTEffectStyleItem ef = styleMatrix.getEffectStyleLst().getEffectStyleArray(idx - 1);
|
CTEffectStyleItem ef = styleMatrix.getEffectStyleLst().getEffectStyleArray(idx - 1);
|
||||||
obj = ef.getEffectLst().getOuterShdw();
|
obj = ef.getEffectLst().getOuterShdw();
|
||||||
}
|
}
|
||||||
@ -493,7 +567,7 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
/**
|
/**
|
||||||
* Specifies the line end decoration, such as a triangle or arrowhead.
|
* Specifies the line end decoration, such as a triangle or arrowhead.
|
||||||
*/
|
*/
|
||||||
public void setLineHeadDecoration(LineDecoration style) {
|
public void setLineHeadDecoration(DecorationShape style) {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();
|
CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
@ -503,18 +577,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineDecoration getLineHeadDecoration() {
|
public DecorationShape getLineHeadDecoration() {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
if (ln == null || !ln.isSetHeadEnd()) return LineDecoration.NONE;
|
if (ln == null || !ln.isSetHeadEnd()) return DecorationShape.NONE;
|
||||||
|
|
||||||
STLineEndType.Enum end = ln.getHeadEnd().getType();
|
STLineEndType.Enum end = ln.getHeadEnd().getType();
|
||||||
return end == null ? LineDecoration.NONE : LineDecoration.values()[end.intValue() - 1];
|
return end == null ? DecorationShape.NONE : DecorationShape.values()[end.intValue() - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* specifies decorations which can be added to the head of a line.
|
* specifies decorations which can be added to the head of a line.
|
||||||
*/
|
*/
|
||||||
public void setLineHeadWidth(LineEndWidth style) {
|
public void setLineHeadWidth(DecorationSize style) {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();
|
CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
@ -524,18 +598,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineEndWidth getLineHeadWidth() {
|
public DecorationSize getLineHeadWidth() {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
if (ln == null || !ln.isSetHeadEnd()) return LineEndWidth.MEDIUM;
|
if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM;
|
||||||
|
|
||||||
STLineEndWidth.Enum w = ln.getHeadEnd().getW();
|
STLineEndWidth.Enum w = ln.getHeadEnd().getW();
|
||||||
return w == null ? LineEndWidth.MEDIUM : LineEndWidth.values()[w.intValue() - 1];
|
return w == null ? DecorationSize.MEDIUM : DecorationSize.values()[w.intValue() - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies the line end width in relation to the line width.
|
* Specifies the line end width in relation to the line width.
|
||||||
*/
|
*/
|
||||||
public void setLineHeadLength(LineEndLength style) {
|
public void setLineHeadLength(DecorationSize style) {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();
|
CTLineEndProperties lnEnd = ln.isSetHeadEnd() ? ln.getHeadEnd() : ln.addNewHeadEnd();
|
||||||
|
|
||||||
@ -546,18 +620,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineEndLength getLineHeadLength() {
|
public DecorationSize getLineHeadLength() {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
if (ln == null || !ln.isSetHeadEnd()) return LineEndLength.MEDIUM;
|
if (ln == null || !ln.isSetHeadEnd()) return DecorationSize.MEDIUM;
|
||||||
|
|
||||||
STLineEndLength.Enum len = ln.getHeadEnd().getLen();
|
STLineEndLength.Enum len = ln.getHeadEnd().getLen();
|
||||||
return len == null ? LineEndLength.MEDIUM : LineEndLength.values()[len.intValue() - 1];
|
return len == null ? DecorationSize.MEDIUM : DecorationSize.values()[len.intValue() - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies the line end decoration, such as a triangle or arrowhead.
|
* Specifies the line end decoration, such as a triangle or arrowhead.
|
||||||
*/
|
*/
|
||||||
public void setLineTailDecoration(LineDecoration style) {
|
public void setLineTailDecoration(DecorationShape style) {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();
|
CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
@ -567,18 +641,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineDecoration getLineTailDecoration() {
|
public DecorationShape getLineTailDecoration() {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
if (ln == null || !ln.isSetTailEnd()) return LineDecoration.NONE;
|
if (ln == null || !ln.isSetTailEnd()) return DecorationShape.NONE;
|
||||||
|
|
||||||
STLineEndType.Enum end = ln.getTailEnd().getType();
|
STLineEndType.Enum end = ln.getTailEnd().getType();
|
||||||
return end == null ? LineDecoration.NONE : LineDecoration.values()[end.intValue() - 1];
|
return end == null ? DecorationShape.NONE : DecorationShape.values()[end.intValue() - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* specifies decorations which can be added to the tail of a line.
|
* specifies decorations which can be added to the tail of a line.
|
||||||
*/
|
*/
|
||||||
public void setLineTailWidth(LineEndWidth style) {
|
public void setLineTailWidth(DecorationSize style) {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();
|
CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();
|
||||||
if (style == null) {
|
if (style == null) {
|
||||||
@ -588,18 +662,18 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineEndWidth getLineTailWidth() {
|
public DecorationSize getLineTailWidth() {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
if (ln == null || !ln.isSetTailEnd()) return LineEndWidth.MEDIUM;
|
if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM;
|
||||||
|
|
||||||
STLineEndWidth.Enum w = ln.getTailEnd().getW();
|
STLineEndWidth.Enum w = ln.getTailEnd().getW();
|
||||||
return w == null ? LineEndWidth.MEDIUM : LineEndWidth.values()[w.intValue() - 1];
|
return w == null ? DecorationSize.MEDIUM : DecorationSize.values()[w.intValue() - 1];
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies the line end width in relation to the line width.
|
* Specifies the line end width in relation to the line width.
|
||||||
*/
|
*/
|
||||||
public void setLineTailLength(LineEndLength style) {
|
public void setLineTailLength(DecorationSize style) {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();
|
CTLineEndProperties lnEnd = ln.isSetTailEnd() ? ln.getTailEnd() : ln.addNewTailEnd();
|
||||||
|
|
||||||
@ -610,142 +684,12 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineEndLength getLineTailLength() {
|
public DecorationSize getLineTailLength() {
|
||||||
CTLineProperties ln = getSpPr().getLn();
|
CTLineProperties ln = getSpPr().getLn();
|
||||||
if (ln == null || !ln.isSetTailEnd()) return LineEndLength.MEDIUM;
|
if (ln == null || !ln.isSetTailEnd()) return DecorationSize.MEDIUM;
|
||||||
|
|
||||||
STLineEndLength.Enum len = ln.getTailEnd().getLen();
|
STLineEndLength.Enum len = ln.getTailEnd().getLen();
|
||||||
return len == null ? LineEndLength.MEDIUM : LineEndLength.values()[len.intValue() - 1];
|
return len == null ? DecorationSize.MEDIUM : DecorationSize.values()[len.intValue() - 1];
|
||||||
}
|
|
||||||
|
|
||||||
Outline getTailDecoration(Graphics2D graphics) {
|
|
||||||
LineEndLength tailLength = getLineTailLength();
|
|
||||||
LineEndWidth tailWidth = getLineTailWidth();
|
|
||||||
|
|
||||||
double lineWidth = Math.max(2.5, getLineWidth());
|
|
||||||
|
|
||||||
Rectangle2D anchor = new RenderableShape(this).getAnchor(graphics);
|
|
||||||
double x2 = anchor.getX() + anchor.getWidth(),
|
|
||||||
y2 = anchor.getY() + anchor.getHeight();
|
|
||||||
|
|
||||||
double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
|
|
||||||
|
|
||||||
AffineTransform at = new AffineTransform();
|
|
||||||
Shape shape = null;
|
|
||||||
Path p = null;
|
|
||||||
Rectangle2D bounds;
|
|
||||||
double scaleY = Math.pow(2, tailWidth.ordinal());
|
|
||||||
double scaleX = Math.pow(2, tailLength.ordinal());
|
|
||||||
switch (getLineTailDecoration()) {
|
|
||||||
case OVAL:
|
|
||||||
p = new Path();
|
|
||||||
shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);
|
|
||||||
bounds = shape.getBounds2D();
|
|
||||||
at.translate(x2 - bounds.getWidth() / 2, y2 - bounds.getHeight() / 2);
|
|
||||||
at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);
|
|
||||||
break;
|
|
||||||
case ARROW:
|
|
||||||
p = new Path();
|
|
||||||
GeneralPath arrow = new GeneralPath();
|
|
||||||
arrow.moveTo((float) (-lineWidth * 3), (float) (-lineWidth * 2));
|
|
||||||
arrow.lineTo(0, 0);
|
|
||||||
arrow.lineTo((float) (-lineWidth * 3), (float) (lineWidth * 2));
|
|
||||||
shape = arrow;
|
|
||||||
at.translate(x2, y2);
|
|
||||||
at.rotate(alpha);
|
|
||||||
break;
|
|
||||||
case TRIANGLE:
|
|
||||||
p = new Path();
|
|
||||||
scaleY = tailWidth.ordinal() + 1;
|
|
||||||
scaleX = tailLength.ordinal() + 1;
|
|
||||||
GeneralPath triangle = new GeneralPath();
|
|
||||||
triangle.moveTo((float) (-lineWidth * scaleX), (float) (-lineWidth * scaleY / 2));
|
|
||||||
triangle.lineTo(0, 0);
|
|
||||||
triangle.lineTo((float) (-lineWidth * scaleX), (float) (lineWidth * scaleY / 2));
|
|
||||||
triangle.closePath();
|
|
||||||
shape = triangle;
|
|
||||||
at.translate(x2, y2);
|
|
||||||
at.rotate(alpha);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shape != null) {
|
|
||||||
shape = at.createTransformedShape(shape);
|
|
||||||
}
|
|
||||||
return shape == null ? null : new Outline(shape, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
Outline getHeadDecoration(Graphics2D graphics) {
|
|
||||||
LineEndLength headLength = getLineHeadLength();
|
|
||||||
LineEndWidth headWidth = getLineHeadWidth();
|
|
||||||
|
|
||||||
double lineWidth = Math.max(2.5, getLineWidth());
|
|
||||||
|
|
||||||
Rectangle2D anchor = new RenderableShape(this).getAnchor(graphics);
|
|
||||||
double x1 = anchor.getX(),
|
|
||||||
y1 = anchor.getY();
|
|
||||||
|
|
||||||
double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
|
|
||||||
|
|
||||||
AffineTransform at = new AffineTransform();
|
|
||||||
Shape shape = null;
|
|
||||||
Path p = null;
|
|
||||||
Rectangle2D bounds;
|
|
||||||
double scaleY = 1;
|
|
||||||
double scaleX = 1;
|
|
||||||
switch (getLineHeadDecoration()) {
|
|
||||||
case OVAL:
|
|
||||||
p = new Path();
|
|
||||||
shape = new Ellipse2D.Double(0, 0, lineWidth * scaleX, lineWidth * scaleY);
|
|
||||||
bounds = shape.getBounds2D();
|
|
||||||
at.translate(x1 - bounds.getWidth() / 2, y1 - bounds.getHeight() / 2);
|
|
||||||
at.rotate(alpha, bounds.getX() + bounds.getWidth() / 2, bounds.getY() + bounds.getHeight() / 2);
|
|
||||||
break;
|
|
||||||
case STEALTH:
|
|
||||||
case ARROW:
|
|
||||||
p = new Path(false, true);
|
|
||||||
GeneralPath arrow = new GeneralPath();
|
|
||||||
arrow.moveTo((float) (lineWidth * 3 * scaleX), (float) (-lineWidth * scaleY * 2));
|
|
||||||
arrow.lineTo(0, 0);
|
|
||||||
arrow.lineTo((float) (lineWidth * 3 * scaleX), (float) (lineWidth * scaleY * 2));
|
|
||||||
shape = arrow;
|
|
||||||
at.translate(x1, y1);
|
|
||||||
at.rotate(alpha);
|
|
||||||
break;
|
|
||||||
case TRIANGLE:
|
|
||||||
p = new Path();
|
|
||||||
scaleY = headWidth.ordinal() + 1;
|
|
||||||
scaleX = headLength.ordinal() + 1;
|
|
||||||
GeneralPath triangle = new GeneralPath();
|
|
||||||
triangle.moveTo((float) (lineWidth * scaleX), (float) (-lineWidth * scaleY / 2));
|
|
||||||
triangle.lineTo(0, 0);
|
|
||||||
triangle.lineTo((float) (lineWidth * scaleX), (float) (lineWidth * scaleY / 2));
|
|
||||||
triangle.closePath();
|
|
||||||
shape = triangle;
|
|
||||||
at.translate(x1, y1);
|
|
||||||
at.rotate(alpha);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (shape != null) {
|
|
||||||
shape = at.createTransformedShape(shape);
|
|
||||||
}
|
|
||||||
return shape == null ? null : new Outline(shape, p);
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Outline> getDecorationOutlines(Graphics2D graphics){
|
|
||||||
List<Outline> lst = new ArrayList<Outline>();
|
|
||||||
|
|
||||||
Outline head = getHeadDecoration(graphics);
|
|
||||||
if(head != null) lst.add(head);
|
|
||||||
|
|
||||||
Outline tail = getTailDecoration(graphics);
|
|
||||||
if(tail != null) lst.add(tail);
|
|
||||||
return lst;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPlaceholder() {
|
public boolean isPlaceholder() {
|
||||||
@ -753,25 +697,79 @@ public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
|||||||
return ph != null;
|
return ph != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Hyperlink getHyperlink() {
|
@SuppressWarnings("deprecation")
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setHyperlink(Hyperlink hyperlink) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public Guide getAdjustValue(String name) {
|
public Guide getAdjustValue(String name) {
|
||||||
// TODO Auto-generated method stub
|
CTPresetGeometry2D prst = getSpPr().getPrstGeom();
|
||||||
|
if (prst.isSetAvLst()) {
|
||||||
|
for (CTGeomGuide g : prst.getAvLst().getGdArray()) {
|
||||||
|
if (g.getName().equals(name)) {
|
||||||
|
return new Guide(g.getName(), g.getFmla());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public org.apache.poi.sl.usermodel.LineDecoration getLineDecoration() {
|
public LineDecoration getLineDecoration() {
|
||||||
// TODO Auto-generated method stub
|
return new LineDecoration() {
|
||||||
return null;
|
public DecorationShape getHeadShape() {
|
||||||
|
return getLineHeadDecoration();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DecorationSize getHeadWidth() {
|
||||||
|
return getLineHeadWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DecorationSize getHeadLength() {
|
||||||
|
return getLineHeadLength();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DecorationShape getTailShape() {
|
||||||
|
return getLineTailDecoration();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DecorationSize getTailWidth() {
|
||||||
|
return getLineTailWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DecorationSize getTailLength() {
|
||||||
|
return getLineTailLength();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch shape fill as a java.awt.Paint
|
||||||
|
*
|
||||||
|
* @return either Color or GradientPaint or TexturePaint or null
|
||||||
|
*/
|
||||||
|
public FillStyle getFillStyle() {
|
||||||
|
return new FillStyle() {
|
||||||
|
public PaintStyle getPaint() {
|
||||||
|
return XSLFSimpleShape.this.getFillPaint();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public StrokeStyle getStrokeStyle() {
|
||||||
|
return new StrokeStyle() {
|
||||||
|
public PaintStyle getPaint() {
|
||||||
|
return XSLFSimpleShape.this.getLinePaint();
|
||||||
|
}
|
||||||
|
|
||||||
|
public LineCap getLineCap() {
|
||||||
|
return XSLFSimpleShape.this.getLineCap();
|
||||||
|
}
|
||||||
|
|
||||||
|
public LineDash getLineDash() {
|
||||||
|
return XSLFSimpleShape.this.getLineDash();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getLineWidth() {
|
||||||
|
return XSLFSimpleShape.this.getLineWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,7 +16,6 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
@ -26,21 +25,11 @@ import org.apache.poi.sl.usermodel.Notes;
|
|||||||
import org.apache.poi.sl.usermodel.Slide;
|
import org.apache.poi.sl.usermodel.Slide;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties;
|
import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument;
|
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public final class XSLFSlide extends XSLFSheet implements Slide {
|
public final class XSLFSlide extends XSLFSheet implements Slide<XSLFShape> {
|
||||||
private final CTSlide _slide;
|
private final CTSlide _slide;
|
||||||
private XSLFSlideLayout _layout;
|
private XSLFSlideLayout _layout;
|
||||||
private XSLFComments _comments;
|
private XSLFComments _comments;
|
||||||
@ -220,17 +209,6 @@ public final class XSLFSlide extends XSLFSheet implements Slide {
|
|||||||
setFollowMasterGraphics(follow);
|
setFollowMasterGraphics(follow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(Graphics2D graphics){
|
|
||||||
|
|
||||||
XSLFBackground bg = getBackground();
|
|
||||||
if(bg != null) bg.draw(graphics);
|
|
||||||
|
|
||||||
super.draw(graphics);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XSLFSlide importContent(XSLFSheet src){
|
public XSLFSlide importContent(XSLFSheet src){
|
||||||
super.importContent(src);
|
super.importContent(src);
|
||||||
|
@ -31,7 +31,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFSlideLayout extends XSLFSheet implements MasterSheet {
|
public class XSLFSlideLayout extends XSLFSheet implements MasterSheet<XSLFShape> {
|
||||||
private CTSlideLayout _layout;
|
private CTSlideLayout _layout;
|
||||||
private XSLFSlideMaster _master;
|
private XSLFSlideMaster _master;
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ import java.util.Map;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFSlideMaster extends XSLFSheet implements MasterSheet {
|
public class XSLFSlideMaster extends XSLFSheet implements MasterSheet<XSLFShape> {
|
||||||
private CTSlideMaster _slide;
|
private CTSlideMaster _slide;
|
||||||
private Map<String, XSLFSlideLayout> _layouts;
|
private Map<String, XSLFSlideLayout> _layouts;
|
||||||
private XSLFTheme _theme;
|
private XSLFTheme _theme;
|
||||||
|
@ -23,42 +23,22 @@ import java.awt.Color;
|
|||||||
|
|
||||||
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSolidColorFillProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCell;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTableCellProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STCompoundLine;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineCap;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndLength;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndType;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STLineEndWidth;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STPenAlignment;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STPresetLineDashVal;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a cell of a table in a .pptx presentation
|
* Represents a cell of a table in a .pptx presentation
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
public class XSLFTableCell extends XSLFTextShape {
|
public class XSLFTableCell extends XSLFTextShape {
|
||||||
static double defaultBorderWidth = 1.0;
|
static double defaultBorderWidth = 1.0;
|
||||||
|
private CTTableCellProperties _tcPr = null;
|
||||||
|
|
||||||
/*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){
|
/*package*/ XSLFTableCell(CTTableCell cell, XSLFSheet sheet){
|
||||||
super(cell, sheet);
|
super(cell, sheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public CTTableCell getXmlObject(){
|
|
||||||
return (CTTableCell)super.getXmlObject();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected CTTextBody getTextBody(boolean create){
|
protected CTTextBody getTextBody(boolean create){
|
||||||
CTTableCell cell = getXmlObject();
|
CTTableCell cell = (CTTableCell)getXmlObject();
|
||||||
CTTextBody txBody = cell.getTxBody();
|
CTTextBody txBody = cell.getTxBody();
|
||||||
if (txBody == null && create) {
|
if (txBody == null && create) {
|
||||||
txBody = cell.addNewTxBody();
|
txBody = cell.addNewTxBody();
|
||||||
@ -78,135 +58,72 @@ public class XSLFTableCell extends XSLFTextShape {
|
|||||||
return cell;
|
return cell;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected CTTableCellProperties getCellProperties(boolean create) {
|
||||||
|
if (_tcPr == null) {
|
||||||
|
CTTableCell cell = (CTTableCell)getXmlObject();
|
||||||
|
_tcPr = cell.getTcPr();
|
||||||
|
if (_tcPr == null && create) {
|
||||||
|
_tcPr = cell.addNewTcPr();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _tcPr;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setLeftInset(double margin){
|
public void setLeftInset(double margin){
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTTableCellProperties pr = getCellProperties(true);
|
||||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
|
||||||
|
|
||||||
pr.setMarL(Units.toEMU(margin));
|
pr.setMarL(Units.toEMU(margin));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRightInset(double margin){
|
public void setRightInset(double margin){
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTTableCellProperties pr = getCellProperties(true);
|
||||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
|
||||||
|
|
||||||
pr.setMarR(Units.toEMU(margin));
|
pr.setMarR(Units.toEMU(margin));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setTopInset(double margin){
|
public void setTopInset(double margin){
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTTableCellProperties pr = getCellProperties(true);
|
||||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
|
||||||
|
|
||||||
pr.setMarT(Units.toEMU(margin));
|
pr.setMarT(Units.toEMU(margin));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setBottomInset(double margin){
|
public void setBottomInset(double margin){
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTTableCellProperties pr = getCellProperties(true);
|
||||||
if(pr == null) pr = getXmlObject().addNewTcPr();
|
|
||||||
|
|
||||||
pr.setMarB(Units.toEMU(margin));
|
pr.setMarB(Units.toEMU(margin));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBorderLeft(double width){
|
private CTLineProperties getCTLine(char bltr, boolean create) {
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTTableCellProperties pr = getCellProperties(create);
|
||||||
|
if (pr == null) return null;
|
||||||
CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();
|
|
||||||
|
switch (bltr) {
|
||||||
|
case 'b':
|
||||||
|
return (pr.isSetLnB()) ? pr.getLnB() : (create ? pr.addNewLnB() : null);
|
||||||
|
case 'l':
|
||||||
|
return (pr.isSetLnL()) ? pr.getLnL() : (create ? pr.addNewLnL() : null);
|
||||||
|
case 't':
|
||||||
|
return (pr.isSetLnT()) ? pr.getLnT() : (create ? pr.addNewLnT() : null);
|
||||||
|
case 'r':
|
||||||
|
return (pr.isSetLnR()) ? pr.getLnR() : (create ? pr.addNewLnR() : null);
|
||||||
|
default:
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setBorderWidth(char bltr, double width) {
|
||||||
|
CTLineProperties ln = getCTLine(bltr, true);
|
||||||
ln.setW(Units.toEMU(width));
|
ln.setW(Units.toEMU(width));
|
||||||
}
|
}
|
||||||
|
|
||||||
public double getBorderLeft(){
|
private double getBorderWidth(char bltr) {
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTLineProperties ln = getCTLine(bltr, false);
|
||||||
|
return (ln == null) ? defaultBorderWidth : Units.toPoints(ln.getW());
|
||||||
CTLineProperties ln = pr.getLnL();
|
|
||||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setBorderLeftColor(Color color){
|
private void setBorderColor(char bltr, Color color) {
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
CTLineProperties ln = getCTLine(bltr, true);
|
||||||
CTLineProperties ln = pr.isSetLnL() ? pr.getLnL() : pr.addNewLnL();
|
|
||||||
setLineColor(ln, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Color getBorderLeftColor(){
|
|
||||||
return getLineColor(getXmlObject().getTcPr().getLnL());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderRight(double width){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
|
|
||||||
CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();
|
|
||||||
ln.setW(Units.toEMU(width));
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getBorderRight(){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
|
|
||||||
CTLineProperties ln = pr.getLnR();
|
|
||||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderRightColor(Color color){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
CTLineProperties ln = pr.isSetLnR() ? pr.getLnR() : pr.addNewLnR();
|
|
||||||
setLineColor(ln, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Color getBorderRightColor(){
|
|
||||||
return getLineColor(getXmlObject().getTcPr().getLnR());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderTop(double width){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
|
|
||||||
CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();
|
|
||||||
ln.setW(Units.toEMU(width));
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getBorderTop(){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
|
|
||||||
CTLineProperties ln = pr.getLnT();
|
|
||||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderTopColor(Color color){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
CTLineProperties ln = pr.isSetLnT() ? pr.getLnT() : pr.addNewLnT();
|
|
||||||
setLineColor(ln, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Color getBorderTopColor(){
|
|
||||||
return getLineColor(getXmlObject().getTcPr().getLnT());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderBottom(double width){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
|
|
||||||
CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();
|
|
||||||
ln.setW(Units.toEMU(width));
|
|
||||||
}
|
|
||||||
|
|
||||||
public double getBorderBottom(){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
|
|
||||||
CTLineProperties ln = pr.getLnB();
|
|
||||||
return ln == null || !ln.isSetW() ? defaultBorderWidth : Units.toPoints(ln.getW());
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBorderBottomColor(Color color){
|
|
||||||
CTTableCellProperties pr = getXmlObject().getTcPr();
|
|
||||||
CTLineProperties ln = pr.isSetLnB() ? pr.getLnB() : pr.addNewLnB();
|
|
||||||
setLineColor(ln, color);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Color getBorderBottomColor(){
|
|
||||||
return getLineColor(getXmlObject().getTcPr().getLnB());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setLineColor(CTLineProperties ln, Color color){
|
|
||||||
if(color == null){
|
if(color == null){
|
||||||
ln.addNewNoFill();
|
ln.addNewNoFill();
|
||||||
if(ln.isSetSolidFill()) ln.unsetSolidFill();
|
if(ln.isSetSolidFill()) ln.unsetSolidFill();
|
||||||
@ -233,19 +150,85 @@ public class XSLFTableCell extends XSLFTextShape {
|
|||||||
rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});
|
rgb.setVal(new byte[]{(byte)color.getRed(), (byte)color.getGreen(), (byte)color.getBlue()});
|
||||||
ln.addNewSolidFill().setSrgbClr(rgb);
|
ln.addNewSolidFill().setSrgbClr(rgb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color getLineColor(CTLineProperties ln){
|
private Color getBorderColor(char bltr) {
|
||||||
if(ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null;
|
CTLineProperties ln = getCTLine(bltr,false);
|
||||||
|
if (ln == null || ln.isSetNoFill() || !ln.isSetSolidFill()) return null;
|
||||||
|
|
||||||
CTSolidColorFillProperties fill = ln.getSolidFill();
|
CTSolidColorFillProperties fill = ln.getSolidFill();
|
||||||
if(!fill.isSetSrgbClr()) {
|
if (!fill.isSetSrgbClr()) {
|
||||||
// TODO for now return null for all colors except explicit RGB
|
// TODO for now return null for all colors except explicit RGB
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
byte[] val = fill.getSrgbClr().getVal();
|
byte[] val = fill.getSrgbClr().getVal();
|
||||||
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
return new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderLeft(double width) {
|
||||||
|
setBorderWidth('l', width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getBorderLeft() {
|
||||||
|
return getBorderWidth('l');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderLeftColor(Color color) {
|
||||||
|
setBorderColor('l', color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getBorderLeftColor() {
|
||||||
|
return getBorderColor('l');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderRight(double width) {
|
||||||
|
setBorderWidth('r', width);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBorderRight() {
|
||||||
|
return getBorderWidth('r');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderRightColor(Color color) {
|
||||||
|
setBorderColor('r', color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getBorderRightColor() {
|
||||||
|
return getBorderColor('r');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderTop(double width) {
|
||||||
|
setBorderWidth('t', width);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBorderTop() {
|
||||||
|
return getBorderWidth('t');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderTopColor(Color color) {
|
||||||
|
setBorderColor('t', color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getBorderTopColor() {
|
||||||
|
return getBorderColor('t');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderBottom(double width) {
|
||||||
|
setBorderWidth('b', width);
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBorderBottom() {
|
||||||
|
return getBorderWidth('b');
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBorderBottomColor(Color color) {
|
||||||
|
setBorderColor('b', color);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getBorderBottomColor(){
|
||||||
|
return getBorderColor('b');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specifies a solid color fill. The shape is filled entirely with the specified color.
|
* Specifies a solid color fill. The shape is filled entirely with the specified color.
|
||||||
*
|
*
|
||||||
@ -254,7 +237,7 @@ public class XSLFTableCell extends XSLFTextShape {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void setFillColor(Color color) {
|
public void setFillColor(Color color) {
|
||||||
CTTableCellProperties spPr = getXmlObject().getTcPr();
|
CTTableCellProperties spPr = getCellProperties(true);
|
||||||
if (color == null) {
|
if (color == null) {
|
||||||
if(spPr.isSetSolidFill()) spPr.unsetSolidFill();
|
if(spPr.isSetSolidFill()) spPr.unsetSolidFill();
|
||||||
}
|
}
|
||||||
@ -274,11 +257,11 @@ public class XSLFTableCell extends XSLFTextShape {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Color getFillColor(){
|
public Color getFillColor(){
|
||||||
CTTableCellProperties spPr = getXmlObject().getTcPr();
|
CTTableCellProperties spPr = getCellProperties(false);
|
||||||
if(!spPr.isSetSolidFill() ) return null;
|
if (spPr == null || !spPr.isSetSolidFill()) return null;
|
||||||
|
|
||||||
CTSolidColorFillProperties fill = spPr.getSolidFill();
|
CTSolidColorFillProperties fill = spPr.getSolidFill();
|
||||||
if(!fill.isSetSrgbClr()) {
|
if (!fill.isSetSrgbClr()) {
|
||||||
// TODO for now return null for all colors except explicit RGB
|
// TODO for now return null for all colors except explicit RGB
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@ -287,38 +270,36 @@ public class XSLFTableCell extends XSLFTextShape {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setGridSpan(int gridSpan_) {
|
void setGridSpan(int gridSpan_) {
|
||||||
getXmlObject().setGridSpan(gridSpan_);
|
((CTTableCell)getXmlObject()).setGridSpan(gridSpan_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setRowSpan(int rowSpan_) {
|
void setRowSpan(int rowSpan_) {
|
||||||
getXmlObject().setRowSpan(rowSpan_);
|
((CTTableCell)getXmlObject()).setRowSpan(rowSpan_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setHMerge(boolean merge_) {
|
void setHMerge(boolean merge_) {
|
||||||
getXmlObject().setHMerge(merge_);
|
((CTTableCell)getXmlObject()).setHMerge(merge_);
|
||||||
}
|
}
|
||||||
|
|
||||||
void setVMerge(boolean merge_) {
|
void setVMerge(boolean merge_) {
|
||||||
getXmlObject().setVMerge(merge_);
|
((CTTableCell)getXmlObject()).setVMerge(merge_);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVerticalAlignment(VerticalAlignment anchor){
|
public void setVerticalAlignment(VerticalAlignment anchor){
|
||||||
CTTableCellProperties cellProps = getXmlObject().getTcPr();
|
CTTableCellProperties cellProps = getCellProperties(true);
|
||||||
if(cellProps != null) {
|
if(anchor == null) {
|
||||||
if(anchor == null) {
|
if(cellProps.isSetAnchor()) {
|
||||||
if(cellProps.isSetAnchor()) {
|
cellProps.unsetAnchor();
|
||||||
cellProps.unsetAnchor();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cellProps.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));
|
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
cellProps.setAnchor(STTextAnchoringType.Enum.forInt(anchor.ordinal() + 1));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public VerticalAlignment getVerticalAlignment(){
|
public VerticalAlignment getVerticalAlignment(){
|
||||||
CTTableCellProperties cellProps = getXmlObject().getTcPr();
|
CTTableCellProperties cellProps = getCellProperties(false);
|
||||||
|
|
||||||
VerticalAlignment align = VerticalAlignment.TOP;
|
VerticalAlignment align = VerticalAlignment.TOP;
|
||||||
if(cellProps != null && cellProps.isSetAnchor()) {
|
if(cellProps != null && cellProps.isSetAnchor()) {
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.TextParagraph;
|
import org.apache.poi.sl.usermodel.TextParagraph;
|
||||||
@ -37,7 +35,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|||||||
* @since POI-3.8
|
* @since POI-3.8
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFTextParagraph implements TextParagraph {
|
public class XSLFTextParagraph implements TextParagraph<XSLFTextRun> {
|
||||||
private final CTTextParagraph _p;
|
private final CTTextParagraph _p;
|
||||||
private final List<XSLFTextRun> _runs;
|
private final List<XSLFTextRun> _runs;
|
||||||
private final XSLFTextShape _shape;
|
private final XSLFTextShape _shape;
|
||||||
@ -697,44 +695,6 @@ public class XSLFTextParagraph implements TextParagraph {
|
|||||||
return "[" + getClass() + "]" + getText();
|
return "[" + getClass() + "]" + getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns wrapping width to break lines in this paragraph
|
|
||||||
*
|
|
||||||
* @param firstLine whether the first line is breaking
|
|
||||||
*
|
|
||||||
* @return wrapping width in points
|
|
||||||
*/
|
|
||||||
double getWrappingWidth(boolean firstLine, Graphics2D graphics){
|
|
||||||
// internal margins for the text box
|
|
||||||
double leftInset = _shape.getLeftInset();
|
|
||||||
double rightInset = _shape.getRightInset();
|
|
||||||
|
|
||||||
RenderableShape rShape = new RenderableShape(_shape);
|
|
||||||
Rectangle2D anchor = rShape.getAnchor(graphics);
|
|
||||||
|
|
||||||
double leftMargin = getLeftMargin();
|
|
||||||
double indent = getIndent();
|
|
||||||
|
|
||||||
double width;
|
|
||||||
if(!_shape.getWordWrap()) {
|
|
||||||
// if wordWrap == false then we return the advance to the right border of the sheet
|
|
||||||
width = _shape.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX();
|
|
||||||
} else {
|
|
||||||
width = anchor.getWidth() - leftInset - rightInset - leftMargin;
|
|
||||||
if(firstLine) {
|
|
||||||
if(isBullet()){
|
|
||||||
if(indent > 0) width -= indent;
|
|
||||||
} else {
|
|
||||||
if(indent > 0) width -= indent; // first line indentation
|
|
||||||
else if (indent < 0) { // hanging indentation: the first line start at the left margin
|
|
||||||
width += leftMargin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTextParagraphProperties getDefaultMasterStyle(){
|
CTTextParagraphProperties getDefaultMasterStyle(){
|
||||||
CTPlaceholder ph = _shape.getCTPlaceholder();
|
CTPlaceholder ph = _shape.getCTPlaceholder();
|
||||||
|
@ -19,17 +19,13 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.geom.AffineTransform;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
import org.apache.poi.sl.draw.DrawFactory;
|
import org.apache.poi.sl.draw.DrawFactory;
|
||||||
import org.apache.poi.sl.draw.geom.Guide;
|
import org.apache.poi.sl.draw.DrawTextShape;
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.sl.usermodel.LineDecoration;
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
import org.apache.poi.xslf.model.PropertyFetcher;
|
import org.apache.poi.xslf.model.PropertyFetcher;
|
||||||
@ -40,18 +36,11 @@ import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a shape that can hold text.
|
* Represents a shape that can hold text.
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape {
|
public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape<XSLFTextParagraph> {
|
||||||
private final List<XSLFTextParagraph> _paragraphs;
|
private final List<XSLFTextParagraph> _paragraphs;
|
||||||
|
|
||||||
/**
|
|
||||||
* whether the text was broken into lines.
|
|
||||||
*/
|
|
||||||
private boolean _isTextBroken;
|
|
||||||
|
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
/*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) {
|
/*package*/ XSLFTextShape(XmlObject shape, XSLFSheet sheet) {
|
||||||
super(shape, sheet);
|
super(shape, sheet);
|
||||||
@ -66,7 +55,7 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Iterator<XSLFTextParagraph> iterator(){
|
public Iterator<XSLFTextParagraph> iterator(){
|
||||||
return _paragraphs.iterator();
|
return getTextParagraphs().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -408,22 +397,15 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
return textBody == null ? null : textBody.getBodyPr();
|
return textBody == null ? null : textBody.getBodyPr();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
protected abstract CTTextBody getTextBody(boolean create);
|
protected abstract CTTextBody getTextBody(boolean create);
|
||||||
|
|
||||||
|
|
||||||
public Placeholder getTextType(){
|
public Placeholder getTextType(){
|
||||||
CTPlaceholder ph;
|
CTPlaceholder ph = getCTPlaceholder();
|
||||||
XmlObject[] obj = getXmlObject().selectPath(
|
if (ph == null) return null;
|
||||||
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph");
|
|
||||||
if(obj.length == 1){
|
int val = ph.getType().intValue();
|
||||||
ph = (CTPlaceholder)obj[0];
|
return Placeholder.values()[val - 1];
|
||||||
int val = ph.getType().intValue();
|
|
||||||
return Placeholder.values()[val - 1];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -437,10 +419,11 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
* @param placeholder
|
* @param placeholder
|
||||||
*/
|
*/
|
||||||
public void setPlaceholder(Placeholder placeholder){
|
public void setPlaceholder(Placeholder placeholder){
|
||||||
CTShape sh = (CTShape)getXmlObject();
|
String xquery = "declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr";
|
||||||
CTApplicationNonVisualDrawingProps nv = sh.getNvSpPr().getNvPr();
|
CTApplicationNonVisualDrawingProps nv = selectProperty(CTApplicationNonVisualDrawingProps.class, xquery);
|
||||||
|
if (nv == null) return;
|
||||||
if(placeholder == null) {
|
if(placeholder == null) {
|
||||||
if(nv.isSetPh()) nv.unsetPh();
|
if (nv.isSetPh()) nv.unsetPh();
|
||||||
} else {
|
} else {
|
||||||
nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1));
|
nv.addNewPh().setType(STPlaceholderType.Enum.forInt(placeholder.ordinal() + 1));
|
||||||
}
|
}
|
||||||
@ -450,14 +433,9 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
* Compute the cumulative height occupied by the text
|
* Compute the cumulative height occupied by the text
|
||||||
*/
|
*/
|
||||||
public double getTextHeight(){
|
public double getTextHeight(){
|
||||||
// dry-run in a 1x1 image and return the vertical advance
|
DrawFactory drawFact = DrawFactory.getInstance(null);
|
||||||
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
DrawTextShape<XSLFTextShape> dts = drawFact.getDrawable(this);
|
||||||
Graphics2D graphics = img.createGraphics();
|
return dts.getTextHeight();
|
||||||
DrawFactory fact = DrawFactory.getInstance(graphics);
|
|
||||||
fact.getDrawable(this);
|
|
||||||
|
|
||||||
breakText(graphics);
|
|
||||||
return drawParagraphs(graphics, 0, 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -521,19 +499,4 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public LineDecoration getLineDecoration() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public FillStyle getFillStyle() {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Guide getAdjustValue(String name) {
|
|
||||||
// TODO Auto-generated method stub
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -18,7 +18,7 @@
|
|||||||
package org.apache.poi.hslf.blip;
|
package org.apache.poi.hslf.blip;
|
||||||
|
|
||||||
import org.apache.poi.hslf.model.Picture;
|
import org.apache.poi.hslf.model.Picture;
|
||||||
import org.apache.poi.hslf.model.Shape;
|
import org.apache.poi.hslf.model.HSLFShape;
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
@ -67,7 +67,7 @@ public final class EMF extends Metafile {
|
|||||||
header.wmfsize = data.length;
|
header.wmfsize = data.length;
|
||||||
//we don't have a EMF reader in java, have to set default image size 200x200
|
//we don't have a EMF reader in java, have to set default image size 200x200
|
||||||
header.bounds = new java.awt.Rectangle(0, 0, 200, 200);
|
header.bounds = new java.awt.Rectangle(0, 0, 200, 200);
|
||||||
header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT, header.bounds.height*Shape.EMU_PER_POINT);
|
header.size = new java.awt.Dimension(header.bounds.width*HSLFShape.EMU_PER_POINT, header.bounds.height*HSLFShape.EMU_PER_POINT);
|
||||||
header.zipsize = compressed.length;
|
header.zipsize = compressed.length;
|
||||||
|
|
||||||
byte[] checksum = getChecksum(data);
|
byte[] checksum = getChecksum(data);
|
||||||
|
@ -24,7 +24,7 @@ import java.util.zip.InflaterInputStream;
|
|||||||
|
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
import org.apache.poi.hslf.model.Picture;
|
import org.apache.poi.hslf.model.Picture;
|
||||||
import org.apache.poi.hslf.model.Shape;
|
import org.apache.poi.hslf.model.HSLFShape;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents Macintosh PICT picture data.
|
* Represents Macintosh PICT picture data.
|
||||||
@ -86,8 +86,8 @@ public final class PICT extends Metafile {
|
|||||||
header.wmfsize = data.length - 512;
|
header.wmfsize = data.length - 512;
|
||||||
//we don't have a PICT reader in java, have to set default image size 200x200
|
//we don't have a PICT reader in java, have to set default image size 200x200
|
||||||
header.bounds = new java.awt.Rectangle(0, 0, 200, 200);
|
header.bounds = new java.awt.Rectangle(0, 0, 200, 200);
|
||||||
header.size = new java.awt.Dimension(header.bounds.width*Shape.EMU_PER_POINT,
|
header.size = new java.awt.Dimension(header.bounds.width*HSLFShape.EMU_PER_POINT,
|
||||||
header.bounds.height*Shape.EMU_PER_POINT);
|
header.bounds.height*HSLFShape.EMU_PER_POINT);
|
||||||
header.zipsize = compressed.length;
|
header.zipsize = compressed.length;
|
||||||
|
|
||||||
byte[] checksum = getChecksum(data);
|
byte[] checksum = getChecksum(data);
|
||||||
|
@ -20,7 +20,7 @@ package org.apache.poi.hslf.blip;
|
|||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.hslf.model.Picture;
|
import org.apache.poi.hslf.model.Picture;
|
||||||
import org.apache.poi.hslf.model.Shape;
|
import org.apache.poi.hslf.model.HSLFShape;
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
|
|
||||||
import java.io.*;
|
import java.io.*;
|
||||||
@ -78,7 +78,7 @@ public final class WMF extends Metafile {
|
|||||||
header.wmfsize = data.length - aldus.getSize();
|
header.wmfsize = data.length - aldus.getSize();
|
||||||
header.bounds = new java.awt.Rectangle((short)aldus.left, (short)aldus.top, (short)aldus.right-(short)aldus.left, (short)aldus.bottom-(short)aldus.top);
|
header.bounds = new java.awt.Rectangle((short)aldus.left, (short)aldus.top, (short)aldus.right-(short)aldus.left, (short)aldus.bottom-(short)aldus.top);
|
||||||
//coefficient to translate from WMF dpi to 96pdi
|
//coefficient to translate from WMF dpi to 96pdi
|
||||||
int coeff = 96*Shape.EMU_PER_POINT/aldus.inch;
|
int coeff = 96*HSLFShape.EMU_PER_POINT/aldus.inch;
|
||||||
header.size = new java.awt.Dimension(header.bounds.width*coeff, header.bounds.height*coeff);
|
header.size = new java.awt.Dimension(header.bounds.width*coeff, header.bounds.height*coeff);
|
||||||
header.zipsize = compressed.length;
|
header.zipsize = compressed.length;
|
||||||
|
|
||||||
|
@ -192,7 +192,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
for (int i = 0; i < _slides.length; i++) {
|
for (int i = 0; i < _slides.length; i++) {
|
||||||
Slide slide = _slides[i];
|
Slide slide = _slides[i];
|
||||||
|
|
||||||
Shape[] shapes = slide.getShapes();
|
HSLFShape[] shapes = slide.getShapes();
|
||||||
for (int j = 0; j < shapes.length; j++) {
|
for (int j = 0; j < shapes.length; j++) {
|
||||||
if (shapes[j] instanceof OLEShape) {
|
if (shapes[j] instanceof OLEShape) {
|
||||||
list.add((OLEShape) shapes[j]);
|
list.add((OLEShape) shapes[j]);
|
||||||
@ -221,7 +221,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
if (getSlideText) {
|
if (getSlideText) {
|
||||||
if (getMasterText) {
|
if (getMasterText) {
|
||||||
for (SlideMaster master : _show.getSlidesMasters()) {
|
for (SlideMaster master : _show.getSlidesMasters()) {
|
||||||
for(Shape sh : master.getShapes()){
|
for(HSLFShape sh : master.getShapes()){
|
||||||
if(sh instanceof TextShape){
|
if(sh instanceof TextShape){
|
||||||
if(MasterSheet.isPlaceholder(sh)) {
|
if(MasterSheet.isPlaceholder(sh)) {
|
||||||
// don't bother about boiler
|
// don't bother about boiler
|
||||||
@ -255,7 +255,7 @@ public final class PowerPointExtractor extends POIOLE2TextExtractor {
|
|||||||
textRunsToText(ret, slide.getTextRuns());
|
textRunsToText(ret, slide.getTextRuns());
|
||||||
|
|
||||||
// Table text
|
// Table text
|
||||||
for (Shape shape : slide.getShapes()){
|
for (HSLFShape shape : slide.getShapes()){
|
||||||
if (shape instanceof Table){
|
if (shape instanceof Table){
|
||||||
extractTableText(ret, (Table)shape);
|
extractTableText(ret, (Table)shape);
|
||||||
}
|
}
|
||||||
|
@ -65,7 +65,7 @@ public final class ActiveXShape extends Picture {
|
|||||||
* this picture in the <code>Slide</code>
|
* this picture in the <code>Slide</code>
|
||||||
* @param parent the parent shape of this picture
|
* @param parent the parent shape of this picture
|
||||||
*/
|
*/
|
||||||
protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -35,13 +35,13 @@ import java.awt.geom.Rectangle2D;
|
|||||||
*/
|
*/
|
||||||
public class AutoShape extends TextShape {
|
public class AutoShape extends TextShape {
|
||||||
|
|
||||||
protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoShape(ShapeType type, ShapeContainer<Shape> parent){
|
public AutoShape(ShapeType type, ShapeContainer<HSLFShape> parent){
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(type, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(type, parent instanceof HSLFGroupShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoShape(ShapeType type){
|
public AutoShape(ShapeType type){
|
||||||
|
@ -70,14 +70,14 @@ public final class AutoShapes {
|
|||||||
shapes = new ShapeOutline[255];
|
shapes = new ShapeOutline[255];
|
||||||
|
|
||||||
shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600);
|
Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
RoundRectangle2D path = new RoundRectangle2D.Float(0, 0, 21600, 21600, adjval, adjval);
|
RoundRectangle2D path = new RoundRectangle2D.Float(0, 0, 21600, 21600, adjval, adjval);
|
||||||
return path;
|
return path;
|
||||||
@ -85,14 +85,14 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.ELLIPSE.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.ELLIPSE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600);
|
Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
path.moveTo(10800, 0);
|
path.moveTo(10800, 0);
|
||||||
path.lineTo(21600, 10800);
|
path.lineTo(21600, 10800);
|
||||||
@ -105,7 +105,7 @@ public final class AutoShapes {
|
|||||||
|
|
||||||
//m@0,l,21600r21600
|
//m@0,l,21600r21600
|
||||||
shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800);
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
path.moveTo(adjval, 0);
|
path.moveTo(adjval, 0);
|
||||||
@ -117,7 +117,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.RT_TRIANGLE.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.RT_TRIANGLE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
path.moveTo(0, 0);
|
path.moveTo(0, 0);
|
||||||
path.lineTo(21600, 21600);
|
path.lineTo(21600, 21600);
|
||||||
@ -128,7 +128,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.PARALLELOGRAM.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.PARALLELOGRAM.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
@ -142,7 +142,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.TRAPEZOID.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.TRAPEZOID.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
@ -156,7 +156,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.HEXAGON.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.HEXAGON.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
@ -172,7 +172,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.OCTAGON.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.OCTAGON.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326);
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
@ -190,7 +190,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.PLUS.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.PLUS.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
@ -212,7 +212,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.PENTAGON.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.PENTAGON.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
path.moveTo(10800, 0);
|
path.moveTo(10800, 0);
|
||||||
@ -226,7 +226,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.DOWN_ARROW.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.DOWN_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe
|
//m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200);
|
||||||
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
||||||
@ -244,7 +244,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.UP_ARROW.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.UP_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe
|
//m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
||||||
@ -262,7 +262,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.RIGHT_ARROW.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.RIGHT_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe
|
//m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 16200);
|
||||||
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
||||||
@ -280,7 +280,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.LEFT_ARROW.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.LEFT_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe
|
//m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 5400);
|
||||||
@ -298,7 +298,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.CAN.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.CAN.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe
|
//m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
@ -322,7 +322,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.LEFT_BRACE.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.LEFT_BRACE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e
|
//m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800);
|
||||||
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800);
|
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800);
|
||||||
@ -350,7 +350,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.RIGHT_BRACE.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.RIGHT_BRACE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
//m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e
|
//m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 1800);
|
||||||
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800);
|
int adjval2 = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUST2VALUE, 10800);
|
||||||
@ -378,7 +378,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeType.STRAIGHT_CONNECTOR_1.nativeId] = new ShapeOutline(){
|
shapes[ShapeType.STRAIGHT_CONNECTOR_1.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(HSLFShape shape){
|
||||||
return new Line2D.Float(0, 0, 21600, 21600);
|
return new Line2D.Float(0, 0, 21600, 21600);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -38,9 +38,9 @@ import org.apache.poi.util.POILogger;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public final class Background extends Shape {
|
public final class Background extends HSLFShape {
|
||||||
|
|
||||||
protected Background(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent) {
|
protected Background(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent) {
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,7 +98,7 @@ public final class Fill {
|
|||||||
/**
|
/**
|
||||||
* The shape this background applies to
|
* The shape this background applies to
|
||||||
*/
|
*/
|
||||||
protected Shape shape;
|
protected HSLFShape shape;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Construct a <code>Fill</code> object for a shape.
|
* Construct a <code>Fill</code> object for a shape.
|
||||||
@ -106,7 +106,7 @@ public final class Fill {
|
|||||||
*
|
*
|
||||||
* @param shape the shape this background applies to
|
* @param shape the shape this background applies to
|
||||||
*/
|
*/
|
||||||
public Fill(Shape shape){
|
public Fill(HSLFShape shape){
|
||||||
this.shape = shape;
|
this.shape = shape;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,7 +118,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
public int getFillType(){
|
public int getFillType(){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
EscherSimpleProperty prop = Shape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE);
|
EscherSimpleProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__FILLTYPE);
|
||||||
return prop == null ? FILL_SOLID : prop.getPropertyValue();
|
return prop == null ? FILL_SOLID : prop.getPropertyValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -126,7 +126,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
protected void afterInsert(Sheet sh){
|
protected void afterInsert(Sheet sh){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
|
EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
|
||||||
if(p != null) {
|
if(p != null) {
|
||||||
int idx = p.getPropertyValue();
|
int idx = p.getPropertyValue();
|
||||||
EscherBSERecord bse = getEscherBSERecord(idx);
|
EscherBSERecord bse = getEscherBSERecord(idx);
|
||||||
@ -143,7 +143,7 @@ public final class Fill {
|
|||||||
SlideShow ppt = sheet.getSlideShow();
|
SlideShow ppt = sheet.getSlideShow();
|
||||||
Document doc = ppt.getDocumentRecord();
|
Document doc = ppt.getDocumentRecord();
|
||||||
EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
|
EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
|
||||||
EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
|
EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
|
||||||
if(bstore == null) {
|
if(bstore == null) {
|
||||||
logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
|
logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
|
||||||
return null;
|
return null;
|
||||||
@ -160,7 +160,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
public void setFillType(int type){
|
public void setFillType(int type){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
Shape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type);
|
HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLTYPE, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -168,7 +168,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
public Color getForegroundColor(){
|
public Color getForegroundColor(){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
|
EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
|
||||||
|
|
||||||
if(p != null && (p.getPropertyValue() & 0x10) == 0) return null;
|
if(p != null && (p.getPropertyValue() & 0x10) == 0) return null;
|
||||||
|
|
||||||
@ -182,12 +182,12 @@ public final class Fill {
|
|||||||
public void setForegroundColor(Color color){
|
public void setForegroundColor(Color color){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
if (color == null) {
|
if (color == null) {
|
||||||
Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000);
|
HSLFShape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150000);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
|
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
|
||||||
Shape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb);
|
HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLCOLOR, rgb);
|
||||||
Shape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011);
|
HSLFShape.setEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST, 0x150011);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -196,7 +196,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
public Color getBackgroundColor(){
|
public Color getBackgroundColor(){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
|
EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__NOFILLHITTEST);
|
||||||
|
|
||||||
if(p != null && (p.getPropertyValue() & 0x10) == 0) return null;
|
if(p != null && (p.getPropertyValue() & 0x10) == 0) return null;
|
||||||
|
|
||||||
@ -209,11 +209,11 @@ public final class Fill {
|
|||||||
public void setBackgroundColor(Color color){
|
public void setBackgroundColor(Color color){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
if (color == null) {
|
if (color == null) {
|
||||||
Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1);
|
HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, -1);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
|
int rgb = new Color(color.getBlue(), color.getGreen(), color.getRed(), 0).getRGB();
|
||||||
Shape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb);
|
HSLFShape.setEscherProperty(opt, EscherProperties.FILL__FILLBACKCOLOR, rgb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,7 +222,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
public PictureData getPictureData(){
|
public PictureData getPictureData(){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
EscherSimpleProperty p = Shape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
|
EscherSimpleProperty p = HSLFShape.getEscherProperty(opt, EscherProperties.FILL__PATTERNTEXTURE);
|
||||||
if (p == null) return null;
|
if (p == null) return null;
|
||||||
|
|
||||||
SlideShow ppt = shape.getSheet().getSlideShow();
|
SlideShow ppt = shape.getSheet().getSlideShow();
|
||||||
@ -230,7 +230,7 @@ public final class Fill {
|
|||||||
Document doc = ppt.getDocumentRecord();
|
Document doc = ppt.getDocumentRecord();
|
||||||
|
|
||||||
EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
|
EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
|
||||||
EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
|
EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
|
||||||
|
|
||||||
java.util.List<EscherRecord> lst = bstore.getChildRecords();
|
java.util.List<EscherRecord> lst = bstore.getChildRecords();
|
||||||
int idx = p.getPropertyValue();
|
int idx = p.getPropertyValue();
|
||||||
@ -255,7 +255,7 @@ public final class Fill {
|
|||||||
*/
|
*/
|
||||||
public void setPictureData(int idx){
|
public void setPictureData(int idx){
|
||||||
EscherOptRecord opt = shape.getEscherOptRecord();
|
EscherOptRecord opt = shape.getEscherOptRecord();
|
||||||
Shape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx);
|
HSLFShape.setEscherProperty(opt, (short)(EscherProperties.FILL__PATTERNTEXTURE + 0x4000), idx);
|
||||||
if( idx != 0 ) {
|
if( idx != 0 ) {
|
||||||
if( shape.getSheet() != null ) {
|
if( shape.getSheet() != null ) {
|
||||||
EscherBSERecord bse = getEscherBSERecord(idx);
|
EscherBSERecord bse = getEscherBSERecord(idx);
|
||||||
|
@ -62,7 +62,7 @@ public final class Freeform extends AutoShape {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected Freeform(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected Freeform(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -73,9 +73,9 @@ public final class Freeform extends AutoShape {
|
|||||||
* @param parent the parent of this Shape. For example, if this text box is a cell
|
* @param parent the parent of this Shape. For example, if this text box is a cell
|
||||||
* in a table then the parent is Table.
|
* in a table then the parent is Table.
|
||||||
*/
|
*/
|
||||||
public Freeform(ShapeContainer<Shape> parent){
|
public Freeform(ShapeContainer<HSLFShape> parent){
|
||||||
super((EscherContainerRecord)null, parent);
|
super((EscherContainerRecord)null, parent);
|
||||||
_escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -40,13 +40,13 @@ import org.apache.poi.util.POILogger;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
public class HSLFGroupShape extends HSLFShape implements ShapeContainer<HSLFShape> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new ShapeGroup. This constructor is used when a new shape is created.
|
* Create a new ShapeGroup. This constructor is used when a new shape is created.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public ShapeGroup(){
|
public HSLFGroupShape(){
|
||||||
this(null, null);
|
this(null, null);
|
||||||
_escherContainer = createSpContainer(false);
|
_escherContainer = createSpContainer(false);
|
||||||
}
|
}
|
||||||
@ -57,16 +57,16 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected ShapeGroup(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected HSLFGroupShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the shapes contained in this group container
|
* @return the shapes contained in this group container
|
||||||
*/
|
*/
|
||||||
public Shape[] getShapes() {
|
public HSLFShape[] getShapes() {
|
||||||
List<Shape> shapeList = getShapeList();
|
List<HSLFShape> shapeList = getShapeList();
|
||||||
Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]);
|
HSLFShape[] shapes = shapeList.toArray(new HSLFShape[shapeList.size()]);
|
||||||
return shapes;
|
return shapes;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -174,7 +174,7 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
*
|
*
|
||||||
* @param shape - the Shape to add
|
* @param shape - the Shape to add
|
||||||
*/
|
*/
|
||||||
public void addShape(Shape shape){
|
public void addShape(HSLFShape shape){
|
||||||
_escherContainer.addChildRecord(shape.getSpContainer());
|
_escherContainer.addChildRecord(shape.getSpContainer());
|
||||||
|
|
||||||
Sheet sheet = getSheet();
|
Sheet sheet = getSheet();
|
||||||
@ -196,7 +196,7 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
anchor.translate(dx, dy);
|
anchor.translate(dx, dy);
|
||||||
setAnchor(anchor);
|
setAnchor(anchor);
|
||||||
|
|
||||||
Shape[] shape = getShapes();
|
HSLFShape[] shape = getShapes();
|
||||||
for (int i = 0; i < shape.length; i++) {
|
for (int i = 0; i < shape.length; i++) {
|
||||||
java.awt.Rectangle chanchor = shape[i].getAnchor();
|
java.awt.Rectangle chanchor = shape[i].getAnchor();
|
||||||
chanchor.translate(dx, dy);
|
chanchor.translate(dx, dy);
|
||||||
@ -257,7 +257,7 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
|
|
||||||
AffineTransform at = graphics.getTransform();
|
AffineTransform at = graphics.getTransform();
|
||||||
|
|
||||||
Shape[] sh = getShapes();
|
HSLFShape[] sh = getShapes();
|
||||||
for (int i = 0; i < sh.length; i++) {
|
for (int i = 0; i < sh.length; i++) {
|
||||||
sh[i].draw(graphics);
|
sh[i].draw(graphics);
|
||||||
}
|
}
|
||||||
@ -271,11 +271,11 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
return groupInfoContainer.getChildById((short)recordId);
|
return groupInfoContainer.getChildById((short)recordId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Iterator<Shape> iterator() {
|
public Iterator<HSLFShape> iterator() {
|
||||||
return getShapeList().iterator();
|
return getShapeList().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean removeShape(Shape shape) {
|
public boolean removeShape(HSLFShape shape) {
|
||||||
// TODO: implement!
|
// TODO: implement!
|
||||||
throw new UnsupportedOperationException();
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
@ -283,7 +283,7 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
/**
|
/**
|
||||||
* @return the shapes contained in this group container
|
* @return the shapes contained in this group container
|
||||||
*/
|
*/
|
||||||
protected List<Shape> getShapeList() {
|
protected List<HSLFShape> getShapeList() {
|
||||||
// Out escher container record should contain several
|
// Out escher container record should contain several
|
||||||
// SpContainers, the first of which is the group shape itself
|
// SpContainers, the first of which is the group shape itself
|
||||||
Iterator<EscherRecord> iter = _escherContainer.getChildIterator();
|
Iterator<EscherRecord> iter = _escherContainer.getChildIterator();
|
||||||
@ -292,13 +292,13 @@ public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
|||||||
if (iter.hasNext()) {
|
if (iter.hasNext()) {
|
||||||
iter.next();
|
iter.next();
|
||||||
}
|
}
|
||||||
List<Shape> shapeList = new ArrayList<Shape>();
|
List<HSLFShape> shapeList = new ArrayList<HSLFShape>();
|
||||||
while (iter.hasNext()) {
|
while (iter.hasNext()) {
|
||||||
EscherRecord r = iter.next();
|
EscherRecord r = iter.next();
|
||||||
if(r instanceof EscherContainerRecord) {
|
if(r instanceof EscherContainerRecord) {
|
||||||
// Create the Shape for it
|
// Create the Shape for it
|
||||||
EscherContainerRecord container = (EscherContainerRecord)r;
|
EscherContainerRecord container = (EscherContainerRecord)r;
|
||||||
Shape shape = ShapeFactory.createShape(container, this);
|
HSLFShape shape = ShapeFactory.createShape(container, this);
|
||||||
shape.setSheet(getSheet());
|
shape.setSheet(getSheet());
|
||||||
shapeList.add( shape );
|
shapeList.add( shape );
|
||||||
} else {
|
} else {
|
@ -45,7 +45,7 @@ import java.awt.geom.Rectangle2D;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public abstract class Shape implements org.apache.poi.sl.usermodel.Shape<Shape> {
|
public abstract class HSLFShape implements org.apache.poi.sl.usermodel.Shape<HSLFShape> {
|
||||||
|
|
||||||
// For logging
|
// For logging
|
||||||
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
||||||
@ -85,7 +85,7 @@ public abstract class Shape implements org.apache.poi.sl.usermodel.Shape<Shape>
|
|||||||
* Parent of this shape.
|
* Parent of this shape.
|
||||||
* <code>null</code> for the topmost shapes.
|
* <code>null</code> for the topmost shapes.
|
||||||
*/
|
*/
|
||||||
protected ShapeContainer<Shape> _parent;
|
protected ShapeContainer<HSLFShape> _parent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The <code>Sheet</code> this shape belongs to
|
* The <code>Sheet</code> this shape belongs to
|
||||||
@ -103,7 +103,7 @@ public abstract class Shape implements org.apache.poi.sl.usermodel.Shape<Shape>
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of this Shape
|
* @param parent the parent of this Shape
|
||||||
*/
|
*/
|
||||||
protected Shape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected HSLFShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
_escherContainer = escherRecord;
|
_escherContainer = escherRecord;
|
||||||
_parent = parent;
|
_parent = parent;
|
||||||
}
|
}
|
||||||
@ -116,7 +116,7 @@ public abstract class Shape implements org.apache.poi.sl.usermodel.Shape<Shape>
|
|||||||
/**
|
/**
|
||||||
* @return the parent of this shape
|
* @return the parent of this shape
|
||||||
*/
|
*/
|
||||||
public ShapeContainer<Shape> getParent(){
|
public ShapeContainer<HSLFShape> getParent(){
|
||||||
return _parent;
|
return _parent;
|
||||||
}
|
}
|
||||||
|
|
@ -176,7 +176,7 @@ public final class Hyperlink {
|
|||||||
* @param shape <code>Shape</code> to lookup hyperlink in
|
* @param shape <code>Shape</code> to lookup hyperlink in
|
||||||
* @return found hyperlink or <code>null</code>
|
* @return found hyperlink or <code>null</code>
|
||||||
*/
|
*/
|
||||||
protected static Hyperlink find(Shape shape){
|
protected static Hyperlink find(HSLFShape shape){
|
||||||
List<Hyperlink> lst = new ArrayList<Hyperlink>();
|
List<Hyperlink> lst = new ArrayList<Hyperlink>();
|
||||||
SlideShow ppt = shape.getSheet().getSlideShow();
|
SlideShow ppt = shape.getSheet().getSlideShow();
|
||||||
//document-level container which stores info about all links in a presentation
|
//document-level container which stores info about all links in a presentation
|
||||||
|
@ -97,13 +97,13 @@ public final class Line extends SimpleShape {
|
|||||||
public static final int LINE_TRIPLE = 4;
|
public static final int LINE_TRIPLE = 4;
|
||||||
|
|
||||||
|
|
||||||
protected Line(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected Line(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Line(ShapeContainer<Shape> parent){
|
public Line(ShapeContainer<HSLFShape> parent){
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(parent instanceof HSLFGroupShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Line(){
|
public Line(){
|
||||||
|
@ -46,7 +46,7 @@ public abstract class MasterSheet extends Sheet {
|
|||||||
*
|
*
|
||||||
* @return true if the shape is a placeholder
|
* @return true if the shape is a placeholder
|
||||||
*/
|
*/
|
||||||
public static boolean isPlaceholder(Shape shape){
|
public static boolean isPlaceholder(HSLFShape shape){
|
||||||
if(!(shape instanceof TextShape)) return false;
|
if(!(shape instanceof TextShape)) return false;
|
||||||
|
|
||||||
TextShape tx = (TextShape)shape;
|
TextShape tx = (TextShape)shape;
|
||||||
|
@ -55,7 +55,7 @@ public final class MovieShape extends Picture {
|
|||||||
* @param idx the index of the picture
|
* @param idx the index of the picture
|
||||||
* @param parent the parent shape
|
* @param parent the parent shape
|
||||||
*/
|
*/
|
||||||
public MovieShape(int movieIdx, int idx, ShapeContainer<Shape> parent) {
|
public MovieShape(int movieIdx, int idx, ShapeContainer<HSLFShape> parent) {
|
||||||
super(idx, parent);
|
super(idx, parent);
|
||||||
setMovieIndex(movieIdx);
|
setMovieIndex(movieIdx);
|
||||||
}
|
}
|
||||||
@ -67,7 +67,7 @@ public final class MovieShape extends Picture {
|
|||||||
* this picture in the <code>Slide</code>
|
* this picture in the <code>Slide</code>
|
||||||
* @param parent the parent shape of this picture
|
* @param parent the parent shape of this picture
|
||||||
*/
|
*/
|
||||||
protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ public final class OLEShape extends Picture {
|
|||||||
* @param idx the index of the picture
|
* @param idx the index of the picture
|
||||||
* @param parent the parent shape
|
* @param parent the parent shape
|
||||||
*/
|
*/
|
||||||
public OLEShape(int idx, ShapeContainer<Shape> parent) {
|
public OLEShape(int idx, ShapeContainer<HSLFShape> parent) {
|
||||||
super(idx, parent);
|
super(idx, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ public final class OLEShape extends Picture {
|
|||||||
* this picture in the <code>Slide</code>
|
* this picture in the <code>Slide</code>
|
||||||
* @param parent the parent shape of this picture
|
* @param parent the parent shape of this picture
|
||||||
*/
|
*/
|
||||||
protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
|||||||
protected POILogger log = POILogFactory.getLogger(this.getClass());
|
protected POILogger log = POILogFactory.getLogger(this.getClass());
|
||||||
|
|
||||||
//The ppt object to write into.
|
//The ppt object to write into.
|
||||||
private ShapeGroup _group;
|
private HSLFGroupShape _group;
|
||||||
|
|
||||||
private AffineTransform _transform;
|
private AffineTransform _transform;
|
||||||
private Stroke _stroke;
|
private Stroke _stroke;
|
||||||
@ -58,7 +58,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
|||||||
*
|
*
|
||||||
* @param group The shape group to write the graphics calls into.
|
* @param group The shape group to write the graphics calls into.
|
||||||
*/
|
*/
|
||||||
public PPGraphics2D(ShapeGroup group){
|
public PPGraphics2D(HSLFGroupShape group){
|
||||||
this._group = group;
|
this._group = group;
|
||||||
|
|
||||||
_transform = new AffineTransform();
|
_transform = new AffineTransform();
|
||||||
@ -73,7 +73,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
|||||||
/**
|
/**
|
||||||
* @return the shape group being used for drawing
|
* @return the shape group being used for drawing
|
||||||
*/
|
*/
|
||||||
public ShapeGroup getShapeGroup(){
|
public HSLFGroupShape getShapeGroup(){
|
||||||
return _group;
|
return _group;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -98,9 +98,9 @@ public class Picture extends SimpleShape {
|
|||||||
* @param idx the index of the picture
|
* @param idx the index of the picture
|
||||||
* @param parent the parent shape
|
* @param parent the parent shape
|
||||||
*/
|
*/
|
||||||
public Picture(int idx, ShapeContainer<Shape> parent) {
|
public Picture(int idx, ShapeContainer<HSLFShape> parent) {
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(idx, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(idx, parent instanceof HSLFGroupShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -110,7 +110,7 @@ public class Picture extends SimpleShape {
|
|||||||
* this picture in the <code>Slide</code>
|
* this picture in the <code>Slide</code>
|
||||||
* @param parent the parent shape of this picture
|
* @param parent the parent shape of this picture
|
||||||
*/
|
*/
|
||||||
protected Picture(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected Picture(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,7 +205,7 @@ public class Picture extends SimpleShape {
|
|||||||
SlideShow ppt = getSheet().getSlideShow();
|
SlideShow ppt = getSheet().getSlideShow();
|
||||||
Document doc = ppt.getDocumentRecord();
|
Document doc = ppt.getDocumentRecord();
|
||||||
EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
|
EscherContainerRecord dggContainer = doc.getPPDrawingGroup().getDggContainer();
|
||||||
EscherContainerRecord bstore = Shape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
|
EscherContainerRecord bstore = HSLFShape.getEscherChild(dggContainer, EscherContainerRecord.BSTORE_CONTAINER);
|
||||||
if(bstore == null) {
|
if(bstore == null) {
|
||||||
logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
|
logger.log(POILogger.DEBUG, "EscherContainerRecord.BSTORE_CONTAINER was not found ");
|
||||||
return null;
|
return null;
|
||||||
|
@ -31,11 +31,11 @@ import java.io.ByteArrayOutputStream;
|
|||||||
*/
|
*/
|
||||||
public final class Placeholder extends TextBox {
|
public final class Placeholder extends TextBox {
|
||||||
|
|
||||||
protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Placeholder(ShapeContainer<Shape> parent){
|
public Placeholder(ShapeContainer<HSLFShape> parent){
|
||||||
super(parent);
|
super(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +36,7 @@ public final class Polygon extends AutoShape {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected Polygon(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected Polygon(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -47,9 +47,9 @@ public final class Polygon extends AutoShape {
|
|||||||
* @param parent the parent of this Shape. For example, if this text box is a cell
|
* @param parent the parent of this Shape. For example, if this text box is a cell
|
||||||
* in a table then the parent is Table.
|
* in a table then the parent is Table.
|
||||||
*/
|
*/
|
||||||
public Polygon(ShapeContainer<Shape> parent){
|
public Polygon(ShapeContainer<HSLFShape> parent){
|
||||||
super((EscherContainerRecord)null, parent);
|
super((EscherContainerRecord)null, parent);
|
||||||
_escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof HSLFGroupShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -51,16 +51,16 @@ public final class ShapeFactory {
|
|||||||
/**
|
/**
|
||||||
* Create a new shape from the data provided.
|
* Create a new shape from the data provided.
|
||||||
*/
|
*/
|
||||||
public static Shape createShape(EscherContainerRecord spContainer, ShapeContainer<Shape> parent){
|
public static HSLFShape createShape(EscherContainerRecord spContainer, ShapeContainer<HSLFShape> parent){
|
||||||
if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){
|
if (spContainer.getRecordId() == EscherContainerRecord.SPGR_CONTAINER){
|
||||||
return createShapeGroup(spContainer, parent);
|
return createShapeGroup(spContainer, parent);
|
||||||
}
|
}
|
||||||
return createSimpeShape(spContainer, parent);
|
return createSimpeShape(spContainer, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, ShapeContainer<Shape> parent){
|
public static HSLFGroupShape createShapeGroup(EscherContainerRecord spContainer, ShapeContainer<HSLFShape> parent){
|
||||||
ShapeGroup group = null;
|
HSLFGroupShape group = null;
|
||||||
EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
|
EscherRecord opt = HSLFShape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
|
||||||
if(opt != null){
|
if(opt != null){
|
||||||
try {
|
try {
|
||||||
EscherPropertyFactory f = new EscherPropertyFactory();
|
EscherPropertyFactory f = new EscherPropertyFactory();
|
||||||
@ -69,21 +69,21 @@ public final class ShapeFactory {
|
|||||||
if(p.getPropertyNumber() == 0x39F && p.getPropertyValue() == 1){
|
if(p.getPropertyNumber() == 0x39F && p.getPropertyValue() == 1){
|
||||||
group = new Table(spContainer, parent);
|
group = new Table(spContainer, parent);
|
||||||
} else {
|
} else {
|
||||||
group = new ShapeGroup(spContainer, parent);
|
group = new HSLFGroupShape(spContainer, parent);
|
||||||
}
|
}
|
||||||
} catch (Exception e){
|
} catch (Exception e){
|
||||||
logger.log(POILogger.WARN, e.getMessage());
|
logger.log(POILogger.WARN, e.getMessage());
|
||||||
group = new ShapeGroup(spContainer, parent);
|
group = new HSLFGroupShape(spContainer, parent);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
group = new ShapeGroup(spContainer, parent);
|
group = new HSLFGroupShape(spContainer, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Shape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer<Shape> parent){
|
public static HSLFShape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer<HSLFShape> parent){
|
||||||
Shape shape = null;
|
HSLFShape shape = null;
|
||||||
EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
|
|
||||||
ShapeType type = ShapeType.forId(spRecord.getShapeType(), false);
|
ShapeType type = ShapeType.forId(spRecord.getShapeType(), false);
|
||||||
@ -117,8 +117,8 @@ public final class ShapeFactory {
|
|||||||
shape = new Line(spContainer, parent);
|
shape = new Line(spContainer, parent);
|
||||||
break;
|
break;
|
||||||
case NOT_PRIMITIVE: {
|
case NOT_PRIMITIVE: {
|
||||||
EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
|
EscherOptRecord opt = HSLFShape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
|
||||||
EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
|
EscherProperty prop = HSLFShape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
|
||||||
if(prop != null)
|
if(prop != null)
|
||||||
shape = new Freeform(spContainer, parent);
|
shape = new Freeform(spContainer, parent);
|
||||||
else {
|
else {
|
||||||
|
@ -23,6 +23,6 @@ package org.apache.poi.hslf.model;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public interface ShapeOutline {
|
public interface ShapeOutline {
|
||||||
java.awt.Shape getOutline(Shape shape);
|
java.awt.Shape getOutline(HSLFShape shape);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -57,7 +57,7 @@ import org.apache.poi.util.POILogger;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public abstract class Sheet implements ShapeContainer<Shape> {
|
public abstract class Sheet implements ShapeContainer<HSLFShape> {
|
||||||
private static POILogger logger = POILogFactory.getLogger(Sheet.class);
|
private static POILogger logger = POILogFactory.getLogger(Sheet.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -272,9 +272,9 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
*
|
*
|
||||||
* @return all shapes contained in this Sheet (Slide or Notes)
|
* @return all shapes contained in this Sheet (Slide or Notes)
|
||||||
*/
|
*/
|
||||||
public Shape[] getShapes() {
|
public HSLFShape[] getShapes() {
|
||||||
List<Shape> shapeList = getShapeList();
|
List<HSLFShape> shapeList = getShapeList();
|
||||||
return shapeList.toArray(new Shape[shapeList.size()]);
|
return shapeList.toArray(new HSLFShape[shapeList.size()]);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -282,11 +282,11 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
*
|
*
|
||||||
* @param shape - the Shape to add
|
* @param shape - the Shape to add
|
||||||
*/
|
*/
|
||||||
public void addShape(Shape shape) {
|
public void addShape(HSLFShape shape) {
|
||||||
PPDrawing ppdrawing = getPPDrawing();
|
PPDrawing ppdrawing = getPPDrawing();
|
||||||
|
|
||||||
EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
EscherContainerRecord dgContainer = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
||||||
EscherContainerRecord spgr = (EscherContainerRecord) Shape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER);
|
EscherContainerRecord spgr = (EscherContainerRecord) HSLFShape.getEscherChild(dgContainer, EscherContainerRecord.SPGR_CONTAINER);
|
||||||
spgr.addChildRecord(shape.getSpContainer());
|
spgr.addChildRecord(shape.getSpContainer());
|
||||||
|
|
||||||
shape.setSheet(this);
|
shape.setSheet(this);
|
||||||
@ -339,7 +339,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
* @param shape shape to be removed from this sheet, if present.
|
* @param shape shape to be removed from this sheet, if present.
|
||||||
* @return <tt>true</tt> if the shape was deleted.
|
* @return <tt>true</tt> if the shape was deleted.
|
||||||
*/
|
*/
|
||||||
public boolean removeShape(Shape shape) {
|
public boolean removeShape(HSLFShape shape) {
|
||||||
PPDrawing ppdrawing = getPPDrawing();
|
PPDrawing ppdrawing = getPPDrawing();
|
||||||
|
|
||||||
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
||||||
@ -427,7 +427,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
* @return <code>TextShape</code> or <code>null</code>
|
* @return <code>TextShape</code> or <code>null</code>
|
||||||
*/
|
*/
|
||||||
public TextShape getPlaceholderByTextType(int type){
|
public TextShape getPlaceholderByTextType(int type){
|
||||||
Shape[] shape = getShapes();
|
HSLFShape[] shape = getShapes();
|
||||||
for (int i = 0; i < shape.length; i++) {
|
for (int i = 0; i < shape.length; i++) {
|
||||||
if(shape[i] instanceof TextShape){
|
if(shape[i] instanceof TextShape){
|
||||||
TextShape tx = (TextShape)shape[i];
|
TextShape tx = (TextShape)shape[i];
|
||||||
@ -447,7 +447,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
* @return <code>TextShape</code> or <code>null</code>
|
* @return <code>TextShape</code> or <code>null</code>
|
||||||
*/
|
*/
|
||||||
public TextShape getPlaceholder(int type){
|
public TextShape getPlaceholder(int type){
|
||||||
Shape[] shape = getShapes();
|
HSLFShape[] shape = getShapes();
|
||||||
for (int i = 0; i < shape.length; i++) {
|
for (int i = 0; i < shape.length; i++) {
|
||||||
if(shape[i] instanceof TextShape){
|
if(shape[i] instanceof TextShape){
|
||||||
TextShape tx = (TextShape)shape[i];
|
TextShape tx = (TextShape)shape[i];
|
||||||
@ -497,7 +497,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Iterator<Shape> iterator() {
|
public Iterator<HSLFShape> iterator() {
|
||||||
return getShapeList().iterator();
|
return getShapeList().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -507,7 +507,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
*
|
*
|
||||||
* @return all shapes contained in this Sheet (Slide or Notes)
|
* @return all shapes contained in this Sheet (Slide or Notes)
|
||||||
*/
|
*/
|
||||||
protected List<Shape> getShapeList() {
|
protected List<HSLFShape> getShapeList() {
|
||||||
PPDrawing ppdrawing = getPPDrawing();
|
PPDrawing ppdrawing = getPPDrawing();
|
||||||
|
|
||||||
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
||||||
@ -524,7 +524,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
throw new IllegalStateException("spgr not found");
|
throw new IllegalStateException("spgr not found");
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Shape> shapeList = new ArrayList<Shape>();
|
List<HSLFShape> shapeList = new ArrayList<HSLFShape>();
|
||||||
Iterator<EscherRecord> it = spgr.getChildIterator();
|
Iterator<EscherRecord> it = spgr.getChildIterator();
|
||||||
if (it.hasNext()) {
|
if (it.hasNext()) {
|
||||||
// skip first item
|
// skip first item
|
||||||
@ -532,7 +532,7 @@ public abstract class Sheet implements ShapeContainer<Shape> {
|
|||||||
}
|
}
|
||||||
for (; it.hasNext();) {
|
for (; it.hasNext();) {
|
||||||
EscherContainerRecord sp = (EscherContainerRecord) it.next();
|
EscherContainerRecord sp = (EscherContainerRecord) it.next();
|
||||||
Shape sh = ShapeFactory.createShape(sp, null);
|
HSLFShape sh = ShapeFactory.createShape(sp, null);
|
||||||
sh.setSheet(this);
|
sh.setSheet(this);
|
||||||
shapeList.add(sh);
|
shapeList.add(sh);
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ import org.apache.poi.util.LittleEndian;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public abstract class SimpleShape extends Shape {
|
public abstract class SimpleShape extends HSLFShape {
|
||||||
|
|
||||||
public final static double DEFAULT_LINE_WIDTH = 0.75;
|
public final static double DEFAULT_LINE_WIDTH = 0.75;
|
||||||
|
|
||||||
@ -63,7 +63,7 @@ public abstract class SimpleShape extends Shape {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,15 +223,15 @@ public abstract class SimpleShape extends Shape {
|
|||||||
|
|
||||||
//if it is a groupped shape see if we need to transform the coordinates
|
//if it is a groupped shape see if we need to transform the coordinates
|
||||||
if (getParent() != null){
|
if (getParent() != null){
|
||||||
ArrayList<ShapeGroup> lst = new ArrayList<ShapeGroup>();
|
ArrayList<HSLFGroupShape> lst = new ArrayList<HSLFGroupShape>();
|
||||||
for (ShapeContainer<Shape> parent=this.getParent();
|
for (ShapeContainer<HSLFShape> parent=this.getParent();
|
||||||
parent instanceof ShapeGroup;
|
parent instanceof HSLFGroupShape;
|
||||||
parent = ((ShapeGroup)parent).getParent()) {
|
parent = ((HSLFGroupShape)parent).getParent()) {
|
||||||
lst.add(0, (ShapeGroup)parent);
|
lst.add(0, (HSLFGroupShape)parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
AffineTransform tx = new AffineTransform();
|
AffineTransform tx = new AffineTransform();
|
||||||
for(ShapeGroup prnt : lst) {
|
for(HSLFGroupShape prnt : lst) {
|
||||||
Rectangle2D exterior = prnt.getAnchor2D();
|
Rectangle2D exterior = prnt.getAnchor2D();
|
||||||
Rectangle2D interior = prnt.getCoordinates();
|
Rectangle2D interior = prnt.getCoordinates();
|
||||||
|
|
||||||
|
@ -149,7 +149,7 @@ public final class Slide extends Sheet {
|
|||||||
//initialize drawing group id
|
//initialize drawing group id
|
||||||
EscherDggRecord dgg = getSlideShow().getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
|
EscherDggRecord dgg = getSlideShow().getDocumentRecord().getPPDrawingGroup().getEscherDggRecord();
|
||||||
EscherContainerRecord dgContainer = (EscherContainerRecord)getSheetContainer().getPPDrawing().getEscherRecords()[0];
|
EscherContainerRecord dgContainer = (EscherContainerRecord)getSheetContainer().getPPDrawing().getEscherRecords()[0];
|
||||||
EscherDgRecord dg = (EscherDgRecord) Shape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID);
|
EscherDgRecord dg = (EscherDgRecord) HSLFShape.getEscherChild(dgContainer, EscherDgRecord.RECORD_ID);
|
||||||
int dgId = dgg.getMaxDrawingGroupId() + 1;
|
int dgId = dgg.getMaxDrawingGroupId() + 1;
|
||||||
dg.setOptions((short)(dgId << 4));
|
dg.setOptions((short)(dgId << 4));
|
||||||
dgg.setDrawingsSaved(dgg.getDrawingsSaved() + 1);
|
dgg.setDrawingsSaved(dgg.getDrawingsSaved() + 1);
|
||||||
@ -428,7 +428,7 @@ public final class Slide extends Sheet {
|
|||||||
if(bg != null)bg.draw(graphics);
|
if(bg != null)bg.draw(graphics);
|
||||||
|
|
||||||
if(getFollowMasterObjects()){
|
if(getFollowMasterObjects()){
|
||||||
Shape[] sh = master.getShapes();
|
HSLFShape[] sh = master.getShapes();
|
||||||
for (int i = 0; i < sh.length; i++) {
|
for (int i = 0; i < sh.length; i++) {
|
||||||
if(MasterSheet.isPlaceholder(sh[i])) continue;
|
if(MasterSheet.isPlaceholder(sh[i])) continue;
|
||||||
|
|
||||||
@ -436,7 +436,7 @@ public final class Slide extends Sheet {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Shape[] sh = getShapes();
|
HSLFShape[] sh = getShapes();
|
||||||
for (int i = 0; i < sh.length; i++) {
|
for (int i = 0; i < sh.length; i++) {
|
||||||
sh[i].draw(graphics);
|
sh[i].draw(graphics);
|
||||||
}
|
}
|
||||||
|
@ -30,7 +30,7 @@ import java.awt.*;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public final class Table extends ShapeGroup {
|
public final class Table extends HSLFGroupShape {
|
||||||
|
|
||||||
protected static final int BORDER_TOP = 1;
|
protected static final int BORDER_TOP = 1;
|
||||||
protected static final int BORDER_RIGHT = 2;
|
protected static final int BORDER_RIGHT = 2;
|
||||||
@ -93,7 +93,7 @@ public final class Table extends ShapeGroup {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
public Table(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent) {
|
public Table(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent) {
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -150,9 +150,9 @@ public final class Table extends ShapeGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void initTable(){
|
protected void initTable(){
|
||||||
List<Shape> shapeList = getShapeList();
|
List<HSLFShape> shapeList = getShapeList();
|
||||||
Collections.sort(shapeList, new Comparator<Shape>(){
|
Collections.sort(shapeList, new Comparator<HSLFShape>(){
|
||||||
public int compare( Shape o1, Shape o2 ) {
|
public int compare( HSLFShape o1, HSLFShape o2 ) {
|
||||||
Rectangle anchor1 = o1.getAnchor();
|
Rectangle anchor1 = o1.getAnchor();
|
||||||
Rectangle anchor2 = o2.getAnchor();
|
Rectangle anchor2 = o2.getAnchor();
|
||||||
int delta = anchor1.y - anchor2.y;
|
int delta = anchor1.y - anchor2.y;
|
||||||
@ -162,14 +162,14 @@ public final class Table extends ShapeGroup {
|
|||||||
});
|
});
|
||||||
int y0 = -1;
|
int y0 = -1;
|
||||||
int maxrowlen = 0;
|
int maxrowlen = 0;
|
||||||
List<List<Shape>> lst = new ArrayList<List<Shape>>();
|
List<List<HSLFShape>> lst = new ArrayList<List<HSLFShape>>();
|
||||||
List<Shape> row = null;
|
List<HSLFShape> row = null;
|
||||||
for (Shape sh : shapeList) {
|
for (HSLFShape sh : shapeList) {
|
||||||
if(sh instanceof TextShape){
|
if(sh instanceof TextShape){
|
||||||
Rectangle anchor = sh.getAnchor();
|
Rectangle anchor = sh.getAnchor();
|
||||||
if(anchor.y != y0){
|
if(anchor.y != y0){
|
||||||
y0 = anchor.y;
|
y0 = anchor.y;
|
||||||
row = new ArrayList<Shape>();
|
row = new ArrayList<HSLFShape>();
|
||||||
lst.add(row);
|
lst.add(row);
|
||||||
}
|
}
|
||||||
row.add(sh);
|
row.add(sh);
|
||||||
|
@ -45,7 +45,7 @@ public final class TableCell extends TextBox {
|
|||||||
* @param escherRecord {@link EscherSpContainer} container which holds information about this shape
|
* @param escherRecord {@link EscherSpContainer} container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected TableCell(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected TableCell(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -55,7 +55,7 @@ public final class TableCell extends TextBox {
|
|||||||
* @param parent the parent of this Shape. For example, if this text box is a cell
|
* @param parent the parent of this Shape. For example, if this text box is a cell
|
||||||
* in a table then the parent is Table.
|
* in a table then the parent is Table.
|
||||||
*/
|
*/
|
||||||
public TableCell(ShapeContainer<Shape> parent){
|
public TableCell(ShapeContainer<HSLFShape> parent){
|
||||||
super(parent);
|
super(parent);
|
||||||
|
|
||||||
setShapeType(ShapeType.RECT);
|
setShapeType(ShapeType.RECT);
|
||||||
|
@ -38,7 +38,7 @@ public class TextBox extends TextShape {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected TextBox(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected TextBox(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -49,7 +49,7 @@ public class TextBox extends TextShape {
|
|||||||
* @param parent the parent of this Shape. For example, if this text box is a cell
|
* @param parent the parent of this Shape. For example, if this text box is a cell
|
||||||
* in a table then the parent is Table.
|
* in a table then the parent is Table.
|
||||||
*/
|
*/
|
||||||
public TextBox(ShapeContainer<Shape> parent){
|
public TextBox(ShapeContainer<HSLFShape> parent){
|
||||||
super(parent);
|
super(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,8 +270,8 @@ public final class TextPainter {
|
|||||||
|
|
||||||
TextRulerAtom ruler = run.getTextRuler();
|
TextRulerAtom ruler = run.getTextRuler();
|
||||||
if(ruler != null) {
|
if(ruler != null) {
|
||||||
int bullet_val = ruler.getBulletOffsets()[indent]*Shape.POINT_DPI/Shape.MASTER_DPI;
|
int bullet_val = ruler.getBulletOffsets()[indent]*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
int text_val = ruler.getTextOffsets()[indent]*Shape.POINT_DPI/Shape.MASTER_DPI;
|
int text_val = ruler.getTextOffsets()[indent]*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
if(bullet_val > text_val){
|
if(bullet_val > text_val){
|
||||||
int a = bullet_val;
|
int a = bullet_val;
|
||||||
bullet_val = text_val;
|
bullet_val = text_val;
|
||||||
@ -309,7 +309,7 @@ public final class TextPainter {
|
|||||||
if(linespacing >= 0){
|
if(linespacing >= 0){
|
||||||
el.ascent = textLayout.getAscent()*linespacing/100;
|
el.ascent = textLayout.getAscent()*linespacing/100;
|
||||||
} else {
|
} else {
|
||||||
el.ascent = -linespacing*Shape.POINT_DPI/Shape.MASTER_DPI;
|
el.ascent = -linespacing*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
el._align = rt.getAlignment();
|
el._align = rt.getAlignment();
|
||||||
@ -325,7 +325,7 @@ public final class TextPainter {
|
|||||||
if(sp >= 0){
|
if(sp >= 0){
|
||||||
spaceBefore = lineHeight * sp/100;
|
spaceBefore = lineHeight * sp/100;
|
||||||
} else {
|
} else {
|
||||||
spaceBefore = -sp*Shape.POINT_DPI/Shape.MASTER_DPI;
|
spaceBefore = -sp*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
}
|
}
|
||||||
el.ascent += spaceBefore;
|
el.ascent += spaceBefore;
|
||||||
}
|
}
|
||||||
@ -334,7 +334,7 @@ public final class TextPainter {
|
|||||||
if(linespacing >= 0){
|
if(linespacing >= 0){
|
||||||
descent = (textLayout.getDescent() + textLayout.getLeading())*linespacing/100;
|
descent = (textLayout.getDescent() + textLayout.getLeading())*linespacing/100;
|
||||||
} else {
|
} else {
|
||||||
descent = -linespacing*Shape.POINT_DPI/Shape.MASTER_DPI;
|
descent = -linespacing*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
}
|
}
|
||||||
if (prStart){
|
if (prStart){
|
||||||
int sp = rt.getSpaceAfter();
|
int sp = rt.getSpaceAfter();
|
||||||
@ -342,7 +342,7 @@ public final class TextPainter {
|
|||||||
if(sp >= 0){
|
if(sp >= 0){
|
||||||
spaceAfter = lineHeight * sp/100;
|
spaceAfter = lineHeight * sp/100;
|
||||||
} else {
|
} else {
|
||||||
spaceAfter = -sp*Shape.POINT_DPI/Shape.MASTER_DPI;
|
spaceAfter = -sp*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
}
|
}
|
||||||
el.ascent += spaceAfter;
|
el.ascent += spaceAfter;
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ public abstract class TextShape extends SimpleShape {
|
|||||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||||
* @param parent the parent of the shape
|
* @param parent the parent of the shape
|
||||||
*/
|
*/
|
||||||
protected TextShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
protected TextShape(EscherContainerRecord escherRecord, ShapeContainer<HSLFShape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -122,9 +122,9 @@ public abstract class TextShape extends SimpleShape {
|
|||||||
* @param parent the parent of this Shape. For example, if this text box is a cell
|
* @param parent the parent of this Shape. For example, if this text box is a cell
|
||||||
* in a table then the parent is Table.
|
* in a table then the parent is Table.
|
||||||
*/
|
*/
|
||||||
public TextShape(ShapeContainer<Shape> parent){
|
public TextShape(ShapeContainer<HSLFShape> parent){
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(parent instanceof HSLFGroupShape);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -20,7 +20,7 @@ package org.apache.poi.hslf.usermodel;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
import org.apache.poi.hslf.model.MasterSheet;
|
import org.apache.poi.hslf.model.MasterSheet;
|
||||||
import org.apache.poi.hslf.model.Shape;
|
import org.apache.poi.hslf.model.HSLFShape;
|
||||||
import org.apache.poi.hslf.model.Sheet;
|
import org.apache.poi.hslf.model.Sheet;
|
||||||
import org.apache.poi.hslf.model.TextRun;
|
import org.apache.poi.hslf.model.TextRun;
|
||||||
import org.apache.poi.hslf.model.textproperties.BitMaskTextProp;
|
import org.apache.poi.hslf.model.textproperties.BitMaskTextProp;
|
||||||
@ -618,28 +618,28 @@ public final class RichTextRun {
|
|||||||
* Sets the bullet offset
|
* Sets the bullet offset
|
||||||
*/
|
*/
|
||||||
public void setBulletOffset(int offset) {
|
public void setBulletOffset(int offset) {
|
||||||
setParaTextPropVal("bullet.offset", offset*Shape.MASTER_DPI/Shape.POINT_DPI);
|
setParaTextPropVal("bullet.offset", offset*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the bullet offset
|
* Returns the bullet offset
|
||||||
*/
|
*/
|
||||||
public int getBulletOffset() {
|
public int getBulletOffset() {
|
||||||
return getParaTextPropVal("bullet.offset")*Shape.POINT_DPI/Shape.MASTER_DPI;
|
return getParaTextPropVal("bullet.offset")*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the text offset
|
* Sets the text offset
|
||||||
*/
|
*/
|
||||||
public void setTextOffset(int offset) {
|
public void setTextOffset(int offset) {
|
||||||
setParaTextPropVal("text.offset", offset*Shape.MASTER_DPI/Shape.POINT_DPI);
|
setParaTextPropVal("text.offset", offset*HSLFShape.MASTER_DPI/HSLFShape.POINT_DPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the text offset
|
* Returns the text offset
|
||||||
*/
|
*/
|
||||||
public int getTextOffset() {
|
public int getTextOffset() {
|
||||||
return getParaTextPropVal("text.offset")*Shape.POINT_DPI/Shape.MASTER_DPI;
|
return getParaTextPropVal("text.offset")*HSLFShape.POINT_DPI/HSLFShape.MASTER_DPI;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -46,7 +46,7 @@ import org.apache.poi.hslf.model.MovieShape;
|
|||||||
import org.apache.poi.hslf.model.Notes;
|
import org.apache.poi.hslf.model.Notes;
|
||||||
import org.apache.poi.hslf.model.PPFont;
|
import org.apache.poi.hslf.model.PPFont;
|
||||||
import org.apache.poi.hslf.model.Picture;
|
import org.apache.poi.hslf.model.Picture;
|
||||||
import org.apache.poi.hslf.model.Shape;
|
import org.apache.poi.hslf.model.HSLFShape;
|
||||||
import org.apache.poi.hslf.model.Slide;
|
import org.apache.poi.hslf.model.Slide;
|
||||||
import org.apache.poi.hslf.model.SlideMaster;
|
import org.apache.poi.hslf.model.SlideMaster;
|
||||||
import org.apache.poi.hslf.model.TitleMaster;
|
import org.apache.poi.hslf.model.TitleMaster;
|
||||||
@ -532,8 +532,8 @@ public final class SlideShow {
|
|||||||
*/
|
*/
|
||||||
public Dimension getPageSize() {
|
public Dimension getPageSize() {
|
||||||
DocumentAtom docatom = _documentRecord.getDocumentAtom();
|
DocumentAtom docatom = _documentRecord.getDocumentAtom();
|
||||||
int pgx = (int) docatom.getSlideSizeX() * Shape.POINT_DPI / Shape.MASTER_DPI;
|
int pgx = (int) docatom.getSlideSizeX() * HSLFShape.POINT_DPI / HSLFShape.MASTER_DPI;
|
||||||
int pgy = (int) docatom.getSlideSizeY() * Shape.POINT_DPI / Shape.MASTER_DPI;
|
int pgy = (int) docatom.getSlideSizeY() * HSLFShape.POINT_DPI / HSLFShape.MASTER_DPI;
|
||||||
return new Dimension(pgx, pgy);
|
return new Dimension(pgx, pgy);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -545,8 +545,8 @@ public final class SlideShow {
|
|||||||
*/
|
*/
|
||||||
public void setPageSize(Dimension pgsize) {
|
public void setPageSize(Dimension pgsize) {
|
||||||
DocumentAtom docatom = _documentRecord.getDocumentAtom();
|
DocumentAtom docatom = _documentRecord.getDocumentAtom();
|
||||||
docatom.setSlideSizeX(pgsize.width * Shape.MASTER_DPI / Shape.POINT_DPI);
|
docatom.setSlideSizeX(pgsize.width * HSLFShape.MASTER_DPI / HSLFShape.POINT_DPI);
|
||||||
docatom.setSlideSizeY(pgsize.height * Shape.MASTER_DPI / Shape.POINT_DPI);
|
docatom.setSlideSizeY(pgsize.height * HSLFShape.MASTER_DPI / HSLFShape.POINT_DPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -784,7 +784,7 @@ public final class SlideShow {
|
|||||||
EscherContainerRecord bstore;
|
EscherContainerRecord bstore;
|
||||||
|
|
||||||
EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
|
EscherContainerRecord dggContainer = _documentRecord.getPPDrawingGroup().getDggContainer();
|
||||||
bstore = (EscherContainerRecord) Shape.getEscherChild(dggContainer,
|
bstore = (EscherContainerRecord) HSLFShape.getEscherChild(dggContainer,
|
||||||
EscherContainerRecord.BSTORE_CONTAINER);
|
EscherContainerRecord.BSTORE_CONTAINER);
|
||||||
if (bstore == null) {
|
if (bstore == null) {
|
||||||
bstore = new EscherContainerRecord();
|
bstore = new EscherContainerRecord();
|
||||||
|
@ -3,7 +3,7 @@ package org.apache.poi.sl.draw;
|
|||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
|
||||||
public class DrawAutoShape<T extends AutoShape> extends DrawTextShape<T> {
|
public class DrawAutoShape<T extends AutoShape<? extends TextParagraph>> extends DrawTextShape<T> {
|
||||||
public DrawAutoShape(T shape) {
|
public DrawAutoShape(T shape) {
|
||||||
super(shape);
|
super(shape);
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,41 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawBackground<T extends Background> extends DrawShape<T> {
|
||||||
|
public DrawBackground(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics) {
|
||||||
|
Dimension pg = shape.getSheet().getSlideShow().getPageSize();
|
||||||
|
final Rectangle2D anchor = new Rectangle2D.Double(0, 0, pg.getWidth(), pg.getHeight());
|
||||||
|
|
||||||
|
PlaceableShape ps = new PlaceableShape(){
|
||||||
|
public Rectangle2D getAnchor() { return anchor; }
|
||||||
|
public void setAnchor(Rectangle2D anchor) {}
|
||||||
|
public double getRotation() { return 0; }
|
||||||
|
public void setRotation(double theta) {}
|
||||||
|
public void setFlipHorizontal(boolean flip) {}
|
||||||
|
public void setFlipVertical(boolean flip) {}
|
||||||
|
public boolean getFlipHorizontal() { return false; }
|
||||||
|
public boolean getFlipVertical() { return false; }
|
||||||
|
};
|
||||||
|
|
||||||
|
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
||||||
|
DrawPaint dp = drawFact.getPaint(ps);
|
||||||
|
Paint fill = dp.getPaint(graphics, shape.getFillStyle().getPaint());
|
||||||
|
Rectangle2D anchor2 = getAnchor(graphics, anchor);
|
||||||
|
|
||||||
|
if(fill != null) {
|
||||||
|
graphics.setPaint(fill);
|
||||||
|
graphics.fill(anchor2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -40,8 +40,13 @@ public class DrawFactory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static DrawFactory getInstance(Graphics2D graphics) {
|
public static DrawFactory getInstance(Graphics2D graphics) {
|
||||||
// first try to find the factory over the rendering hing
|
// first try to find the factory over the rendering hint
|
||||||
DrawFactory factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY);
|
DrawFactory factory = null;
|
||||||
|
boolean isHint = false;
|
||||||
|
if (graphics != null) {
|
||||||
|
factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY);
|
||||||
|
isHint = true;
|
||||||
|
}
|
||||||
// secondly try the thread local default
|
// secondly try the thread local default
|
||||||
if (factory == null) {
|
if (factory == null) {
|
||||||
factory = defaultFactory.get();
|
factory = defaultFactory.get();
|
||||||
@ -49,43 +54,78 @@ public class DrawFactory {
|
|||||||
// and at last, use the default factory
|
// and at last, use the default factory
|
||||||
if (factory == null) {
|
if (factory == null) {
|
||||||
factory = new DrawFactory();
|
factory = new DrawFactory();
|
||||||
|
}
|
||||||
|
if (graphics != null && !isHint) {
|
||||||
graphics.setRenderingHint(DRAW_FACTORY, factory);
|
graphics.setRenderingHint(DRAW_FACTORY, factory);
|
||||||
}
|
}
|
||||||
return factory;
|
return factory;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Drawable getDrawable(Sheet sheet) {
|
|
||||||
return new DrawSheet(sheet);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Drawable getDrawable(MasterSheet sheet) {
|
|
||||||
return new DrawMasterSheet(sheet);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public Drawable getDrawable(Shape shape) {
|
public Drawable getDrawable(Shape shape) {
|
||||||
if (shape instanceof TextBox) {
|
if (shape instanceof TextBox) {
|
||||||
return getDrawable((TextBox)shape);
|
return getDrawable((TextBox<? extends TextParagraph<? extends TextRun>>)shape);
|
||||||
} else if (shape instanceof FreeformShape) {
|
} else if (shape instanceof FreeformShape) {
|
||||||
return getDrawable((FreeformShape)shape);
|
return getDrawable((FreeformShape<? extends TextParagraph<? extends TextRun>>)shape);
|
||||||
|
} else if (shape instanceof TextShape) {
|
||||||
|
return getDrawable((TextShape<? extends TextParagraph<? extends TextRun>>)shape);
|
||||||
|
} else if (shape instanceof ShapeGroup) {
|
||||||
|
return getDrawable((ShapeGroup<? extends Shape>)shape);
|
||||||
|
} else if (shape instanceof PictureShape) {
|
||||||
|
return getDrawable((PictureShape)shape);
|
||||||
|
} else if (shape instanceof Background) {
|
||||||
|
return getDrawable((Background)shape);
|
||||||
|
} else if (shape instanceof Slide) {
|
||||||
|
return getDrawable((Slide<? extends Shape>)shape);
|
||||||
|
} else if (shape instanceof MasterSheet) {
|
||||||
|
return getDrawable((MasterSheet<? extends Shape>)shape);
|
||||||
|
} else if (shape instanceof Sheet) {
|
||||||
|
return getDrawable((Sheet<? extends Shape>)shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass());
|
throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass());
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends TextBox> DrawTextBox<T> getDrawable(T shape) {
|
public <T extends Slide<? extends Shape>> DrawSlide<T> getDrawable(T sheet) {
|
||||||
|
return new DrawSlide<T>(sheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends Sheet<? extends Shape>> DrawSheet<T> getDrawable(T sheet) {
|
||||||
|
return new DrawSheet<T>(sheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends MasterSheet<? extends Shape>> DrawMasterSheet<T> getDrawable(T sheet) {
|
||||||
|
return new DrawMasterSheet<T>(sheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends TextBox<? extends TextParagraph<?>>> DrawTextBox<T> getDrawable(T shape) {
|
||||||
return new DrawTextBox<T>(shape);
|
return new DrawTextBox<T>(shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends FreeformShape> DrawFreeformShape<T> getDrawable(T shape) {
|
public <T extends FreeformShape<? extends TextParagraph<? extends TextRun>>> DrawFreeformShape<T> getDrawable(T shape) {
|
||||||
return new DrawFreeformShape<T>(shape);
|
return new DrawFreeformShape<T>(shape);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T extends TextShape<? extends TextParagraph<? extends TextRun>>> DrawTextShape<T> getDrawable(T shape) {
|
||||||
public DrawTextParagraph getDrawable(TextParagraph paragraph) {
|
return new DrawTextShape<T>(shape);
|
||||||
return new DrawTextParagraph(paragraph);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public <T extends ShapeGroup<? extends Shape>> DrawShapeGroup<T> getDrawable(T shape) {
|
||||||
|
return new DrawShapeGroup<T>(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends PictureShape> DrawPictureShape<T> getDrawable(T shape) {
|
||||||
|
return new DrawPictureShape<T>(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends TextRun> DrawTextParagraph<T> getDrawable(TextParagraph<T> paragraph) {
|
||||||
|
return new DrawTextParagraph<T>(paragraph);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends Background> DrawBackground<T> getDrawable(T shape) {
|
||||||
|
return new DrawBackground<T>(shape);
|
||||||
|
}
|
||||||
|
|
||||||
public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) {
|
public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) {
|
||||||
return new DrawTextFragment(layout, str);
|
return new DrawTextFragment(layout, str);
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@ package org.apache.poi.sl.draw;
|
|||||||
|
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
public class DrawFreeformShape<T extends FreeformShape> extends DrawAutoShape<T> {
|
public class DrawFreeformShape<T extends FreeformShape<? extends TextParagraph<? extends TextRun>>> extends DrawAutoShape<T> {
|
||||||
public DrawFreeformShape(T shape) {
|
public DrawFreeformShape(T shape) {
|
||||||
super(shape);
|
super(shape);
|
||||||
}
|
}
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
package org.apache.poi.sl.draw;
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.sl.usermodel.Shape;
|
|
||||||
|
|
||||||
|
|
||||||
public class DrawMasterSheet extends DrawSheet {
|
public class DrawMasterSheet<T extends MasterSheet<? extends Shape>> extends DrawSheet<T> {
|
||||||
|
|
||||||
public DrawMasterSheet(MasterSheet sheet) {
|
public DrawMasterSheet(T sheet) {
|
||||||
super(sheet);
|
super(sheet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -17,6 +16,6 @@ public class DrawMasterSheet extends DrawSheet {
|
|||||||
* for instance, slide masters and layouts don't display placeholders
|
* for instance, slide masters and layouts don't display placeholders
|
||||||
*/
|
*/
|
||||||
protected boolean canDraw(Shape shape){
|
protected boolean canDraw(Shape shape){
|
||||||
return !shape.isPlaceholder();
|
return !(shape instanceof SimpleShape) || !((SimpleShape)shape).isPlaceholder();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -27,8 +27,9 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.sl.usermodel.GradientPaint;
|
import org.apache.poi.sl.usermodel.PaintStyle.GradientPaint;
|
||||||
import org.apache.poi.sl.usermodel.TexturePaint;
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
|
import org.apache.poi.sl.usermodel.PaintStyle.TexturePaint;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -142,7 +143,6 @@ public class DrawPaint {
|
|||||||
|
|
||||||
float red,green,blue;
|
float red,green,blue;
|
||||||
|
|
||||||
Color color;
|
|
||||||
if (lumOff > 0) {
|
if (lumOff > 0) {
|
||||||
float flumOff = lumOff / 100000.f;
|
float flumOff = lumOff / 100000.f;
|
||||||
red = (255.f - r) * (1.f - flumOff) + r;
|
red = (255.f - r) * (1.f - flumOff) + r;
|
||||||
@ -150,9 +150,9 @@ public class DrawPaint {
|
|||||||
blue = (255.f - b) * flumOff + b;
|
blue = (255.f - b) * flumOff + b;
|
||||||
} else {
|
} else {
|
||||||
float flumMod = lumMod / 100000.f;
|
float flumMod = lumMod / 100000.f;
|
||||||
red = r * lumMod;
|
red = r * flumMod;
|
||||||
green = g * lumMod;
|
green = g * flumMod;
|
||||||
blue = b * lumMod;
|
blue = b * flumMod;
|
||||||
}
|
}
|
||||||
return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());
|
return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,37 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Insets;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.PictureData;
|
||||||
|
import org.apache.poi.sl.usermodel.PictureShape;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawPictureShape<T extends PictureShape> extends DrawSimpleShape<T> {
|
||||||
|
public DrawPictureShape(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawContent(Graphics2D graphics) {
|
||||||
|
PictureData data = shape.getPictureData();
|
||||||
|
if(data == null) return;
|
||||||
|
|
||||||
|
ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER);
|
||||||
|
if (renderer == null) renderer = new ImageRenderer();
|
||||||
|
|
||||||
|
Rectangle2D anchor = getAnchor(graphics, shape);
|
||||||
|
|
||||||
|
Insets insets = shape.getClipping();
|
||||||
|
|
||||||
|
try {
|
||||||
|
renderer.loadImage(data.getData(), data.getContentType());
|
||||||
|
renderer.drawImage(graphics, anchor, insets);
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO: draw specific runtime exception?
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -22,14 +22,17 @@ public class DrawShape<T extends Shape> implements Drawable {
|
|||||||
* @param graphics the graphics whos transform matrix will be modified
|
* @param graphics the graphics whos transform matrix will be modified
|
||||||
*/
|
*/
|
||||||
public void applyTransform(Graphics2D graphics) {
|
public void applyTransform(Graphics2D graphics) {
|
||||||
Rectangle2D anchor = shape.getAnchor();
|
if (!(shape instanceof PlaceableShape)) return;
|
||||||
|
|
||||||
|
PlaceableShape ps = (PlaceableShape)shape;
|
||||||
|
Rectangle2D anchor = ps.getAnchor();
|
||||||
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
|
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
|
||||||
if(tx != null) {
|
if(tx != null) {
|
||||||
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
||||||
}
|
}
|
||||||
|
|
||||||
// rotation
|
// rotation
|
||||||
double rotation = shape.getRotation();
|
double rotation = ps.getRotation();
|
||||||
if (rotation != 0.) {
|
if (rotation != 0.) {
|
||||||
// PowerPoint rotates shapes relative to the geometric center
|
// PowerPoint rotates shapes relative to the geometric center
|
||||||
double centerX = anchor.getCenterX();
|
double centerX = anchor.getCenterX();
|
||||||
@ -59,7 +62,7 @@ public class DrawShape<T extends Shape> implements Drawable {
|
|||||||
txs.rotate(Math.toRadians(-quadrant*90));
|
txs.rotate(Math.toRadians(-quadrant*90));
|
||||||
txs.translate(-centerX, -centerY);
|
txs.translate(-centerX, -centerY);
|
||||||
txg.concatenate(txs);
|
txg.concatenate(txs);
|
||||||
Rectangle2D anchor2 = txg.createTransformedShape(shape.getAnchor()).getBounds2D();
|
Rectangle2D anchor2 = txg.createTransformedShape(ps.getAnchor()).getBounds2D();
|
||||||
scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();
|
scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();
|
||||||
scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();
|
scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();
|
||||||
}
|
}
|
||||||
@ -73,14 +76,14 @@ public class DrawShape<T extends Shape> implements Drawable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//flip horizontal
|
//flip horizontal
|
||||||
if (shape.getFlipHorizontal()) {
|
if (ps.getFlipHorizontal()) {
|
||||||
graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
|
graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
|
||||||
graphics.scale(-1, 1);
|
graphics.scale(-1, 1);
|
||||||
graphics.translate(-anchor.getX(), -anchor.getY());
|
graphics.translate(-anchor.getX(), -anchor.getY());
|
||||||
}
|
}
|
||||||
|
|
||||||
//flip vertical
|
//flip vertical
|
||||||
if (shape.getFlipVertical()) {
|
if (ps.getFlipVertical()) {
|
||||||
graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
|
graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
|
||||||
graphics.scale(1, -1);
|
graphics.scale(1, -1);
|
||||||
graphics.translate(-anchor.getX(), -anchor.getY());
|
graphics.translate(-anchor.getX(), -anchor.getY());
|
||||||
@ -93,9 +96,12 @@ public class DrawShape<T extends Shape> implements Drawable {
|
|||||||
|
|
||||||
public void drawContent(Graphics2D context) {
|
public void drawContent(Graphics2D context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Rectangle2D getAnchor(Graphics2D graphics, PlaceableShape shape) {
|
public static Rectangle2D getAnchor(Graphics2D graphics, PlaceableShape shape) {
|
||||||
Rectangle2D anchor = shape.getAnchor();
|
return getAnchor(graphics, shape.getAnchor());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Rectangle2D getAnchor(Graphics2D graphics, Rectangle2D anchor) {
|
||||||
if(graphics == null) {
|
if(graphics == null) {
|
||||||
return anchor;
|
return anchor;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawShapeGroup<T extends ShapeGroup<? extends Shape>> implements Drawable {
|
||||||
|
|
||||||
|
protected final T shape;
|
||||||
|
|
||||||
|
public DrawShapeGroup(T shape) {
|
||||||
|
this.shape = shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyTransform(Graphics2D context) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics) {
|
||||||
|
|
||||||
|
// the coordinate system of this group of shape
|
||||||
|
Rectangle2D interior = shape.getInteriorAnchor();
|
||||||
|
// anchor of this group relative to the parent shape
|
||||||
|
Rectangle2D exterior = shape.getAnchor();
|
||||||
|
|
||||||
|
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
|
||||||
|
AffineTransform tx0 = new AffineTransform(tx);
|
||||||
|
|
||||||
|
double scaleX = interior.getWidth() == 0. ? 1.0 : exterior.getWidth() / interior.getWidth();
|
||||||
|
double scaleY = interior.getHeight() == 0. ? 1.0 : exterior.getHeight() / interior.getHeight();
|
||||||
|
|
||||||
|
tx.translate(exterior.getX(), exterior.getY());
|
||||||
|
tx.scale(scaleX, scaleY);
|
||||||
|
tx.translate(-interior.getX(), -interior.getY());
|
||||||
|
|
||||||
|
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
||||||
|
|
||||||
|
for (Shape child : shape) {
|
||||||
|
// remember the initial transform and restore it after we are done with the drawing
|
||||||
|
AffineTransform at = graphics.getTransform();
|
||||||
|
graphics.setRenderingHint(Drawable.GSAVE, true);
|
||||||
|
|
||||||
|
Drawable draw = drawFact.getDrawable(child);
|
||||||
|
draw.applyTransform(graphics);
|
||||||
|
draw.draw(graphics);
|
||||||
|
|
||||||
|
// restore the coordinate system
|
||||||
|
graphics.setTransform(at);
|
||||||
|
graphics.setRenderingHint(Drawable.GRESTORE, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, tx0);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawContent(Graphics2D context) {
|
||||||
|
}
|
||||||
|
}
|
@ -3,16 +3,14 @@ package org.apache.poi.sl.draw;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
|
|
||||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.sl.usermodel.Shape;
|
|
||||||
import org.apache.poi.sl.usermodel.Sheet;
|
|
||||||
|
|
||||||
|
|
||||||
public class DrawSheet implements Drawable {
|
public class DrawSheet<T extends Sheet<? extends Shape>> implements Drawable {
|
||||||
|
|
||||||
protected final Sheet sheet;
|
protected final T sheet;
|
||||||
|
|
||||||
public DrawSheet(Sheet sheet) {
|
public DrawSheet(T sheet) {
|
||||||
this.sheet = sheet;
|
this.sheet = sheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,7 +21,7 @@ public class DrawSheet implements Drawable {
|
|||||||
|
|
||||||
public void draw(Graphics2D graphics) {
|
public void draw(Graphics2D graphics) {
|
||||||
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
||||||
MasterSheet master = sheet.getMasterSheet();
|
MasterSheet<? extends Shape> master = sheet.getMasterSheet();
|
||||||
|
|
||||||
if(sheet.getFollowMasterGraphics() && master != null) {
|
if(sheet.getFollowMasterGraphics() && master != null) {
|
||||||
Drawable drawer = drawFact.getDrawable(master);
|
Drawable drawer = drawFact.getDrawable(master);
|
||||||
|
@ -17,6 +17,7 @@ import org.apache.poi.sl.draw.binding.CTCustomGeometry2D;
|
|||||||
import org.apache.poi.sl.draw.geom.*;
|
import org.apache.poi.sl.draw.geom.*;
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;
|
import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;
|
||||||
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
|
|
||||||
@ -257,6 +258,9 @@ public class DrawSimpleShape<T extends SimpleShape> extends DrawShape<T> {
|
|||||||
Shadow shadow = shape.getShadow();
|
Shadow shadow = shape.getShadow();
|
||||||
if (shadow == null || (fill == null && line == null)) return;
|
if (shadow == null || (fill == null && line == null)) return;
|
||||||
|
|
||||||
|
SolidPaint shadowPaint = shadow.getFillStyle();
|
||||||
|
Color shadowColor = DrawPaint.applyColorTransform(shadowPaint.getSolidColor());
|
||||||
|
|
||||||
double shapeRotation = shape.getRotation();
|
double shapeRotation = shape.getRotation();
|
||||||
if(shape.getFlipVertical()) {
|
if(shape.getFlipVertical()) {
|
||||||
shapeRotation += 180;
|
shapeRotation += 180;
|
||||||
@ -272,12 +276,11 @@ public class DrawSimpleShape<T extends SimpleShape> extends DrawShape<T> {
|
|||||||
java.awt.Shape s = o.getOutline();
|
java.awt.Shape s = o.getOutline();
|
||||||
Path p = o.getPath();
|
Path p = o.getPath();
|
||||||
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
||||||
|
graphics.setPaint(shadowColor);
|
||||||
|
|
||||||
if(fill != null && p.isFilled()){
|
if(fill != null && p.isFilled()){
|
||||||
graphics.setPaint(fill);
|
|
||||||
graphics.fill(s);
|
graphics.fill(s);
|
||||||
} else if (line != null && p.isStroked()) {
|
} else if (line != null && p.isStroked()) {
|
||||||
graphics.setPaint(line);
|
|
||||||
graphics.draw(s);
|
graphics.draw(s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
24
src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java
Normal file
24
src/scratchpad/src/org/apache/poi/sl/draw/DrawSlide.java
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawSlide<T extends Slide<? extends Shape>> extends DrawSheet<T> {
|
||||||
|
|
||||||
|
public DrawSlide(T slide) {
|
||||||
|
super(slide);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics) {
|
||||||
|
Background bg = sheet.getBackground();
|
||||||
|
if(bg != null) {
|
||||||
|
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
||||||
|
DrawBackground<Background> db = drawFact.getDrawable(bg);
|
||||||
|
db.draw(graphics);
|
||||||
|
}
|
||||||
|
|
||||||
|
super.draw(graphics);
|
||||||
|
}
|
||||||
|
}
|
@ -2,7 +2,7 @@ package org.apache.poi.sl.draw;
|
|||||||
|
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
public class DrawTextBox<T extends TextBox> extends DrawAutoShape<T> {
|
public class DrawTextBox<T extends TextBox<? extends TextParagraph<? extends TextRun>>> extends DrawAutoShape<T> {
|
||||||
public DrawTextBox(T shape) {
|
public DrawTextBox(T shape) {
|
||||||
super(shape);
|
super(shape);
|
||||||
}
|
}
|
||||||
|
@ -13,8 +13,8 @@ import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle;
|
|||||||
import org.apache.poi.sl.usermodel.TextRun.TextCap;
|
import org.apache.poi.sl.usermodel.TextRun.TextCap;
|
||||||
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
|
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
|
||||||
|
|
||||||
public class DrawTextParagraph implements Drawable {
|
public class DrawTextParagraph<T extends TextRun> implements Drawable {
|
||||||
protected TextParagraph paragraph;
|
protected TextParagraph<T> paragraph;
|
||||||
double x, y;
|
double x, y;
|
||||||
protected Insets2D insets = new Insets2D(0,0,0,0);
|
protected Insets2D insets = new Insets2D(0,0,0,0);
|
||||||
protected List<DrawTextFragment> lines = new ArrayList<DrawTextFragment>();
|
protected List<DrawTextFragment> lines = new ArrayList<DrawTextFragment>();
|
||||||
@ -26,7 +26,7 @@ public class DrawTextParagraph implements Drawable {
|
|||||||
*/
|
*/
|
||||||
protected double maxLineHeight;
|
protected double maxLineHeight;
|
||||||
|
|
||||||
public DrawTextParagraph(TextParagraph paragraph) {
|
public DrawTextParagraph(TextParagraph<T> paragraph) {
|
||||||
this.paragraph = paragraph;
|
this.paragraph = paragraph;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -275,7 +275,7 @@ public class DrawTextParagraph implements Drawable {
|
|||||||
double indent = paragraph.getIndent();
|
double indent = paragraph.getIndent();
|
||||||
|
|
||||||
double width;
|
double width;
|
||||||
TextShape ts = paragraph.getParentShape();
|
TextShape<? extends TextParagraph<T>> ts = paragraph.getParentShape();
|
||||||
if (!ts.getWordWrap()) {
|
if (!ts.getWordWrap()) {
|
||||||
// if wordWrap == false then we return the advance to the right border of the sheet
|
// if wordWrap == false then we return the advance to the right border of the sheet
|
||||||
width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX();
|
width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX();
|
||||||
|
@ -8,7 +8,7 @@ import java.util.Iterator;
|
|||||||
|
|
||||||
import org.apache.poi.sl.usermodel.*;
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
public class DrawTextShape<T extends TextShape> extends DrawSimpleShape<T> {
|
public class DrawTextShape<T extends TextShape<? extends TextParagraph>> extends DrawSimpleShape<T> {
|
||||||
|
|
||||||
public DrawTextShape(T shape) {
|
public DrawTextShape(T shape) {
|
||||||
super(shape);
|
super(shape);
|
||||||
@ -84,7 +84,7 @@ public class DrawTextShape<T extends TextShape> extends DrawSimpleShape<T> {
|
|||||||
Insets2D shapePadding = shape.getInsets();
|
Insets2D shapePadding = shape.getInsets();
|
||||||
|
|
||||||
double y0 = y;
|
double y0 = y;
|
||||||
Iterator<TextParagraph> paragraphs = shape.iterator();
|
Iterator<? extends TextParagraph> paragraphs = shape.iterator();
|
||||||
|
|
||||||
boolean isFirstLine = true;
|
boolean isFirstLine = true;
|
||||||
while (paragraphs.hasNext()){
|
while (paragraphs.hasNext()){
|
||||||
@ -129,12 +129,10 @@ public class DrawTextShape<T extends TextShape> extends DrawSimpleShape<T> {
|
|||||||
/**
|
/**
|
||||||
* Compute the cumulative height occupied by the text
|
* Compute the cumulative height occupied by the text
|
||||||
*/
|
*/
|
||||||
protected double getTextHeight(){
|
public double getTextHeight(){
|
||||||
// dry-run in a 1x1 image and return the vertical advance
|
// dry-run in a 1x1 image and return the vertical advance
|
||||||
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
||||||
Graphics2D graphics = img.createGraphics();
|
Graphics2D graphics = img.createGraphics();
|
||||||
return drawParagraphs(graphics, 0, 0);
|
return drawParagraphs(graphics, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,8 +23,7 @@ import java.awt.geom.AffineTransform;
|
|||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.awt.image.RescaleOp;
|
import java.awt.image.RescaleOp;
|
||||||
import java.io.IOException;
|
import java.io.*;
|
||||||
import java.io.InputStream;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
@ -73,6 +72,17 @@ public class ImageRenderer {
|
|||||||
img = ImageIO.read(data);
|
img = ImageIO.read(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and buffer the image
|
||||||
|
*
|
||||||
|
* @param data the raw image stream
|
||||||
|
* @param contentType the content type
|
||||||
|
*/
|
||||||
|
public void loadImage(byte data[], String contentType) throws IOException {
|
||||||
|
img = ImageIO.read(new ByteArrayInputStream(data));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the buffered image
|
* @return the buffered image
|
||||||
*/
|
*/
|
||||||
|
@ -17,6 +17,5 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface AutoShape extends TextShape {
|
public interface AutoShape<T extends TextParagraph> extends TextShape<T> {
|
||||||
public TextRun getTextRun();
|
|
||||||
}
|
}
|
||||||
|
@ -18,5 +18,5 @@
|
|||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface Background extends Shape {
|
public interface Background extends Shape {
|
||||||
|
FillStyle getFillStyle();
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface FreeformShape extends AutoShape {
|
public interface FreeformShape<T extends TextParagraph> extends AutoShape<T> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,32 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
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.usermodel;
|
|
||||||
|
|
||||||
|
|
||||||
public interface GradientPaint extends PaintStyle {
|
|
||||||
enum GradientType { linear, circular, shape }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return the angle of the gradient
|
|
||||||
*/
|
|
||||||
double getGradientAngle();
|
|
||||||
ColorStyle[] getGradientColors();
|
|
||||||
float[] getGradientFractions();
|
|
||||||
boolean isRotatedWithShape();
|
|
||||||
GradientType getGradientType();
|
|
||||||
}
|
|
@ -17,6 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface MasterSheet extends Sheet {
|
public interface MasterSheet<T extends Shape> extends Sheet<T> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,6 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface Notes extends Sheet {
|
public interface Notes<T extends Shape> extends Sheet<T> {
|
||||||
public TextRun getTextRun();
|
public TextRun getTextRun();
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,42 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface PaintStyle {
|
public interface PaintStyle {
|
||||||
|
public interface SolidPaint extends PaintStyle {
|
||||||
|
ColorStyle getSolidColor();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface GradientPaint extends PaintStyle {
|
||||||
|
enum GradientType { linear, circular, shape }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the angle of the gradient
|
||||||
|
*/
|
||||||
|
double getGradientAngle();
|
||||||
|
ColorStyle[] getGradientColors();
|
||||||
|
float[] getGradientFractions();
|
||||||
|
boolean isRotatedWithShape();
|
||||||
|
GradientType getGradientType();
|
||||||
|
}
|
||||||
|
|
||||||
|
public interface TexturePaint extends PaintStyle {
|
||||||
|
/**
|
||||||
|
* @return the raw image stream
|
||||||
|
*/
|
||||||
|
InputStream getImageData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the content type of the image data
|
||||||
|
*/
|
||||||
|
String getContentType();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the alpha mask in percents [0..100000]
|
||||||
|
*/
|
||||||
|
int getAlpha();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,22 +0,0 @@
|
|||||||
/* ====================================================================
|
|
||||||
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.usermodel;
|
|
||||||
|
|
||||||
public interface Picture extends SimpleShape {
|
|
||||||
public PictureData getPictureData();
|
|
||||||
}
|
|
@ -17,10 +17,11 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
public interface PictureData {
|
public interface PictureData {
|
||||||
public int getType();
|
public String getContentType();
|
||||||
public byte[] getUID();
|
|
||||||
|
|
||||||
public byte[] getData();
|
public byte[] getData();
|
||||||
public void setData(byte[] data);
|
public void setData(byte[] data) throws IOException;
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,29 @@
|
|||||||
/* ====================================================================
|
/* ====================================================================
|
||||||
Licensed to the Apache Software Foundation (ASF) under one or more
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
contributor license agreements. See the NOTICE file distributed with
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
this work for additional information regarding copyright ownership.
|
this work for additional information regarding copyright ownership.
|
||||||
The ASF licenses this file to You under the Apache License, Version 2.0
|
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 not use this file except in compliance with
|
||||||
the License. You may obtain a copy of the License at
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
Unless required by applicable law or agreed to in writing, software
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
==================================================================== */
|
==================================================================== */
|
||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
|
import java.awt.Insets;
|
||||||
public interface SolidPaint extends PaintStyle {
|
|
||||||
ColorStyle getSolidColor();
|
public interface PictureShape extends SimpleShape {
|
||||||
}
|
PictureData getPictureData();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the clipping rectangle, which is given in percent in relation to the image width/height
|
||||||
|
*/
|
||||||
|
Insets getClipping();
|
||||||
|
}
|
@ -20,11 +20,17 @@ package org.apache.poi.sl.usermodel;
|
|||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
public interface PlaceableShape {
|
public interface PlaceableShape {
|
||||||
|
/**
|
||||||
|
* @return the position of this shape within the drawing canvas.
|
||||||
|
* The coordinates are expressed in points
|
||||||
|
*/
|
||||||
Rectangle2D getAnchor();
|
Rectangle2D getAnchor();
|
||||||
|
|
||||||
FillStyle getFillStyle();
|
/**
|
||||||
|
* @param anchor the position of this shape within the drawing canvas.
|
||||||
StrokeStyle getStrokeStyle();
|
* The coordinates are expressed in points
|
||||||
|
*/
|
||||||
|
void setAnchor(Rectangle2D anchor);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Rotation angle in degrees
|
* Rotation angle in degrees
|
||||||
@ -36,4 +42,41 @@ public interface PlaceableShape {
|
|||||||
* @return rotation angle in degrees
|
* @return rotation angle in degrees
|
||||||
*/
|
*/
|
||||||
double getRotation();
|
double getRotation();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Rotate this shape.
|
||||||
|
* <p>
|
||||||
|
* Positive angles are clockwise (i.e., towards the positive y axis);
|
||||||
|
* negative angles are counter-clockwise (i.e., towards the negative y axis).
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param theta the rotation angle in degrees.
|
||||||
|
*/
|
||||||
|
void setRotation(double theta);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param flip whether the shape is horizontally flipped
|
||||||
|
*/
|
||||||
|
void setFlipHorizontal(boolean flip);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the shape is vertically flipped
|
||||||
|
*
|
||||||
|
* @param flip whether the shape is vertically flipped
|
||||||
|
*/
|
||||||
|
void setFlipVertical(boolean flip);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the shape is horizontally flipped
|
||||||
|
*
|
||||||
|
* @return whether the shape is horizontally flipped
|
||||||
|
*/
|
||||||
|
boolean getFlipHorizontal();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Whether the shape is vertically flipped
|
||||||
|
*
|
||||||
|
* @return whether the shape is vertically flipped
|
||||||
|
*/
|
||||||
|
boolean getFlipVertical();
|
||||||
}
|
}
|
||||||
|
@ -17,10 +17,13 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
import java.awt.Color;
|
import org.apache.poi.sl.usermodel.PaintStyle.SolidPaint;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface Shadow {
|
public interface Shadow {
|
||||||
|
SimpleShape getShadowParent();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the offset of this shadow in points
|
* @return the offset of this shadow in points
|
||||||
*/
|
*/
|
||||||
@ -43,5 +46,5 @@ public interface Shadow {
|
|||||||
* @return the color of this shadow.
|
* @return the color of this shadow.
|
||||||
* Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow
|
* Depending whether the parent shape is filled or stroked, this color is used to fill or stroke this shadow
|
||||||
*/
|
*/
|
||||||
Color getColor();
|
SolidPaint getFillStyle();
|
||||||
}
|
}
|
||||||
|
@ -17,63 +17,16 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
|
|
||||||
import org.apache.poi.sl.draw.geom.CustomGeometry;
|
|
||||||
|
|
||||||
public interface Shape extends PlaceableShape {
|
|
||||||
CustomGeometry getGeometry();
|
|
||||||
|
|
||||||
ShapeType getShapeType();
|
|
||||||
|
|
||||||
void setAnchor(Rectangle2D anchor);
|
|
||||||
|
|
||||||
|
public interface Shape {
|
||||||
ShapeContainer getParent();
|
ShapeContainer getParent();
|
||||||
|
|
||||||
boolean isPlaceholder();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return the sheet this shape belongs to
|
* @return the sheet this shape belongs to
|
||||||
*/
|
*/
|
||||||
Sheet getSheet();
|
Sheet getSheet();
|
||||||
|
|
||||||
/**
|
|
||||||
* Rotate this shape.
|
|
||||||
* <p>
|
|
||||||
* Positive angles are clockwise (i.e., towards the positive y axis);
|
|
||||||
* negative angles are counter-clockwise (i.e., towards the negative y axis).
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param theta the rotation angle in degrees.
|
|
||||||
*/
|
|
||||||
void setRotation(double theta);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param flip whether the shape is horizontally flipped
|
|
||||||
*/
|
|
||||||
void setFlipHorizontal(boolean flip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the shape is vertically flipped
|
|
||||||
*
|
|
||||||
* @param flip whether the shape is vertically flipped
|
|
||||||
*/
|
|
||||||
void setFlipVertical(boolean flip);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the shape is horizontally flipped
|
|
||||||
*
|
|
||||||
* @return whether the shape is horizontally flipped
|
|
||||||
*/
|
|
||||||
boolean getFlipHorizontal();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Whether the shape is vertically flipped
|
|
||||||
*
|
|
||||||
* @return whether the shape is vertically flipped
|
|
||||||
*/
|
|
||||||
boolean getFlipVertical();
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
|
|
||||||
public interface ShapeContainer extends Iterable<Shape>, PlaceableShape {
|
public interface ShapeContainer<T extends Shape> extends Iterable<T> {
|
||||||
/**
|
/**
|
||||||
* Returns an array containing all of the elements in this container in proper
|
* Returns an array containing all of the elements in this container in proper
|
||||||
* sequence (from first to last element).
|
* sequence (from first to last element).
|
||||||
@ -26,9 +26,9 @@ public interface ShapeContainer extends Iterable<Shape>, PlaceableShape {
|
|||||||
* @return an array containing all of the elements in this container in proper
|
* @return an array containing all of the elements in this container in proper
|
||||||
* sequence
|
* sequence
|
||||||
*/
|
*/
|
||||||
public Shape[] getShapes();
|
public T[] getShapes();
|
||||||
|
|
||||||
public void addShape(Shape shape);
|
public void addShape(T shape);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the specified shape from this sheet, if it is present
|
* Removes the specified shape from this sheet, if it is present
|
||||||
@ -40,5 +40,5 @@ public interface ShapeContainer extends Iterable<Shape>, PlaceableShape {
|
|||||||
* @throws IllegalArgumentException if the type of the specified shape
|
* @throws IllegalArgumentException if the type of the specified shape
|
||||||
* is incompatible with this sheet (optional)
|
* is incompatible with this sheet (optional)
|
||||||
*/
|
*/
|
||||||
public boolean removeShape(Shape shape);
|
public boolean removeShape(T shape);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface ShapeGroup extends ShapeContainer {
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
public interface ShapeGroup<T extends Shape> extends ShapeContainer<T>, PlaceableShape {
|
||||||
|
Rectangle2D getInteriorAnchor();
|
||||||
}
|
}
|
||||||
|
@ -21,7 +21,7 @@ package org.apache.poi.sl.usermodel;
|
|||||||
/**
|
/**
|
||||||
* Common parent of Slides, Notes and Masters
|
* Common parent of Slides, Notes and Masters
|
||||||
*/
|
*/
|
||||||
public interface Sheet extends ShapeContainer {
|
public interface Sheet<T extends Shape> extends ShapeContainer<T> {
|
||||||
SlideShow getSlideShow();
|
SlideShow getSlideShow();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -31,7 +31,7 @@ public interface Sheet extends ShapeContainer {
|
|||||||
*/
|
*/
|
||||||
boolean getFollowMasterGraphics();
|
boolean getFollowMasterGraphics();
|
||||||
|
|
||||||
MasterSheet getMasterSheet();
|
MasterSheet<T> getMasterSheet();
|
||||||
|
|
||||||
Background getBackground();
|
Background getBackground();
|
||||||
}
|
}
|
||||||
|
@ -17,14 +17,20 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.geom.CustomGeometry;
|
||||||
import org.apache.poi.sl.draw.geom.IAdjustableShape;
|
import org.apache.poi.sl.draw.geom.IAdjustableShape;
|
||||||
|
|
||||||
|
|
||||||
public interface SimpleShape extends Shape, IAdjustableShape {
|
public interface SimpleShape extends Shape, IAdjustableShape, PlaceableShape {
|
||||||
StrokeStyle getStrokeStyle();
|
FillStyle getFillStyle();
|
||||||
|
LineDecoration getLineDecoration();
|
||||||
|
StrokeStyle getStrokeStyle();
|
||||||
|
|
||||||
|
CustomGeometry getGeometry();
|
||||||
|
|
||||||
|
ShapeType getShapeType();
|
||||||
|
|
||||||
|
boolean isPlaceholder();
|
||||||
|
|
||||||
Shadow getShadow();
|
Shadow getShadow();
|
||||||
LineDecoration getLineDecoration();
|
|
||||||
|
|
||||||
Hyperlink getHyperlink();
|
|
||||||
void setHyperlink(Hyperlink hyperlink);
|
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface Slide extends Sheet {
|
public interface Slide<T extends Shape> extends Sheet<T> {
|
||||||
public Notes getNotes();
|
public Notes<T> getNotes();
|
||||||
public void setNotes(Notes notes);
|
public void setNotes(Notes<T> notes);
|
||||||
|
|
||||||
public boolean getFollowMasterBackground();
|
public boolean getFollowMasterBackground();
|
||||||
public void setFollowMasterBackground(boolean follow);
|
public void setFollowMasterBackground(boolean follow);
|
||||||
|
@ -17,5 +17,5 @@
|
|||||||
|
|
||||||
package org.apache.poi.sl.usermodel;
|
package org.apache.poi.sl.usermodel;
|
||||||
|
|
||||||
public interface TextBox extends AutoShape {
|
public interface TextBox<T extends TextParagraph> extends AutoShape<T> {
|
||||||
}
|
}
|
||||||
|
@ -20,7 +20,7 @@ package org.apache.poi.sl.usermodel;
|
|||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
|
|
||||||
public interface TextParagraph extends Iterable<TextRun> {
|
public interface TextParagraph<T extends TextRun> extends Iterable<T> {
|
||||||
/**
|
/**
|
||||||
* Specified a list of text alignment types
|
* Specified a list of text alignment types
|
||||||
*/
|
*/
|
||||||
@ -128,5 +128,5 @@ public interface TextParagraph extends Iterable<TextRun> {
|
|||||||
*/
|
*/
|
||||||
BulletStyle getBulletStyle();
|
BulletStyle getBulletStyle();
|
||||||
|
|
||||||
TextShape getParentShape();
|
TextShape<? extends TextParagraph<T>> getParentShape();
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ package org.apache.poi.sl.usermodel;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
public interface TextShape extends SimpleShape, Iterable<TextParagraph> {
|
public interface TextShape<T extends TextParagraph<?>> extends SimpleShape, Iterable<T> {
|
||||||
/**
|
/**
|
||||||
* Vertical Text Types
|
* Vertical Text Types
|
||||||
*/
|
*/
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user