initial commit - still lots of errors, but I need to switch to a clean trunk for releasing and testing
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/common_sl@1661322 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
8e701d0c4d
commit
996c9dd93c
40
build.xml
40
build.xml
@ -103,6 +103,12 @@ under the License.
|
|||||||
<property name="scratchpad.output.test.dir" location="build/scratchpad-test-classes"/>
|
<property name="scratchpad.output.test.dir" location="build/scratchpad-test-classes"/>
|
||||||
<property name="scratchpad.testokfile" location="build/scratchpad-testokfile.txt"/>
|
<property name="scratchpad.testokfile" location="build/scratchpad-testokfile.txt"/>
|
||||||
|
|
||||||
|
<!-- Scratchpad/Geometry -->
|
||||||
|
<property name="geometry.schema" value="src/resources/ooxml/org/apache/poi/xslf/usermodel/presetShapeDefinitions.xml"/>
|
||||||
|
<property name="geometry.pkg" value="org.apache.poi.sl.draw.binding"/>
|
||||||
|
<property name="geometry.output.tmpdir" value="build/geometry-java"/>
|
||||||
|
|
||||||
|
|
||||||
<!-- Examples: -->
|
<!-- Examples: -->
|
||||||
<property name="examples.src" location="src/examples/src"/>
|
<property name="examples.src" location="src/examples/src"/>
|
||||||
<property name="examples.output.dir" location="build/examples-classes"/>
|
<property name="examples.output.dir" location="build/examples-classes"/>
|
||||||
@ -371,6 +377,7 @@ under the License.
|
|||||||
<mkdir dir="${scratchpad.output.dir}"/>
|
<mkdir dir="${scratchpad.output.dir}"/>
|
||||||
<mkdir dir="${scratchpad.output.test.dir}"/>
|
<mkdir dir="${scratchpad.output.test.dir}"/>
|
||||||
<mkdir dir="${scratchpad.reports.test}"/>
|
<mkdir dir="${scratchpad.reports.test}"/>
|
||||||
|
<mkdir dir="${geometry.output.tmpdir}"/>
|
||||||
<mkdir dir="${ooxml.output.dir}"/>
|
<mkdir dir="${ooxml.output.dir}"/>
|
||||||
<mkdir dir="${ooxml.output.test.dir}"/>
|
<mkdir dir="${ooxml.output.test.dir}"/>
|
||||||
<mkdir dir="${ooxml.reports.test}"/>
|
<mkdir dir="${ooxml.reports.test}"/>
|
||||||
@ -690,7 +697,38 @@ under the License.
|
|||||||
</copy>
|
</copy>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
<target name="compile-scratchpad" depends="compile-main">
|
<target name="generate-geometry" depends="fetch-ooxml-xsds">
|
||||||
|
<delete dir="${geometry.output.tmpdir}"/>
|
||||||
|
<!-- taskdef xjc -->
|
||||||
|
<!-- "D:\Program Files\Java\jdk1.6.0_45\bin\xjc" -p org.apache.poi.sl.model.geom.binding -readOnly -Xlocator -mark-generated ooxml-schemas\dml-shapeGeometry.xsd -->
|
||||||
|
<unzip src="${ooxml.lib}/${ooxml.xsds.izip.1}" dest="${geometry.output.tmpdir}"/>
|
||||||
|
<exec executable="${env.JAVA_HOME}/bin/xjc">
|
||||||
|
<arg value="-p"/>
|
||||||
|
<arg value="${geometry.pkg}"/>
|
||||||
|
<arg value="-b"/>
|
||||||
|
<arg file="src/types/definitions/dml-shapeGeometry.xjb"/>
|
||||||
|
<arg value="-readOnly"/>
|
||||||
|
<arg value="-npa"/>
|
||||||
|
<arg value="-no-header"/>
|
||||||
|
<arg value="-Xlocator"/>
|
||||||
|
<arg file="${geometry.output.tmpdir}/dml-shapeGeometry.xsd"/>
|
||||||
|
<arg value="-d"/>
|
||||||
|
<arg file="${geometry.output.tmpdir}"/>
|
||||||
|
</exec>
|
||||||
|
<copy file="src/java/org/apache/poi/POIDocument.java" tofile="${geometry.output.tmpdir}/apache-license.txt">
|
||||||
|
<filterchain>
|
||||||
|
<headfilter lines="16"/>
|
||||||
|
</filterchain>
|
||||||
|
</copy>
|
||||||
|
<copy todir="${scratchpad.src}">
|
||||||
|
<fileset dir="${geometry.output.tmpdir}" includes="**/*.java"/>
|
||||||
|
<filterchain>
|
||||||
|
<concatfilter prepend="${geometry.output.tmpdir}/apache-license.txt"/>
|
||||||
|
</filterchain>
|
||||||
|
</copy>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="compile-scratchpad" depends="compile-main,generate-geometry">
|
||||||
<javac target="${jdk.version.class}"
|
<javac target="${jdk.version.class}"
|
||||||
source="${jdk.version.source}"
|
source="${jdk.version.source}"
|
||||||
destdir="${scratchpad.output.dir}"
|
destdir="${scratchpad.output.dir}"
|
||||||
|
@ -20,6 +20,7 @@ package org.apache.poi.hslf.examples;
|
|||||||
import org.apache.poi.hslf.usermodel.*;
|
import org.apache.poi.hslf.usermodel.*;
|
||||||
import org.apache.poi.hslf.model.*;
|
import org.apache.poi.hslf.model.*;
|
||||||
import org.apache.poi.hslf.record.TextHeaderAtom;
|
import org.apache.poi.hslf.record.TextHeaderAtom;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
@ -312,7 +313,7 @@ public final class ApacheconEU08 {
|
|||||||
box3.setAnchor(new Rectangle(473, 243, 170, 170));
|
box3.setAnchor(new Rectangle(473, 243, 170, 170));
|
||||||
slide.addShape(box3);
|
slide.addShape(box3);
|
||||||
|
|
||||||
AutoShape box4 = new AutoShape(ShapeTypes.Arrow);
|
AutoShape box4 = new AutoShape(ShapeType.RIGHT_ARROW);
|
||||||
box4.getFill().setForegroundColor(new Color(187, 224, 227));
|
box4.getFill().setForegroundColor(new Color(187, 224, 227));
|
||||||
box4.setLineWidth(0.75);
|
box4.setLineWidth(0.75);
|
||||||
box4.setLineColor(Color.black);
|
box4.setLineColor(Color.black);
|
||||||
|
@ -24,6 +24,8 @@ import java.awt.geom.Rectangle2D;
|
|||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.TextAlign;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PPTX Tables
|
* PPTX Tables
|
||||||
*
|
*
|
||||||
|
@ -519,7 +519,7 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public Chart createChart(ClientAnchor anchor) {
|
public Chart createChart(ClientAnchor anchor) {
|
||||||
throw new RuntimeException("NotImplemented");
|
throw new UnsupportedOperationException("NotImplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,17 +42,32 @@ public class Units {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Converts a value of type FixedPoint to a decimal number
|
* Converts a value of type FixedPoint to a floating point
|
||||||
*
|
*
|
||||||
* @param fixedPoint
|
* @param fixedPoint
|
||||||
* @return decimal number
|
* @return floating point (double)
|
||||||
*
|
*
|
||||||
* @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a>
|
* @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a>
|
||||||
*/
|
*/
|
||||||
public static double fixedPointToDecimal(int fixedPoint) {
|
public static double fixedPointToDouble(int fixedPoint) {
|
||||||
int i = (fixedPoint >> 16);
|
int i = (fixedPoint >> 16);
|
||||||
int f = (fixedPoint >> 0) & 0xFFFF;
|
int f = (fixedPoint >> 0) & 0xFFFF;
|
||||||
double decimal = (i + f/65536.0);
|
double floatPoint = (i + f/65536d);
|
||||||
return decimal;
|
return floatPoint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Converts a value of type floating point to a FixedPoint
|
||||||
|
*
|
||||||
|
* @param floatPoint
|
||||||
|
* @return fixedPoint
|
||||||
|
*
|
||||||
|
* @see <a href="http://msdn.microsoft.com/en-us/library/dd910765(v=office.12).aspx">[MS-OSHARED] - 2.2.1.6 FixedPoint</a>
|
||||||
|
*/
|
||||||
|
public static int doubleToFixedPoint(double floatPoint) {
|
||||||
|
int i = (int)Math.floor(floatPoint);
|
||||||
|
int f = (int)((floatPoint % 1d)*65536d);
|
||||||
|
int fixedPoint = (i << 16) | (f & 0xFFFF);
|
||||||
|
return fixedPoint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,8 +19,8 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.model;
|
package org.apache.poi.xslf.model;
|
||||||
|
|
||||||
import org.apache.poi.xslf.usermodel.XSLFSimpleShape;
|
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.poi.xslf.usermodel.XSLFShape;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used internally to navigate the PresentationML text style hierarchy and fetch properties
|
* Used internally to navigate the PresentationML text style hierarchy and fetch properties
|
||||||
@ -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(XSLFSimpleShape shape) ;
|
public abstract boolean fetch(XSLFShape shape) ;
|
||||||
|
|
||||||
public T getValue(){
|
public T getValue(){
|
||||||
return _value;
|
return _value;
|
||||||
|
@ -1,67 +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.model.geom;
|
|
||||||
|
|
||||||
import org.apache.poi.xslf.usermodel.XMLSlideShow;
|
|
||||||
import org.apache.xmlbeans.XmlObject;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTCustomGeometry2D;
|
|
||||||
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.LinkedHashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Date: 10/25/11
|
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public class PresetGeometries extends LinkedHashMap<String, CustomGeometry> {
|
|
||||||
private static PresetGeometries _inst;
|
|
||||||
|
|
||||||
private PresetGeometries(){
|
|
||||||
try {
|
|
||||||
InputStream is =
|
|
||||||
XMLSlideShow.class.getResourceAsStream("presetShapeDefinitions.xml");
|
|
||||||
read(is);
|
|
||||||
} catch (Exception e){
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void read(InputStream is) throws Exception {
|
|
||||||
XmlObject obj = XmlObject.Factory.parse(is);
|
|
||||||
for (XmlObject def : obj.selectPath("*/*")) {
|
|
||||||
|
|
||||||
String name = def.getDomNode().getLocalName();
|
|
||||||
CTCustomGeometry2D geom = CTCustomGeometry2D.Factory.parse(def.toString());
|
|
||||||
|
|
||||||
if(containsKey(name)) {
|
|
||||||
System.out.println("Duplicate definoition of " + name) ;
|
|
||||||
}
|
|
||||||
put(name, new CustomGeometry(geom));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PresetGeometries getInstance(){
|
|
||||||
if(_inst == null) _inst = new PresetGeometries();
|
|
||||||
|
|
||||||
return _inst;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,34 +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 LineDash {
|
|
||||||
SOLID,
|
|
||||||
DOT,
|
|
||||||
DASH,
|
|
||||||
LG_DASH,
|
|
||||||
DASH_DOT,
|
|
||||||
LG_DASH_DOT,
|
|
||||||
LG_DASH_DOT_DOT,
|
|
||||||
SYS_DASH,
|
|
||||||
SYS_DOT,
|
|
||||||
SYS_DASH_DOT,
|
|
||||||
SYS_DASH_DOT_DOT;
|
|
||||||
}
|
|
@ -40,6 +40,8 @@ import java.util.Comparator;
|
|||||||
|
|
||||||
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.LineCap;
|
||||||
|
import org.apache.poi.sl.usermodel.LineDash;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
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;
|
||||||
|
@ -1,50 +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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specified a list of text alignment types
|
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public enum TextAlign {
|
|
||||||
/**
|
|
||||||
* Align text to the left margin.
|
|
||||||
*/
|
|
||||||
LEFT,
|
|
||||||
/**
|
|
||||||
* Align text in the center.
|
|
||||||
*/
|
|
||||||
CENTER,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Align text to the right margin.
|
|
||||||
*/
|
|
||||||
RIGHT,
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Align text so that it is justified across the whole line. It
|
|
||||||
* is smart in the sense that it will not justify sentences
|
|
||||||
* which are short
|
|
||||||
*/
|
|
||||||
JUSTIFY,
|
|
||||||
JUSTIFY_LOW,
|
|
||||||
DIST,
|
|
||||||
THAI_DIST
|
|
||||||
}
|
|
@ -1,59 +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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specifies alist of auto-fit types.
|
|
||||||
* <p>
|
|
||||||
* Autofit specofies that a shape should be auto-fit to fully contain the text described within it.
|
|
||||||
* Auto-fitting is when text within a shape is scaled in order to contain all the text inside
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public enum TextAutofit {
|
|
||||||
/**
|
|
||||||
* Specifies that text within the text body should not be auto-fit to the bounding box.
|
|
||||||
* Auto-fitting is when text within a text box is scaled in order to remain inside
|
|
||||||
* the text box.
|
|
||||||
*/
|
|
||||||
NONE,
|
|
||||||
/**
|
|
||||||
* Specifies that text within the text body should be normally auto-fit to the bounding box.
|
|
||||||
* Autofitting is when text within a text box is scaled in order to remain inside the text box.
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* <em>Example:</em> Consider the situation where a user is building a diagram and needs
|
|
||||||
* to have the text for each shape that they are using stay within the bounds of the shape.
|
|
||||||
* An easy way this might be done is by using NORMAL autofit
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
NORMAL,
|
|
||||||
/**
|
|
||||||
* Specifies that a shape should be auto-fit to fully contain the text described within it.
|
|
||||||
* Auto-fitting is when text within a shape is scaled in order to contain all the text inside.
|
|
||||||
*
|
|
||||||
* <p>
|
|
||||||
* <em>Example:</em> Consider the situation where a user is building a diagram and needs to have
|
|
||||||
* the text for each shape that they are using stay within the bounds of the shape.
|
|
||||||
* An easy way this might be done is by using SHAPE autofit
|
|
||||||
* </p>
|
|
||||||
*/
|
|
||||||
SHAPE
|
|
||||||
}
|
|
@ -1,48 +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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Vertical Text Types
|
|
||||||
*/
|
|
||||||
public enum TextDirection {
|
|
||||||
/**
|
|
||||||
* Horizontal text. This should be default.
|
|
||||||
*/
|
|
||||||
HORIZONTAL,
|
|
||||||
/**
|
|
||||||
* Vertical orientation.
|
|
||||||
* (each line is 90 degrees rotated clockwise, so it goes
|
|
||||||
* from top to bottom; each next line is to the left from
|
|
||||||
* the previous one).
|
|
||||||
*/
|
|
||||||
VERTICAL,
|
|
||||||
/**
|
|
||||||
* Vertical orientation.
|
|
||||||
* (each line is 270 degrees rotated clockwise, so it goes
|
|
||||||
* from bottom to top; each next line is to the right from
|
|
||||||
* the previous one).
|
|
||||||
*/
|
|
||||||
VERTICAL_270,
|
|
||||||
/**
|
|
||||||
* Determines if all of the text is vertical
|
|
||||||
* ("one letter on top of another").
|
|
||||||
*/
|
|
||||||
STACKED;
|
|
||||||
}
|
|
@ -1,90 +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.*;
|
|
||||||
import java.awt.font.TextLayout;
|
|
||||||
import java.text.AttributedCharacterIterator;
|
|
||||||
import java.text.AttributedString;
|
|
||||||
import java.text.CharacterIterator;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* a renderable text fragment
|
|
||||||
*/
|
|
||||||
class TextFragment {
|
|
||||||
final TextLayout _layout;
|
|
||||||
final AttributedString _str;
|
|
||||||
|
|
||||||
TextFragment(TextLayout layout, AttributedString str){
|
|
||||||
_layout = layout;
|
|
||||||
_str = str;
|
|
||||||
}
|
|
||||||
|
|
||||||
void draw(Graphics2D graphics, double x, double y){
|
|
||||||
if(_str == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
double yBaseline = y + _layout.getAscent();
|
|
||||||
|
|
||||||
Integer textMode = (Integer)graphics.getRenderingHint(XSLFRenderingHint.TEXT_RENDERING_MODE);
|
|
||||||
if(textMode != null && textMode == XSLFRenderingHint.TEXT_AS_SHAPES){
|
|
||||||
_layout.draw(graphics, (float)x, (float)yBaseline);
|
|
||||||
} else {
|
|
||||||
graphics.drawString(_str.getIterator(), (float)x, (float)yBaseline );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return full height of this text run which is sum of ascent, descent and leading
|
|
||||||
*/
|
|
||||||
public float getHeight(){
|
|
||||||
double h = Math.ceil(_layout.getAscent()) + Math.ceil(_layout.getDescent()) + _layout.getLeading();
|
|
||||||
return (float)h;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return width if this text run
|
|
||||||
*/
|
|
||||||
public float getWidth(){
|
|
||||||
return _layout.getAdvance();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return the string to be painted
|
|
||||||
*/
|
|
||||||
public String getString(){
|
|
||||||
if(_str == null) return "";
|
|
||||||
|
|
||||||
AttributedCharacterIterator it = _str.getIterator();
|
|
||||||
StringBuffer buf = new StringBuffer();
|
|
||||||
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
|
|
||||||
buf.append(c);
|
|
||||||
}
|
|
||||||
return buf.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString(){
|
|
||||||
return "[" + getClass().getSimpleName() + "] " + getString();
|
|
||||||
}
|
|
||||||
}
|
|
@ -20,7 +20,11 @@ import java.awt.Dimension;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocument;
|
import org.apache.poi.POIXMLDocument;
|
||||||
@ -32,6 +36,9 @@ import org.apache.poi.openxml4j.opc.OPCPackage;
|
|||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePartName;
|
import org.apache.poi.openxml4j.opc.PackagePartName;
|
||||||
import org.apache.poi.openxml4j.opc.TargetMode;
|
import org.apache.poi.openxml4j.opc.TargetMode;
|
||||||
|
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||||
|
import org.apache.poi.sl.usermodel.Resources;
|
||||||
|
import org.apache.poi.sl.usermodel.SlideShow;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
@ -53,6 +60,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideIdListEntry;
|
|||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideSize;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlideSize;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument;
|
import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument;
|
||||||
|
|
||||||
|
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
|
||||||
|
|
||||||
|
import com.sun.org.apache.xml.internal.utils.UnImplNode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation of a ooxml slideshow.
|
* High level representation of a ooxml slideshow.
|
||||||
* This is the first object most users will construct whether
|
* This is the first object most users will construct whether
|
||||||
@ -60,7 +71,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.PresentationDocument
|
|||||||
* top level object for creating new slides/etc.
|
* top level object for creating new slides/etc.
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XMLSlideShow extends POIXMLDocument {
|
public class XMLSlideShow extends POIXMLDocument implements SlideShow {
|
||||||
private static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class);
|
private static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class);
|
||||||
|
|
||||||
private CTPresentation _presentation;
|
private CTPresentation _presentation;
|
||||||
@ -437,7 +448,7 @@ public class XMLSlideShow extends POIXMLDocument {
|
|||||||
*/
|
*/
|
||||||
public int addPicture(byte[] pictureData, int format) {
|
public int addPicture(byte[] pictureData, int format) {
|
||||||
XSLFPictureData img = findPictureData(pictureData);
|
XSLFPictureData img = findPictureData(pictureData);
|
||||||
POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format];
|
// POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format];
|
||||||
|
|
||||||
if(img == null) {
|
if(img == null) {
|
||||||
int imageNumber = _pictures.size();
|
int imageNumber = _pictures.size();
|
||||||
@ -485,4 +496,17 @@ public class XMLSlideShow extends POIXMLDocument {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public MasterSheet<XSLFShape>[] getMasterSheet() {
|
||||||
|
return getSlideMasters();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MasterSheet<XSLFShape> createMasterSheet() throws IOException {
|
||||||
|
// TODO: implement!
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Resources getResources() {
|
||||||
|
// TODO: implement!
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.AutoShape;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;
|
||||||
@ -35,7 +36,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFAutoShape extends XSLFTextShape {
|
public class XSLFAutoShape extends XSLFTextShape implements AutoShape {
|
||||||
|
|
||||||
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
|
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
|
||||||
super(shape, sheet);
|
super(shape, sheet);
|
||||||
|
@ -17,25 +17,20 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import java.awt.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBackgroundFillStyleList;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTStyleMatrixReference;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTransform2D;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.Paint;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.Background;
|
||||||
|
import org.apache.xmlbeans.XmlObject;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Background shape
|
* Background shape
|
||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public class XSLFBackground extends XSLFSimpleShape {
|
public class XSLFBackground extends XSLFSimpleShape implements Background {
|
||||||
|
|
||||||
/* package */XSLFBackground(CTBackground shape, XSLFSheet sheet) {
|
/* package */XSLFBackground(CTBackground shape, XSLFSheet sheet) {
|
||||||
super(shape, sheet);
|
super(shape, sheet);
|
||||||
|
@ -18,22 +18,18 @@
|
|||||||
*/
|
*/
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.xmlbeans.XmlObject;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTHslColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTScRgbColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSystemColor;
|
|
||||||
import org.w3c.dom.Node;
|
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.DrawPaint;
|
||||||
|
import org.apache.poi.sl.usermodel.ColorStyle;
|
||||||
|
import org.apache.poi.util.Beta;
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
import org.apache.xmlbeans.XmlObject;
|
||||||
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
|
import org.w3c.dom.Node;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encapsulates logic to read color definitions from DrawingML and convert them to java.awt.Color
|
* Encapsulates logic to read color definitions from DrawingML and convert them to java.awt.Color
|
||||||
*
|
*
|
||||||
@ -63,38 +59,35 @@ public class XSLFColor {
|
|||||||
* If not color information was found in the supplied xml object then a null is returned.
|
* If not color information was found in the supplied xml object then a null is returned.
|
||||||
*/
|
*/
|
||||||
public Color getColor() {
|
public Color getColor() {
|
||||||
return _color == null ? null : applyColorTransform(_color);
|
return DrawPaint.applyColorTransform(getColorStyle());
|
||||||
}
|
}
|
||||||
|
|
||||||
private Color applyColorTransform(Color color){
|
public ColorStyle getColorStyle() {
|
||||||
Color result = color;
|
return new ColorStyle() {
|
||||||
|
public Color getColor() {
|
||||||
int alpha = getAlpha();
|
return _color;
|
||||||
if(alpha != -1){
|
|
||||||
result = new Color(
|
|
||||||
result.getRed(), result.getGreen(), result.getBlue(),
|
|
||||||
Math.round(255 * alpha * 0.01f));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int lumOff = getLumOff();
|
public int getAlpha() {
|
||||||
int lumMod = getLumMod();
|
return getRawValue("alpha");
|
||||||
if(lumMod != -1 || lumOff != -1){
|
|
||||||
result = modulateLuminanace(result,
|
|
||||||
lumMod == -1 ? 100 : lumMod,
|
|
||||||
lumOff == -1 ? 0 : lumOff);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int shade = getShade();
|
public int getLumOff() {
|
||||||
if(shade != -1){
|
return getRawValue("lumOff");
|
||||||
result = shade(result, shade);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int tint = getTint();
|
public int getLumMod() {
|
||||||
if(tint != -1){
|
return getRawValue("lumMod");
|
||||||
result = tint(result, tint);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
public int getShade() {
|
||||||
|
return getRawValue("shade");
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTint() {
|
||||||
|
return getRawValue("tint");
|
||||||
|
}
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Color toColor(XmlObject obj, XSLFTheme theme) {
|
Color toColor(XmlObject obj, XSLFTheme theme) {
|
||||||
@ -140,6 +133,7 @@ public class XSLFColor {
|
|||||||
color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
color = new Color(0xFF & val[0], 0xFF & val[1], 0xFF & val[2]);
|
||||||
} else {
|
} else {
|
||||||
// YK: color is a string like "menuText" or "windowText", we return black for such cases
|
// YK: color is a string like "menuText" or "windowText", we return black for such cases
|
||||||
|
@SuppressWarnings("unused")
|
||||||
String colorName = sys.getVal().toString();
|
String colorName = sys.getVal().toString();
|
||||||
color = Color.black;
|
color = Color.black;
|
||||||
}
|
}
|
||||||
@ -150,6 +144,33 @@ public class XSLFColor {
|
|||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private int getRawValue(String elem) {
|
||||||
|
String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;
|
||||||
|
|
||||||
|
XmlObject[] obj;
|
||||||
|
|
||||||
|
// first ask the context color and if not found, ask the actual color bean
|
||||||
|
if (_phClr != null){
|
||||||
|
obj = _phClr.selectPath(query);
|
||||||
|
if (obj.length == 1){
|
||||||
|
Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
|
||||||
|
if(attr != null) {
|
||||||
|
return Integer.parseInt(attr.getNodeValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
obj = _xmlObject.selectPath(query);
|
||||||
|
if (obj.length == 1){
|
||||||
|
Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
|
||||||
|
if(attr != null) {
|
||||||
|
return Integer.parseInt(attr.getNodeValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read a perecentage value from the supplied xml bean.
|
* Read a perecentage value from the supplied xml bean.
|
||||||
* Example:
|
* Example:
|
||||||
@ -160,56 +181,13 @@ public class XSLFColor {
|
|||||||
* @return the percentage value in the range [0 .. 100]
|
* @return the percentage value in the range [0 .. 100]
|
||||||
*/
|
*/
|
||||||
private int getPercentageValue(String elem){
|
private int getPercentageValue(String elem){
|
||||||
String query = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;
|
int val = getRawValue(elem);
|
||||||
|
return (val == -1) ? val : (val / 1000);
|
||||||
XmlObject[] obj;
|
|
||||||
|
|
||||||
// first ask the context color and if not found, ask the actual color bean
|
|
||||||
if(_phClr != null){
|
|
||||||
obj = _phClr.selectPath(query);
|
|
||||||
if(obj.length == 1){
|
|
||||||
Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
|
|
||||||
if(attr != null) {
|
|
||||||
return Integer.parseInt(attr.getNodeValue()) / 1000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = _xmlObject.selectPath(query);
|
|
||||||
if(obj.length == 1){
|
|
||||||
Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
|
|
||||||
if(attr != null) {
|
|
||||||
return Integer.parseInt(attr.getNodeValue()) / 1000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getAngleValue(String elem){
|
private int getAngleValue(String elem){
|
||||||
String color = "declare namespace a='http://schemas.openxmlformats.org/drawingml/2006/main' $this//a:" + elem;
|
int val = getRawValue(elem);
|
||||||
XmlObject[] obj;
|
return (val == -1) ? val : (val / 60000);
|
||||||
|
|
||||||
// first ask the context color and if not found, ask the actual color bean
|
|
||||||
if(_phClr != null){
|
|
||||||
obj = _xmlObject.selectPath( color );
|
|
||||||
if(obj.length == 1){
|
|
||||||
Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
|
|
||||||
if(attr != null) {
|
|
||||||
return Integer.parseInt(attr.getNodeValue()) / 60000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
obj = _xmlObject.selectPath( color );
|
|
||||||
if(obj.length == 1){
|
|
||||||
Node attr = obj[0].getDomNode().getAttributes().getNamedItem("val");
|
|
||||||
if(attr != null) {
|
|
||||||
return Integer.parseInt(attr.getNodeValue()) / 60000;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -387,7 +365,7 @@ public class XSLFColor {
|
|||||||
* percentage with 0% indicating minimal shade and 100% indicating maximum
|
* percentage with 0% indicating minimal shade and 100% indicating maximum
|
||||||
* or -1 if the value is not set
|
* or -1 if the value is not set
|
||||||
*/
|
*/
|
||||||
int getShade(){
|
public int getShade(){
|
||||||
return getPercentageValue("shade");
|
return getPercentageValue("shade");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -399,69 +377,11 @@ public class XSLFColor {
|
|||||||
* percentage with 0% indicating minimal tint and 100% indicating maximum
|
* percentage with 0% indicating minimal tint and 100% indicating maximum
|
||||||
* or -1 if the value is not set
|
* or -1 if the value is not set
|
||||||
*/
|
*/
|
||||||
int getTint(){
|
public int getTint(){
|
||||||
return getPercentageValue("tint");
|
return getPercentageValue("tint");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply lumMod / lumOff adjustments
|
|
||||||
*
|
|
||||||
* @param c the color to modify
|
|
||||||
* @param lumMod luminance modulation in the range [0..100]
|
|
||||||
* @param lumOff luminance offset in the range [0..100]
|
|
||||||
* @return modified color
|
|
||||||
*/
|
|
||||||
private static Color modulateLuminanace(Color c, int lumMod, int lumOff) {
|
|
||||||
Color color;
|
|
||||||
if (lumOff > 0) {
|
|
||||||
color = new Color(
|
|
||||||
(int) (Math.round((255 - c.getRed()) * (100.0 - lumMod) / 100.0 + c.getRed())),
|
|
||||||
(int) (Math.round((255 - c.getGreen()) * lumOff / 100.0 + c.getGreen())),
|
|
||||||
(int) (Math.round((255 - c.getBlue()) * lumOff / 100.0 + c.getBlue())),
|
|
||||||
c.getAlpha()
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
color = new Color(
|
|
||||||
(int) (Math.round(c.getRed() * lumMod / 100.0)),
|
|
||||||
(int) (Math.round(c.getGreen() * lumMod / 100.0)),
|
|
||||||
(int) (Math.round(c.getBlue() * lumMod / 100.0)),
|
|
||||||
c.getAlpha()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return color;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This algorithm returns result different from PowerPoint.
|
|
||||||
* TODO: revisit and improve
|
|
||||||
*/
|
|
||||||
private static Color shade(Color c, int shade) {
|
|
||||||
return new Color(
|
|
||||||
(int)(c.getRed() * shade * 0.01),
|
|
||||||
(int)(c.getGreen() * shade * 0.01),
|
|
||||||
(int)(c.getBlue() * shade * 0.01),
|
|
||||||
c.getAlpha());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This algorithm returns result different from PowerPoint.
|
|
||||||
* TODO: revisit and improve
|
|
||||||
*/
|
|
||||||
private static Color tint(Color c, int tint) {
|
|
||||||
int r = c.getRed();
|
|
||||||
int g = c.getGreen();
|
|
||||||
int b = c.getBlue();
|
|
||||||
|
|
||||||
float ftint = tint / 100.0f;
|
|
||||||
|
|
||||||
int red = Math.round(ftint * r + (1 - ftint) * 255);
|
|
||||||
int green = Math.round(ftint * g + (1 - ftint) * 255);
|
|
||||||
int blue = Math.round(ftint * b + (1 - ftint) * 255);
|
|
||||||
|
|
||||||
return new Color(red, green, blue);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Preset colors defined in DrawingML
|
* Preset colors defined in DrawingML
|
||||||
*/
|
*/
|
||||||
|
@ -23,6 +23,7 @@ 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;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
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.XmlCursor;
|
import org.apache.xmlbeans.XmlCursor;
|
||||||
@ -34,6 +35,7 @@ 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 javax.xml.namespace.QName;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
|
||||||
@ -58,8 +60,8 @@ public class XSLFGraphicFrame extends XSLFShape {
|
|||||||
return _sheet;
|
return _sheet;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getShapeType(){
|
public ShapeType getShapeType(){
|
||||||
throw new RuntimeException("NotImplemented");
|
throw new UnsupportedOperationException();
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getShapeId(){
|
public int getShapeId(){
|
||||||
|
@ -19,9 +19,17 @@
|
|||||||
|
|
||||||
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.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
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.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;
|
||||||
@ -35,13 +43,6 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShape;
|
|||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.awt.geom.AffineTransform;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a group shape that consists of many shapes grouped together.
|
* Represents a group shape that consists of many shapes grouped together.
|
||||||
*
|
*
|
||||||
@ -207,30 +208,35 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
public XSLFAutoShape createAutoShape(){
|
public XSLFAutoShape createAutoShape(){
|
||||||
XSLFAutoShape sh = getDrawing().createAutoShape();
|
XSLFAutoShape sh = getDrawing().createAutoShape();
|
||||||
_shapes.add(sh);
|
_shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFFreeformShape createFreeform(){
|
public XSLFFreeformShape createFreeform(){
|
||||||
XSLFFreeformShape sh = getDrawing().createFreeform();
|
XSLFFreeformShape sh = getDrawing().createFreeform();
|
||||||
_shapes.add(sh);
|
_shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFTextBox createTextBox(){
|
public XSLFTextBox createTextBox(){
|
||||||
XSLFTextBox sh = getDrawing().createTextBox();
|
XSLFTextBox sh = getDrawing().createTextBox();
|
||||||
_shapes.add(sh);
|
_shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFConnectorShape createConnector(){
|
public XSLFConnectorShape createConnector(){
|
||||||
XSLFConnectorShape sh = getDrawing().createConnector();
|
XSLFConnectorShape sh = getDrawing().createConnector();
|
||||||
_shapes.add(sh);
|
_shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFGroupShape createGroup(){
|
public XSLFGroupShape createGroup(){
|
||||||
XSLFGroupShape sh = getDrawing().createGroup();
|
XSLFGroupShape sh = getDrawing().createGroup();
|
||||||
_shapes.add(sh);
|
_shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -251,6 +257,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
|
XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
|
||||||
sh.resize();
|
sh.resize();
|
||||||
_shapes.add(sh);
|
_shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -343,4 +350,13 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ShapeType getShapeType(){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addShape(XSLFShape shape) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Adding a shape from a different container is not supported -"
|
||||||
|
+ " create it from scratch witht XSLFGroupShape.create* methods");
|
||||||
|
}
|
||||||
}
|
}
|
@ -21,6 +21,8 @@ import java.io.IOException;
|
|||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
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.Notes;
|
||||||
|
import org.apache.poi.sl.usermodel.TextRun;
|
||||||
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.presentationml.x2006.main.CTCommonSlideData;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
||||||
@ -28,7 +30,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTNotesSlide;
|
|||||||
import org.openxmlformats.schemas.presentationml.x2006.main.NotesDocument;
|
import org.openxmlformats.schemas.presentationml.x2006.main.NotesDocument;
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public final class XSLFNotes extends XSLFSheet {
|
public final class XSLFNotes extends XSLFSheet implements Notes<XSLFShape> {
|
||||||
private CTNotesSlide _notes;
|
private CTNotesSlide _notes;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -80,7 +82,6 @@ public final class XSLFNotes extends XSLFSheet {
|
|||||||
return getMasterSheet().getTheme();
|
return getMasterSheet().getTheme();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public XSLFNotesMaster getMasterSheet() {
|
public XSLFNotesMaster getMasterSheet() {
|
||||||
for (POIXMLDocumentPart p : getRelations()) {
|
for (POIXMLDocumentPart p : getRelations()) {
|
||||||
if (p instanceof XSLFNotesMaster){
|
if (p instanceof XSLFNotesMaster){
|
||||||
@ -89,4 +90,20 @@ public final class XSLFNotes extends XSLFSheet {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TextRun getTextRun() {
|
||||||
|
for (XSLFShape sh : super.getShapes()) {
|
||||||
|
if (sh instanceof XSLFTextShape) {
|
||||||
|
XSLFTextShape txt = (XSLFTextShape)sh;
|
||||||
|
for (XSLFTextParagraph p : txt.getTextParagraphs()) {
|
||||||
|
for (XSLFTextRun r : p.getTextRuns()) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import org.apache.poi.POIXMLDocumentPart;
|
|||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
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.MasterSheet;
|
||||||
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.CTColorMapping;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping;
|
||||||
@ -46,7 +47,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFNotesMaster extends XSLFSheet {
|
public class XSLFNotesMaster extends XSLFSheet implements MasterSheet<XSLFShape> {
|
||||||
private CTNotesMaster _slide;
|
private CTNotesMaster _slide;
|
||||||
private XSLFTheme _theme;
|
private XSLFTheme _theme;
|
||||||
|
|
||||||
@ -93,7 +94,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XSLFSheet getMasterSheet() {
|
public MasterSheet getMasterSheet() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.Shadow;
|
||||||
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;
|
||||||
@ -31,7 +32,7 @@ import java.awt.geom.Rectangle2D;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public class XSLFShadow extends XSLFSimpleShape {
|
public class XSLFShadow extends XSLFSimpleShape implements Shadow {
|
||||||
|
|
||||||
private XSLFSimpleShape _parent;
|
private XSLFSimpleShape _parent;
|
||||||
|
|
||||||
|
@ -19,13 +19,25 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Color;
|
||||||
import java.awt.geom.AffineTransform;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Comparator;
|
||||||
|
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
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.util.*;
|
||||||
|
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.presentationml.x2006.main.CTPlaceholder;
|
||||||
|
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
|
||||||
@ -33,24 +45,42 @@ import org.apache.xmlbeans.XmlObject;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFShape {
|
public abstract class XSLFShape implements Shape {
|
||||||
|
protected final XmlObject _shape;
|
||||||
|
protected final XSLFSheet _sheet;
|
||||||
|
protected XSLFShapeContainer _parent;
|
||||||
|
|
||||||
/**
|
private CTShapeProperties _spPr;
|
||||||
* @return the position of this shape within the drawing canvas.
|
private CTShapeStyle _spStyle;
|
||||||
* The coordinates are expressed in points
|
private CTNonVisualDrawingProps _nvPr;
|
||||||
*/
|
private CTPlaceholder _ph;
|
||||||
public abstract Rectangle2D getAnchor();
|
|
||||||
|
private static final PaintStyle TRANSPARENT_PAINT = new SolidPaint() {
|
||||||
|
public ColorStyle getSolidColor() {
|
||||||
|
return new ColorStyle(){
|
||||||
|
public Color getColor() { return DrawPaint.NO_PAINT; }
|
||||||
|
public int getAlpha() { return -1; }
|
||||||
|
public int getLumOff() { return -1; }
|
||||||
|
public int getLumMod() { return -1; }
|
||||||
|
public int getShade() { return -1; }
|
||||||
|
public int getTint() { return -1; }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
protected XSLFShape(XmlObject shape, XSLFSheet sheet) {
|
||||||
|
_shape = shape;
|
||||||
|
_sheet = sheet;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param anchor the position of this shape within the drawing canvas.
|
|
||||||
* The coordinates are expressed in points
|
|
||||||
*/
|
|
||||||
public abstract void setAnchor(Rectangle2D anchor);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return the xml bean holding this shape's data
|
* @return the xml bean holding this shape's data
|
||||||
*/
|
*/
|
||||||
public abstract XmlObject getXmlObject();
|
public XmlObject getXmlObject() {
|
||||||
|
return _shape;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return human-readable name of this shape, e.g. "Rectange 3"
|
* @return human-readable name of this shape, e.g. "Rectange 3"
|
||||||
@ -118,84 +148,6 @@ public abstract class XSLFShape {
|
|||||||
*/
|
*/
|
||||||
public abstract boolean getFlipVertical();
|
public abstract boolean getFlipVertical();
|
||||||
|
|
||||||
/**
|
|
||||||
* Draw this shape into the supplied canvas
|
|
||||||
*
|
|
||||||
* @param graphics the graphics to draw into
|
|
||||||
*/
|
|
||||||
public abstract void draw(Graphics2D graphics);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apply 2-D transforms before drawing this shape. This includes rotation and flipping.
|
|
||||||
*
|
|
||||||
* @param graphics the graphics whos transform matrix will be modified
|
|
||||||
*/
|
|
||||||
protected void applyTransform(Graphics2D graphics) {
|
|
||||||
Rectangle2D anchor = getAnchor();
|
|
||||||
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM);
|
|
||||||
if(tx != null) {
|
|
||||||
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
|
||||||
}
|
|
||||||
|
|
||||||
// rotation
|
|
||||||
double rotation = getRotation();
|
|
||||||
if (rotation != 0.) {
|
|
||||||
// PowerPoint rotates shapes relative to the geometric center
|
|
||||||
double centerX = anchor.getCenterX();
|
|
||||||
double centerY = anchor.getCenterY();
|
|
||||||
|
|
||||||
// normalize rotation
|
|
||||||
rotation = (360.+(rotation%360.))%360.;
|
|
||||||
int quadrant = (((int)rotation+45)/90)%4;
|
|
||||||
double scaleX = 1.0, scaleY = 1.0;
|
|
||||||
|
|
||||||
// scale to bounding box (bug #53176)
|
|
||||||
if (quadrant == 1 || quadrant == 3) {
|
|
||||||
// In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation
|
|
||||||
// (45-135 degrees and 225-315 degrees), we need to first rotate the shape by a multiple
|
|
||||||
// of 90 degrees and then resize the bounding box to its original bbox. After that we can
|
|
||||||
// rotate the shape to the exact rotation amount.
|
|
||||||
// It's strange that you'll need to rotate the shape back and forth again, but you can
|
|
||||||
// think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might
|
|
||||||
// be already (differently) scaled, so you can paint the shape in its default orientation
|
|
||||||
// and later on, turn it around again to compare it with its original size ...
|
|
||||||
AffineTransform txg = new AffineTransform(); // graphics coordinate space
|
|
||||||
AffineTransform txs = new AffineTransform(tx); // shape coordinate space
|
|
||||||
txg.translate(centerX, centerY);
|
|
||||||
txg.rotate(Math.toRadians(quadrant*90));
|
|
||||||
txg.translate(-centerX, -centerY);
|
|
||||||
txs.translate(centerX, centerY);
|
|
||||||
txs.rotate(Math.toRadians(-quadrant*90));
|
|
||||||
txs.translate(-centerX, -centerY);
|
|
||||||
txg.concatenate(txs);
|
|
||||||
Rectangle2D anchor2 = txg.createTransformedShape(getAnchor()).getBounds2D();
|
|
||||||
scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();
|
|
||||||
scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();
|
|
||||||
}
|
|
||||||
|
|
||||||
// transformation is applied reversed ...
|
|
||||||
graphics.translate(centerX, centerY);
|
|
||||||
graphics.rotate(Math.toRadians(rotation-(double)(quadrant*90)));
|
|
||||||
graphics.scale(scaleX, scaleY);
|
|
||||||
graphics.rotate(Math.toRadians(quadrant*90));
|
|
||||||
graphics.translate(-centerX, -centerY);
|
|
||||||
}
|
|
||||||
|
|
||||||
//flip horizontal
|
|
||||||
if (getFlipHorizontal()) {
|
|
||||||
graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
|
|
||||||
graphics.scale(-1, 1);
|
|
||||||
graphics.translate(-anchor.getX(), -anchor.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
//flip vertical
|
|
||||||
if (getFlipVertical()) {
|
|
||||||
graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
|
|
||||||
graphics.scale(1, -1);
|
|
||||||
graphics.translate(-anchor.getX(), -anchor.getY());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
* This method is called recursively for each shape when merging slides
|
* This method is called recursively for each shape when merging slides
|
||||||
@ -212,4 +164,402 @@ public abstract class XSLFShape {
|
|||||||
|
|
||||||
setAnchor(sh.getAnchor());
|
setAnchor(sh.getAnchor());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setParent(XSLFShapeContainer parent) {
|
||||||
|
this._parent = parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XSLFShapeContainer getParent() {
|
||||||
|
return this._parent;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isPlaceholder() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public StrokeStyle getStrokeStyle() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public CustomGeometry getGeometry() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ShapeType getShapeType() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public XSLFSheet getSheet() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fetch shape fill as a java.awt.Paint
|
||||||
|
*
|
||||||
|
* @return either Color or GradientPaint or TexturePaint or null
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public FillStyle getFillStyle() {
|
||||||
|
return new FillStyle() {
|
||||||
|
public PaintStyle getPaint() {
|
||||||
|
PropertyFetcher<PaintStyle> fetcher = new PropertyFetcher<PaintStyle>() {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Walk up the inheritance tree and fetch shape properties.
|
||||||
|
*
|
||||||
|
* The following order of inheritance is assumed:
|
||||||
|
* <p>
|
||||||
|
* slide <-- slideLayout <-- slideMaster
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @param visitor the object that collects the desired property
|
||||||
|
* @return true if the property was fetched
|
||||||
|
*/
|
||||||
|
protected boolean fetchShapeProperty(PropertyFetcher<?> visitor) {
|
||||||
|
boolean ok = visitor.fetch(this);
|
||||||
|
|
||||||
|
XSLFSimpleShape masterShape;
|
||||||
|
XSLFSheet masterSheet = (XSLFSheet)getSheet().getMasterSheet();
|
||||||
|
CTPlaceholder ph = getCTPlaceholder();
|
||||||
|
|
||||||
|
if (masterSheet != null && ph != null) {
|
||||||
|
if (!ok) {
|
||||||
|
masterShape = masterSheet.getPlaceholder(ph);
|
||||||
|
if (masterShape != null) {
|
||||||
|
ok = visitor.fetch(masterShape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// try slide master
|
||||||
|
if (!ok ) {
|
||||||
|
int textType;
|
||||||
|
if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY;
|
||||||
|
else {
|
||||||
|
switch (ph.getType().intValue()) {
|
||||||
|
case STPlaceholderType.INT_TITLE:
|
||||||
|
case STPlaceholderType.INT_CTR_TITLE:
|
||||||
|
textType = STPlaceholderType.INT_TITLE;
|
||||||
|
break;
|
||||||
|
case STPlaceholderType.INT_FTR:
|
||||||
|
case STPlaceholderType.INT_SLD_NUM:
|
||||||
|
case STPlaceholderType.INT_DT:
|
||||||
|
textType = ph.getType().intValue();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
textType = STPlaceholderType.INT_BODY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
XSLFSheet master = (XSLFSheet)masterSheet.getMasterSheet();
|
||||||
|
if (master != null) {
|
||||||
|
masterShape = master.getPlaceholderByType(textType);
|
||||||
|
if (masterShape != null) {
|
||||||
|
ok = visitor.fetch(masterShape);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected CTPlaceholder getCTPlaceholder() {
|
||||||
|
if (_ph == null) {
|
||||||
|
XmlObject[] obj = _shape.selectPath(
|
||||||
|
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph");
|
||||||
|
if (obj.length == 1) {
|
||||||
|
_ph = (CTPlaceholder) obj[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return _ph;
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
* 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
|
||||||
|
*/
|
||||||
|
protected PaintStyle selectPaint(XmlObject obj, final CTSchemeColor phClr, final PackagePart parentPart) {
|
||||||
|
final XSLFTheme theme = getSheet().getTheme();
|
||||||
|
|
||||||
|
if (obj instanceof CTNoFillProperties) {
|
||||||
|
return TRANSPARENT_PAINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof CTSolidColorFillProperties) {
|
||||||
|
CTSolidColorFillProperties solidFill = (CTSolidColorFillProperties) obj;
|
||||||
|
final XSLFColor c = new XSLFColor(solidFill, theme, phClr);
|
||||||
|
return new SolidPaint() {
|
||||||
|
public ColorStyle getSolidColor() {
|
||||||
|
return c.getColorStyle();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
if (obj instanceof CTBlipFillProperties) {
|
||||||
|
CTBlipFillProperties blipFill = (CTBlipFillProperties)obj;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -19,10 +19,12 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
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 Iterable<XSLFShape> {
|
public interface XSLFShapeContainer extends ShapeContainer {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@ -55,27 +57,6 @@ public interface XSLFShapeContainer extends Iterable<XSLFShape> {
|
|||||||
*/
|
*/
|
||||||
XSLFPictureShape createPicture(int pictureIndex);
|
XSLFPictureShape createPicture(int pictureIndex);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns an array containing all of the elements in this container in proper
|
|
||||||
* sequence (from first to last element).
|
|
||||||
*
|
|
||||||
* @return an array containing all of the elements in this container in proper
|
|
||||||
* sequence
|
|
||||||
*/
|
|
||||||
XSLFShape[] getShapes();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Removes the specified shape from this sheet, if it is present
|
|
||||||
* (optional operation). If this sheet does not contain the element,
|
|
||||||
* it is unchanged.
|
|
||||||
*
|
|
||||||
* @param xShape shape to be removed from this sheet, if present
|
|
||||||
* @return <tt>true</tt> if this sheet contained the specified element
|
|
||||||
* @throws IllegalArgumentException if the type of the specified shape
|
|
||||||
* is incompatible with this sheet (optional)
|
|
||||||
*/
|
|
||||||
boolean removeShape(XSLFShape xShape) ;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes all of the elements from this container (optional operation).
|
* Removes all of the elements from this container (optional operation).
|
||||||
* The container will be empty after this call returns.
|
* The container will be empty after this call returns.
|
||||||
|
@ -1,236 +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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* known preset shape geometries in PresentationML
|
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public enum XSLFShapeType {
|
|
||||||
LINE(1),
|
|
||||||
LINE_INV(2),
|
|
||||||
TRIANGLE(3),
|
|
||||||
RT_TRIANGLE(4),
|
|
||||||
RECT(5),
|
|
||||||
DIAMOND(6),
|
|
||||||
PARALLELOGRAM(7),
|
|
||||||
TRAPEZOID(8),
|
|
||||||
NON_ISOSCELES_TRAPEZOID(9),
|
|
||||||
PENTAGON(10),
|
|
||||||
HEXAGON(11),
|
|
||||||
HEPTAGON(12),
|
|
||||||
OCTAGON(13),
|
|
||||||
DECAGON(14),
|
|
||||||
DODECAGON(15),
|
|
||||||
STAR_4(16),
|
|
||||||
STAR_5(17),
|
|
||||||
STAR_6(18),
|
|
||||||
STAR_7(19),
|
|
||||||
STAR_8(20),
|
|
||||||
STAR_10(21),
|
|
||||||
STAR_12(22),
|
|
||||||
STAR_16(23),
|
|
||||||
STAR_24(24),
|
|
||||||
STAR_32(25),
|
|
||||||
ROUND_RECT(26),
|
|
||||||
ROUND_1_RECT(27),
|
|
||||||
ROUND_2_SAME_RECT(28),
|
|
||||||
ROUND_2_DIAG_RECT(29),
|
|
||||||
SNIP_ROUND_RECT(30),
|
|
||||||
SNIP_1_RECT(31),
|
|
||||||
SNIP_2_SAME_RECT(32),
|
|
||||||
SNIP_2_DIAG_RECT(33),
|
|
||||||
PLAQUE(34),
|
|
||||||
ELLIPSE(35),
|
|
||||||
TEARDROP(36),
|
|
||||||
HOME_PLATE(37),
|
|
||||||
CHEVRON(38),
|
|
||||||
PIE_WEDGE(39),
|
|
||||||
PIE(40),
|
|
||||||
BLOCK_ARC(41),
|
|
||||||
DONUT(42),
|
|
||||||
NO_SMOKING(43),
|
|
||||||
RIGHT_ARROW(44),
|
|
||||||
LEFT_ARROW(45),
|
|
||||||
UP_ARROW(46),
|
|
||||||
DOWN_ARROW(47),
|
|
||||||
STRIPED_RIGHT_ARROW(48),
|
|
||||||
NOTCHED_RIGHT_ARROW(49),
|
|
||||||
BENT_UP_ARROW(50),
|
|
||||||
LEFT_RIGHT_ARROW(51),
|
|
||||||
UP_DOWN_ARROW(52),
|
|
||||||
LEFT_UP_ARROW(53),
|
|
||||||
LEFT_RIGHT_UP_ARROW(54),
|
|
||||||
QUAD_ARROW(55),
|
|
||||||
LEFT_ARROW_CALLOUT(56),
|
|
||||||
RIGHT_ARROW_CALLOUT(57),
|
|
||||||
UP_ARROW_CALLOUT(58),
|
|
||||||
DOWN_ARROW_CALLOUT(59),
|
|
||||||
LEFT_RIGHT_ARROW_CALLOUT(60),
|
|
||||||
UP_DOWN_ARROW_CALLOUT(61),
|
|
||||||
QUAD_ARROW_CALLOUT(62),
|
|
||||||
BENT_ARROW(63),
|
|
||||||
UTURN_ARROW(64),
|
|
||||||
CIRCULAR_ARROW(65),
|
|
||||||
LEFT_CIRCULAR_ARROW(66),
|
|
||||||
LEFT_RIGHT_CIRCULAR_ARROW(67),
|
|
||||||
CURVED_RIGHT_ARROW(68),
|
|
||||||
CURVED_LEFT_ARROW(69),
|
|
||||||
CURVED_UP_ARROW(70),
|
|
||||||
CURVED_DOWN_ARROW(71),
|
|
||||||
SWOOSH_ARROW(72),
|
|
||||||
CUBE(73),
|
|
||||||
CAN(74),
|
|
||||||
LIGHTNING_BOLT(75),
|
|
||||||
HEART(76),
|
|
||||||
SUN(77),
|
|
||||||
MOON(78),
|
|
||||||
SMILEY_FACE(79),
|
|
||||||
IRREGULAR_SEAL_1(80),
|
|
||||||
IRREGULAR_SEAL_2(81),
|
|
||||||
FOLDED_CORNER(82),
|
|
||||||
BEVEL(83),
|
|
||||||
FRAME(84),
|
|
||||||
HALF_FRAME(85),
|
|
||||||
CORNER(86),
|
|
||||||
DIAG_STRIPE(87),
|
|
||||||
CHORD(88),
|
|
||||||
ARC(89),
|
|
||||||
LEFT_BRACKET(90),
|
|
||||||
RIGHT_BRACKET(91),
|
|
||||||
LEFT_BRACE(92),
|
|
||||||
RIGHT_BRACE(93),
|
|
||||||
BRACKET_PAIR(94),
|
|
||||||
BRACE_PAIR(95),
|
|
||||||
STRAIGHT_CONNECTOR_1(96),
|
|
||||||
BENT_CONNECTOR_2(97),
|
|
||||||
BENT_CONNECTOR_3(98),
|
|
||||||
BENT_CONNECTOR_4(99),
|
|
||||||
BENT_CONNECTOR_5(100),
|
|
||||||
CURVED_CONNECTOR_2(101),
|
|
||||||
CURVED_CONNECTOR_3(102),
|
|
||||||
CURVED_CONNECTOR_4(103),
|
|
||||||
CURVED_CONNECTOR_5(104),
|
|
||||||
CALLOUT_1(105),
|
|
||||||
CALLOUT_2(106),
|
|
||||||
CALLOUT_3(107),
|
|
||||||
ACCENT_CALLOUT_1(108),
|
|
||||||
ACCENT_CALLOUT_2(109),
|
|
||||||
ACCENT_CALLOUT_3(110),
|
|
||||||
BORDER_CALLOUT_1(111),
|
|
||||||
BORDER_CALLOUT_2(112),
|
|
||||||
BORDER_CALLOUT_3(113),
|
|
||||||
ACCENT_BORDER_CALLOUT_1(114),
|
|
||||||
ACCENT_BORDER_CALLOUT_2(115),
|
|
||||||
ACCENT_BORDER_CALLOUT_3(116),
|
|
||||||
WEDGE_RECT_CALLOUT(117),
|
|
||||||
WEDGE_ROUND_RECT_CALLOUT(118),
|
|
||||||
WEDGE_ELLIPSE_CALLOUT(119),
|
|
||||||
CLOUD_CALLOUT(120),
|
|
||||||
CLOUD(121),
|
|
||||||
RIBBON(122),
|
|
||||||
RIBBON_2(123),
|
|
||||||
ELLIPSE_RIBBON(124),
|
|
||||||
ELLIPSE_RIBBON_2(125),
|
|
||||||
LEFT_RIGHT_RIBBON(126),
|
|
||||||
VERTICAL_SCROLL(127),
|
|
||||||
HORIZONTAL_SCROLL(128),
|
|
||||||
WAVE(129),
|
|
||||||
DOUBLE_WAVE(130),
|
|
||||||
PLUS(131),
|
|
||||||
FLOW_CHART_PROCESS(132),
|
|
||||||
FLOW_CHART_DECISION(133),
|
|
||||||
FLOW_CHART_INPUT_OUTPUT(134),
|
|
||||||
FLOW_CHART_PREDEFINED_PROCESS(135),
|
|
||||||
FLOW_CHART_INTERNAL_STORAGE(136),
|
|
||||||
FLOW_CHART_DOCUMENT(137),
|
|
||||||
FLOW_CHART_MULTIDOCUMENT(138),
|
|
||||||
FLOW_CHART_TERMINATOR(139),
|
|
||||||
FLOW_CHART_PREPARATION(140),
|
|
||||||
FLOW_CHART_MANUAL_INPUT(141),
|
|
||||||
FLOW_CHART_MANUAL_OPERATION(142),
|
|
||||||
FLOW_CHART_CONNECTOR(143),
|
|
||||||
FLOW_CHART_PUNCHED_CARD(144),
|
|
||||||
FLOW_CHART_PUNCHED_TAPE(145),
|
|
||||||
FLOW_CHART_SUMMING_JUNCTION(146),
|
|
||||||
FLOW_CHART_OR(147),
|
|
||||||
FLOW_CHART_COLLATE(148),
|
|
||||||
FLOW_CHART_SORT(149),
|
|
||||||
FLOW_CHART_EXTRACT(150),
|
|
||||||
FLOW_CHART_MERGE(151),
|
|
||||||
FLOW_CHART_OFFLINE_STORAGE(152),
|
|
||||||
FLOW_CHART_ONLINE_STORAGE(153),
|
|
||||||
FLOW_CHART_MAGNETIC_TAPE(154),
|
|
||||||
FLOW_CHART_MAGNETIC_DISK(155),
|
|
||||||
FLOW_CHART_MAGNETIC_DRUM(156),
|
|
||||||
FLOW_CHART_DISPLAY(157),
|
|
||||||
FLOW_CHART_DELAY(158),
|
|
||||||
FLOW_CHART_ALTERNATE_PROCESS(159),
|
|
||||||
FLOW_CHART_OFFPAGE_CONNECTOR(160),
|
|
||||||
ACTION_BUTTON_BLANK(161),
|
|
||||||
ACTION_BUTTON_HOME(162),
|
|
||||||
ACTION_BUTTON_HELP(163),
|
|
||||||
ACTION_BUTTON_INFORMATION(164),
|
|
||||||
ACTION_BUTTON_FORWARD_NEXT(165),
|
|
||||||
ACTION_BUTTON_BACK_PREVIOUS(166),
|
|
||||||
ACTION_BUTTON_END(167),
|
|
||||||
ACTION_BUTTON_BEGINNING(168),
|
|
||||||
ACTION_BUTTON_RETURN(169),
|
|
||||||
ACTION_BUTTON_DOCUMENT(170),
|
|
||||||
ACTION_BUTTON_SOUND(171),
|
|
||||||
ACTION_BUTTON_MOVIE(172),
|
|
||||||
GEAR_6(173),
|
|
||||||
GEAR_9(174),
|
|
||||||
FUNNEL(175),
|
|
||||||
MATH_PLUS(176),
|
|
||||||
MATH_MINUS(177),
|
|
||||||
MATH_MULTIPLY(178),
|
|
||||||
MATH_DIVIDE(179),
|
|
||||||
MATH_EQUAL(180),
|
|
||||||
MATH_NOT_EQUAL(181),
|
|
||||||
CORNER_TABS(182),
|
|
||||||
SQUARE_TABS(183),
|
|
||||||
PLAQUE_TABS(184),
|
|
||||||
CHART_X(185),
|
|
||||||
CHART_STAR(186),
|
|
||||||
CHART_PLUS(187);
|
|
||||||
|
|
||||||
private int _idx;
|
|
||||||
|
|
||||||
XSLFShapeType(int idx){
|
|
||||||
_idx = idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return index in the STShapeType enum
|
|
||||||
*/
|
|
||||||
int getIndex(){
|
|
||||||
return _idx;
|
|
||||||
}
|
|
||||||
|
|
||||||
static XSLFShapeType forInt(int idx){
|
|
||||||
for(XSLFShapeType t : values()){
|
|
||||||
if(t._idx == idx) return t;
|
|
||||||
}
|
|
||||||
throw new IllegalArgumentException("Unknown shape type: " + idx);
|
|
||||||
}
|
|
||||||
}
|
|
@ -23,6 +23,8 @@ 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.openxml4j.exceptions.InvalidFormatException;
|
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.Beta;
|
||||||
import org.apache.poi.util.IOUtils;
|
import org.apache.poi.util.IOUtils;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
@ -37,7 +39,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTPicture;
|
|||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
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 java.awt.Graphics2D;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@ -51,7 +56,7 @@ import java.util.Map;
|
|||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer {
|
public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet {
|
||||||
private XSLFCommonSlideData _commonSlideData;
|
private XSLFCommonSlideData _commonSlideData;
|
||||||
private XSLFDrawing _drawing;
|
private XSLFDrawing _drawing;
|
||||||
private List<XSLFShape> _shapes;
|
private List<XSLFShape> _shapes;
|
||||||
@ -142,6 +147,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
List<XSLFShape> shapes = getShapeList();
|
List<XSLFShape> shapes = getShapeList();
|
||||||
XSLFAutoShape sh = getDrawing().createAutoShape();
|
XSLFAutoShape sh = getDrawing().createAutoShape();
|
||||||
shapes.add(sh);
|
shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,6 +155,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
List<XSLFShape> shapes = getShapeList();
|
List<XSLFShape> shapes = getShapeList();
|
||||||
XSLFFreeformShape sh = getDrawing().createFreeform();
|
XSLFFreeformShape sh = getDrawing().createFreeform();
|
||||||
shapes.add(sh);
|
shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,6 +163,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
List<XSLFShape> shapes = getShapeList();
|
List<XSLFShape> shapes = getShapeList();
|
||||||
XSLFTextBox sh = getDrawing().createTextBox();
|
XSLFTextBox sh = getDrawing().createTextBox();
|
||||||
shapes.add(sh);
|
shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,6 +171,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
List<XSLFShape> shapes = getShapeList();
|
List<XSLFShape> shapes = getShapeList();
|
||||||
XSLFConnectorShape sh = getDrawing().createConnector();
|
XSLFConnectorShape sh = getDrawing().createConnector();
|
||||||
shapes.add(sh);
|
shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,6 +179,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
List<XSLFShape> shapes = getShapeList();
|
List<XSLFShape> shapes = getShapeList();
|
||||||
XSLFGroupShape sh = getDrawing().createGroup();
|
XSLFGroupShape sh = getDrawing().createGroup();
|
||||||
shapes.add(sh);
|
shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,6 +201,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
sh.resize();
|
sh.resize();
|
||||||
|
|
||||||
getShapeList().add(sh);
|
getShapeList().add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -198,6 +209,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
List<XSLFShape> shapes = getShapeList();
|
List<XSLFShape> shapes = getShapeList();
|
||||||
XSLFTable sh = getDrawing().createTable();
|
XSLFTable sh = getDrawing().createTable();
|
||||||
shapes.add(sh);
|
shapes.add(sh);
|
||||||
|
sh.setParent(this);
|
||||||
return sh;
|
return sh;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -219,6 +231,12 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
return getShapeList().iterator();
|
return getShapeList().iterator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void addShape(XSLFShape shape) {
|
||||||
|
throw new UnsupportedOperationException(
|
||||||
|
"Adding a shape from a different container is not supported -"
|
||||||
|
+ " create it from scratch witht XSLFSheet.create* methods");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Removes the specified shape from this sheet, if it is present
|
* Removes the specified shape from this sheet, if it is present
|
||||||
* (optional operation). If this sheet does not contain the element,
|
* (optional operation). If this sheet does not contain the element,
|
||||||
@ -370,12 +388,6 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @return master of this sheet.
|
|
||||||
*/
|
|
||||||
public abstract XSLFSheet getMasterSheet();
|
|
||||||
|
|
||||||
protected XSLFTextShape getTextShapeByType(Placeholder type){
|
protected XSLFTextShape getTextShapeByType(Placeholder type){
|
||||||
for(XSLFShape shape : this.getShapes()){
|
for(XSLFShape shape : this.getShapes()){
|
||||||
if(shape instanceof XSLFTextShape) {
|
if(shape instanceof XSLFTextShape) {
|
||||||
@ -486,7 +498,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
|||||||
* @param graphics
|
* @param graphics
|
||||||
*/
|
*/
|
||||||
public void draw(Graphics2D graphics){
|
public void draw(Graphics2D graphics){
|
||||||
XSLFSheet master = getMasterSheet();
|
XSLFSheet master = (XSLFSheet)getMasterSheet();
|
||||||
if(getFollowMasterGraphics() && master != null) master.draw(graphics);
|
if(getFollowMasterGraphics() && master != null) master.draw(graphics);
|
||||||
|
|
||||||
graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform());
|
graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform());
|
||||||
|
@ -19,26 +19,25 @@
|
|||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.Shape;
|
||||||
|
import java.awt.geom.*;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.stream.XMLStreamException;
|
||||||
|
import javax.xml.stream.XMLStreamReader;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.geom.*;
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineCap;
|
||||||
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
||||||
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;
|
||||||
import org.apache.poi.xslf.model.geom.CustomGeometry;
|
|
||||||
import org.apache.poi.xslf.model.geom.Outline;
|
|
||||||
import org.apache.poi.xslf.model.geom.Path;
|
|
||||||
import org.apache.poi.xslf.model.geom.PresetGeometries;
|
|
||||||
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.CTShape;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|
||||||
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.geom.AffineTransform;
|
|
||||||
import java.awt.geom.Ellipse2D;
|
|
||||||
import java.awt.geom.GeneralPath;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a single (non-group) shape in a .pptx slide show
|
* Represents a single (non-group) shape in a .pptx slide show
|
||||||
@ -46,24 +45,11 @@ import java.util.List;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFSimpleShape extends XSLFShape {
|
public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
||||||
private static CTOuterShadowEffect NO_SHADOW = CTOuterShadowEffect.Factory.newInstance();
|
private static CTOuterShadowEffect NO_SHADOW = CTOuterShadowEffect.Factory.newInstance();
|
||||||
|
|
||||||
private final XmlObject _shape;
|
|
||||||
private final XSLFSheet _sheet;
|
|
||||||
private CTShapeProperties _spPr;
|
|
||||||
private CTShapeStyle _spStyle;
|
|
||||||
private CTNonVisualDrawingProps _nvPr;
|
|
||||||
private CTPlaceholder _ph;
|
|
||||||
|
|
||||||
/* package */XSLFSimpleShape(XmlObject shape, XSLFSheet sheet) {
|
/* package */XSLFSimpleShape(XmlObject shape, XSLFSheet sheet) {
|
||||||
_shape = shape;
|
super(shape,sheet);
|
||||||
_sheet = sheet;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public XmlObject getXmlObject() {
|
|
||||||
return _shape;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -78,16 +64,16 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
*
|
*
|
||||||
* @param type
|
* @param type
|
||||||
*/
|
*/
|
||||||
public void setShapeType(XSLFShapeType type){
|
public void setShapeType(ShapeType type){
|
||||||
CTShape shape = (CTShape) getXmlObject();
|
CTShape shape = (CTShape) getXmlObject();
|
||||||
STShapeType.Enum geom = STShapeType.Enum.forInt(type.getIndex());
|
STShapeType.Enum geom = STShapeType.Enum.forInt(type.ooxmlId);
|
||||||
shape.getSpPr().getPrstGeom().setPrst(geom);
|
shape.getSpPr().getPrstGeom().setPrst(geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSLFShapeType getShapeType(){
|
public ShapeType getShapeType(){
|
||||||
CTShape shape = (CTShape) getXmlObject();
|
CTShape shape = (CTShape) getXmlObject();
|
||||||
STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst();
|
STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst();
|
||||||
return XSLFShapeType.forInt(geom.intValue());
|
return ShapeType.forId(geom.intValue(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -100,101 +86,6 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
return (int) getNvPr().getId();
|
return (int) getNvPr().getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected CTShapeStyle getSpStyle() {
|
|
||||||
if (_spStyle == null) {
|
|
||||||
for (XmlObject obj : _shape.selectPath("*")) {
|
|
||||||
if (obj instanceof CTShapeStyle) {
|
|
||||||
_spStyle = (CTShapeStyle) obj;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _spStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected CTPlaceholder getCTPlaceholder() {
|
|
||||||
if (_ph == null) {
|
|
||||||
XmlObject[] obj = _shape.selectPath(
|
|
||||||
"declare namespace p='http://schemas.openxmlformats.org/presentationml/2006/main' .//*/p:nvPr/p:ph");
|
|
||||||
if (obj.length == 1) {
|
|
||||||
_ph = (CTPlaceholder) obj[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _ph;
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTransform2D getXfrm() {
|
|
||||||
PropertyFetcher<CTTransform2D> fetcher = new PropertyFetcher<CTTransform2D>() {
|
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
|
||||||
CTShapeProperties pr = shape.getSpPr();
|
|
||||||
if (pr.isSetXfrm()) {
|
|
||||||
setValue(pr.getXfrm());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
fetchShapeProperty(fetcher);
|
|
||||||
return fetcher.getValue();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Rectangle2D getAnchor() {
|
|
||||||
|
|
||||||
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) {
|
|
||||||
CTShapeProperties spPr = getSpPr();
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setRotation(double theta) {
|
public void setRotation(double theta) {
|
||||||
CTShapeProperties spPr = getSpPr();
|
CTShapeProperties spPr = getSpPr();
|
||||||
@ -314,7 +205,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
*/
|
*/
|
||||||
public double getLineWidth() {
|
public double getLineWidth() {
|
||||||
PropertyFetcher<Double> fetcher = new PropertyFetcher<Double>() {
|
PropertyFetcher<Double> fetcher = new PropertyFetcher<Double>() {
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
public boolean fetch(XSLFShape shape) {
|
||||||
CTShapeProperties spPr = shape.getSpPr();
|
CTShapeProperties spPr = shape.getSpPr();
|
||||||
CTLineProperties ln = spPr.getLn();
|
CTLineProperties ln = spPr.getLn();
|
||||||
if (ln != null) {
|
if (ln != null) {
|
||||||
@ -371,7 +262,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
public LineDash getLineDash() {
|
public LineDash getLineDash() {
|
||||||
|
|
||||||
PropertyFetcher<LineDash> fetcher = new PropertyFetcher<LineDash>() {
|
PropertyFetcher<LineDash> fetcher = new PropertyFetcher<LineDash>() {
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
public boolean fetch(XSLFShape shape) {
|
||||||
CTShapeProperties spPr = shape.getSpPr();
|
CTShapeProperties spPr = shape.getSpPr();
|
||||||
CTLineProperties ln = spPr.getLn();
|
CTLineProperties ln = spPr.getLn();
|
||||||
if (ln != null) {
|
if (ln != null) {
|
||||||
@ -421,7 +312,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
*/
|
*/
|
||||||
public LineCap getLineCap() {
|
public LineCap getLineCap() {
|
||||||
PropertyFetcher<LineCap> fetcher = new PropertyFetcher<LineCap>() {
|
PropertyFetcher<LineCap> fetcher = new PropertyFetcher<LineCap>() {
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
public boolean fetch(XSLFShape shape) {
|
||||||
CTShapeProperties spPr = shape.getSpPr();
|
CTShapeProperties spPr = shape.getSpPr();
|
||||||
CTLineProperties ln = spPr.getLn();
|
CTLineProperties ln = spPr.getLn();
|
||||||
if (ln != null) {
|
if (ln != null) {
|
||||||
@ -499,7 +390,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
*/
|
*/
|
||||||
public XSLFShadow getShadow() {
|
public XSLFShadow getShadow() {
|
||||||
PropertyFetcher<CTOuterShadowEffect> fetcher = new PropertyFetcher<CTOuterShadowEffect>() {
|
PropertyFetcher<CTOuterShadowEffect> fetcher = new PropertyFetcher<CTOuterShadowEffect>() {
|
||||||
public boolean fetch(XSLFSimpleShape shape) {
|
public boolean fetch(XSLFShape shape) {
|
||||||
CTShapeProperties spPr = shape.getSpPr();
|
CTShapeProperties spPr = shape.getSpPr();
|
||||||
if (spPr.isSetEffectLst()) {
|
if (spPr.isSetEffectLst()) {
|
||||||
CTOuterShadowEffect obj = spPr.getEffectLst().getOuterShdw();
|
CTOuterShadowEffect obj = spPr.getEffectLst().getOuterShdw();
|
||||||
@ -528,90 +419,11 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
return (obj == null || obj == NO_SHADOW) ? null : new XSLFShadow(obj, this);
|
return (obj == null || obj == NO_SHADOW) ? null : new XSLFShadow(obj, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void draw(Graphics2D graphics) {
|
|
||||||
RenderableShape rShape = new RenderableShape(this);
|
|
||||||
rShape.render(graphics);
|
|
||||||
|
|
||||||
// draw line decorations
|
|
||||||
Color lineColor = getLineColor();
|
|
||||||
if(lineColor != null) {
|
|
||||||
graphics.setPaint(lineColor);
|
|
||||||
for(Outline o : getDecorationOutlines(graphics)){
|
|
||||||
if(o.getPath().isFilled()){
|
|
||||||
graphics.fill(o.getOutline());
|
|
||||||
}
|
|
||||||
if(o.getPath().isStroked()){
|
|
||||||
graphics.draw(o.getOutline());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Walk up the inheritance tree and fetch shape properties.
|
|
||||||
*
|
|
||||||
* The following order of inheritance is assumed:
|
|
||||||
* <p>
|
|
||||||
* slide <-- slideLayout <-- slideMaster
|
|
||||||
* </p>
|
|
||||||
*
|
|
||||||
* @param visitor the object that collects the desired property
|
|
||||||
* @return true if the property was fetched
|
|
||||||
*/
|
|
||||||
boolean fetchShapeProperty(PropertyFetcher visitor) {
|
|
||||||
boolean ok = visitor.fetch(this);
|
|
||||||
|
|
||||||
XSLFSimpleShape masterShape;
|
|
||||||
XSLFSheet masterSheet = getSheet().getMasterSheet();
|
|
||||||
CTPlaceholder ph = getCTPlaceholder();
|
|
||||||
|
|
||||||
if (masterSheet != null && ph != null) {
|
|
||||||
if (!ok) {
|
|
||||||
masterShape = masterSheet.getPlaceholder(ph);
|
|
||||||
if (masterShape != null) {
|
|
||||||
ok = visitor.fetch(masterShape);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// try slide master
|
|
||||||
if (!ok ) {
|
|
||||||
int textType;
|
|
||||||
if ( !ph.isSetType()) textType = STPlaceholderType.INT_BODY;
|
|
||||||
else {
|
|
||||||
switch (ph.getType().intValue()) {
|
|
||||||
case STPlaceholderType.INT_TITLE:
|
|
||||||
case STPlaceholderType.INT_CTR_TITLE:
|
|
||||||
textType = STPlaceholderType.INT_TITLE;
|
|
||||||
break;
|
|
||||||
case STPlaceholderType.INT_FTR:
|
|
||||||
case STPlaceholderType.INT_SLD_NUM:
|
|
||||||
case STPlaceholderType.INT_DT:
|
|
||||||
textType = ph.getType().intValue();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
textType = STPlaceholderType.INT_BODY;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
XSLFSheet master = masterSheet.getMasterSheet();
|
|
||||||
if (master != null) {
|
|
||||||
masterShape = master.getPlaceholderByType(textType);
|
|
||||||
if (masterShape != null) {
|
|
||||||
ok = visitor.fetch(masterShape);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ok;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return definition of the shape geometry
|
* @return definition of the shape geometry
|
||||||
*/
|
*/
|
||||||
CustomGeometry getGeometry(){
|
public CustomGeometry getGeometry(){
|
||||||
CTShapeProperties spPr = getSpPr();
|
CTShapeProperties spPr = getSpPr();
|
||||||
CustomGeometry geom;
|
CustomGeometry geom;
|
||||||
PresetGeometries dict = PresetGeometries.getInstance();
|
PresetGeometries dict = PresetGeometries.getInstance();
|
||||||
@ -622,23 +434,16 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
throw new IllegalStateException("Unknown shape geometry: " + name);
|
throw new IllegalStateException("Unknown shape geometry: " + name);
|
||||||
}
|
}
|
||||||
} else if (spPr.isSetCustGeom()){
|
} else if (spPr.isSetCustGeom()){
|
||||||
geom = new CustomGeometry(spPr.getCustGeom());
|
XMLStreamReader staxReader = spPr.getCustGeom().newXMLStreamReader();
|
||||||
|
geom = PresetGeometries.convertCustomGeometry(staxReader);
|
||||||
|
try { staxReader.close(); }
|
||||||
|
catch (XMLStreamException e) {}
|
||||||
} else {
|
} else {
|
||||||
geom = dict.get("rect");
|
geom = dict.get("rect");
|
||||||
}
|
}
|
||||||
return geom;
|
return geom;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* draw any content within this shape (image, text, etc.).
|
|
||||||
*
|
|
||||||
* @param graphics the graphics to draw into
|
|
||||||
*/
|
|
||||||
public void drawContent(Graphics2D graphics){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void copy(XSLFShape sh){
|
void copy(XSLFShape sh){
|
||||||
super.copy(sh);
|
super.copy(sh);
|
||||||
@ -943,4 +748,30 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
|||||||
return lst;
|
return lst;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean isPlaceholder() {
|
||||||
|
CTPlaceholder ph = getCTPlaceholder();
|
||||||
|
return ph != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Hyperlink getHyperlink() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHyperlink(Hyperlink hyperlink) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public Guide getAdjustValue(String name) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public org.apache.poi.sl.usermodel.LineDecoration getLineDecoration() {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,29 +16,31 @@
|
|||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
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.Notes;
|
||||||
|
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.CTGroupShapeProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupShapeProperties;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTGroupTransform2D;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTCommonSlideData;
|
||||||
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;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument;
|
import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
@Beta
|
@Beta
|
||||||
public final class XSLFSlide extends XSLFSheet {
|
public final class XSLFSlide extends XSLFSheet implements Slide {
|
||||||
private final CTSlide _slide;
|
private final CTSlide _slide;
|
||||||
private XSLFSlideLayout _layout;
|
private XSLFSlideLayout _layout;
|
||||||
private XSLFComments _comments;
|
private XSLFComments _comments;
|
||||||
@ -111,7 +113,6 @@ public final class XSLFSlide extends XSLFSheet {
|
|||||||
return "sld";
|
return "sld";
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public XSLFSlideLayout getMasterSheet(){
|
public XSLFSlideLayout getMasterSheet(){
|
||||||
return getSlideLayout();
|
return getSlideLayout();
|
||||||
}
|
}
|
||||||
@ -211,6 +212,15 @@ public final class XSLFSlide extends XSLFSheet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public boolean getFollowMasterObjects() {
|
||||||
|
return getFollowMasterGraphics();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFollowMasterObjects(boolean follow) {
|
||||||
|
setFollowMasterGraphics(follow);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void draw(Graphics2D graphics){
|
public void draw(Graphics2D graphics){
|
||||||
|
|
||||||
@ -239,4 +249,26 @@ public final class XSLFSlide extends XSLFSheet {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean getFollowMasterBackground() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFollowMasterBackground(boolean follow) {
|
||||||
|
// not implemented ... also not in the specs
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean getFollowMasterColourScheme() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFollowMasterColourScheme(boolean follow) {
|
||||||
|
// not implemented ... only for OLE objects in the specs
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setNotes(Notes<XSLFShape> notes) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel;
|
|||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
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.MasterSheet;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
@ -30,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 {
|
public class XSLFSlideLayout extends XSLFSheet implements MasterSheet {
|
||||||
private CTSlideLayout _layout;
|
private CTSlideLayout _layout;
|
||||||
private XSLFSlideMaster _master;
|
private XSLFSlideMaster _master;
|
||||||
|
|
||||||
|
@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel;
|
|||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
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.MasterSheet;
|
||||||
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.CTColorMapping;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping;
|
||||||
@ -53,7 +54,7 @@ import java.util.Map;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFSlideMaster extends XSLFSheet {
|
public class XSLFSlideMaster extends XSLFSheet implements MasterSheet {
|
||||||
private CTSlideMaster _slide;
|
private CTSlideMaster _slide;
|
||||||
private Map<String, XSLFSlideLayout> _layouts;
|
private Map<String, XSLFSlideLayout> _layouts;
|
||||||
private XSLFTheme _theme;
|
private XSLFTheme _theme;
|
||||||
@ -82,7 +83,7 @@ import java.util.Map;
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public XSLFSheet getMasterSheet() {
|
public MasterSheet getMasterSheet() {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,5 +178,4 @@ import java.util.Map;
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -21,6 +21,7 @@ package org.apache.poi.xslf.usermodel;
|
|||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
|
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.CTLineEndProperties;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineProperties;
|
||||||
|
@ -18,42 +18,14 @@ package org.apache.poi.xslf.usermodel;
|
|||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.font.LineBreakMeasurer;
|
|
||||||
import java.awt.font.TextAttribute;
|
|
||||||
import java.awt.font.TextLayout;
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.text.AttributedCharacterIterator;
|
import java.util.*;
|
||||||
import java.text.AttributedString;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.poi.hslf.model.TextPainter;
|
import org.apache.poi.sl.usermodel.TextParagraph;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.*;
|
||||||
import org.apache.poi.util.Internal;
|
|
||||||
import org.apache.poi.util.Units;
|
|
||||||
import org.apache.poi.xslf.model.ParagraphPropertyFetcher;
|
import org.apache.poi.xslf.model.ParagraphPropertyFetcher;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSRgbColor;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextAutonumberBullet;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePercent;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePoint;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharBullet;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStop;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStopList;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAutonumberScheme;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
||||||
|
|
||||||
@ -65,16 +37,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|||||||
* @since POI-3.8
|
* @since POI-3.8
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
public class XSLFTextParagraph implements TextParagraph {
|
||||||
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;
|
||||||
private List<TextFragment> _lines;
|
|
||||||
private TextFragment _bullet;
|
|
||||||
/**
|
|
||||||
* the highest line in this paragraph. Used for line spacing.
|
|
||||||
*/
|
|
||||||
private double _maxLineHeight;
|
|
||||||
|
|
||||||
XSLFTextParagraph(CTTextParagraph p, XSLFTextShape shape){
|
XSLFTextParagraph(CTTextParagraph p, XSLFTextShape shape){
|
||||||
_p = p;
|
_p = p;
|
||||||
@ -122,7 +88,7 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
return _p;
|
return _p;
|
||||||
}
|
}
|
||||||
|
|
||||||
XSLFTextShape getParentShape() {
|
public XSLFTextShape getParentShape() {
|
||||||
return _shape;
|
return _shape;
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -194,7 +160,7 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
/**
|
/**
|
||||||
* Specifies the alignment that is to be applied to the paragraph.
|
* Specifies the alignment that is to be applied to the paragraph.
|
||||||
* Possible values for this include left, right, centered, justified and distributed,
|
* Possible values for this include left, right, centered, justified and distributed,
|
||||||
* see {@link org.apache.poi.xslf.usermodel.TextAlign}.
|
* see {@link org.apache.poi.sl.usermodel.TextAlign}.
|
||||||
*
|
*
|
||||||
* @param align text align
|
* @param align text align
|
||||||
*/
|
*/
|
||||||
@ -408,6 +374,26 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
return fetcher.getValue() == null ? 0 : fetcher.getValue();
|
return fetcher.getValue() == null ? 0 : fetcher.getValue();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the right margin of the paragraph
|
||||||
|
*/
|
||||||
|
public double getRightMargin(){
|
||||||
|
ParagraphPropertyFetcher<Double> fetcher = new ParagraphPropertyFetcher<Double>(getLevel()){
|
||||||
|
public boolean fetch(CTTextParagraphProperties props){
|
||||||
|
if(props.isSetMarR()){
|
||||||
|
double val = Units.toPoints(props.getMarR());
|
||||||
|
setValue(val);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
fetchParagraphProperty(fetcher);
|
||||||
|
// if the marL attribute is omitted, then a value of 347663 is implied
|
||||||
|
return fetcher.getValue() == null ? 0 : fetcher.getValue();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return the default size for a tab character within this paragraph in points
|
* @return the default size for a tab character within this paragraph in points
|
||||||
@ -711,10 +697,6 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
return "[" + getClass() + "]" + getText();
|
return "[" + getClass() + "]" + getText();
|
||||||
}
|
}
|
||||||
|
|
||||||
List<TextFragment> getTextLines(){
|
|
||||||
return _lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns wrapping width to break lines in this paragraph
|
* Returns wrapping width to break lines in this paragraph
|
||||||
*
|
*
|
||||||
@ -754,244 +736,6 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
return width;
|
return width;
|
||||||
}
|
}
|
||||||
|
|
||||||
public double draw(Graphics2D graphics, double x, double y){
|
|
||||||
double leftInset = _shape.getLeftInset();
|
|
||||||
double rightInset = _shape.getRightInset();
|
|
||||||
RenderableShape rShape = new RenderableShape(_shape);
|
|
||||||
Rectangle2D anchor = rShape.getAnchor(graphics);
|
|
||||||
double penY = y;
|
|
||||||
|
|
||||||
double leftMargin = getLeftMargin();
|
|
||||||
boolean firstLine = true;
|
|
||||||
double indent = getIndent();
|
|
||||||
|
|
||||||
//The vertical line spacing
|
|
||||||
double spacing = getLineSpacing();
|
|
||||||
for(TextFragment line : _lines){
|
|
||||||
double penX = x + leftMargin;
|
|
||||||
|
|
||||||
if(firstLine) {
|
|
||||||
if(_bullet != null){
|
|
||||||
if(indent < 0) {
|
|
||||||
// a negative value means "Hanging" indentation and
|
|
||||||
// indicates the position of the actual bullet character.
|
|
||||||
// (the bullet is shifted to right relative to the text)
|
|
||||||
_bullet.draw(graphics, penX + indent, penY);
|
|
||||||
} else if(indent > 0){
|
|
||||||
// a positive value means the "First Line" indentation:
|
|
||||||
// the first line is indented and other lines start at the bullet ofset
|
|
||||||
_bullet.draw(graphics, penX, penY);
|
|
||||||
penX += indent;
|
|
||||||
} else {
|
|
||||||
// a zero indent means that the bullet and text have the same offset
|
|
||||||
_bullet.draw(graphics, penX, penY);
|
|
||||||
|
|
||||||
// don't let text overlay the bullet and advance by the bullet width
|
|
||||||
penX += _bullet._layout.getAdvance() + 1;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
penX += indent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
switch (getTextAlign()) {
|
|
||||||
case CENTER:
|
|
||||||
penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2;
|
|
||||||
break;
|
|
||||||
case RIGHT:
|
|
||||||
penX += (anchor.getWidth() - line.getWidth() - leftInset - rightInset);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
line.draw(graphics, penX, penY);
|
|
||||||
|
|
||||||
if(spacing > 0) {
|
|
||||||
// If linespacing >= 0, then linespacing is a percentage of normal line height.
|
|
||||||
penY += spacing*0.01* line.getHeight();
|
|
||||||
} else {
|
|
||||||
// positive value means absolute spacing in points
|
|
||||||
penY += -spacing;
|
|
||||||
}
|
|
||||||
|
|
||||||
firstLine = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return penY - y;
|
|
||||||
}
|
|
||||||
|
|
||||||
AttributedString getAttributedString(Graphics2D graphics){
|
|
||||||
|
|
||||||
String text = getRenderableText();
|
|
||||||
|
|
||||||
AttributedString string = new AttributedString(text);
|
|
||||||
|
|
||||||
XSLFFontManager fontHandler = (XSLFFontManager)graphics.getRenderingHint(XSLFRenderingHint.FONT_HANDLER);
|
|
||||||
|
|
||||||
int startIndex = 0;
|
|
||||||
for (XSLFTextRun run : _runs){
|
|
||||||
int length = run.getRenderableText().length();
|
|
||||||
if(length == 0) {
|
|
||||||
// skip empty runs
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
int endIndex = startIndex + length;
|
|
||||||
|
|
||||||
string.addAttribute(TextAttribute.FOREGROUND, run.getFontColor(), startIndex, endIndex);
|
|
||||||
|
|
||||||
// user can pass an custom object to convert fonts
|
|
||||||
String fontFamily = run.getFontFamily();
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(TextPainter.KEY_FONTMAP);
|
|
||||||
if (fontMap != null && fontMap.containsKey(fontFamily)) {
|
|
||||||
fontFamily = fontMap.get(fontFamily);
|
|
||||||
}
|
|
||||||
if(fontHandler != null) {
|
|
||||||
fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily());
|
|
||||||
}
|
|
||||||
string.addAttribute(TextAttribute.FAMILY, fontFamily, startIndex, endIndex);
|
|
||||||
|
|
||||||
float fontSz = (float)run.getFontSize();
|
|
||||||
string.addAttribute(TextAttribute.SIZE, fontSz , startIndex, endIndex);
|
|
||||||
|
|
||||||
if(run.isBold()) {
|
|
||||||
string.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, startIndex, endIndex);
|
|
||||||
}
|
|
||||||
if(run.isItalic()) {
|
|
||||||
string.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, startIndex, endIndex);
|
|
||||||
}
|
|
||||||
if(run.isUnderline()) {
|
|
||||||
string.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, startIndex, endIndex);
|
|
||||||
string.addAttribute(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, startIndex, endIndex);
|
|
||||||
}
|
|
||||||
if(run.isStrikethrough()) {
|
|
||||||
string.addAttribute(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, startIndex, endIndex);
|
|
||||||
}
|
|
||||||
if(run.isSubscript()) {
|
|
||||||
string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, startIndex, endIndex);
|
|
||||||
}
|
|
||||||
if(run.isSuperscript()) {
|
|
||||||
string.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, startIndex, endIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
startIndex = endIndex;
|
|
||||||
}
|
|
||||||
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* ensure that the paragraph contains at least one character.
|
|
||||||
* We need this trick to correctly measure text
|
|
||||||
*/
|
|
||||||
private void ensureNotEmpty(){
|
|
||||||
XSLFTextRun r = addNewTextRun();
|
|
||||||
r.setText(" ");
|
|
||||||
CTTextCharacterProperties endPr = _p.getEndParaRPr();
|
|
||||||
if(endPr != null) {
|
|
||||||
if(endPr.isSetSz()) r.setFontSize(endPr.getSz() / 100);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* break text into lines
|
|
||||||
*
|
|
||||||
* @param graphics
|
|
||||||
* @return array of text fragments,
|
|
||||||
* each representing a line of text that fits in the wrapping width
|
|
||||||
*/
|
|
||||||
List<TextFragment> breakText(Graphics2D graphics){
|
|
||||||
_lines = new ArrayList<TextFragment>();
|
|
||||||
|
|
||||||
// does this paragraph contain text?
|
|
||||||
boolean emptyParagraph = _runs.size() == 0;
|
|
||||||
|
|
||||||
// ensure that the paragraph contains at least one character
|
|
||||||
if(_runs.size() == 0) ensureNotEmpty();
|
|
||||||
|
|
||||||
String text = getRenderableText();
|
|
||||||
if(text.length() == 0) return _lines;
|
|
||||||
|
|
||||||
AttributedString at = getAttributedString(graphics);
|
|
||||||
AttributedCharacterIterator it = at.getIterator();
|
|
||||||
LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext()) ;
|
|
||||||
for (;;) {
|
|
||||||
int startIndex = measurer.getPosition();
|
|
||||||
|
|
||||||
double wrappingWidth = getWrappingWidth(_lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors
|
|
||||||
// shape width can be smaller that the sum of insets (this was proved by a test file)
|
|
||||||
if(wrappingWidth < 0) wrappingWidth = 1;
|
|
||||||
|
|
||||||
int nextBreak = text.indexOf('\n', startIndex + 1);
|
|
||||||
if(nextBreak == -1) nextBreak = it.getEndIndex();
|
|
||||||
|
|
||||||
TextLayout layout = measurer.nextLayout((float)wrappingWidth, nextBreak, true);
|
|
||||||
if (layout == null) {
|
|
||||||
// layout can be null if the entire word at the current position
|
|
||||||
// does not fit within the wrapping width. Try with requireNextWord=false.
|
|
||||||
layout = measurer.nextLayout((float)wrappingWidth, nextBreak, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
if(layout == null) {
|
|
||||||
// exit if can't break any more
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
int endIndex = measurer.getPosition();
|
|
||||||
// skip over new line breaks (we paint 'clear' text runs not starting or ending with \n)
|
|
||||||
if(endIndex < it.getEndIndex() && text.charAt(endIndex) == '\n'){
|
|
||||||
measurer.setPosition(endIndex + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
TextAlign hAlign = getTextAlign();
|
|
||||||
if(hAlign == TextAlign.JUSTIFY || hAlign == TextAlign.JUSTIFY_LOW) {
|
|
||||||
layout = layout.getJustifiedLayout((float)wrappingWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
AttributedString str = new AttributedString(it, startIndex, endIndex);
|
|
||||||
TextFragment line = new TextFragment(
|
|
||||||
layout, // we will not paint empty paragraphs
|
|
||||||
emptyParagraph ? null : str);
|
|
||||||
_lines.add(line);
|
|
||||||
|
|
||||||
_maxLineHeight = Math.max(_maxLineHeight, line.getHeight());
|
|
||||||
|
|
||||||
if(endIndex == it.getEndIndex()) break;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
if(isBullet() && !emptyParagraph) {
|
|
||||||
String buCharacter = getBulletCharacter();
|
|
||||||
String buFont = getBulletFont();
|
|
||||||
if(buFont == null) buFont = getTextRuns().get(0).getFontFamily();
|
|
||||||
if(buCharacter != null && buFont != null && _lines.size() > 0) {
|
|
||||||
AttributedString str = new AttributedString(buCharacter);
|
|
||||||
|
|
||||||
TextFragment firstLine = _lines.get(0);
|
|
||||||
AttributedCharacterIterator bit = firstLine._str.getIterator();
|
|
||||||
|
|
||||||
Color buColor = getBulletFontColor();
|
|
||||||
str.addAttribute(TextAttribute.FOREGROUND, buColor == null ?
|
|
||||||
bit.getAttribute(TextAttribute.FOREGROUND) : buColor);
|
|
||||||
str.addAttribute(TextAttribute.FAMILY, buFont);
|
|
||||||
|
|
||||||
float fontSize = (Float)bit.getAttribute(TextAttribute.SIZE);
|
|
||||||
float buSz = (float)getBulletFontSize();
|
|
||||||
if(buSz > 0) fontSize *= buSz* 0.01;
|
|
||||||
else fontSize = -buSz;
|
|
||||||
|
|
||||||
str.addAttribute(TextAttribute.SIZE, fontSize);
|
|
||||||
|
|
||||||
TextLayout layout = new TextLayout(str.getIterator(), graphics.getFontRenderContext());
|
|
||||||
_bullet = new TextFragment(layout, str);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return _lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
CTTextParagraphProperties getDefaultMasterStyle(){
|
CTTextParagraphProperties getDefaultMasterStyle(){
|
||||||
CTPlaceholder ph = _shape.getCTPlaceholder();
|
CTPlaceholder ph = _shape.getCTPlaceholder();
|
||||||
String defaultStyleSelector;
|
String defaultStyleSelector;
|
||||||
@ -1017,7 +761,7 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
// wind up and find the root master sheet which must be slide master
|
// wind up and find the root master sheet which must be slide master
|
||||||
XSLFSheet masterSheet = _shape.getSheet();
|
XSLFSheet masterSheet = _shape.getSheet();
|
||||||
while (masterSheet.getMasterSheet() != null){
|
while (masterSheet.getMasterSheet() != null){
|
||||||
masterSheet = masterSheet.getMasterSheet();
|
masterSheet = (XSLFSheet)masterSheet.getMasterSheet();
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlObject[] o = masterSheet.getXmlObject().selectPath(
|
XmlObject[] o = masterSheet.getXmlObject().selectPath(
|
||||||
@ -1130,4 +874,32 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public double getDefaultFontSize() {
|
||||||
|
CTTextCharacterProperties endPr = _p.getEndParaRPr();
|
||||||
|
return (endPr == null || !endPr.isSetSz()) ? 12 : (endPr.getSz() / 100);
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDefaultFontFamily() {
|
||||||
|
return (_runs.isEmpty() ? "Arial" : _runs.get(0).getFontFamily());
|
||||||
|
}
|
||||||
|
|
||||||
|
public BulletStyle getBulletStyle() {
|
||||||
|
return new BulletStyle(){
|
||||||
|
public String getBulletCharacter() {
|
||||||
|
return XSLFTextParagraph.this.getBulletCharacter();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getBulletFont() {
|
||||||
|
return XSLFTextParagraph.this.getBulletFont();
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getBulletFontSize() {
|
||||||
|
return XSLFTextParagraph.this.getBulletFontSize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Color getBulletFontColor() {
|
||||||
|
return XSLFTextParagraph.this.getBulletFontColor();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,7 @@ import java.awt.font.TextAttribute;
|
|||||||
import java.awt.font.TextLayout;
|
import java.awt.font.TextLayout;
|
||||||
import java.text.AttributedString;
|
import java.text.AttributedString;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.TextRun;
|
||||||
import org.apache.poi.util.Beta;
|
import org.apache.poi.util.Beta;
|
||||||
import org.apache.poi.xslf.model.CharacterPropertyFetcher;
|
import org.apache.poi.xslf.model.CharacterPropertyFetcher;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
||||||
@ -45,7 +46,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public class XSLFTextRun {
|
public class XSLFTextRun implements TextRun {
|
||||||
private final CTRegularTextRun _r;
|
private final CTRegularTextRun _r;
|
||||||
private final XSLFTextParagraph _p;
|
private final XSLFTextParagraph _p;
|
||||||
|
|
||||||
|
@ -23,26 +23,20 @@ import java.awt.Graphics2D;
|
|||||||
import java.awt.geom.AffineTransform;
|
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.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
|
import org.apache.poi.sl.draw.DrawFactory;
|
||||||
|
import org.apache.poi.sl.draw.geom.Guide;
|
||||||
|
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;
|
||||||
import org.apache.poi.xslf.model.TextBodyPropertyFetcher;
|
import org.apache.poi.xslf.model.TextBodyPropertyFetcher;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAnchoringType;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextVerticalType;
|
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextWrappingType;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTApplicationNonVisualDrawingProps;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTShape;
|
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a shape that can hold text.
|
* Represents a shape that can hold text.
|
||||||
@ -50,7 +44,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
@Beta
|
@Beta
|
||||||
public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<XSLFTextParagraph>{
|
public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape {
|
||||||
private final List<XSLFTextParagraph> _paragraphs;
|
private final List<XSLFTextParagraph> _paragraphs;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -338,6 +332,12 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Insets2D getInsets() {
|
||||||
|
Insets2D insets = new Insets2D(getTopInset(), getLeftInset(), getBottomInset(), getRightInset());
|
||||||
|
return insets;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return whether to wrap words within the bounding rectangle
|
* @return whether to wrap words within the bounding rectangle
|
||||||
@ -453,6 +453,9 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<
|
|||||||
// 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();
|
||||||
|
DrawFactory fact = DrawFactory.getInstance(graphics);
|
||||||
|
fact.getDrawable(this);
|
||||||
|
|
||||||
breakText(graphics);
|
breakText(graphics);
|
||||||
return drawParagraphs(graphics, 0, 0);
|
return drawParagraphs(graphics, 0, 0);
|
||||||
}
|
}
|
||||||
@ -475,121 +478,6 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<
|
|||||||
return anchor;
|
return anchor;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* break the contained text into lines
|
|
||||||
*/
|
|
||||||
private void breakText(Graphics2D graphics){
|
|
||||||
if(!_isTextBroken) {
|
|
||||||
for(XSLFTextParagraph p : _paragraphs) p.breakText(graphics);
|
|
||||||
|
|
||||||
_isTextBroken = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void drawContent(Graphics2D graphics) {
|
|
||||||
breakText(graphics);
|
|
||||||
|
|
||||||
RenderableShape rShape = new RenderableShape(this);
|
|
||||||
Rectangle2D anchor = rShape.getAnchor(graphics);
|
|
||||||
double x = anchor.getX() + getLeftInset();
|
|
||||||
double y = anchor.getY();
|
|
||||||
|
|
||||||
// remember the initial transform
|
|
||||||
AffineTransform tx = graphics.getTransform();
|
|
||||||
|
|
||||||
// Transform of text in flipped shapes is special.
|
|
||||||
// At this point the flip and rotation transform is already applied
|
|
||||||
// (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down".
|
|
||||||
// See Bugzilla 54210.
|
|
||||||
|
|
||||||
if(getFlipVertical()){
|
|
||||||
graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
|
|
||||||
graphics.scale(1, -1);
|
|
||||||
graphics.translate(-anchor.getX(), -anchor.getY());
|
|
||||||
|
|
||||||
// text in vertically flipped shapes is rotated by 180 degrees
|
|
||||||
double centerX = anchor.getX() + anchor.getWidth()/2;
|
|
||||||
double centerY = anchor.getY() + anchor.getHeight()/2;
|
|
||||||
graphics.translate(centerX, centerY);
|
|
||||||
graphics.rotate(Math.toRadians(180));
|
|
||||||
graphics.translate(-centerX, -centerY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Horizontal flipping applies only to shape outline and not to the text in the shape.
|
|
||||||
// Applying flip second time restores the original not-flipped transform
|
|
||||||
if(getFlipHorizontal()){
|
|
||||||
graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
|
|
||||||
graphics.scale(-1, 1);
|
|
||||||
graphics.translate(-anchor.getX() , -anchor.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// first dry-run to calculate the total height of the text
|
|
||||||
double textHeight = getTextHeight();
|
|
||||||
|
|
||||||
switch (getVerticalAlignment()){
|
|
||||||
case TOP:
|
|
||||||
y += getTopInset();
|
|
||||||
break;
|
|
||||||
case BOTTOM:
|
|
||||||
y += anchor.getHeight() - textHeight - getBottomInset();
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
case MIDDLE:
|
|
||||||
double delta = anchor.getHeight() - textHeight -
|
|
||||||
getTopInset() - getBottomInset();
|
|
||||||
y += getTopInset() + delta/2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
drawParagraphs(graphics, x, y);
|
|
||||||
|
|
||||||
// restore the transform
|
|
||||||
graphics.setTransform(tx);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* paint the paragraphs starting from top left (x,y)
|
|
||||||
*
|
|
||||||
* @return the vertical advance, i.e. the cumulative space occupied by the text
|
|
||||||
*/
|
|
||||||
private double drawParagraphs(Graphics2D graphics, double x, double y) {
|
|
||||||
double y0 = y;
|
|
||||||
for(int i = 0; i < _paragraphs.size(); i++){
|
|
||||||
XSLFTextParagraph p = _paragraphs.get(i);
|
|
||||||
List<TextFragment> lines = p.getTextLines();
|
|
||||||
|
|
||||||
if(i > 0 && lines.size() > 0) {
|
|
||||||
// the amount of vertical white space before the paragraph
|
|
||||||
double spaceBefore = p.getSpaceBefore();
|
|
||||||
if(spaceBefore > 0) {
|
|
||||||
// positive value means percentage spacing of the height of the first line, e.g.
|
|
||||||
// the higher the first line, the bigger the space before the paragraph
|
|
||||||
y += spaceBefore*0.01*lines.get(0).getHeight();
|
|
||||||
} else {
|
|
||||||
// negative value means the absolute spacing in points
|
|
||||||
y += -spaceBefore;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
y += p.draw(graphics, x, y);
|
|
||||||
|
|
||||||
if(i < _paragraphs.size() - 1) {
|
|
||||||
double spaceAfter = p.getSpaceAfter();
|
|
||||||
if(spaceAfter > 0) {
|
|
||||||
// positive value means percentage spacing of the height of the last line, e.g.
|
|
||||||
// the higher the last line, the bigger the space after the paragraph
|
|
||||||
y += spaceAfter*0.01*lines.get(lines.size() - 1).getHeight();
|
|
||||||
} else {
|
|
||||||
// negative value means the absolute spacing in points
|
|
||||||
y += -spaceAfter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return y - y0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void copy(XSLFShape sh){
|
void copy(XSLFShape sh){
|
||||||
@ -633,4 +521,19 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
@ -17,6 +17,10 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
import org.apache.poi.sl.usermodel.TextAlign;
|
||||||
|
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.STTextStrikeType;
|
import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;
|
import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;
|
||||||
@ -270,12 +274,12 @@ public class TestXSLFAutoShape extends TestCase {
|
|||||||
XSLFSlide slide = ppt.createSlide();
|
XSLFSlide slide = ppt.createSlide();
|
||||||
|
|
||||||
XSLFAutoShape shape = slide.createAutoShape();
|
XSLFAutoShape shape = slide.createAutoShape();
|
||||||
assertEquals(XSLFShapeType.RECT, shape.getShapeType());
|
assertEquals(ShapeType.RECT, shape.getShapeType());
|
||||||
|
|
||||||
shape.setShapeType(XSLFShapeType.TRIANGLE);
|
shape.setShapeType(ShapeType.TRIANGLE);
|
||||||
assertEquals(XSLFShapeType.TRIANGLE, shape.getShapeType());
|
assertEquals(ShapeType.TRIANGLE, shape.getShapeType());
|
||||||
|
|
||||||
for(XSLFShapeType tp : XSLFShapeType.values()) {
|
for(ShapeType tp : ShapeType.values()) {
|
||||||
shape.setShapeType(tp);
|
shape.setShapeType(tp);
|
||||||
assertEquals(tp, shape.getShapeType());
|
assertEquals(tp, shape.getShapeType());
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
||||||
|
|
||||||
@ -112,12 +114,12 @@ public class TestXSLFConnectorShape extends TestCase {
|
|||||||
XSLFSlide slide = pptx.createSlide();
|
XSLFSlide slide = pptx.createSlide();
|
||||||
|
|
||||||
XSLFAutoShape rect1 = slide.createAutoShape();
|
XSLFAutoShape rect1 = slide.createAutoShape();
|
||||||
rect1.setShapeType(XSLFShapeType.RECT);
|
rect1.setShapeType(ShapeType.RECT);
|
||||||
rect1.setAnchor(new Rectangle(100, 100, 100, 100));
|
rect1.setAnchor(new Rectangle(100, 100, 100, 100));
|
||||||
rect1.setFillColor(Color.blue);
|
rect1.setFillColor(Color.blue);
|
||||||
|
|
||||||
XSLFAutoShape rect2 = slide.createAutoShape();
|
XSLFAutoShape rect2 = slide.createAutoShape();
|
||||||
rect2.setShapeType(XSLFShapeType.RECT);
|
rect2.setShapeType(ShapeType.RECT);
|
||||||
rect2.setAnchor(new Rectangle(300, 300, 100, 100));
|
rect2.setAnchor(new Rectangle(300, 300, 100, 100));
|
||||||
rect2.setFillColor(Color.red);
|
rect2.setFillColor(Color.red);
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ import java.awt.Color;
|
|||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.LineCap;
|
||||||
|
import org.apache.poi.sl.usermodel.LineDash;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem;
|
||||||
|
@ -17,6 +17,8 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||||
|
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.TextFragment;
|
||||||
|
import org.apache.poi.sl.usermodel.TextAlign;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
|
@ -17,6 +17,9 @@
|
|||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.xslf.usermodel;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.TextAlign;
|
||||||
|
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
||||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
||||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;
|
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties;
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -34,6 +34,8 @@ import org.apache.poi.hslf.record.ExObjList;
|
|||||||
import org.apache.poi.hslf.record.OEShapeAtom;
|
import org.apache.poi.hslf.record.OEShapeAtom;
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.StringUtil;
|
import org.apache.poi.util.StringUtil;
|
||||||
|
|
||||||
@ -63,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, Shape parent){
|
protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,7 +80,7 @@ public final class ActiveXShape extends Picture {
|
|||||||
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
spRecord.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE | EscherSpRecord.FLAG_OLESHAPE);
|
spRecord.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_HASSHAPETYPE | EscherSpRecord.FLAG_OLESHAPE);
|
||||||
|
|
||||||
setShapeType(ShapeTypes.HostControl);
|
setShapeType(ShapeType.HOST_CONTROL);
|
||||||
setEscherProperty(EscherProperties.BLIP__PICTUREID, idx);
|
setEscherProperty(EscherProperties.BLIP__PICTUREID, idx);
|
||||||
setEscherProperty(EscherProperties.LINESTYLE__COLOR, 0x8000001);
|
setEscherProperty(EscherProperties.LINESTYLE__COLOR, 0x8000001);
|
||||||
setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80008);
|
setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80008);
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
@ -33,20 +35,20 @@ import java.awt.geom.Rectangle2D;
|
|||||||
*/
|
*/
|
||||||
public class AutoShape extends TextShape {
|
public class AutoShape extends TextShape {
|
||||||
|
|
||||||
protected AutoShape(EscherContainerRecord escherRecord, Shape parent){
|
protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoShape(int type, Shape parent){
|
public AutoShape(ShapeType type, ShapeContainer<Shape> parent){
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(type, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(type, parent instanceof ShapeGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
public AutoShape(int type){
|
public AutoShape(ShapeType type){
|
||||||
this(type, null);
|
this(type, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected EscherContainerRecord createSpContainer(int shapeType, boolean isChild){
|
protected EscherContainerRecord createSpContainer(ShapeType shapeType, boolean isChild){
|
||||||
_escherContainer = super.createSpContainer(isChild);
|
_escherContainer = super.createSpContainer(isChild);
|
||||||
|
|
||||||
setShapeType(shapeType);
|
setShapeType(shapeType);
|
||||||
@ -110,7 +112,7 @@ public class AutoShape extends TextShape {
|
|||||||
ShapeOutline outline = AutoShapes.getShapeOutline(getShapeType());
|
ShapeOutline outline = AutoShapes.getShapeOutline(getShapeType());
|
||||||
Rectangle2D anchor = getLogicalAnchor2D();
|
Rectangle2D anchor = getLogicalAnchor2D();
|
||||||
if(outline == null){
|
if(outline == null){
|
||||||
logger.log(POILogger.WARN, "Outline not found for " + ShapeTypes.typeName(getShapeType()));
|
logger.log(POILogger.WARN, "Outline not found for " + getShapeType().nativeName);
|
||||||
return anchor;
|
return anchor;
|
||||||
}
|
}
|
||||||
java.awt.Shape shape = outline.getOutline(this);
|
java.awt.Shape shape = outline.getOutline(this);
|
||||||
|
@ -26,6 +26,7 @@ import java.awt.geom.Rectangle2D;
|
|||||||
import java.awt.geom.RoundRectangle2D;
|
import java.awt.geom.RoundRectangle2D;
|
||||||
|
|
||||||
import org.apache.poi.ddf.EscherProperties;
|
import org.apache.poi.ddf.EscherProperties;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Stores definition of auto-shapes.
|
* Stores definition of auto-shapes.
|
||||||
@ -45,8 +46,8 @@ public final class AutoShapes {
|
|||||||
*
|
*
|
||||||
* @return the shape outline
|
* @return the shape outline
|
||||||
*/
|
*/
|
||||||
public static ShapeOutline getShapeOutline(int type){
|
public static ShapeOutline getShapeOutline(ShapeType type){
|
||||||
ShapeOutline outline = shapes[type];
|
ShapeOutline outline = shapes[type.nativeId];
|
||||||
return outline;
|
return outline;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -68,14 +69,14 @@ public final class AutoShapes {
|
|||||||
static {
|
static {
|
||||||
shapes = new ShapeOutline[255];
|
shapes = new ShapeOutline[255];
|
||||||
|
|
||||||
shapes[ShapeTypes.Rectangle] = new ShapeOutline(){
|
shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600);
|
Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.RoundRectangle] = new ShapeOutline(){
|
shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -83,14 +84,14 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Ellipse] = new ShapeOutline(){
|
shapes[ShapeType.ELLIPSE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600);
|
Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600);
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Diamond] = new ShapeOutline(){
|
shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
path.moveTo(10800, 0);
|
path.moveTo(10800, 0);
|
||||||
@ -103,7 +104,7 @@ public final class AutoShapes {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//m@0,l,21600r21600
|
//m@0,l,21600r21600
|
||||||
shapes[ShapeTypes.IsocelesTriangle] = new ShapeOutline(){
|
shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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();
|
||||||
@ -115,7 +116,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.RightTriangle] = new ShapeOutline(){
|
shapes[ShapeType.RT_TRIANGLE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
path.moveTo(0, 0);
|
path.moveTo(0, 0);
|
||||||
@ -126,7 +127,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Parallelogram] = new ShapeOutline(){
|
shapes[ShapeType.PARALLELOGRAM.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
@ -140,7 +141,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Trapezoid] = new ShapeOutline(){
|
shapes[ShapeType.TRAPEZOID.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
@ -154,7 +155,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Hexagon] = new ShapeOutline(){
|
shapes[ShapeType.HEXAGON.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
@ -170,7 +171,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Octagon] = new ShapeOutline(){
|
shapes[ShapeType.OCTAGON.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 6326);
|
||||||
|
|
||||||
@ -188,7 +189,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Plus] = new ShapeOutline(){
|
shapes[ShapeType.PLUS.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||||
|
|
||||||
@ -210,7 +211,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Pentagon] = new ShapeOutline(){
|
shapes[ShapeType.PENTAGON.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
|
|
||||||
GeneralPath path = new GeneralPath();
|
GeneralPath path = new GeneralPath();
|
||||||
@ -224,7 +225,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.DownArrow] = new ShapeOutline(){
|
shapes[ShapeType.DOWN_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -242,7 +243,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.UpArrow] = new ShapeOutline(){
|
shapes[ShapeType.UP_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -260,7 +261,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Arrow] = new ShapeOutline(){
|
shapes[ShapeType.RIGHT_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -278,7 +279,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.LeftArrow] = new ShapeOutline(){
|
shapes[ShapeType.LEFT_ARROW.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -296,7 +297,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.Can] = new ShapeOutline(){
|
shapes[ShapeType.CAN.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -320,7 +321,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.LeftBrace] = new ShapeOutline(){
|
shapes[ShapeType.LEFT_BRACE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -348,7 +349,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.RightBrace] = new ShapeOutline(){
|
shapes[ShapeType.RIGHT_BRACE.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape 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);
|
||||||
@ -376,7 +377,7 @@ public final class AutoShapes {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
shapes[ShapeTypes.StraightConnector1] = new ShapeOutline(){
|
shapes[ShapeType.STRAIGHT_CONNECTOR_1.nativeId] = new ShapeOutline(){
|
||||||
public java.awt.Shape getOutline(Shape shape){
|
public java.awt.Shape getOutline(Shape shape){
|
||||||
return new Line2D.Float(0, 0, 21600, 21600);
|
return new Line2D.Float(0, 0, 21600, 21600);
|
||||||
}
|
}
|
||||||
|
@ -17,16 +17,22 @@
|
|||||||
|
|
||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.EscherContainerRecord;
|
import java.awt.Color;
|
||||||
import org.apache.poi.hslf.usermodel.PictureData;
|
import java.awt.Dimension;
|
||||||
import org.apache.poi.hslf.blip.Bitmap;
|
import java.awt.Graphics2D;
|
||||||
import org.apache.poi.util.POILogger;
|
import java.awt.Image;
|
||||||
|
import java.awt.Rectangle;
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.*;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
import org.apache.poi.ddf.EscherContainerRecord;
|
||||||
|
import org.apache.poi.hslf.blip.Bitmap;
|
||||||
|
import org.apache.poi.hslf.usermodel.PictureData;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Background shape
|
* Background shape
|
||||||
*
|
*
|
||||||
@ -34,7 +40,7 @@ import java.io.ByteArrayInputStream;
|
|||||||
*/
|
*/
|
||||||
public final class Background extends Shape {
|
public final class Background extends Shape {
|
||||||
|
|
||||||
protected Background(EscherContainerRecord escherRecord, Shape parent) {
|
protected Background(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent) {
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,6 +31,8 @@ import org.apache.poi.ddf.EscherContainerRecord;
|
|||||||
import org.apache.poi.ddf.EscherOptRecord;
|
import org.apache.poi.ddf.EscherOptRecord;
|
||||||
import org.apache.poi.ddf.EscherProperties;
|
import org.apache.poi.ddf.EscherProperties;
|
||||||
import org.apache.poi.ddf.EscherSimpleProperty;
|
import org.apache.poi.ddf.EscherSimpleProperty;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -60,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, Shape parent){
|
protected Freeform(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -71,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(Shape parent){
|
public Freeform(ShapeContainer<Shape> parent){
|
||||||
super(null, parent);
|
super((EscherContainerRecord)null, parent);
|
||||||
_escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -152,7 +152,7 @@ public final class Hyperlink {
|
|||||||
* @return found hyperlinks or <code>null</code> if not found
|
* @return found hyperlinks or <code>null</code> if not found
|
||||||
*/
|
*/
|
||||||
protected static Hyperlink[] find(TextRun run){
|
protected static Hyperlink[] find(TextRun run){
|
||||||
ArrayList lst = new ArrayList();
|
List<Hyperlink> lst = new ArrayList<Hyperlink>();
|
||||||
SlideShow ppt = run.getSheet().getSlideShow();
|
SlideShow ppt = run.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
|
||||||
ExObjList exobj = ppt.getDocumentRecord().getExObjList();
|
ExObjList exobj = ppt.getDocumentRecord().getExObjList();
|
||||||
@ -177,7 +177,7 @@ public final class Hyperlink {
|
|||||||
* @return found hyperlink or <code>null</code>
|
* @return found hyperlink or <code>null</code>
|
||||||
*/
|
*/
|
||||||
protected static Hyperlink find(Shape shape){
|
protected static Hyperlink find(Shape shape){
|
||||||
ArrayList lst = new ArrayList();
|
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
|
||||||
ExObjList exobj = ppt.getDocumentRecord().getExObjList();
|
ExObjList exobj = ppt.getDocumentRecord().getExObjList();
|
||||||
@ -198,7 +198,7 @@ public final class Hyperlink {
|
|||||||
return lst.size() == 1 ? (Hyperlink)lst.get(0) : null;
|
return lst.size() == 1 ? (Hyperlink)lst.get(0) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void find(Record[] records, ExObjList exobj, List out){
|
private static void find(Record[] records, ExObjList exobj, List<Hyperlink> out){
|
||||||
for (int i = 0; i < records.length; i++) {
|
for (int i = 0; i < records.length; i++) {
|
||||||
//see if we have InteractiveInfo in the textrun's records
|
//see if we have InteractiveInfo in the textrun's records
|
||||||
if( records[i] instanceof InteractiveInfo){
|
if( records[i] instanceof InteractiveInfo){
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
|
||||||
import java.awt.geom.Rectangle2D;
|
import java.awt.geom.Rectangle2D;
|
||||||
import java.awt.geom.Line2D;
|
import java.awt.geom.Line2D;
|
||||||
@ -95,11 +97,11 @@ public final class Line extends SimpleShape {
|
|||||||
public static final int LINE_TRIPLE = 4;
|
public static final int LINE_TRIPLE = 4;
|
||||||
|
|
||||||
|
|
||||||
protected Line(EscherContainerRecord escherRecord, Shape parent){
|
protected Line(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Line(Shape parent){
|
public Line(ShapeContainer<Shape> parent){
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
||||||
}
|
}
|
||||||
@ -112,7 +114,7 @@ public final class Line extends SimpleShape {
|
|||||||
_escherContainer = super.createSpContainer(isChild);
|
_escherContainer = super.createSpContainer(isChild);
|
||||||
|
|
||||||
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
short type = (ShapeTypes.Line << 4) | 0x2;
|
short type = (short)((ShapeType.LINE.nativeId << 4) | 0x2);
|
||||||
spRecord.setOptions(type);
|
spRecord.setOptions(type);
|
||||||
|
|
||||||
//set default properties for a line
|
//set default properties for a line
|
||||||
|
@ -25,6 +25,7 @@ import org.apache.poi.ddf.EscherProperties;
|
|||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
import org.apache.poi.hslf.record.*;
|
import org.apache.poi.hslf.record.*;
|
||||||
import org.apache.poi.hslf.usermodel.SlideShow;
|
import org.apache.poi.hslf.usermodel.SlideShow;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a movie in a PowerPoint document.
|
* Represents a movie in a PowerPoint document.
|
||||||
@ -54,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, Shape parent) {
|
public MovieShape(int movieIdx, int idx, ShapeContainer<Shape> parent) {
|
||||||
super(idx, parent);
|
super(idx, parent);
|
||||||
setMovieIndex(movieIdx);
|
setMovieIndex(movieIdx);
|
||||||
}
|
}
|
||||||
@ -66,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, Shape parent){
|
protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ import org.apache.poi.hslf.record.ExObjList;
|
|||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
import org.apache.poi.hslf.record.ExEmbed;
|
import org.apache.poi.hslf.record.ExEmbed;
|
||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -51,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, Shape parent) {
|
public OLEShape(int idx, ShapeContainer<Shape> parent) {
|
||||||
super(idx, parent);
|
super(idx, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,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, Shape parent){
|
protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1456,7 +1456,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
|||||||
* @param hints the rendering hints to be set
|
* @param hints the rendering hints to be set
|
||||||
* @see RenderingHints
|
* @see RenderingHints
|
||||||
*/
|
*/
|
||||||
public void addRenderingHints(Map hints){
|
public void addRenderingHints(Map<?,?> hints){
|
||||||
this._hints.putAll(hints);
|
this._hints.putAll(hints);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1581,8 +1581,9 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
|||||||
* @param hints the rendering hints to be set
|
* @param hints the rendering hints to be set
|
||||||
* @see RenderingHints
|
* @see RenderingHints
|
||||||
*/
|
*/
|
||||||
public void setRenderingHints(Map hints){
|
public void setRenderingHints(Map<?,?> hints){
|
||||||
this._hints = new RenderingHints(hints);
|
this._hints = new RenderingHints(null);
|
||||||
|
this._hints.putAll(hints);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -39,6 +39,8 @@ import org.apache.poi.hslf.blip.Bitmap;
|
|||||||
import org.apache.poi.hslf.record.Document;
|
import org.apache.poi.hslf.record.Document;
|
||||||
import org.apache.poi.hslf.usermodel.PictureData;
|
import org.apache.poi.hslf.usermodel.PictureData;
|
||||||
import org.apache.poi.hslf.usermodel.SlideShow;
|
import org.apache.poi.hslf.usermodel.SlideShow;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.util.StringUtil;
|
import org.apache.poi.util.StringUtil;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
@ -96,7 +98,7 @@ 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, Shape parent) {
|
public Picture(int idx, ShapeContainer<Shape> parent) {
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(idx, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(idx, parent instanceof ShapeGroup);
|
||||||
}
|
}
|
||||||
@ -108,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, Shape parent){
|
protected Picture(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -136,7 +138,7 @@ public class Picture extends SimpleShape {
|
|||||||
_escherContainer.setOptions((short)15);
|
_escherContainer.setOptions((short)15);
|
||||||
|
|
||||||
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
spRecord.setOptions((short)((ShapeTypes.PictureFrame << 4) | 0x2));
|
spRecord.setOptions((short)((ShapeType.FRAME.nativeId << 4) | 0x2));
|
||||||
|
|
||||||
//set default properties for a picture
|
//set default properties for a picture
|
||||||
EscherOptRecord opt = getEscherOptRecord();
|
EscherOptRecord opt = getEscherOptRecord();
|
||||||
@ -295,6 +297,6 @@ public class Picture extends SimpleShape {
|
|||||||
EscherSimpleProperty prop = getEscherProperty(opt, propertyId);
|
EscherSimpleProperty prop = getEscherProperty(opt, propertyId);
|
||||||
if (prop == null) return 0;
|
if (prop == null) return 0;
|
||||||
int fixedPoint = prop.getPropertyValue();
|
int fixedPoint = prop.getPropertyValue();
|
||||||
return Units.fixedPointToDecimal(fixedPoint);
|
return Units.fixedPointToDouble(fixedPoint);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -20,6 +20,7 @@ package org.apache.poi.hslf.model;
|
|||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
import org.apache.poi.hslf.record.OEPlaceholderAtom;
|
import org.apache.poi.hslf.record.OEPlaceholderAtom;
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
|
|
||||||
@ -30,11 +31,11 @@ import java.io.ByteArrayOutputStream;
|
|||||||
*/
|
*/
|
||||||
public final class Placeholder extends TextBox {
|
public final class Placeholder extends TextBox {
|
||||||
|
|
||||||
protected Placeholder(EscherContainerRecord escherRecord, Shape parent){
|
protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Placeholder(Shape parent){
|
public Placeholder(ShapeContainer<Shape> parent){
|
||||||
super(parent);
|
super(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
import java.awt.geom.Point2D;
|
import java.awt.geom.Point2D;
|
||||||
@ -34,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, Shape parent){
|
protected Polygon(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -45,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(Shape parent){
|
public Polygon(ShapeContainer<Shape> parent){
|
||||||
super(null, parent);
|
super((EscherContainerRecord)null, parent);
|
||||||
_escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(ShapeType.NOT_PRIMITIVE, parent instanceof ShapeGroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,6 +19,8 @@ package org.apache.poi.hslf.model;
|
|||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
import org.apache.poi.hslf.record.ColorSchemeAtom;
|
import org.apache.poi.hslf.record.ColorSchemeAtom;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.Units;
|
import org.apache.poi.util.Units;
|
||||||
@ -43,7 +45,7 @@ import java.awt.geom.Rectangle2D;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public abstract class Shape {
|
public abstract class Shape implements org.apache.poi.sl.usermodel.Shape<Shape> {
|
||||||
|
|
||||||
// For logging
|
// For logging
|
||||||
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
||||||
@ -83,7 +85,7 @@ public abstract class Shape {
|
|||||||
* Parent of this shape.
|
* Parent of this shape.
|
||||||
* <code>null</code> for the topmost shapes.
|
* <code>null</code> for the topmost shapes.
|
||||||
*/
|
*/
|
||||||
protected Shape _parent;
|
protected ShapeContainer<Shape> _parent;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The <code>Sheet</code> this shape belongs to
|
* The <code>Sheet</code> this shape belongs to
|
||||||
@ -101,7 +103,7 @@ public abstract class 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, Shape parent){
|
protected Shape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
_escherContainer = escherRecord;
|
_escherContainer = escherRecord;
|
||||||
_parent = parent;
|
_parent = parent;
|
||||||
}
|
}
|
||||||
@ -114,7 +116,7 @@ public abstract class Shape {
|
|||||||
/**
|
/**
|
||||||
* @return the parent of this shape
|
* @return the parent of this shape
|
||||||
*/
|
*/
|
||||||
public Shape getParent(){
|
public ShapeContainer<Shape> getParent(){
|
||||||
return _parent;
|
return _parent;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,25 +124,25 @@ public abstract class Shape {
|
|||||||
* @return name of the shape.
|
* @return name of the shape.
|
||||||
*/
|
*/
|
||||||
public String getShapeName(){
|
public String getShapeName(){
|
||||||
return ShapeTypes.typeName(getShapeType());
|
return getShapeType().nativeName;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return type of the shape.
|
* @return type of the shape.
|
||||||
* @see org.apache.poi.hslf.record.RecordTypes
|
* @see org.apache.poi.hslf.record.RecordTypes
|
||||||
*/
|
*/
|
||||||
public int getShapeType(){
|
public ShapeType getShapeType(){
|
||||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
return spRecord.getShapeType();
|
return ShapeType.forId(spRecord.getShapeType(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param type type of the shape.
|
* @param type type of the shape.
|
||||||
* @see org.apache.poi.hslf.record.RecordTypes
|
* @see org.apache.poi.hslf.record.RecordTypes
|
||||||
*/
|
*/
|
||||||
public void setShapeType(int type){
|
public void setShapeType(ShapeType type){
|
||||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
spRecord.setShapeType( (short) type );
|
spRecord.setShapeType( (short) type.nativeId );
|
||||||
spRecord.setVersion( (short) 0x2 );
|
spRecord.setVersion( (short) 0x2 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -395,7 +397,7 @@ public abstract class Shape {
|
|||||||
EscherSimpleProperty op = getEscherProperty(opt, opacityProperty);
|
EscherSimpleProperty op = getEscherProperty(opt, opacityProperty);
|
||||||
int defaultOpacity = 0x00010000;
|
int defaultOpacity = 0x00010000;
|
||||||
int opacity = (op == null) ? defaultOpacity : op.getPropertyValue();
|
int opacity = (op == null) ? defaultOpacity : op.getPropertyValue();
|
||||||
double alpha = Units.fixedPointToDecimal(opacity)*255.0;
|
double alpha = Units.fixedPointToDouble(opacity)*255.0;
|
||||||
return new Color(rgb[0], rgb[1], rgb[2], (int)alpha);
|
return new Color(rgb[0], rgb[1], rgb[2], (int)alpha);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -477,44 +479,47 @@ public abstract class Shape {
|
|||||||
return getEscherChild(EscherOptRecord.RECORD_ID);
|
return getEscherChild(EscherOptRecord.RECORD_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Whether the shape is horizontally flipped
|
|
||||||
*
|
|
||||||
* @return whether the shape is horizontally flipped
|
|
||||||
*/
|
|
||||||
public boolean getFlipHorizontal(){
|
public boolean getFlipHorizontal(){
|
||||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPHORIZ) != 0;
|
return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPHORIZ) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Whether the shape is vertically flipped
|
public void setFlipHorizontal(boolean flip) {
|
||||||
*
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
* @return whether the shape is vertically flipped
|
int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPHORIZ;
|
||||||
*/
|
spRecord.setFlags(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public boolean getFlipVertical(){
|
public boolean getFlipVertical(){
|
||||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPVERT) != 0;
|
return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPVERT) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Rotation angle in degrees
|
public void setFlipVertical(boolean flip) {
|
||||||
*
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
* @return rotation angle in degrees
|
int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPVERT;
|
||||||
*/
|
spRecord.setFlags(flag);
|
||||||
public int getRotation(){
|
}
|
||||||
int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION);
|
|
||||||
int angle = (rot >> 16) % 360;
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getRotation(){
|
||||||
|
int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION);
|
||||||
|
double angle = Units.fixedPointToDouble(rot) % 360.0;
|
||||||
return angle;
|
return angle;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Rotate this shape
|
public void setRotation(double theta){
|
||||||
*
|
int rot = Units.doubleToFixedPoint(theta % 360.0);
|
||||||
* @param theta the rotation angle in degrees
|
setEscherProperty(EscherProperties.TRANSFORM__ROTATION, rot);
|
||||||
*/
|
}
|
||||||
public void setRotation(int theta){
|
|
||||||
setEscherProperty(EscherProperties.TRANSFORM__ROTATION, (theta << 16));
|
@Override
|
||||||
|
public boolean isPlaceholder() {
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ import org.apache.poi.hslf.record.InteractiveInfoAtom;
|
|||||||
import org.apache.poi.hslf.record.OEShapeAtom;
|
import org.apache.poi.hslf.record.OEShapeAtom;
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -49,14 +51,14 @@ 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, Shape parent){
|
public static Shape createShape(EscherContainerRecord spContainer, ShapeContainer<Shape> 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, Shape parent){
|
public static ShapeGroup createShapeGroup(EscherContainerRecord spContainer, ShapeContainer<Shape> parent){
|
||||||
ShapeGroup group = null;
|
ShapeGroup group = null;
|
||||||
EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
|
EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
|
||||||
if(opt != null){
|
if(opt != null){
|
||||||
@ -80,17 +82,17 @@ public final class ShapeFactory {
|
|||||||
return group;
|
return group;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Shape createSimpeShape(EscherContainerRecord spContainer, Shape parent){
|
public static Shape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer<Shape> parent){
|
||||||
Shape shape = null;
|
Shape shape = null;
|
||||||
EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||||
|
|
||||||
int type = spRecord.getShapeType();
|
ShapeType type = ShapeType.forId(spRecord.getShapeType(), false);
|
||||||
switch (type){
|
switch (type){
|
||||||
case ShapeTypes.TextBox:
|
case TEXT_BOX:
|
||||||
shape = new TextBox(spContainer, parent);
|
shape = new TextBox(spContainer, parent);
|
||||||
break;
|
break;
|
||||||
case ShapeTypes.HostControl:
|
case HOST_CONTROL:
|
||||||
case ShapeTypes.PictureFrame: {
|
case FRAME: {
|
||||||
InteractiveInfo info = getClientDataRecord(spContainer, RecordTypes.InteractiveInfo.typeID);
|
InteractiveInfo info = getClientDataRecord(spContainer, RecordTypes.InteractiveInfo.typeID);
|
||||||
OEShapeAtom oes = getClientDataRecord(spContainer, RecordTypes.OEShapeAtom.typeID);
|
OEShapeAtom oes = getClientDataRecord(spContainer, RecordTypes.OEShapeAtom.typeID);
|
||||||
if(info != null && info.getInteractiveInfoAtom() != null){
|
if(info != null && info.getInteractiveInfoAtom() != null){
|
||||||
@ -111,10 +113,10 @@ public final class ShapeFactory {
|
|||||||
if(shape == null) shape = new Picture(spContainer, parent);
|
if(shape == null) shape = new Picture(spContainer, parent);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case ShapeTypes.Line:
|
case LINE:
|
||||||
shape = new Line(spContainer, parent);
|
shape = new Line(spContainer, parent);
|
||||||
break;
|
break;
|
||||||
case ShapeTypes.NotPrimitive: {
|
case NOT_PRIMITIVE: {
|
||||||
EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
|
EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
|
||||||
EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
|
EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
|
||||||
if(prop != null)
|
if(prop != null)
|
||||||
|
@ -30,6 +30,8 @@ import org.apache.poi.ddf.EscherContainerRecord;
|
|||||||
import org.apache.poi.ddf.EscherRecord;
|
import org.apache.poi.ddf.EscherRecord;
|
||||||
import org.apache.poi.ddf.EscherSpRecord;
|
import org.apache.poi.ddf.EscherSpRecord;
|
||||||
import org.apache.poi.ddf.EscherSpgrRecord;
|
import org.apache.poi.ddf.EscherSpgrRecord;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -38,7 +40,7 @@ import org.apache.poi.util.POILogger;
|
|||||||
*
|
*
|
||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
public class ShapeGroup extends Shape{
|
public class ShapeGroup extends Shape implements ShapeContainer<Shape> {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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.
|
||||||
@ -55,7 +57,7 @@ public class ShapeGroup 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 ShapeGroup(EscherContainerRecord escherRecord, Shape parent){
|
protected ShapeGroup(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -63,31 +65,7 @@ public class ShapeGroup extends Shape{
|
|||||||
* @return the shapes contained in this group container
|
* @return the shapes contained in this group container
|
||||||
*/
|
*/
|
||||||
public Shape[] getShapes() {
|
public Shape[] getShapes() {
|
||||||
// Out escher container record should contain several
|
List<Shape> shapeList = getShapeList();
|
||||||
// SpContainers, the first of which is the group shape itself
|
|
||||||
Iterator<EscherRecord> iter = _escherContainer.getChildIterator();
|
|
||||||
|
|
||||||
// Don't include the first SpContainer, it is always NotPrimitive
|
|
||||||
if (iter.hasNext()) {
|
|
||||||
iter.next();
|
|
||||||
}
|
|
||||||
List<Shape> shapeList = new ArrayList<Shape>();
|
|
||||||
while (iter.hasNext()) {
|
|
||||||
EscherRecord r = iter.next();
|
|
||||||
if(r instanceof EscherContainerRecord) {
|
|
||||||
// Create the Shape for it
|
|
||||||
EscherContainerRecord container = (EscherContainerRecord)r;
|
|
||||||
Shape shape = ShapeFactory.createShape(container, this);
|
|
||||||
shape.setSheet(getSheet());
|
|
||||||
shapeList.add( shape );
|
|
||||||
} else {
|
|
||||||
// Should we do anything special with these non
|
|
||||||
// Container records?
|
|
||||||
logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Put the shapes into an array, and return
|
|
||||||
Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]);
|
Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]);
|
||||||
return shapes;
|
return shapes;
|
||||||
}
|
}
|
||||||
@ -179,7 +157,7 @@ public class ShapeGroup extends Shape{
|
|||||||
spcont.addChildRecord(spg);
|
spcont.addChildRecord(spg);
|
||||||
|
|
||||||
EscherSpRecord sp = new EscherSpRecord();
|
EscherSpRecord sp = new EscherSpRecord();
|
||||||
short type = (ShapeTypes.NotPrimitive << 4) + 2;
|
short type = (short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2);
|
||||||
sp.setOptions(type);
|
sp.setOptions(type);
|
||||||
sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_GROUP);
|
sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_GROUP);
|
||||||
spcont.addChildRecord(sp);
|
spcont.addChildRecord(sp);
|
||||||
@ -260,9 +238,10 @@ public class ShapeGroup extends Shape{
|
|||||||
*
|
*
|
||||||
* @return type of the shape.
|
* @return type of the shape.
|
||||||
*/
|
*/
|
||||||
public int getShapeType(){
|
public ShapeType getShapeType(){
|
||||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||||
return spRecord.getOptions() >> 4;
|
int nativeId = spRecord.getOptions() >> 4;
|
||||||
|
return ShapeType.forId(nativeId, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -291,4 +270,45 @@ public class ShapeGroup extends Shape{
|
|||||||
EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0);
|
EscherContainerRecord groupInfoContainer = (EscherContainerRecord)_escherContainer.getChild(0);
|
||||||
return groupInfoContainer.getChildById((short)recordId);
|
return groupInfoContainer.getChildById((short)recordId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Iterator<Shape> iterator() {
|
||||||
|
return getShapeList().iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean removeShape(Shape shape) {
|
||||||
|
// TODO: implement!
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the shapes contained in this group container
|
||||||
|
*/
|
||||||
|
protected List<Shape> getShapeList() {
|
||||||
|
// Out escher container record should contain several
|
||||||
|
// SpContainers, the first of which is the group shape itself
|
||||||
|
Iterator<EscherRecord> iter = _escherContainer.getChildIterator();
|
||||||
|
|
||||||
|
// Don't include the first SpContainer, it is always NotPrimitive
|
||||||
|
if (iter.hasNext()) {
|
||||||
|
iter.next();
|
||||||
|
}
|
||||||
|
List<Shape> shapeList = new ArrayList<Shape>();
|
||||||
|
while (iter.hasNext()) {
|
||||||
|
EscherRecord r = iter.next();
|
||||||
|
if(r instanceof EscherContainerRecord) {
|
||||||
|
// Create the Shape for it
|
||||||
|
EscherContainerRecord container = (EscherContainerRecord)r;
|
||||||
|
Shape shape = ShapeFactory.createShape(container, this);
|
||||||
|
shape.setSheet(getSheet());
|
||||||
|
shapeList.add( shape );
|
||||||
|
} else {
|
||||||
|
// Should we do anything special with these non
|
||||||
|
// Container records?
|
||||||
|
logger.log(POILogger.ERROR, "Shape contained non container escher record, was " + r.getClass().getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return shapeList;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,57 +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.hslf.model;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.HashMap;
|
|
||||||
|
|
||||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Contains all known shape types in PowerPoint
|
|
||||||
*
|
|
||||||
* @author Yegor Kozlov
|
|
||||||
*/
|
|
||||||
public final class ShapeTypes implements org.apache.poi.sl.usermodel.ShapeTypes {
|
|
||||||
/**
|
|
||||||
* Return name of the shape by id
|
|
||||||
* @param type - the id of the shape, one of the static constants defined in this class
|
|
||||||
* @return the name of the shape
|
|
||||||
*/
|
|
||||||
public static String typeName(int type) {
|
|
||||||
String name = (String)types.get(Integer.valueOf(type));
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final HashMap types;
|
|
||||||
static {
|
|
||||||
types = new HashMap();
|
|
||||||
try {
|
|
||||||
Field[] f = org.apache.poi.sl.usermodel.ShapeTypes.class.getFields();
|
|
||||||
for (int i = 0; i < f.length; i++){
|
|
||||||
Object val = f[i].get(null);
|
|
||||||
if (val instanceof Integer) {
|
|
||||||
types.put(val, f[i].getName());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (IllegalAccessException e){
|
|
||||||
throw new HSLFException("Failed to initialize shape types");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -45,6 +45,7 @@ import org.apache.poi.hslf.record.TextHeaderAtom;
|
|||||||
import org.apache.poi.hslf.record.TextRulerAtom;
|
import org.apache.poi.hslf.record.TextRulerAtom;
|
||||||
import org.apache.poi.hslf.record.TextSpecInfoAtom;
|
import org.apache.poi.hslf.record.TextSpecInfoAtom;
|
||||||
import org.apache.poi.hslf.usermodel.SlideShow;
|
import org.apache.poi.hslf.usermodel.SlideShow;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -56,7 +57,7 @@ import org.apache.poi.util.POILogger;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public abstract class Sheet {
|
public abstract class Sheet implements ShapeContainer<Shape> {
|
||||||
private static POILogger logger = POILogFactory.getLogger(Sheet.class);
|
private static POILogger logger = POILogFactory.getLogger(Sheet.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -272,36 +273,8 @@ public abstract class Sheet {
|
|||||||
* @return all shapes contained in this Sheet (Slide or Notes)
|
* @return all shapes contained in this Sheet (Slide or Notes)
|
||||||
*/
|
*/
|
||||||
public Shape[] getShapes() {
|
public Shape[] getShapes() {
|
||||||
PPDrawing ppdrawing = getPPDrawing();
|
List<Shape> shapeList = getShapeList();
|
||||||
|
return shapeList.toArray(new Shape[shapeList.size()]);
|
||||||
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
|
||||||
EscherContainerRecord spgr = null;
|
|
||||||
|
|
||||||
for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
|
|
||||||
EscherRecord rec = it.next();
|
|
||||||
if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
|
|
||||||
spgr = (EscherContainerRecord) rec;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (spgr == null) {
|
|
||||||
throw new IllegalStateException("spgr not found");
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Shape> shapes = new ArrayList<Shape>();
|
|
||||||
Iterator<EscherRecord> it = spgr.getChildIterator();
|
|
||||||
if (it.hasNext()) {
|
|
||||||
// skip first item
|
|
||||||
it.next();
|
|
||||||
}
|
|
||||||
for (; it.hasNext();) {
|
|
||||||
EscherContainerRecord sp = (EscherContainerRecord) it.next();
|
|
||||||
Shape sh = ShapeFactory.createShape(sp, null);
|
|
||||||
sh.setSheet(this);
|
|
||||||
shapes.add(sh);
|
|
||||||
}
|
|
||||||
|
|
||||||
return shapes.toArray(new Shape[shapes.size()]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -524,4 +497,47 @@ public abstract class Sheet {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Iterator<Shape> iterator() {
|
||||||
|
return getShapeList().iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns all shapes contained in this Sheet
|
||||||
|
*
|
||||||
|
* @return all shapes contained in this Sheet (Slide or Notes)
|
||||||
|
*/
|
||||||
|
protected List<Shape> getShapeList() {
|
||||||
|
PPDrawing ppdrawing = getPPDrawing();
|
||||||
|
|
||||||
|
EscherContainerRecord dg = (EscherContainerRecord) ppdrawing.getEscherRecords()[0];
|
||||||
|
EscherContainerRecord spgr = null;
|
||||||
|
|
||||||
|
for (Iterator<EscherRecord> it = dg.getChildIterator(); it.hasNext();) {
|
||||||
|
EscherRecord rec = it.next();
|
||||||
|
if (rec.getRecordId() == EscherContainerRecord.SPGR_CONTAINER) {
|
||||||
|
spgr = (EscherContainerRecord) rec;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (spgr == null) {
|
||||||
|
throw new IllegalStateException("spgr not found");
|
||||||
|
}
|
||||||
|
|
||||||
|
List<Shape> shapeList = new ArrayList<Shape>();
|
||||||
|
Iterator<EscherRecord> it = spgr.getChildIterator();
|
||||||
|
if (it.hasNext()) {
|
||||||
|
// skip first item
|
||||||
|
it.next();
|
||||||
|
}
|
||||||
|
for (; it.hasNext();) {
|
||||||
|
EscherContainerRecord sp = (EscherContainerRecord) it.next();
|
||||||
|
Shape sh = ShapeFactory.createShape(sp, null);
|
||||||
|
sh.setSheet(this);
|
||||||
|
shapeList.add(sh);
|
||||||
|
}
|
||||||
|
|
||||||
|
return shapeList;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,7 @@ import org.apache.poi.hslf.exceptions.HSLFException;
|
|||||||
import org.apache.poi.hslf.record.InteractiveInfo;
|
import org.apache.poi.hslf.record.InteractiveInfo;
|
||||||
import org.apache.poi.hslf.record.InteractiveInfoAtom;
|
import org.apache.poi.hslf.record.InteractiveInfoAtom;
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -62,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, Shape parent){
|
protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,7 +192,7 @@ public abstract class SimpleShape extends Shape {
|
|||||||
*
|
*
|
||||||
* @return style of the line.
|
* @return style of the line.
|
||||||
*/
|
*/
|
||||||
public int getLineStyle(){
|
public int getStrokeStyle(){
|
||||||
EscherOptRecord opt = getEscherOptRecord();
|
EscherOptRecord opt = getEscherOptRecord();
|
||||||
EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE);
|
EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE);
|
||||||
return prop == null ? Line.LINE_SIMPLE : prop.getPropertyValue();
|
return prop == null ? Line.LINE_SIMPLE : prop.getPropertyValue();
|
||||||
@ -221,10 +222,12 @@ public abstract class SimpleShape extends Shape {
|
|||||||
Rectangle2D anchor = getAnchor2D();
|
Rectangle2D anchor = getAnchor2D();
|
||||||
|
|
||||||
//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 (_parent != null){
|
if (getParent() != null){
|
||||||
ArrayList<ShapeGroup> lst = new ArrayList<ShapeGroup>();
|
ArrayList<ShapeGroup> lst = new ArrayList<ShapeGroup>();
|
||||||
for (Shape top=this; (top = top.getParent()) != null; ) {
|
for (ShapeContainer<Shape> parent=this.getParent();
|
||||||
lst.add(0, (ShapeGroup)top);
|
parent instanceof ShapeGroup;
|
||||||
|
parent = ((ShapeGroup)parent).getParent()) {
|
||||||
|
lst.add(0, (ShapeGroup)parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
AffineTransform tx = new AffineTransform();
|
AffineTransform tx = new AffineTransform();
|
||||||
@ -243,8 +246,8 @@ public abstract class SimpleShape extends Shape {
|
|||||||
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
||||||
}
|
}
|
||||||
|
|
||||||
int angle = getRotation();
|
double angle = getRotation();
|
||||||
if(angle != 0){
|
if(angle != 0.){
|
||||||
double centerX = anchor.getX() + anchor.getWidth()/2;
|
double centerX = anchor.getX() + anchor.getWidth()/2;
|
||||||
double centerY = anchor.getY() + anchor.getHeight()/2;
|
double centerY = anchor.getY() + anchor.getHeight()/2;
|
||||||
|
|
||||||
|
@ -34,9 +34,10 @@ import org.apache.poi.hslf.record.RecordContainer;
|
|||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
import org.apache.poi.hslf.record.SSSlideInfoAtom;
|
import org.apache.poi.hslf.record.SSSlideInfoAtom;
|
||||||
import org.apache.poi.hslf.record.SlideAtom;
|
import org.apache.poi.hslf.record.SlideAtom;
|
||||||
|
import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
|
||||||
import org.apache.poi.hslf.record.StyleTextProp9Atom;
|
import org.apache.poi.hslf.record.StyleTextProp9Atom;
|
||||||
import org.apache.poi.hslf.record.TextHeaderAtom;
|
import org.apache.poi.hslf.record.TextHeaderAtom;
|
||||||
import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class represents a slide in a PowerPoint Document. It allows
|
* This class represents a slide in a PowerPoint Document. It allows
|
||||||
@ -47,8 +48,7 @@ import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
|
|||||||
* @author Yegor Kozlov
|
* @author Yegor Kozlov
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public final class Slide extends Sheet
|
public final class Slide extends Sheet {
|
||||||
{
|
|
||||||
private int _slideNo;
|
private int _slideNo;
|
||||||
private SlideAtomsSet _atomSet;
|
private SlideAtomsSet _atomSet;
|
||||||
private TextRun[] _runs;
|
private TextRun[] _runs;
|
||||||
@ -180,7 +180,7 @@ public final class Slide extends Sheet
|
|||||||
*/
|
*/
|
||||||
public TextBox addTitle() {
|
public TextBox addTitle() {
|
||||||
Placeholder pl = new Placeholder();
|
Placeholder pl = new Placeholder();
|
||||||
pl.setShapeType(ShapeTypes.Rectangle);
|
pl.setShapeType(ShapeType.RECT);
|
||||||
pl.getTextRun().setRunType(TextHeaderAtom.TITLE_TYPE);
|
pl.getTextRun().setRunType(TextHeaderAtom.TITLE_TYPE);
|
||||||
pl.setText("Click to edit title");
|
pl.setText("Click to edit title");
|
||||||
pl.setAnchor(new java.awt.Rectangle(54, 48, 612, 90));
|
pl.setAnchor(new java.awt.Rectangle(54, 48, 612, 90));
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
@ -92,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, Shape parent) {
|
public Table(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent) {
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -125,7 +126,7 @@ public final class Table extends ShapeGroup {
|
|||||||
TableCell cell = cells[i][0];
|
TableCell cell = cells[i][0];
|
||||||
int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI;
|
int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI;
|
||||||
byte[] val = new byte[4];
|
byte[] val = new byte[4];
|
||||||
LittleEndian.putInt(val, rowHeight);
|
LittleEndian.putInt(val, 0, rowHeight);
|
||||||
p.setElement(i, val);
|
p.setElement(i, val);
|
||||||
for (int j = 0; j < cells[i].length; j++) {
|
for (int j = 0; j < cells[i].length; j++) {
|
||||||
TableCell c = cells[i][j];
|
TableCell c = cells[i][j];
|
||||||
@ -149,11 +150,11 @@ public final class Table extends ShapeGroup {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void initTable(){
|
protected void initTable(){
|
||||||
Shape[] sh = getShapes();
|
List<Shape> shapeList = getShapeList();
|
||||||
Arrays.sort(sh, new Comparator(){
|
Collections.sort(shapeList, new Comparator<Shape>(){
|
||||||
public int compare( Object o1, Object o2 ) {
|
public int compare( Shape o1, Shape o2 ) {
|
||||||
Rectangle anchor1 = ((Shape)o1).getAnchor();
|
Rectangle anchor1 = o1.getAnchor();
|
||||||
Rectangle anchor2 = ((Shape)o2).getAnchor();
|
Rectangle anchor2 = o2.getAnchor();
|
||||||
int delta = anchor1.y - anchor2.y;
|
int delta = anchor1.y - anchor2.y;
|
||||||
if(delta == 0) delta = anchor1.x - anchor2.x;
|
if(delta == 0) delta = anchor1.x - anchor2.x;
|
||||||
return delta;
|
return delta;
|
||||||
@ -161,23 +162,23 @@ public final class Table extends ShapeGroup {
|
|||||||
});
|
});
|
||||||
int y0 = -1;
|
int y0 = -1;
|
||||||
int maxrowlen = 0;
|
int maxrowlen = 0;
|
||||||
ArrayList lst = new ArrayList();
|
List<List<Shape>> lst = new ArrayList<List<Shape>>();
|
||||||
ArrayList row = null;
|
List<Shape> row = null;
|
||||||
for (int i = 0; i < sh.length; i++) {
|
for (Shape sh : shapeList) {
|
||||||
if(sh[i] instanceof TextShape){
|
if(sh instanceof TextShape){
|
||||||
Rectangle anchor = sh[i].getAnchor();
|
Rectangle anchor = sh.getAnchor();
|
||||||
if(anchor.y != y0){
|
if(anchor.y != y0){
|
||||||
y0 = anchor.y;
|
y0 = anchor.y;
|
||||||
row = new ArrayList();
|
row = new ArrayList<Shape>();
|
||||||
lst.add(row);
|
lst.add(row);
|
||||||
}
|
}
|
||||||
row.add(sh[i]);
|
row.add(sh);
|
||||||
maxrowlen = Math.max(maxrowlen, row.size());
|
maxrowlen = Math.max(maxrowlen, row.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
cells = new TableCell[lst.size()][maxrowlen];
|
cells = new TableCell[lst.size()][maxrowlen];
|
||||||
for (int i = 0; i < lst.size(); i++) {
|
for (int i = 0; i < lst.size(); i++) {
|
||||||
row = (ArrayList)lst.get(i);
|
row = lst.get(i);
|
||||||
for (int j = 0; j < row.size(); j++) {
|
for (int j = 0; j < row.size(); j++) {
|
||||||
TextShape tx = (TextShape)row.get(j);
|
TextShape tx = (TextShape)row.get(j);
|
||||||
cells[i][j] = new TableCell(tx.getSpContainer(), getParent());
|
cells[i][j] = new TableCell(tx.getSpContainer(), getParent());
|
||||||
@ -318,7 +319,7 @@ public final class Table extends ShapeGroup {
|
|||||||
private Line cloneBorder(Line line){
|
private Line cloneBorder(Line line){
|
||||||
Line border = createBorder();
|
Line border = createBorder();
|
||||||
border.setLineWidth(line.getLineWidth());
|
border.setLineWidth(line.getLineWidth());
|
||||||
border.setLineStyle(line.getLineStyle());
|
border.setLineStyle(line.getStrokeStyle());
|
||||||
border.setLineDashing(line.getLineDashing());
|
border.setLineDashing(line.getLineDashing());
|
||||||
border.setLineColor(line.getLineColor());
|
border.setLineColor(line.getLineColor());
|
||||||
return border;
|
return border;
|
||||||
|
@ -17,9 +17,13 @@
|
|||||||
|
|
||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import java.awt.Rectangle;
|
||||||
|
|
||||||
import java.awt.*;
|
import org.apache.poi.ddf.EscherContainerRecord;
|
||||||
|
import org.apache.poi.ddf.EscherOptRecord;
|
||||||
|
import org.apache.poi.ddf.EscherProperties;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a cell in a ppt table
|
* Represents a cell in a ppt table
|
||||||
@ -38,10 +42,10 @@ public final class TableCell extends TextBox {
|
|||||||
/**
|
/**
|
||||||
* Create a TableCell object and initialize it from the supplied Record container.
|
* Create a TableCell object and initialize it from the supplied Record container.
|
||||||
*
|
*
|
||||||
* @param escherRecord <code>EscherSpContainer</code> 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, Shape parent){
|
protected TableCell(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -51,10 +55,10 @@ 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(Shape parent){
|
public TableCell(ShapeContainer<Shape> parent){
|
||||||
super(parent);
|
super(parent);
|
||||||
|
|
||||||
setShapeType(ShapeTypes.Rectangle);
|
setShapeType(ShapeType.RECT);
|
||||||
//_txtrun.setRunType(TextHeaderAtom.HALF_BODY_TYPE);
|
//_txtrun.setRunType(TextHeaderAtom.HALF_BODY_TYPE);
|
||||||
//_txtrun.getRichTextRuns()[0].setFlag(false, 0, false);
|
//_txtrun.getRichTextRuns()[0].setFlag(false, 0, false);
|
||||||
}
|
}
|
||||||
|
@ -18,6 +18,8 @@
|
|||||||
package org.apache.poi.hslf.model;
|
package org.apache.poi.hslf.model;
|
||||||
|
|
||||||
import org.apache.poi.ddf.*;
|
import org.apache.poi.ddf.*;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a TextFrame shape in PowerPoint.
|
* Represents a TextFrame shape in PowerPoint.
|
||||||
@ -36,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, Shape parent){
|
protected TextBox(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -47,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(Shape parent){
|
public TextBox(ShapeContainer<Shape> parent){
|
||||||
super(parent);
|
super(parent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,7 +69,7 @@ public class TextBox extends TextShape {
|
|||||||
protected EscherContainerRecord createSpContainer(boolean isChild){
|
protected EscherContainerRecord createSpContainer(boolean isChild){
|
||||||
_escherContainer = super.createSpContainer(isChild);
|
_escherContainer = super.createSpContainer(isChild);
|
||||||
|
|
||||||
setShapeType(ShapeTypes.TextBox);
|
setShapeType(ShapeType.TEXT_BOX);
|
||||||
|
|
||||||
//set default properties for a TextBox
|
//set default properties for a TextBox
|
||||||
setEscherProperty(EscherProperties.FILL__FILLCOLOR, 0x8000004);
|
setEscherProperty(EscherProperties.FILL__FILLCOLOR, 0x8000004);
|
||||||
|
@ -41,12 +41,14 @@ import org.apache.poi.hslf.record.OutlineTextRefAtom;
|
|||||||
import org.apache.poi.hslf.record.PPDrawing;
|
import org.apache.poi.hslf.record.PPDrawing;
|
||||||
import org.apache.poi.hslf.record.Record;
|
import org.apache.poi.hslf.record.Record;
|
||||||
import org.apache.poi.hslf.record.RecordTypes;
|
import org.apache.poi.hslf.record.RecordTypes;
|
||||||
|
import org.apache.poi.hslf.record.RoundTripHFPlaceholder12;
|
||||||
import org.apache.poi.hslf.record.StyleTextPropAtom;
|
import org.apache.poi.hslf.record.StyleTextPropAtom;
|
||||||
import org.apache.poi.hslf.record.TextBytesAtom;
|
import org.apache.poi.hslf.record.TextBytesAtom;
|
||||||
import org.apache.poi.hslf.record.TextCharsAtom;
|
import org.apache.poi.hslf.record.TextCharsAtom;
|
||||||
import org.apache.poi.hslf.record.TextHeaderAtom;
|
import org.apache.poi.hslf.record.TextHeaderAtom;
|
||||||
import org.apache.poi.hslf.record.TxInteractiveInfoAtom;
|
import org.apache.poi.hslf.record.TxInteractiveInfoAtom;
|
||||||
import org.apache.poi.hslf.usermodel.RichTextRun;
|
import org.apache.poi.hslf.usermodel.RichTextRun;
|
||||||
|
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -109,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, Shape parent){
|
protected TextShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||||
super(escherRecord, parent);
|
super(escherRecord, parent);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -120,7 +122,7 @@ 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(Shape parent){
|
public TextShape(ShapeContainer<Shape> parent){
|
||||||
super(null, parent);
|
super(null, parent);
|
||||||
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
||||||
}
|
}
|
||||||
@ -623,4 +625,17 @@ public abstract class TextShape extends SimpleShape {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPlaceholder() {
|
||||||
|
OEPlaceholderAtom oep = getPlaceholderAtom();
|
||||||
|
if (oep != null) return true;
|
||||||
|
|
||||||
|
//special case for files saved in Office 2007
|
||||||
|
RoundTripHFPlaceholder12 hldr = getClientDataRecord(RecordTypes.RoundTripHFPlaceholder12.typeID);
|
||||||
|
if (hldr != null) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -37,7 +37,7 @@ import org.apache.poi.ddf.EscherSpRecord;
|
|||||||
import org.apache.poi.ddf.EscherSpgrRecord;
|
import org.apache.poi.ddf.EscherSpgrRecord;
|
||||||
import org.apache.poi.ddf.EscherTextboxRecord;
|
import org.apache.poi.ddf.EscherTextboxRecord;
|
||||||
import org.apache.poi.ddf.UnknownEscherRecord;
|
import org.apache.poi.ddf.UnknownEscherRecord;
|
||||||
import org.apache.poi.hslf.model.ShapeTypes;
|
import org.apache.poi.sl.usermodel.ShapeType;
|
||||||
import org.apache.poi.util.LittleEndian;
|
import org.apache.poi.util.LittleEndian;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
@ -95,7 +95,7 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
final DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
|
final DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
|
||||||
final List<EscherRecord> escherChildren = new ArrayList<EscherRecord>();
|
final List<EscherRecord> escherChildren = new ArrayList<EscherRecord>();
|
||||||
findEscherChildren(erf, contents, 8, len-8, escherChildren);
|
findEscherChildren(erf, contents, 8, len-8, escherChildren);
|
||||||
this.childRecords = (EscherRecord[]) escherChildren.toArray(new EscherRecord[escherChildren.size()]);
|
this.childRecords = escherChildren.toArray(new EscherRecord[escherChildren.size()]);
|
||||||
|
|
||||||
if (1 == this.childRecords.length && (short)0xf002 == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) {
|
if (1 == this.childRecords.length && (short)0xf002 == this.childRecords[0].getRecordId() && this.childRecords[0] instanceof EscherContainerRecord) {
|
||||||
this.textboxWrappers = findInDgContainer((EscherContainerRecord) this.childRecords[0]);
|
this.textboxWrappers = findInDgContainer((EscherContainerRecord) this.childRecords[0]);
|
||||||
@ -103,7 +103,7 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
// Find and EscherTextboxRecord's, and wrap them up
|
// Find and EscherTextboxRecord's, and wrap them up
|
||||||
final List<EscherTextboxWrapper> textboxes = new ArrayList<EscherTextboxWrapper>();
|
final List<EscherTextboxWrapper> textboxes = new ArrayList<EscherTextboxWrapper>();
|
||||||
findEscherTextboxRecord(childRecords, textboxes);
|
findEscherTextboxRecord(childRecords, textboxes);
|
||||||
this.textboxWrappers = (EscherTextboxWrapper[]) textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]);
|
this.textboxWrappers = textboxes.toArray(new EscherTextboxWrapper[textboxes.size()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord escherContainerF002) {
|
private EscherTextboxWrapper[] findInDgContainer(final EscherContainerRecord escherContainerF002) {
|
||||||
@ -131,7 +131,7 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
found.add(w);
|
found.add(w);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (EscherTextboxWrapper[]) found.toArray(new EscherTextboxWrapper[found.size()]);
|
return found.toArray(new EscherTextboxWrapper[found.size()]);
|
||||||
}
|
}
|
||||||
private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) {
|
private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) {
|
||||||
final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, spContainer);
|
final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, spContainer);
|
||||||
@ -301,7 +301,7 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
spContainer.addChildRecord(spgr);
|
spContainer.addChildRecord(spgr);
|
||||||
|
|
||||||
EscherSpRecord sp = new EscherSpRecord();
|
EscherSpRecord sp = new EscherSpRecord();
|
||||||
sp.setOptions((short)((ShapeTypes.NotPrimitive << 4) + 2));
|
sp.setOptions((short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2));
|
||||||
sp.setFlags(EscherSpRecord.FLAG_PATRIARCH | EscherSpRecord.FLAG_GROUP);
|
sp.setFlags(EscherSpRecord.FLAG_PATRIARCH | EscherSpRecord.FLAG_GROUP);
|
||||||
spContainer.addChildRecord(sp);
|
spContainer.addChildRecord(sp);
|
||||||
spgrContainer.addChildRecord(spContainer);
|
spgrContainer.addChildRecord(spContainer);
|
||||||
@ -311,7 +311,7 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
spContainer.setOptions((short)15);
|
spContainer.setOptions((short)15);
|
||||||
spContainer.setRecordId(EscherContainerRecord.SP_CONTAINER);
|
spContainer.setRecordId(EscherContainerRecord.SP_CONTAINER);
|
||||||
sp = new EscherSpRecord();
|
sp = new EscherSpRecord();
|
||||||
sp.setOptions((short)((ShapeTypes.Rectangle << 4) + 2));
|
sp.setOptions((short)((ShapeType.RECT.nativeId << 4) + 2));
|
||||||
sp.setFlags(EscherSpRecord.FLAG_BACKGROUND | EscherSpRecord.FLAG_HASSHAPETYPE);
|
sp.setFlags(EscherSpRecord.FLAG_BACKGROUND | EscherSpRecord.FLAG_HASSHAPETYPE);
|
||||||
spContainer.addChildRecord(sp);
|
spContainer.addChildRecord(sp);
|
||||||
|
|
||||||
@ -393,7 +393,7 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
result.add(child);
|
result.add(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (EscherContainerRecord[]) result.toArray(new EscherContainerRecord[result.size()]);
|
return result.toArray(new EscherContainerRecord[result.size()]);
|
||||||
}
|
}
|
||||||
protected Record buildFromUnknownEscherRecord(UnknownEscherRecord unknown) {
|
protected Record buildFromUnknownEscherRecord(UnknownEscherRecord unknown) {
|
||||||
byte[] bingo = unknown.getData();
|
byte[] bingo = unknown.getData();
|
||||||
@ -436,6 +436,6 @@ public final class PPDrawing extends RecordAtom {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (StyleTextProp9Atom[]) result.toArray(new StyleTextProp9Atom[result.size()]);
|
return result.toArray(new StyleTextProp9Atom[result.size()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
10
src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java
Normal file
10
src/scratchpad/src/org/apache/poi/sl/draw/DrawAutoShape.java
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawAutoShape<T extends AutoShape> extends DrawTextShape<T> {
|
||||||
|
public DrawAutoShape(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
}
|
96
src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java
Normal file
96
src/scratchpad/src/org/apache/poi/sl/draw/DrawFactory.java
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import static org.apache.poi.sl.draw.Drawable.DRAW_FACTORY;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.font.TextLayout;
|
||||||
|
import java.text.AttributedString;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
public class DrawFactory {
|
||||||
|
protected static ThreadLocal<DrawFactory> defaultFactory = new ThreadLocal<DrawFactory>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a custom draw factory for the current thread.
|
||||||
|
* This is a fallback, for operations where usercode can't set a graphics context.
|
||||||
|
* Preferably use the rendering hint {@link Drawable#DRAW_FACTORY} to set the factory.
|
||||||
|
*
|
||||||
|
* @param factory
|
||||||
|
*/
|
||||||
|
public static void setDefaultFactory(DrawFactory factory) {
|
||||||
|
defaultFactory.set(factory);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static DrawFactory getInstance(Graphics2D graphics) {
|
||||||
|
// first try to find the factory over the rendering hing
|
||||||
|
DrawFactory factory = (DrawFactory)graphics.getRenderingHint(DRAW_FACTORY);
|
||||||
|
// secondly try the thread local default
|
||||||
|
if (factory == null) {
|
||||||
|
factory = defaultFactory.get();
|
||||||
|
}
|
||||||
|
// and at last, use the default factory
|
||||||
|
if (factory == null) {
|
||||||
|
factory = new DrawFactory();
|
||||||
|
graphics.setRenderingHint(DRAW_FACTORY, factory);
|
||||||
|
}
|
||||||
|
return factory;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Drawable getDrawable(Sheet sheet) {
|
||||||
|
return new DrawSheet(sheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Drawable getDrawable(MasterSheet sheet) {
|
||||||
|
return new DrawMasterSheet(sheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
public Drawable getDrawable(Shape shape) {
|
||||||
|
if (shape instanceof TextBox) {
|
||||||
|
return getDrawable((TextBox)shape);
|
||||||
|
} else if (shape instanceof FreeformShape) {
|
||||||
|
return getDrawable((FreeformShape)shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
throw new IllegalArgumentException("Unsupported shape type: "+shape.getClass());
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends TextBox> DrawTextBox<T> getDrawable(T shape) {
|
||||||
|
return new DrawTextBox<T>(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <T extends FreeformShape> DrawFreeformShape<T> getDrawable(T shape) {
|
||||||
|
return new DrawFreeformShape<T>(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public DrawTextParagraph getDrawable(TextParagraph paragraph) {
|
||||||
|
return new DrawTextParagraph(paragraph);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DrawTextFragment getTextFragment(TextLayout layout, AttributedString str) {
|
||||||
|
return new DrawTextFragment(layout, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
public DrawPaint getPaint(PlaceableShape shape) {
|
||||||
|
return new DrawPaint(shape);
|
||||||
|
}
|
||||||
|
}
|
@ -17,13 +17,22 @@
|
|||||||
* ====================================================================
|
* ====================================================================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package org.apache.poi.xslf.usermodel;
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Yegor Kozlov
|
* Manages fonts when rendering slides.
|
||||||
|
*
|
||||||
|
* Use this class to handle unknown / missing fonts or to substitute fonts
|
||||||
*/
|
*/
|
||||||
public enum TextCap {
|
public interface DrawFontManager {
|
||||||
NONE,
|
|
||||||
SMALL,
|
/**
|
||||||
ALL
|
* select a font to be used to paint text
|
||||||
|
*
|
||||||
|
* @param typeface the font family as defined in the .pptx file.
|
||||||
|
* This can be unknown or missing in the graphic environment.
|
||||||
|
*
|
||||||
|
* @return the font to be used to paint text
|
||||||
|
*/
|
||||||
|
String getRendererableFont(String typeface, int pitchFamily);
|
||||||
}
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
public class DrawFreeformShape<T extends FreeformShape> extends DrawAutoShape<T> {
|
||||||
|
public DrawFreeformShape(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||||
|
import org.apache.poi.sl.usermodel.Shape;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawMasterSheet extends DrawSheet {
|
||||||
|
|
||||||
|
public DrawMasterSheet(MasterSheet sheet) {
|
||||||
|
super(sheet);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this <code>sheet</code> displays the specified shape.
|
||||||
|
*
|
||||||
|
* Subclasses can override it and skip certain shapes from drawings,
|
||||||
|
* for instance, slide masters and layouts don't display placeholders
|
||||||
|
*/
|
||||||
|
protected boolean canDraw(Shape shape){
|
||||||
|
return !shape.isPlaceholder();
|
||||||
|
}
|
||||||
|
}
|
448
src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java
Normal file
448
src/scratchpad/src/org/apache/poi/sl/draw/DrawPaint.java
Normal file
@ -0,0 +1,448 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.MultipleGradientPaint.ColorSpaceType;
|
||||||
|
import java.awt.MultipleGradientPaint.CycleMethod;
|
||||||
|
import java.awt.Shape;
|
||||||
|
import java.awt.geom.*;
|
||||||
|
import java.awt.image.*;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
import org.apache.poi.sl.usermodel.GradientPaint;
|
||||||
|
import org.apache.poi.sl.usermodel.TexturePaint;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawPaint {
|
||||||
|
public final static Color NO_PAINT = new Color(0xFF, 0xFF, 0xFF, 0);
|
||||||
|
private final static POILogger LOG = POILogFactory.getLogger(DrawPaint.class);
|
||||||
|
|
||||||
|
protected PlaceableShape shape;
|
||||||
|
|
||||||
|
public DrawPaint(PlaceableShape shape) {
|
||||||
|
this.shape = shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Paint getPaint(Graphics2D graphics, PaintStyle paint) {
|
||||||
|
if (paint instanceof SolidPaint) {
|
||||||
|
return getSolidPaint((SolidPaint)paint, graphics);
|
||||||
|
} else if (paint instanceof GradientPaint) {
|
||||||
|
return getGradientPaint((GradientPaint)paint, graphics);
|
||||||
|
} else if (paint instanceof TexturePaint) {
|
||||||
|
return getTexturePaint((TexturePaint)paint, graphics);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Paint getSolidPaint(SolidPaint fill, Graphics2D graphics) {
|
||||||
|
return applyColorTransform(fill.getSolidColor());
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Paint getGradientPaint(GradientPaint fill, Graphics2D graphics) {
|
||||||
|
switch (fill.getGradientType()) {
|
||||||
|
case linear:
|
||||||
|
return createLinearGradientPaint(fill, graphics);
|
||||||
|
case circular:
|
||||||
|
return createRadialGradientPaint(fill, graphics);
|
||||||
|
case shape:
|
||||||
|
return createPathGradientPaint(fill, graphics);
|
||||||
|
default:
|
||||||
|
throw new UnsupportedOperationException("gradient fill of type "+fill+" not supported.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Paint getTexturePaint(TexturePaint fill, Graphics2D graphics) {
|
||||||
|
InputStream is = fill.getImageData();
|
||||||
|
if (is == null) return NO_PAINT;
|
||||||
|
assert(graphics != null);
|
||||||
|
|
||||||
|
ImageRenderer renderer = (ImageRenderer)graphics.getRenderingHint(Drawable.IMAGE_RENDERER);
|
||||||
|
if (renderer == null) renderer = new ImageRenderer();
|
||||||
|
|
||||||
|
try {
|
||||||
|
renderer.loadImage(fill.getImageData(), fill.getContentType());
|
||||||
|
} catch (IOException e) {
|
||||||
|
LOG.log(POILogger.ERROR, "Can't load image data - using transparent color", e);
|
||||||
|
return NO_PAINT;
|
||||||
|
}
|
||||||
|
|
||||||
|
int alpha = fill.getAlpha();
|
||||||
|
if (alpha != -1) {
|
||||||
|
renderer.setAlpha(fill.getAlpha()/100000.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
Dimension dim = renderer.getDimension();
|
||||||
|
Rectangle2D textAnchor = new Rectangle2D.Double(0, 0, dim.getWidth(), dim.getHeight());
|
||||||
|
Paint paint = new java.awt.TexturePaint(renderer.getImage(), textAnchor);
|
||||||
|
|
||||||
|
return paint;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert color transformations in {@link ColorStyle} to a {@link Color} instance
|
||||||
|
*/
|
||||||
|
public static Color applyColorTransform(ColorStyle color){
|
||||||
|
Color result = color.getColor();
|
||||||
|
|
||||||
|
if (result == null || color.getAlpha() == 100) return NO_PAINT;
|
||||||
|
|
||||||
|
result = applyAlpha(result, color);
|
||||||
|
result = applyLuminanace(result, color);
|
||||||
|
result = applyShade(result, color);
|
||||||
|
result = applyTint(result, color);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static Color applyAlpha(Color c, ColorStyle fc) {
|
||||||
|
int alpha = c.getAlpha();
|
||||||
|
return (alpha == 0 || alpha == -1) ? c : new Color(c.getRed(), c.getGreen(), c.getBlue(), alpha);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply lumMod / lumOff adjustments
|
||||||
|
*
|
||||||
|
* @param c the color to modify
|
||||||
|
* @param lumMod luminance modulation in the range [0..100000]
|
||||||
|
* @param lumOff luminance offset in the range [0..100000]
|
||||||
|
* @return modified color
|
||||||
|
*/
|
||||||
|
protected static Color applyLuminanace(Color c, ColorStyle fc) {
|
||||||
|
int lumMod = fc.getLumMod();
|
||||||
|
if (lumMod == -1) lumMod = 100000;
|
||||||
|
|
||||||
|
int lumOff = fc.getLumOff();
|
||||||
|
if (lumOff == -1) lumOff = 0;
|
||||||
|
|
||||||
|
if (lumMod == 100000 && lumOff == 0) return c;
|
||||||
|
|
||||||
|
int r = c.getRed();
|
||||||
|
int g = c.getGreen();
|
||||||
|
int b = c.getBlue();
|
||||||
|
|
||||||
|
float red,green,blue;
|
||||||
|
|
||||||
|
Color color;
|
||||||
|
if (lumOff > 0) {
|
||||||
|
float flumOff = lumOff / 100000.f;
|
||||||
|
red = (255.f - r) * (1.f - flumOff) + r;
|
||||||
|
green = (255.f - g) * flumOff + g;
|
||||||
|
blue = (255.f - b) * flumOff + b;
|
||||||
|
} else {
|
||||||
|
float flumMod = lumMod / 100000.f;
|
||||||
|
red = r * lumMod;
|
||||||
|
green = g * lumMod;
|
||||||
|
blue = b * lumMod;
|
||||||
|
}
|
||||||
|
return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This algorithm returns result different from PowerPoint.
|
||||||
|
* TODO: revisit and improve
|
||||||
|
*/
|
||||||
|
protected static Color applyShade(Color c, ColorStyle fc) {
|
||||||
|
int shade = fc.getShade();
|
||||||
|
if (shade == -1) return c;
|
||||||
|
|
||||||
|
float fshade = shade / 100000.f;
|
||||||
|
|
||||||
|
float red = c.getRed() * fshade;
|
||||||
|
float green = c.getGreen() * fshade;
|
||||||
|
float blue = c.getGreen() * fshade;
|
||||||
|
|
||||||
|
return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* This algorithm returns result different from PowerPoint.
|
||||||
|
* TODO: revisit and improve
|
||||||
|
*/
|
||||||
|
protected static Color applyTint(Color c, ColorStyle fc) {
|
||||||
|
int tint = fc.getTint();
|
||||||
|
if (tint == -1) return c;
|
||||||
|
|
||||||
|
float ftint = tint / 100000.f;
|
||||||
|
|
||||||
|
float red = ftint * c.getRed() + (1.f - ftint) * 255.f;
|
||||||
|
float green = ftint * c.getGreen() + (1.f - ftint) * 255.f;
|
||||||
|
float blue = ftint * c.getBlue() + (1.f - ftint) * 255.f;
|
||||||
|
|
||||||
|
return new Color(Math.round(red), Math.round(green), Math.round(blue), c.getAlpha());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected Paint createLinearGradientPaint(GradientPaint fill, Graphics2D graphics) {
|
||||||
|
double angle = fill.getGradientAngle();
|
||||||
|
Rectangle2D anchor = DrawShape.getAnchor(graphics, shape);
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
float[] fractions = fill.getGradientFractions();
|
||||||
|
Color[] colors = new Color[fractions.length];
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (ColorStyle fc : fill.getGradientColors()) {
|
||||||
|
colors[i++] = applyColorTransform(fc);
|
||||||
|
}
|
||||||
|
|
||||||
|
AffineTransform grAt = new AffineTransform();
|
||||||
|
if(fill.isRotatedWithShape()) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return new LinearGradientPaint
|
||||||
|
(p1, p2, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, grAt);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Paint createRadialGradientPaint(GradientPaint fill, Graphics2D graphics) {
|
||||||
|
Rectangle2D anchor = DrawShape.getAnchor(graphics, shape);
|
||||||
|
|
||||||
|
Point2D pCenter = new Point2D.Double(anchor.getX() + anchor.getWidth()/2,
|
||||||
|
anchor.getY() + anchor.getHeight()/2);
|
||||||
|
|
||||||
|
float radius = (float)Math.max(anchor.getWidth(), anchor.getHeight());
|
||||||
|
|
||||||
|
float[] fractions = fill.getGradientFractions();
|
||||||
|
Color[] colors = new Color[fractions.length];
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
for (ColorStyle fc : fill.getGradientColors()) {
|
||||||
|
colors[i++] = applyColorTransform(fc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new RadialGradientPaint(pCenter, radius, fractions, colors);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Paint createPathGradientPaint(GradientPaint fill, Graphics2D graphics) {
|
||||||
|
// currently we ignore an eventually center setting
|
||||||
|
|
||||||
|
float[] fractions = fill.getGradientFractions();
|
||||||
|
Color[] colors = new Color[fractions.length];
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
for (ColorStyle fc : fill.getGradientColors()) {
|
||||||
|
colors[i++] = applyColorTransform(fc);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PathGradientPaint(colors, fractions);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected 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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class PathGradientPaint implements Paint {
|
||||||
|
|
||||||
|
// http://asserttrue.blogspot.de/2010/01/how-to-iimplement-custom-paint-in-50.html
|
||||||
|
protected final Color colors[];
|
||||||
|
protected final float fractions[];
|
||||||
|
protected final int capStyle;
|
||||||
|
protected final int joinStyle;
|
||||||
|
protected final int transparency;
|
||||||
|
|
||||||
|
|
||||||
|
public PathGradientPaint(Color colors[], float fractions[]) {
|
||||||
|
this(colors,fractions,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND);
|
||||||
|
}
|
||||||
|
|
||||||
|
public PathGradientPaint(Color colors[], float fractions[], int capStyle, int joinStyle) {
|
||||||
|
this.colors = colors;
|
||||||
|
this.fractions = fractions;
|
||||||
|
this.capStyle = capStyle;
|
||||||
|
this.joinStyle = joinStyle;
|
||||||
|
|
||||||
|
// determine transparency
|
||||||
|
boolean opaque = true;
|
||||||
|
for (int i = 0; i < colors.length; i++){
|
||||||
|
opaque = opaque && (colors[i].getAlpha() == 0xff);
|
||||||
|
}
|
||||||
|
this.transparency = opaque ? OPAQUE : TRANSLUCENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
public PaintContext createContext(ColorModel cm,
|
||||||
|
Rectangle deviceBounds,
|
||||||
|
Rectangle2D userBounds,
|
||||||
|
AffineTransform transform,
|
||||||
|
RenderingHints hints) {
|
||||||
|
return new PathGradientContext(cm, deviceBounds, userBounds, transform, hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getTransparency() {
|
||||||
|
return transparency;
|
||||||
|
}
|
||||||
|
|
||||||
|
class PathGradientContext implements PaintContext {
|
||||||
|
protected final Rectangle deviceBounds;
|
||||||
|
protected final Rectangle2D userBounds;
|
||||||
|
protected final AffineTransform xform;
|
||||||
|
protected final RenderingHints hints;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* for POI: the shape will be only known when the subclasses determines the concrete implementation
|
||||||
|
* in the draw/-content method, so we need to postpone the setting/creation as long as possible
|
||||||
|
**/
|
||||||
|
protected final Shape shape;
|
||||||
|
protected final PaintContext pCtx;
|
||||||
|
protected final int gradientSteps;
|
||||||
|
WritableRaster raster;
|
||||||
|
|
||||||
|
public PathGradientContext(
|
||||||
|
ColorModel cm
|
||||||
|
, Rectangle deviceBounds
|
||||||
|
, Rectangle2D userBounds
|
||||||
|
, AffineTransform xform
|
||||||
|
, RenderingHints hints
|
||||||
|
) {
|
||||||
|
shape = (Shape)hints.get(Drawable.GRADIENT_SHAPE);
|
||||||
|
if (shape == null) {
|
||||||
|
throw new IllegalPathStateException("PathGradientPaint needs a shape to be set via the rendering hint PathGradientPaint.GRADIANT_SHAPE.");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.deviceBounds = deviceBounds;
|
||||||
|
this.userBounds = userBounds;
|
||||||
|
this.xform = xform;
|
||||||
|
this.hints = hints;
|
||||||
|
|
||||||
|
gradientSteps = getGradientSteps(shape);
|
||||||
|
|
||||||
|
Point2D start = new Point2D.Double(0, 0);
|
||||||
|
Point2D end = new Point2D.Double(gradientSteps, 0);
|
||||||
|
LinearGradientPaint gradientPaint = new LinearGradientPaint(start, end, fractions, colors, CycleMethod.NO_CYCLE, ColorSpaceType.SRGB, new AffineTransform());
|
||||||
|
|
||||||
|
Rectangle bounds = new Rectangle(0, 0, gradientSteps, 1);
|
||||||
|
pCtx = gradientPaint.createContext(cm, bounds, bounds, new AffineTransform(), hints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void dispose() {}
|
||||||
|
|
||||||
|
public ColorModel getColorModel() {
|
||||||
|
return pCtx.getColorModel();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Raster getRaster(int xOffset, int yOffset, int w, int h) {
|
||||||
|
ColorModel cm = getColorModel();
|
||||||
|
if (raster == null) createRaster();
|
||||||
|
|
||||||
|
// TODO: eventually use caching here
|
||||||
|
WritableRaster childRaster = cm.createCompatibleWritableRaster(w, h);
|
||||||
|
Rectangle2D childRect = new Rectangle2D.Double(xOffset, yOffset, w, h);
|
||||||
|
if (!childRect.intersects(deviceBounds)) {
|
||||||
|
// usually doesn't happen ...
|
||||||
|
return childRaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle2D destRect = new Rectangle2D.Double();
|
||||||
|
Rectangle2D.intersect(childRect, deviceBounds, destRect);
|
||||||
|
int dx = (int)(destRect.getX()-deviceBounds.getX());
|
||||||
|
int dy = (int)(destRect.getY()-deviceBounds.getY());
|
||||||
|
int dw = (int)destRect.getWidth();
|
||||||
|
int dh = (int)destRect.getHeight();
|
||||||
|
Object data = raster.getDataElements(dx, dy, dw, dh, null);
|
||||||
|
dx = (int)(destRect.getX()-childRect.getX());
|
||||||
|
dy = (int)(destRect.getY()-childRect.getY());
|
||||||
|
childRaster.setDataElements(dx, dy, dw, dh, data);
|
||||||
|
|
||||||
|
return childRaster;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected int getGradientSteps(Shape shape) {
|
||||||
|
Rectangle rect = shape.getBounds();
|
||||||
|
int lower = 1;
|
||||||
|
int upper = (int)(Math.max(rect.getWidth(),rect.getHeight())/2.0);
|
||||||
|
while (lower < upper-1) {
|
||||||
|
int mid = lower + (upper - lower) / 2;
|
||||||
|
BasicStroke bs = new BasicStroke(mid, capStyle, joinStyle);
|
||||||
|
Area area = new Area(bs.createStrokedShape(shape));
|
||||||
|
if (area.isSingular()) {
|
||||||
|
upper = mid;
|
||||||
|
} else {
|
||||||
|
lower = mid;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return upper;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
protected void createRaster() {
|
||||||
|
ColorModel cm = getColorModel();
|
||||||
|
raster = cm.createCompatibleWritableRaster((int)deviceBounds.getWidth(), (int)deviceBounds.getHeight());
|
||||||
|
BufferedImage img = new BufferedImage(cm, raster, false, null);
|
||||||
|
Graphics2D graphics = img.createGraphics();
|
||||||
|
graphics.setRenderingHints(hints);
|
||||||
|
graphics.translate(-deviceBounds.getX(), -deviceBounds.getY());
|
||||||
|
graphics.transform(xform);
|
||||||
|
|
||||||
|
Raster img2 = pCtx.getRaster(0, 0, gradientSteps, 1);
|
||||||
|
int rgb[] = new int[cm.getNumComponents()];
|
||||||
|
|
||||||
|
for (int i = gradientSteps-1; i>=0; i--) {
|
||||||
|
img2.getPixel(i, 0, rgb);
|
||||||
|
Color c = new Color(rgb[0],rgb[1],rgb[2]);
|
||||||
|
if (rgb.length == 4) {
|
||||||
|
// it doesn't work to use just a color with transparency ...
|
||||||
|
graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC, rgb[3]/255.0f));
|
||||||
|
}
|
||||||
|
graphics.setStroke(new BasicStroke(i+1, capStyle, joinStyle));
|
||||||
|
graphics.setColor(c);
|
||||||
|
graphics.draw(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics.dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
109
src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java
Normal file
109
src/scratchpad/src/org/apache/poi/sl/draw/DrawShape.java
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
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.PlaceableShape;
|
||||||
|
import org.apache.poi.sl.usermodel.Shape;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawShape<T extends Shape> implements Drawable {
|
||||||
|
|
||||||
|
protected final T shape;
|
||||||
|
|
||||||
|
public DrawShape(T shape) {
|
||||||
|
this.shape = shape;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply 2-D transforms before drawing this shape. This includes rotation and flipping.
|
||||||
|
*
|
||||||
|
* @param graphics the graphics whos transform matrix will be modified
|
||||||
|
*/
|
||||||
|
public void applyTransform(Graphics2D graphics) {
|
||||||
|
Rectangle2D anchor = shape.getAnchor();
|
||||||
|
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
|
||||||
|
if(tx != null) {
|
||||||
|
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
||||||
|
}
|
||||||
|
|
||||||
|
// rotation
|
||||||
|
double rotation = shape.getRotation();
|
||||||
|
if (rotation != 0.) {
|
||||||
|
// PowerPoint rotates shapes relative to the geometric center
|
||||||
|
double centerX = anchor.getCenterX();
|
||||||
|
double centerY = anchor.getCenterY();
|
||||||
|
|
||||||
|
// normalize rotation
|
||||||
|
rotation = (360.+(rotation%360.))%360.;
|
||||||
|
int quadrant = (((int)rotation+45)/90)%4;
|
||||||
|
double scaleX = 1.0, scaleY = 1.0;
|
||||||
|
|
||||||
|
// scale to bounding box (bug #53176)
|
||||||
|
if (quadrant == 1 || quadrant == 3) {
|
||||||
|
// In quadrant 1 and 3, which is basically a shape in a more or less portrait orientation
|
||||||
|
// (45-135 degrees and 225-315 degrees), we need to first rotate the shape by a multiple
|
||||||
|
// of 90 degrees and then resize the bounding box to its original bbox. After that we can
|
||||||
|
// rotate the shape to the exact rotation amount.
|
||||||
|
// It's strange that you'll need to rotate the shape back and forth again, but you can
|
||||||
|
// think of it, as if you paint the shape on a canvas. First you rotate the canvas, which might
|
||||||
|
// be already (differently) scaled, so you can paint the shape in its default orientation
|
||||||
|
// and later on, turn it around again to compare it with its original size ...
|
||||||
|
AffineTransform txg = new AffineTransform(); // graphics coordinate space
|
||||||
|
AffineTransform txs = new AffineTransform(tx); // shape coordinate space
|
||||||
|
txg.translate(centerX, centerY);
|
||||||
|
txg.rotate(Math.toRadians(quadrant*90));
|
||||||
|
txg.translate(-centerX, -centerY);
|
||||||
|
txs.translate(centerX, centerY);
|
||||||
|
txs.rotate(Math.toRadians(-quadrant*90));
|
||||||
|
txs.translate(-centerX, -centerY);
|
||||||
|
txg.concatenate(txs);
|
||||||
|
Rectangle2D anchor2 = txg.createTransformedShape(shape.getAnchor()).getBounds2D();
|
||||||
|
scaleX = anchor.getWidth() == 0. ? 1.0 : anchor.getWidth() / anchor2.getWidth();
|
||||||
|
scaleY = anchor.getHeight() == 0. ? 1.0 : anchor.getHeight() / anchor2.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
// transformation is applied reversed ...
|
||||||
|
graphics.translate(centerX, centerY);
|
||||||
|
graphics.rotate(Math.toRadians(rotation-quadrant*90.));
|
||||||
|
graphics.scale(scaleX, scaleY);
|
||||||
|
graphics.rotate(Math.toRadians(quadrant*90));
|
||||||
|
graphics.translate(-centerX, -centerY);
|
||||||
|
}
|
||||||
|
|
||||||
|
//flip horizontal
|
||||||
|
if (shape.getFlipHorizontal()) {
|
||||||
|
graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
|
||||||
|
graphics.scale(-1, 1);
|
||||||
|
graphics.translate(-anchor.getX(), -anchor.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
//flip vertical
|
||||||
|
if (shape.getFlipVertical()) {
|
||||||
|
graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
|
||||||
|
graphics.scale(1, -1);
|
||||||
|
graphics.translate(-anchor.getX(), -anchor.getY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawContent(Graphics2D context) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Rectangle2D getAnchor(Graphics2D graphics, PlaceableShape shape) {
|
||||||
|
Rectangle2D anchor = shape.getAnchor();
|
||||||
|
if(graphics == null) {
|
||||||
|
return anchor;
|
||||||
|
}
|
||||||
|
|
||||||
|
AffineTransform tx = (AffineTransform)graphics.getRenderingHint(Drawable.GROUP_TRANSFORM);
|
||||||
|
if(tx != null) {
|
||||||
|
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
||||||
|
}
|
||||||
|
return anchor;
|
||||||
|
}
|
||||||
|
}
|
72
src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java
Normal file
72
src/scratchpad/src/org/apache/poi/sl/draw/DrawSheet.java
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||||
|
import org.apache.poi.sl.usermodel.Shape;
|
||||||
|
import org.apache.poi.sl.usermodel.Sheet;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawSheet implements Drawable {
|
||||||
|
|
||||||
|
protected final Sheet sheet;
|
||||||
|
|
||||||
|
public DrawSheet(Sheet sheet) {
|
||||||
|
this.sheet = sheet;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyTransform(Graphics2D context) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics) {
|
||||||
|
DrawFactory drawFact = DrawFactory.getInstance(graphics);
|
||||||
|
MasterSheet master = sheet.getMasterSheet();
|
||||||
|
|
||||||
|
if(sheet.getFollowMasterGraphics() && master != null) {
|
||||||
|
Drawable drawer = drawFact.getDrawable(master);
|
||||||
|
drawer.draw(graphics);
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics.setRenderingHint(Drawable.GROUP_TRANSFORM, new AffineTransform());
|
||||||
|
|
||||||
|
for (Shape shape : sheet.getShapes()) {
|
||||||
|
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(Drawable.GSAVE, true);
|
||||||
|
|
||||||
|
// apply rotation and flipping
|
||||||
|
Drawable drawer = drawFact.getDrawable(shape);
|
||||||
|
drawer.applyTransform(graphics);
|
||||||
|
// draw stuff
|
||||||
|
drawer.draw(graphics);
|
||||||
|
|
||||||
|
// restore the coordinate system
|
||||||
|
graphics.setTransform(at);
|
||||||
|
|
||||||
|
graphics.setRenderingHint(Drawable.GRESTORE, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawContent(Graphics2D context) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if this <code>sheet</code> displays the specified shape.
|
||||||
|
*
|
||||||
|
* Subclasses can override it and skip certain shapes from drawings,
|
||||||
|
* for instance, slide masters and layouts don't display placeholders
|
||||||
|
*/
|
||||||
|
protected boolean canDraw(Shape shape){
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
391
src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java
Normal file
391
src/scratchpad/src/org/apache/poi/sl/draw/DrawSimpleShape.java
Normal file
@ -0,0 +1,391 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.geom.*;
|
||||||
|
import java.io.*;
|
||||||
|
import java.nio.charset.Charset;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.xml.bind.*;
|
||||||
|
import javax.xml.stream.*;
|
||||||
|
import javax.xml.stream.EventFilter;
|
||||||
|
import javax.xml.stream.events.StartElement;
|
||||||
|
import javax.xml.stream.events.XMLEvent;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.draw.binding.CTCustomGeometry2D;
|
||||||
|
import org.apache.poi.sl.draw.geom.*;
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
import org.apache.poi.sl.usermodel.LineDecoration.DecorationSize;
|
||||||
|
import org.apache.poi.sl.usermodel.StrokeStyle.LineDash;
|
||||||
|
import org.apache.poi.util.Units;
|
||||||
|
|
||||||
|
|
||||||
|
public class DrawSimpleShape<T extends SimpleShape> extends DrawShape<T> {
|
||||||
|
|
||||||
|
public DrawSimpleShape(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(Graphics2D graphics) {
|
||||||
|
// RenderableShape rShape = new RenderableShape(this);
|
||||||
|
// rShape.render(graphics);
|
||||||
|
|
||||||
|
DrawPaint drawPaint = DrawFactory.getInstance(graphics).getPaint(shape);
|
||||||
|
Paint fill = drawPaint.getPaint(graphics, shape.getFillStyle().getPaint());
|
||||||
|
Paint line = drawPaint.getPaint(graphics, shape.getStrokeStyle().getPaint());
|
||||||
|
BasicStroke stroke = getStroke(); // the stroke applies both to the shadow and the shape
|
||||||
|
graphics.setStroke(stroke);
|
||||||
|
|
||||||
|
Collection<Outline> elems = computeOutlines(graphics);
|
||||||
|
|
||||||
|
// first paint the shadow
|
||||||
|
drawShadow(graphics, elems, fill, line);
|
||||||
|
|
||||||
|
// then fill the shape interior
|
||||||
|
if (fill != null) {
|
||||||
|
graphics.setPaint(fill);
|
||||||
|
for (Outline o : elems) {
|
||||||
|
if (o.getPath().isFilled()){
|
||||||
|
java.awt.Shape s = o.getOutline();
|
||||||
|
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
||||||
|
graphics.fill(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// then draw any content within this shape (text, image, etc.)
|
||||||
|
drawContent(graphics);
|
||||||
|
|
||||||
|
// then stroke the shape outline
|
||||||
|
if(line != null) {
|
||||||
|
graphics.setPaint(line);
|
||||||
|
for(Outline o : elems){
|
||||||
|
if(o.getPath().isStroked()){
|
||||||
|
java.awt.Shape s = o.getOutline();
|
||||||
|
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
||||||
|
graphics.draw(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// draw line decorations
|
||||||
|
drawDecoration(graphics, line, stroke);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void drawDecoration(Graphics2D graphics, Paint line, BasicStroke stroke) {
|
||||||
|
if(line == null) return;
|
||||||
|
graphics.setPaint(line);
|
||||||
|
|
||||||
|
List<Outline> lst = new ArrayList<Outline>();
|
||||||
|
LineDecoration deco = shape.getLineDecoration();
|
||||||
|
Outline head = getHeadDecoration(graphics, deco, stroke);
|
||||||
|
if (head != null) lst.add(head);
|
||||||
|
Outline tail = getTailDecoration(graphics, deco, stroke);
|
||||||
|
if (tail != null) lst.add(tail);
|
||||||
|
|
||||||
|
|
||||||
|
for(Outline o : lst){
|
||||||
|
java.awt.Shape s = o.getOutline();
|
||||||
|
Path p = o.getPath();
|
||||||
|
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
||||||
|
|
||||||
|
if(p.isFilled()) graphics.fill(s);
|
||||||
|
if(p.isStroked()) graphics.draw(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Outline getTailDecoration(Graphics2D graphics, LineDecoration deco, BasicStroke stroke) {
|
||||||
|
DecorationSize tailLength = deco.getTailLength();
|
||||||
|
DecorationSize tailWidth = deco.getTailWidth();
|
||||||
|
|
||||||
|
double lineWidth = Math.max(2.5, stroke.getLineWidth());
|
||||||
|
|
||||||
|
Rectangle2D anchor = getAnchor(graphics, shape);
|
||||||
|
double x2 = anchor.getX() + anchor.getWidth(),
|
||||||
|
y2 = anchor.getY() + anchor.getHeight();
|
||||||
|
|
||||||
|
double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
|
||||||
|
|
||||||
|
AffineTransform at = new AffineTransform();
|
||||||
|
java.awt.Shape shape = null;
|
||||||
|
Path p = null;
|
||||||
|
Rectangle2D bounds;
|
||||||
|
double scaleY = Math.pow(2, tailWidth.ordinal());
|
||||||
|
double scaleX = Math.pow(2, tailLength.ordinal());
|
||||||
|
switch (deco.getTailShape()) {
|
||||||
|
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, LineDecoration deco, BasicStroke stroke) {
|
||||||
|
DecorationSize headLength = deco.getHeadLength();
|
||||||
|
DecorationSize headWidth = deco.getHeadWidth();
|
||||||
|
|
||||||
|
double lineWidth = Math.max(2.5, stroke.getLineWidth());
|
||||||
|
|
||||||
|
Rectangle2D anchor = getAnchor(graphics, shape);
|
||||||
|
double x1 = anchor.getX(),
|
||||||
|
y1 = anchor.getY();
|
||||||
|
|
||||||
|
double alpha = Math.atan(anchor.getHeight() / anchor.getWidth());
|
||||||
|
|
||||||
|
AffineTransform at = new AffineTransform();
|
||||||
|
java.awt.Shape shape = null;
|
||||||
|
Path p = null;
|
||||||
|
Rectangle2D bounds;
|
||||||
|
double scaleY = 1;
|
||||||
|
double scaleX = 1;
|
||||||
|
switch (deco.getHeadShape()) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
public BasicStroke getStroke() {
|
||||||
|
StrokeStyle strokeStyle = shape.getStrokeStyle();
|
||||||
|
|
||||||
|
float lineWidth = (float) strokeStyle.getLineWidth();
|
||||||
|
if (lineWidth == 0.0f) lineWidth = 0.25f; // Both PowerPoint and OOo draw zero-length lines as 0.25pt
|
||||||
|
|
||||||
|
LineDash lineDash = strokeStyle.getLineDash();
|
||||||
|
int dashPatI[] = lineDash.pattern;
|
||||||
|
float[] dashPatF = new float[dashPatI.length];
|
||||||
|
final float dash_phase = 0;
|
||||||
|
for (int i=0; i<dashPatI.length; i++) {
|
||||||
|
dashPatF[i] = dashPatI[i]*lineWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lineCap;
|
||||||
|
switch (strokeStyle.getLineCap()) {
|
||||||
|
case ROUND:
|
||||||
|
lineCap = BasicStroke.CAP_ROUND;
|
||||||
|
break;
|
||||||
|
case SQUARE:
|
||||||
|
lineCap = BasicStroke.CAP_SQUARE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case FLAT:
|
||||||
|
lineCap = BasicStroke.CAP_BUTT;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int lineJoin = BasicStroke.JOIN_ROUND;
|
||||||
|
|
||||||
|
return new BasicStroke(lineWidth, lineCap, lineJoin, Math.max(1, lineWidth), dashPatF, dash_phase);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected void drawShadow(
|
||||||
|
Graphics2D graphics
|
||||||
|
, Collection<Outline> outlines
|
||||||
|
, Paint fill
|
||||||
|
, Paint line
|
||||||
|
) {
|
||||||
|
Shadow shadow = shape.getShadow();
|
||||||
|
if (shadow == null || (fill == null && line == null)) return;
|
||||||
|
|
||||||
|
double shapeRotation = shape.getRotation();
|
||||||
|
if(shape.getFlipVertical()) {
|
||||||
|
shapeRotation += 180;
|
||||||
|
}
|
||||||
|
double angle = shadow.getAngle() - shapeRotation;
|
||||||
|
double dist = shadow.getDistance();
|
||||||
|
double dx = dist * Math.cos(Math.toRadians(angle));
|
||||||
|
double dy = dist * Math.sin(Math.toRadians(angle));
|
||||||
|
|
||||||
|
graphics.translate(dx, dy);
|
||||||
|
|
||||||
|
for(Outline o : outlines){
|
||||||
|
java.awt.Shape s = o.getOutline();
|
||||||
|
Path p = o.getPath();
|
||||||
|
graphics.setRenderingHint(Drawable.GRADIENT_SHAPE, s);
|
||||||
|
|
||||||
|
if(fill != null && p.isFilled()){
|
||||||
|
graphics.setPaint(fill);
|
||||||
|
graphics.fill(s);
|
||||||
|
} else if (line != null && p.isStroked()) {
|
||||||
|
graphics.setPaint(line);
|
||||||
|
graphics.draw(s);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
graphics.translate(-dx, -dy);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static CustomGeometry getCustomGeometry(String name) {
|
||||||
|
return getCustomGeometry(name, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static CustomGeometry getCustomGeometry(String name, Graphics2D graphics) {
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String, CustomGeometry> presets = (graphics == null)
|
||||||
|
? null
|
||||||
|
: (Map<String, CustomGeometry>)graphics.getRenderingHint(Drawable.PRESET_GEOMETRY_CACHE);
|
||||||
|
|
||||||
|
if (presets == null) {
|
||||||
|
presets = new HashMap<String,CustomGeometry>();
|
||||||
|
if (graphics != null) {
|
||||||
|
graphics.setRenderingHint(Drawable.PRESET_GEOMETRY_CACHE, presets);
|
||||||
|
}
|
||||||
|
|
||||||
|
String packageName = "org.apache.poi.sl.draw.binding";
|
||||||
|
InputStream presetIS = Drawable.class.getResourceAsStream("presetShapeDefinitions.xml");
|
||||||
|
Reader xml = new InputStreamReader( presetIS, Charset.forName("UTF-8") );
|
||||||
|
|
||||||
|
// StAX:
|
||||||
|
EventFilter startElementFilter = new EventFilter() {
|
||||||
|
@Override
|
||||||
|
public boolean accept(XMLEvent event) {
|
||||||
|
return event.isStartElement();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
XMLInputFactory staxFactory = XMLInputFactory.newInstance();
|
||||||
|
XMLEventReader staxReader = staxFactory.createXMLEventReader(xml);
|
||||||
|
XMLEventReader staxFiltRd = staxFactory.createFilteredReader(staxReader, startElementFilter);
|
||||||
|
// Ignore StartElement:
|
||||||
|
staxFiltRd.nextEvent();
|
||||||
|
// JAXB:
|
||||||
|
JAXBContext jaxbContext = JAXBContext.newInstance(packageName);
|
||||||
|
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
|
||||||
|
|
||||||
|
while (staxFiltRd.peek() != null) {
|
||||||
|
StartElement evRoot = (StartElement)staxFiltRd.peek();
|
||||||
|
String cusName = evRoot.getName().getLocalPart();
|
||||||
|
// XMLEvent ev = staxReader.nextEvent();
|
||||||
|
JAXBElement<org.apache.poi.sl.draw.binding.CTCustomGeometry2D> el = unmarshaller.unmarshal(staxReader, CTCustomGeometry2D.class);
|
||||||
|
CTCustomGeometry2D cusGeom = el.getValue();
|
||||||
|
|
||||||
|
presets.put(cusName, new CustomGeometry(cusGeom));
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("Unable to load preset geometries.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return presets.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Collection<Outline> computeOutlines(Graphics2D graphics) {
|
||||||
|
|
||||||
|
List<Outline> lst = new ArrayList<Outline>();
|
||||||
|
CustomGeometry geom = shape.getGeometry();
|
||||||
|
if(geom == null) {
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle2D anchor = getAnchor(graphics, shape);
|
||||||
|
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, shape);
|
||||||
|
|
||||||
|
java.awt.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);
|
||||||
|
|
||||||
|
java.awt.Shape canvasShape = at.createTransformedShape(gp);
|
||||||
|
|
||||||
|
lst.add(new Outline(canvasShape, p));
|
||||||
|
}
|
||||||
|
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
public class DrawTextBox<T extends TextBox> extends DrawAutoShape<T> {
|
||||||
|
public DrawTextBox(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,94 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.font.TextLayout;
|
||||||
|
import java.text.*;
|
||||||
|
|
||||||
|
import org.apache.poi.xslf.usermodel.XSLFRenderingHint;
|
||||||
|
|
||||||
|
public class DrawTextFragment implements Drawable {
|
||||||
|
final TextLayout layout;
|
||||||
|
final AttributedString str;
|
||||||
|
double x, y;
|
||||||
|
|
||||||
|
public DrawTextFragment(TextLayout layout, AttributedString str) {
|
||||||
|
this.layout = layout;
|
||||||
|
this.str = str;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPosition(double x, double y) {
|
||||||
|
// TODO: replace it, by applyTransform????
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics){
|
||||||
|
if(str == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
double yBaseline = y + layout.getAscent();
|
||||||
|
|
||||||
|
Integer textMode = (Integer)graphics.getRenderingHint(XSLFRenderingHint.TEXT_RENDERING_MODE);
|
||||||
|
if(textMode != null && textMode == XSLFRenderingHint.TEXT_AS_SHAPES){
|
||||||
|
layout.draw(graphics, (float)x, (float)yBaseline);
|
||||||
|
} else {
|
||||||
|
graphics.drawString(str.getIterator(), (float)x, (float)yBaseline );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyTransform(Graphics2D graphics) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawContent(Graphics2D graphics) {
|
||||||
|
// TODO Auto-generated method stub
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public TextLayout getLayout() {
|
||||||
|
return layout;
|
||||||
|
}
|
||||||
|
|
||||||
|
public AttributedString getAttributedString() {
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return full height of this text run which is sum of ascent, descent and leading
|
||||||
|
*/
|
||||||
|
public float getHeight(){
|
||||||
|
double h = Math.ceil(layout.getAscent()) + Math.ceil(layout.getDescent()) + layout.getLeading();
|
||||||
|
return (float)h;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return width if this text run
|
||||||
|
*/
|
||||||
|
public float getWidth(){
|
||||||
|
return layout.getAdvance();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the string to be painted
|
||||||
|
*/
|
||||||
|
public String getString(){
|
||||||
|
if (str == null) return "";
|
||||||
|
|
||||||
|
AttributedCharacterIterator it = str.getIterator();
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
for (char c = it.first(); c != CharacterIterator.DONE; c = it.next()) {
|
||||||
|
buf.append(c);
|
||||||
|
}
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString(){
|
||||||
|
return "[" + getClass().getSimpleName() + "] " + getString();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
381
src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java
Normal file
381
src/scratchpad/src/org/apache/poi/sl/draw/DrawTextParagraph.java
Normal file
@ -0,0 +1,381 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.font.*;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.text.*;
|
||||||
|
import java.text.AttributedCharacterIterator.Attribute;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
import org.apache.poi.sl.usermodel.TextParagraph.BulletStyle;
|
||||||
|
import org.apache.poi.sl.usermodel.TextRun.TextCap;
|
||||||
|
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign;
|
||||||
|
|
||||||
|
public class DrawTextParagraph implements Drawable {
|
||||||
|
protected TextParagraph paragraph;
|
||||||
|
double x, y;
|
||||||
|
protected Insets2D insets = new Insets2D(0,0,0,0);
|
||||||
|
protected List<DrawTextFragment> lines = new ArrayList<DrawTextFragment>();
|
||||||
|
protected String rawText;
|
||||||
|
protected DrawTextFragment bullet;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* the highest line in this paragraph. Used for line spacing.
|
||||||
|
*/
|
||||||
|
protected double maxLineHeight;
|
||||||
|
|
||||||
|
public DrawTextParagraph(TextParagraph paragraph) {
|
||||||
|
this.paragraph = paragraph;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Insets2D getInsets() {
|
||||||
|
return insets;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setInsets(Insets2D insets) {
|
||||||
|
this.insets.set(insets.top, insets.left, insets.bottom, insets.right);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPosition(double x, double y) {
|
||||||
|
// TODO: replace it, by applyTransform????
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public double getY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void draw(Graphics2D graphics){
|
||||||
|
if (lines.isEmpty()) return;
|
||||||
|
|
||||||
|
double leftInset = insets.left;
|
||||||
|
double rightInset = insets.right;
|
||||||
|
double penY = y;
|
||||||
|
|
||||||
|
double leftMargin = paragraph.getLeftMargin();
|
||||||
|
boolean firstLine = true;
|
||||||
|
double indent = paragraph.getIndent();
|
||||||
|
|
||||||
|
//The vertical line spacing
|
||||||
|
double spacing = paragraph.getLineSpacing();
|
||||||
|
for(DrawTextFragment line : lines){
|
||||||
|
double penX = x + leftMargin;
|
||||||
|
|
||||||
|
if(firstLine) {
|
||||||
|
if (!isEmptyParagraph()) {
|
||||||
|
bullet = getBullet(graphics, line.getAttributedString().getIterator());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(bullet != null){
|
||||||
|
if (indent < 0) {
|
||||||
|
// a negative value means "Hanging" indentation and
|
||||||
|
// indicates the position of the actual bullet character.
|
||||||
|
// (the bullet is shifted to right relative to the text)
|
||||||
|
bullet.setPosition(penX + indent, penY);
|
||||||
|
} else if(indent > 0){
|
||||||
|
// a positive value means the "First Line" indentation:
|
||||||
|
// the first line is indented and other lines start at the bullet ofset
|
||||||
|
bullet.setPosition(penX, penY);
|
||||||
|
penX += indent;
|
||||||
|
} else {
|
||||||
|
// a zero indent means that the bullet and text have the same offset
|
||||||
|
bullet.setPosition(penX, penY);
|
||||||
|
|
||||||
|
// don't let text overlay the bullet and advance by the bullet width
|
||||||
|
penX += bullet.getLayout().getAdvance() + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bullet.draw(graphics);
|
||||||
|
} else {
|
||||||
|
penX += indent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape());
|
||||||
|
|
||||||
|
switch (paragraph.getTextAlign()) {
|
||||||
|
case CENTER:
|
||||||
|
penX += (anchor.getWidth() - leftMargin - line.getWidth() - leftInset - rightInset) / 2;
|
||||||
|
break;
|
||||||
|
case RIGHT:
|
||||||
|
penX += (anchor.getWidth() - line.getWidth() - leftInset - rightInset);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
line.setPosition(penX, penY);
|
||||||
|
line.draw(graphics);
|
||||||
|
|
||||||
|
if(spacing > 0) {
|
||||||
|
// If linespacing >= 0, then linespacing is a percentage of normal line height.
|
||||||
|
penY += spacing*0.01* line.getHeight();
|
||||||
|
} else {
|
||||||
|
// positive value means absolute spacing in points
|
||||||
|
penY += -spacing;
|
||||||
|
}
|
||||||
|
|
||||||
|
firstLine = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
y = penY - y;
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getFirstLineHeight() {
|
||||||
|
return (lines.isEmpty()) ? 0 : lines.get(0).getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public float getLastLineHeight() {
|
||||||
|
return (lines.isEmpty()) ? 0 : lines.get(lines.size()-1).getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isEmptyParagraph() {
|
||||||
|
return (lines.isEmpty() || rawText.trim().isEmpty());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void applyTransform(Graphics2D graphics) {
|
||||||
|
}
|
||||||
|
|
||||||
|
public void drawContent(Graphics2D graphics) {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* break text into lines, each representing a line of text that fits in the wrapping width
|
||||||
|
*
|
||||||
|
* @param graphics
|
||||||
|
*/
|
||||||
|
protected void breakText(Graphics2D graphics){
|
||||||
|
lines.clear();
|
||||||
|
|
||||||
|
DrawFactory fact = DrawFactory.getInstance(graphics);
|
||||||
|
StringBuilder text = new StringBuilder();
|
||||||
|
AttributedString at = getAttributedString(graphics, text);
|
||||||
|
boolean emptyParagraph = ("".equals(text.toString().trim()));
|
||||||
|
|
||||||
|
AttributedCharacterIterator it = at.getIterator();
|
||||||
|
LineBreakMeasurer measurer = new LineBreakMeasurer(it, graphics.getFontRenderContext());
|
||||||
|
for (;;) {
|
||||||
|
int startIndex = measurer.getPosition();
|
||||||
|
|
||||||
|
double wrappingWidth = getWrappingWidth(lines.size() == 0, graphics) + 1; // add a pixel to compensate rounding errors
|
||||||
|
// shape width can be smaller that the sum of insets (this was proved by a test file)
|
||||||
|
if(wrappingWidth < 0) wrappingWidth = 1;
|
||||||
|
|
||||||
|
int nextBreak = text.indexOf("\n", startIndex + 1);
|
||||||
|
if(nextBreak == -1) nextBreak = it.getEndIndex();
|
||||||
|
|
||||||
|
TextLayout layout = measurer.nextLayout((float)wrappingWidth, nextBreak, true);
|
||||||
|
if (layout == null) {
|
||||||
|
// layout can be null if the entire word at the current position
|
||||||
|
// does not fit within the wrapping width. Try with requireNextWord=false.
|
||||||
|
layout = measurer.nextLayout((float)wrappingWidth, nextBreak, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(layout == null) {
|
||||||
|
// exit if can't break any more
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
int endIndex = measurer.getPosition();
|
||||||
|
// skip over new line breaks (we paint 'clear' text runs not starting or ending with \n)
|
||||||
|
if(endIndex < it.getEndIndex() && text.charAt(endIndex) == '\n'){
|
||||||
|
measurer.setPosition(endIndex + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
TextAlign hAlign = paragraph.getTextAlign();
|
||||||
|
if(hAlign == TextAlign.JUSTIFY || hAlign == TextAlign.JUSTIFY_LOW) {
|
||||||
|
layout = layout.getJustifiedLayout((float)wrappingWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
AttributedString str = (emptyParagraph)
|
||||||
|
? null // we will not paint empty paragraphs
|
||||||
|
: new AttributedString(it, startIndex, endIndex);
|
||||||
|
DrawTextFragment line = fact.getTextFragment(layout, str);
|
||||||
|
lines.add(line);
|
||||||
|
|
||||||
|
maxLineHeight = Math.max(maxLineHeight, line.getHeight());
|
||||||
|
|
||||||
|
if(endIndex == it.getEndIndex()) break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rawText = text.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected DrawTextFragment getBullet(Graphics2D graphics, AttributedCharacterIterator firstLineAttr) {
|
||||||
|
BulletStyle bulletStyle = paragraph.getBulletStyle();
|
||||||
|
if (bulletStyle == null) return null;
|
||||||
|
|
||||||
|
String buCharacter = bulletStyle.getBulletCharacter();
|
||||||
|
if (buCharacter == null) return null;
|
||||||
|
|
||||||
|
String buFont = bulletStyle.getBulletFont();
|
||||||
|
if (buFont == null) buFont = paragraph.getDefaultFontFamily();
|
||||||
|
assert(buFont != null);
|
||||||
|
|
||||||
|
Color buColor = bulletStyle.getBulletFontColor();
|
||||||
|
if (buColor == null) buColor = (Color)firstLineAttr.getAttribute(TextAttribute.FOREGROUND);
|
||||||
|
|
||||||
|
float fontSize = (Float)firstLineAttr.getAttribute(TextAttribute.SIZE);
|
||||||
|
float buSz = (float)bulletStyle.getBulletFontSize();
|
||||||
|
if(buSz > 0) fontSize *= buSz* 0.01;
|
||||||
|
else fontSize = -buSz;
|
||||||
|
|
||||||
|
|
||||||
|
AttributedString str = new AttributedString(buCharacter);
|
||||||
|
str.addAttribute(TextAttribute.FOREGROUND, buColor);
|
||||||
|
str.addAttribute(TextAttribute.FAMILY, buFont);
|
||||||
|
str.addAttribute(TextAttribute.SIZE, fontSize);
|
||||||
|
|
||||||
|
TextLayout layout = new TextLayout(str.getIterator(), graphics.getFontRenderContext());
|
||||||
|
DrawFactory fact = DrawFactory.getInstance(graphics);
|
||||||
|
return fact.getTextFragment(layout, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected String getRenderableText(TextRun tr) {
|
||||||
|
StringBuilder buf = new StringBuilder();
|
||||||
|
TextCap cap = tr.getTextCap();
|
||||||
|
for (char c : tr.getText().toCharArray()) {
|
||||||
|
if(c == '\t') {
|
||||||
|
// TODO: finish support for tabs
|
||||||
|
buf.append(" ");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (cap) {
|
||||||
|
case ALL: c = Character.toUpperCase(c); break;
|
||||||
|
case SMALL: c = Character.toLowerCase(c); break;
|
||||||
|
case NONE: break;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf.append(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return buf.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns wrapping width to break lines in this paragraph
|
||||||
|
*
|
||||||
|
* @param firstLine whether the first line is breaking
|
||||||
|
*
|
||||||
|
* @return wrapping width in points
|
||||||
|
*/
|
||||||
|
protected double getWrappingWidth(boolean firstLine, Graphics2D graphics){
|
||||||
|
// internal margins for the text box
|
||||||
|
|
||||||
|
double leftInset = insets.left;
|
||||||
|
double rightInset = insets.right;
|
||||||
|
|
||||||
|
Rectangle2D anchor = DrawShape.getAnchor(graphics, paragraph.getParentShape());
|
||||||
|
|
||||||
|
double leftMargin = paragraph.getLeftMargin();
|
||||||
|
double indent = paragraph.getIndent();
|
||||||
|
|
||||||
|
double width;
|
||||||
|
TextShape ts = paragraph.getParentShape();
|
||||||
|
if (!ts.getWordWrap()) {
|
||||||
|
// if wordWrap == false then we return the advance to the right border of the sheet
|
||||||
|
width = ts.getSheet().getSlideShow().getPageSize().getWidth() - anchor.getX();
|
||||||
|
} else {
|
||||||
|
width = anchor.getWidth() - leftInset - rightInset - leftMargin;
|
||||||
|
if (firstLine) {
|
||||||
|
if (bullet != null){
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class AttributedStringData {
|
||||||
|
Attribute attribute;
|
||||||
|
Object value;
|
||||||
|
int beginIndex, endIndex;
|
||||||
|
AttributedStringData(Attribute attribute, Object value, int beginIndex, int endIndex) {
|
||||||
|
this.attribute = attribute;
|
||||||
|
this.value = value;
|
||||||
|
this.beginIndex = beginIndex;
|
||||||
|
this.endIndex = endIndex;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected AttributedString getAttributedString(Graphics2D graphics, StringBuilder text){
|
||||||
|
List<AttributedStringData> attList = new ArrayList<AttributedStringData>();
|
||||||
|
if (text == null) text = new StringBuilder();
|
||||||
|
|
||||||
|
DrawFontManager fontHandler = (DrawFontManager)graphics.getRenderingHint(Drawable.FONT_HANDLER);
|
||||||
|
|
||||||
|
for (TextRun run : paragraph){
|
||||||
|
String runText = getRenderableText(run);
|
||||||
|
// skip empty runs
|
||||||
|
if (runText.isEmpty()) continue;
|
||||||
|
|
||||||
|
int beginIndex = text.length();
|
||||||
|
text.append(runText);
|
||||||
|
int endIndex = text.length();
|
||||||
|
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.FOREGROUND, run.getFontColor(), beginIndex, endIndex));
|
||||||
|
|
||||||
|
// user can pass an custom object to convert fonts
|
||||||
|
String fontFamily = run.getFontFamily();
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
Map<String,String> fontMap = (Map<String,String>)graphics.getRenderingHint(Drawable.FONT_MAP);
|
||||||
|
if (fontMap != null && fontMap.containsKey(fontFamily)) {
|
||||||
|
fontFamily = fontMap.get(fontFamily);
|
||||||
|
}
|
||||||
|
if(fontHandler != null) {
|
||||||
|
fontFamily = fontHandler.getRendererableFont(fontFamily, run.getPitchAndFamily());
|
||||||
|
}
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.FAMILY, fontFamily, beginIndex, endIndex));
|
||||||
|
|
||||||
|
float fontSz = (float)run.getFontSize();
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, beginIndex, endIndex));
|
||||||
|
|
||||||
|
if(run.isBold()) {
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD, beginIndex, endIndex));
|
||||||
|
}
|
||||||
|
if(run.isItalic()) {
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE, beginIndex, endIndex));
|
||||||
|
}
|
||||||
|
if(run.isUnderline()) {
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, beginIndex, endIndex));
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.INPUT_METHOD_UNDERLINE, TextAttribute.UNDERLINE_LOW_TWO_PIXEL, beginIndex, endIndex));
|
||||||
|
}
|
||||||
|
if(run.isStrikethrough()) {
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.STRIKETHROUGH, TextAttribute.STRIKETHROUGH_ON, beginIndex, endIndex));
|
||||||
|
}
|
||||||
|
if(run.isSubscript()) {
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUB, beginIndex, endIndex));
|
||||||
|
}
|
||||||
|
if(run.isSuperscript()) {
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, beginIndex, endIndex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// ensure that the paragraph contains at least one character
|
||||||
|
// We need this trick to correctly measure text
|
||||||
|
if (text.length() == 0) {
|
||||||
|
float fontSz = (float)paragraph.getDefaultFontSize();
|
||||||
|
text.append(" ");
|
||||||
|
attList.add(new AttributedStringData(TextAttribute.SIZE, fontSz, 0, 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
AttributedString string = new AttributedString(text.toString());
|
||||||
|
for (AttributedStringData asd : attList) {
|
||||||
|
string.addAttribute(asd.attribute, asd.value, asd.beginIndex, asd.endIndex);
|
||||||
|
}
|
||||||
|
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
140
src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java
Normal file
140
src/scratchpad/src/org/apache/poi/sl/draw/DrawTextShape.java
Normal file
@ -0,0 +1,140 @@
|
|||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.poi.sl.usermodel.*;
|
||||||
|
|
||||||
|
public class DrawTextShape<T extends TextShape> extends DrawSimpleShape<T> {
|
||||||
|
|
||||||
|
public DrawTextShape(T shape) {
|
||||||
|
super(shape);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void drawContent(Graphics2D graphics) {
|
||||||
|
Rectangle2D anchor = DrawShape.getAnchor(graphics, shape);
|
||||||
|
Insets2D insets = shape.getInsets();
|
||||||
|
double x = anchor.getX() + insets.left;
|
||||||
|
double y = anchor.getY();
|
||||||
|
|
||||||
|
// remember the initial transform
|
||||||
|
AffineTransform tx = graphics.getTransform();
|
||||||
|
|
||||||
|
// Transform of text in flipped shapes is special.
|
||||||
|
// At this point the flip and rotation transform is already applied
|
||||||
|
// (see XSLFShape#applyTransform ), but we need to restore it to avoid painting "upside down".
|
||||||
|
// See Bugzilla 54210.
|
||||||
|
|
||||||
|
if(shape.getFlipVertical()){
|
||||||
|
graphics.translate(anchor.getX(), anchor.getY() + anchor.getHeight());
|
||||||
|
graphics.scale(1, -1);
|
||||||
|
graphics.translate(-anchor.getX(), -anchor.getY());
|
||||||
|
|
||||||
|
// text in vertically flipped shapes is rotated by 180 degrees
|
||||||
|
double centerX = anchor.getX() + anchor.getWidth()/2;
|
||||||
|
double centerY = anchor.getY() + anchor.getHeight()/2;
|
||||||
|
graphics.translate(centerX, centerY);
|
||||||
|
graphics.rotate(Math.toRadians(180));
|
||||||
|
graphics.translate(-centerX, -centerY);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Horizontal flipping applies only to shape outline and not to the text in the shape.
|
||||||
|
// Applying flip second time restores the original not-flipped transform
|
||||||
|
if(shape.getFlipHorizontal()){
|
||||||
|
graphics.translate(anchor.getX() + anchor.getWidth(), anchor.getY());
|
||||||
|
graphics.scale(-1, 1);
|
||||||
|
graphics.translate(-anchor.getX() , -anchor.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// first dry-run to calculate the total height of the text
|
||||||
|
double textHeight = shape.getTextHeight();
|
||||||
|
|
||||||
|
switch (shape.getVerticalAlignment()){
|
||||||
|
case TOP:
|
||||||
|
y += insets.top;
|
||||||
|
break;
|
||||||
|
case BOTTOM:
|
||||||
|
y += anchor.getHeight() - textHeight - insets.bottom;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
case MIDDLE:
|
||||||
|
double delta = anchor.getHeight() - textHeight - insets.top - insets.bottom;
|
||||||
|
y += insets.top + delta/2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawParagraphs(graphics, x, y);
|
||||||
|
|
||||||
|
// restore the transform
|
||||||
|
graphics.setTransform(tx);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* paint the paragraphs starting from top left (x,y)
|
||||||
|
*
|
||||||
|
* @return the vertical advance, i.e. the cumulative space occupied by the text
|
||||||
|
*/
|
||||||
|
public double drawParagraphs(Graphics2D graphics, double x, double y) {
|
||||||
|
DrawFactory fact = DrawFactory.getInstance(graphics);
|
||||||
|
Insets2D shapePadding = shape.getInsets();
|
||||||
|
|
||||||
|
double y0 = y;
|
||||||
|
Iterator<TextParagraph> paragraphs = shape.iterator();
|
||||||
|
|
||||||
|
boolean isFirstLine = true;
|
||||||
|
while (paragraphs.hasNext()){
|
||||||
|
TextParagraph p = paragraphs.next();
|
||||||
|
DrawTextParagraph dp = fact.getDrawable(p);
|
||||||
|
dp.setInsets(shapePadding);
|
||||||
|
dp.breakText(graphics);
|
||||||
|
|
||||||
|
if (!isFirstLine) {
|
||||||
|
// the amount of vertical white space before the paragraph
|
||||||
|
double spaceBefore = p.getSpaceBefore();
|
||||||
|
if(spaceBefore > 0) {
|
||||||
|
// positive value means percentage spacing of the height of the first line, e.g.
|
||||||
|
// the higher the first line, the bigger the space before the paragraph
|
||||||
|
y += spaceBefore*0.01*dp.getFirstLineHeight();
|
||||||
|
} else {
|
||||||
|
// negative value means the absolute spacing in points
|
||||||
|
y += -spaceBefore;
|
||||||
|
}
|
||||||
|
isFirstLine = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
dp.setPosition(x, y);
|
||||||
|
dp.draw(graphics);
|
||||||
|
y += dp.getY();
|
||||||
|
|
||||||
|
if (paragraphs.hasNext()) {
|
||||||
|
double spaceAfter = p.getSpaceAfter();
|
||||||
|
if(spaceAfter > 0) {
|
||||||
|
// positive value means percentage spacing of the height of the last line, e.g.
|
||||||
|
// the higher the last line, the bigger the space after the paragraph
|
||||||
|
y += spaceAfter*0.01*dp.getLastLineHeight();
|
||||||
|
} else {
|
||||||
|
// negative value means the absolute spacing in points
|
||||||
|
y += -spaceAfter;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return y - y0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compute the cumulative height occupied by the text
|
||||||
|
*/
|
||||||
|
protected double getTextHeight(){
|
||||||
|
// dry-run in a 1x1 image and return the vertical advance
|
||||||
|
BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_RGB);
|
||||||
|
Graphics2D graphics = img.createGraphics();
|
||||||
|
return drawParagraphs(graphics, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
123
src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java
Normal file
123
src/scratchpad/src/org/apache/poi/sl/draw/Drawable.java
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.RenderingHints;
|
||||||
|
|
||||||
|
import org.apache.poi.util.Internal;
|
||||||
|
|
||||||
|
|
||||||
|
public interface Drawable {
|
||||||
|
class DrawableHint extends RenderingHints.Key {
|
||||||
|
protected DrawableHint(int id) {
|
||||||
|
super(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCompatibleValue(Object val) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@link DrawFactory} which will be used to draw objects into this graphics context
|
||||||
|
*/
|
||||||
|
DrawableHint DRAW_FACTORY = new DrawableHint(1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Key will be internally used to store affine transformation temporarily within group shapes
|
||||||
|
*/
|
||||||
|
@Internal
|
||||||
|
DrawableHint GROUP_TRANSFORM = new DrawableHint(2);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use a custom image renderer of an instance of {@link ImageRenderer}
|
||||||
|
*/
|
||||||
|
DrawableHint IMAGE_RENDERER = new DrawableHint(3);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* how to render text:
|
||||||
|
*
|
||||||
|
* {@link #TEXT_AS_CHARACTERS} (default) means to draw via
|
||||||
|
* {@link java.awt.Graphics2D#drawString(java.text.AttributedCharacterIterator, float, float)}.
|
||||||
|
* This mode draws text as characters. Use it if the target graphics writes the actual
|
||||||
|
* character codes instead of glyph outlines (PDFGraphics2D, SVGGraphics2D, etc.)
|
||||||
|
*
|
||||||
|
* {@link #TEXT_AS_SHAPES} means to render via
|
||||||
|
* {@link java.awt.font.TextLayout#draw(java.awt.Graphics2D, float, float)}.
|
||||||
|
* This mode draws glyphs as shapes and provides some advanced capabilities such as
|
||||||
|
* justification and font substitution. Use it if the target graphics is an image.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
DrawableHint TEXT_RENDERING_MODE = new DrawableHint(4);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PathGradientPaint needs the shape to be set.
|
||||||
|
* It will be achieved through setting it in the rendering hints
|
||||||
|
*/
|
||||||
|
DrawableHint GRADIENT_SHAPE = new DrawableHint(5);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal key for caching the preset geometries
|
||||||
|
*/
|
||||||
|
DrawableHint PRESET_GEOMETRY_CACHE = new DrawableHint(6);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* draw text via {@link java.awt.Graphics2D#drawString(java.text.AttributedCharacterIterator, float, float)}
|
||||||
|
*/
|
||||||
|
int TEXT_AS_CHARACTERS = 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* draw text via {@link java.awt.font.TextLayout#draw(java.awt.Graphics2D, float, float)}
|
||||||
|
*/
|
||||||
|
int TEXT_AS_SHAPES = 2;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Use this object to resolve unknown / missing fonts when rendering slides
|
||||||
|
*/
|
||||||
|
DrawableHint FONT_HANDLER = new DrawableHint(7);
|
||||||
|
DrawableHint FONT_FALLBACK = new DrawableHint(8);
|
||||||
|
DrawableHint FONT_MAP = new DrawableHint(9);
|
||||||
|
|
||||||
|
DrawableHint GSAVE = new DrawableHint(10);
|
||||||
|
DrawableHint GRESTORE = new DrawableHint(11);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Apply 2-D transforms before drawing this shape. This includes rotation and flipping.
|
||||||
|
*
|
||||||
|
* @param graphics the graphics whos transform matrix will be modified
|
||||||
|
*/
|
||||||
|
void applyTransform(Graphics2D graphics);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw this shape into the supplied canvas
|
||||||
|
*
|
||||||
|
* @param graphics the graphics to draw into
|
||||||
|
*/
|
||||||
|
void draw(Graphics2D graphics);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* draw any content within this shape (image, text, etc.).
|
||||||
|
*
|
||||||
|
* @param graphics the graphics to draw into
|
||||||
|
*/
|
||||||
|
void drawContent(Graphics2D graphics);
|
||||||
|
}
|
155
src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java
Normal file
155
src/scratchpad/src/org/apache/poi/sl/draw/ImageRenderer.java
Normal file
@ -0,0 +1,155 @@
|
|||||||
|
/*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
* contributor license agreements. See the NOTICE file distributed with
|
||||||
|
* this work for additional information regarding copyright ownership.
|
||||||
|
* The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
* (the "License"); you may not use this file except in compliance with
|
||||||
|
* the License. You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
package org.apache.poi.sl.draw;
|
||||||
|
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.geom.AffineTransform;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.awt.image.RescaleOp;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* For now this class renders only images supported by the javax.imageio.ImageIO
|
||||||
|
* framework. Subclasses can override this class to support other formats, for
|
||||||
|
* example, Use Apache batik to render WMF:
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <code>
|
||||||
|
* public class MyImageRendener extends ImageRendener {
|
||||||
|
*
|
||||||
|
* public boolean drawImage(Graphics2D graphics,Rectangle2D anchor,Insets clip) {
|
||||||
|
* // draw image
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* public void loadImage(InputStream data, String contentType) throws IOException {
|
||||||
|
* if ("image/wmf".equals(contentType)) {
|
||||||
|
* // use Apache Batik to handle WMF
|
||||||
|
* } else {
|
||||||
|
* super.loadImage(data,contentType);
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* }
|
||||||
|
* </code>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
* and then pass this class to your instance of java.awt.Graphics2D:
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <code>
|
||||||
|
* graphics.setRenderingHint(Drawable.IMAGE_RENDERER, new MyImageRendener());
|
||||||
|
* </code>
|
||||||
|
* </pre>
|
||||||
|
*/
|
||||||
|
public class ImageRenderer {
|
||||||
|
protected BufferedImage img;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load and buffer the image
|
||||||
|
*
|
||||||
|
* @param data the raw image stream
|
||||||
|
* @param contentType the content type
|
||||||
|
*/
|
||||||
|
public void loadImage(InputStream data, String contentType) throws IOException {
|
||||||
|
img = ImageIO.read(data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the buffered image
|
||||||
|
*/
|
||||||
|
public BufferedImage getImage() {
|
||||||
|
return img;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return the dimension of the buffered image
|
||||||
|
*/
|
||||||
|
public Dimension getDimension() {
|
||||||
|
return (img == null)
|
||||||
|
? new Dimension(0,0)
|
||||||
|
: new Dimension(img.getWidth(),img.getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param alpha the alpha [0..1] to be added to the image (possibly already containing an alpha channel)
|
||||||
|
*/
|
||||||
|
public void setAlpha(double alpha) {
|
||||||
|
if (img == null) return;
|
||||||
|
|
||||||
|
Dimension dim = getDimension();
|
||||||
|
BufferedImage newImg = new BufferedImage((int)dim.getWidth(), (int)dim.getHeight(), BufferedImage.TYPE_INT_ARGB);
|
||||||
|
Graphics2D g = newImg.createGraphics();
|
||||||
|
RescaleOp op = new RescaleOp(new float[]{1.0f, 1.0f, 1.0f, (float)alpha}, new float[]{0,0,0,0}, null);
|
||||||
|
g.drawImage(img, op, 0, 0);
|
||||||
|
g.dispose();
|
||||||
|
|
||||||
|
img = newImg;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render picture data into the supplied graphics
|
||||||
|
*
|
||||||
|
* @return true if the picture data was successfully rendered
|
||||||
|
*/
|
||||||
|
public boolean drawImage(
|
||||||
|
Graphics2D graphics,
|
||||||
|
Rectangle2D anchor) {
|
||||||
|
return drawImage(graphics, anchor, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Render picture data into the supplied graphics
|
||||||
|
*
|
||||||
|
* @return true if the picture data was successfully rendered
|
||||||
|
*/
|
||||||
|
public boolean drawImage(
|
||||||
|
Graphics2D graphics,
|
||||||
|
Rectangle2D anchor,
|
||||||
|
Insets clip) {
|
||||||
|
if (img == null) return false;
|
||||||
|
|
||||||
|
boolean isClipped = true;
|
||||||
|
if (clip == null) {
|
||||||
|
isClipped = false;
|
||||||
|
clip = new Insets(0,0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int iw = img.getWidth();
|
||||||
|
int ih = img.getHeight();
|
||||||
|
|
||||||
|
double cw = (100000-clip.left-clip.right) / 100000.0;
|
||||||
|
double ch = (100000-clip.top-clip.bottom) / 100000.0;
|
||||||
|
double sx = anchor.getWidth()/(iw*cw);
|
||||||
|
double sy = anchor.getHeight()/(ih*ch);
|
||||||
|
double tx = anchor.getX()-(iw*sx*clip.left/100000.0);
|
||||||
|
double ty = anchor.getY()-(ih*sy*clip.top/100000.0);
|
||||||
|
AffineTransform at = new AffineTransform(sx, 0, 0, sy, tx, ty) ;
|
||||||
|
|
||||||
|
Shape clipOld = graphics.getClip();
|
||||||
|
if (isClipped) graphics.clip(anchor.getBounds2D());
|
||||||
|
graphics.drawRenderedImage(img, at);
|
||||||
|
graphics.setClip(clipOld);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,126 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_AdjPoint2D complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_AdjPoint2D">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute name="x" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
|
||||||
|
* <attribute name="y" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_AdjPoint2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTAdjPoint2D
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "x", required = true)
|
||||||
|
protected String x;
|
||||||
|
@XmlAttribute(name = "y", required = true)
|
||||||
|
protected String y;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the x property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the x property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setX(String value) {
|
||||||
|
this.x = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetX() {
|
||||||
|
return (this.x!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the y property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the y property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setY(String value) {
|
||||||
|
this.y = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetY() {
|
||||||
|
return (this.y!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,116 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElements;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_AdjustHandleList complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_AdjustHandleList">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <choice maxOccurs="unbounded" minOccurs="0">
|
||||||
|
* <element name="ahXY" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_XYAdjustHandle"/>
|
||||||
|
* <element name="ahPolar" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PolarAdjustHandle"/>
|
||||||
|
* </choice>
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_AdjustHandleList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"ahXYOrAhPolar"
|
||||||
|
})
|
||||||
|
public class CTAdjustHandleList
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElements({
|
||||||
|
@XmlElement(name = "ahXY", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTXYAdjustHandle.class),
|
||||||
|
@XmlElement(name = "ahPolar", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPolarAdjustHandle.class)
|
||||||
|
})
|
||||||
|
protected List<Object> ahXYOrAhPolar;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the ahXYOrAhPolar property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This accessor method returns a reference to the live list,
|
||||||
|
* not a snapshot. Therefore any modification you make to the
|
||||||
|
* returned list will be present inside the JAXB object.
|
||||||
|
* This is why there is not a <CODE>set</CODE> method for the ahXYOrAhPolar property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For example, to add a new item, do as follows:
|
||||||
|
* <pre>
|
||||||
|
* getAhXYOrAhPolar().add(newItem);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Objects of the following type(s) are allowed in the list
|
||||||
|
* {@link CTXYAdjustHandle }
|
||||||
|
* {@link CTPolarAdjustHandle }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public List<Object> getAhXYOrAhPolar() {
|
||||||
|
if (ahXYOrAhPolar == null) {
|
||||||
|
ahXYOrAhPolar = new ArrayList<Object>();
|
||||||
|
}
|
||||||
|
return this.ahXYOrAhPolar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetAhXYOrAhPolar() {
|
||||||
|
return ((this.ahXYOrAhPolar!= null)&&(!this.ahXYOrAhPolar.isEmpty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetAhXYOrAhPolar() {
|
||||||
|
this.ahXYOrAhPolar = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_Angle complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_Angle">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_Angle", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTAngle implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "val", required = true)
|
||||||
|
protected int val;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the val property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getVal() {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the val property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setVal(int value) {
|
||||||
|
this.val = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetVal() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
254
src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java
Normal file
254
src/scratchpad/src/org/apache/poi/sl/draw/binding/CTColor.java
Normal file
@ -0,0 +1,254 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_Color complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_Color">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorChoice"/>
|
||||||
|
* </sequence>
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_Color", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"scrgbClr",
|
||||||
|
"srgbClr",
|
||||||
|
"hslClr",
|
||||||
|
"sysClr",
|
||||||
|
"schemeClr",
|
||||||
|
"prstClr"
|
||||||
|
})
|
||||||
|
public class CTColor
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTScRgbColor scrgbClr;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTSRgbColor srgbClr;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTHslColor hslClr;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTSystemColor sysClr;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTSchemeColor schemeClr;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTPresetColor prstClr;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the scrgbClr property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTScRgbColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTScRgbColor getScrgbClr() {
|
||||||
|
return scrgbClr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the scrgbClr property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTScRgbColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setScrgbClr(CTScRgbColor value) {
|
||||||
|
this.scrgbClr = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetScrgbClr() {
|
||||||
|
return (this.scrgbClr!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the srgbClr property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTSRgbColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTSRgbColor getSrgbClr() {
|
||||||
|
return srgbClr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the srgbClr property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTSRgbColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setSrgbClr(CTSRgbColor value) {
|
||||||
|
this.srgbClr = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetSrgbClr() {
|
||||||
|
return (this.srgbClr!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the hslClr property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTHslColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTHslColor getHslClr() {
|
||||||
|
return hslClr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the hslClr property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTHslColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setHslClr(CTHslColor value) {
|
||||||
|
this.hslClr = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetHslClr() {
|
||||||
|
return (this.hslClr!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the sysClr property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTSystemColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTSystemColor getSysClr() {
|
||||||
|
return sysClr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the sysClr property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTSystemColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setSysClr(CTSystemColor value) {
|
||||||
|
this.sysClr = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetSysClr() {
|
||||||
|
return (this.sysClr!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the schemeClr property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTSchemeColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTSchemeColor getSchemeClr() {
|
||||||
|
return schemeClr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the schemeClr property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTSchemeColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setSchemeClr(CTSchemeColor value) {
|
||||||
|
this.schemeClr = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetSchemeClr() {
|
||||||
|
return (this.schemeClr!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the prstClr property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTPresetColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTPresetColor getPrstClr() {
|
||||||
|
return prstClr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the prstClr property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTPresetColor }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPrstClr(CTPresetColor value) {
|
||||||
|
this.prstClr = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetPrstClr() {
|
||||||
|
return (this.prstClr!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,123 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlElements;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_ColorMRU complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_ColorMRU">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorChoice" maxOccurs="10" minOccurs="0"/>
|
||||||
|
* </sequence>
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_ColorMRU", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"egColorChoice"
|
||||||
|
})
|
||||||
|
public class CTColorMRU
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElements({
|
||||||
|
@XmlElement(name = "scrgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTScRgbColor.class),
|
||||||
|
@XmlElement(name = "srgbClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSRgbColor.class),
|
||||||
|
@XmlElement(name = "hslClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTHslColor.class),
|
||||||
|
@XmlElement(name = "sysClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSystemColor.class),
|
||||||
|
@XmlElement(name = "schemeClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTSchemeColor.class),
|
||||||
|
@XmlElement(name = "prstClr", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = CTPresetColor.class)
|
||||||
|
})
|
||||||
|
protected List<Object> egColorChoice;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the egColorChoice property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This accessor method returns a reference to the live list,
|
||||||
|
* not a snapshot. Therefore any modification you make to the
|
||||||
|
* returned list will be present inside the JAXB object.
|
||||||
|
* This is why there is not a <CODE>set</CODE> method for the egColorChoice property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For example, to add a new item, do as follows:
|
||||||
|
* <pre>
|
||||||
|
* getEGColorChoice().add(newItem);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Objects of the following type(s) are allowed in the list
|
||||||
|
* {@link CTScRgbColor }
|
||||||
|
* {@link CTSRgbColor }
|
||||||
|
* {@link CTHslColor }
|
||||||
|
* {@link CTSystemColor }
|
||||||
|
* {@link CTSchemeColor }
|
||||||
|
* {@link CTPresetColor }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public List<Object> getEGColorChoice() {
|
||||||
|
if (egColorChoice == null) {
|
||||||
|
egColorChoice = new ArrayList<Object>();
|
||||||
|
}
|
||||||
|
return this.egColorChoice;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetEGColorChoice() {
|
||||||
|
return ((this.egColorChoice!= null)&&(!this.egColorChoice.isEmpty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetEGColorChoice() {
|
||||||
|
this.egColorChoice = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_ComplementTransform complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_ComplementTransform">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_ComplementTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTComplementTransform implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,112 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlSchemaType;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_Connection complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_Connection">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute name="id" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_DrawingElementId" />
|
||||||
|
* <attribute name="idx" use="required" type="{http://www.w3.org/2001/XMLSchema}unsignedInt" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_Connection", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTConnection
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "id", required = true)
|
||||||
|
protected long id;
|
||||||
|
@XmlAttribute(name = "idx", required = true)
|
||||||
|
@XmlSchemaType(name = "unsignedInt")
|
||||||
|
protected long idx;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the id property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the id property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setId(long value) {
|
||||||
|
this.id = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetId() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the idx property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public long getIdx() {
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the idx property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setIdx(long value) {
|
||||||
|
this.idx = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetIdx() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,131 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_ConnectionSite complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_ConnectionSite">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <element name="pos" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjPoint2D"/>
|
||||||
|
* </sequence>
|
||||||
|
* <attribute name="ang" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjAngle" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_ConnectionSite", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"pos"
|
||||||
|
})
|
||||||
|
public class CTConnectionSite
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)
|
||||||
|
protected CTAdjPoint2D pos;
|
||||||
|
@XmlAttribute(name = "ang", required = true)
|
||||||
|
protected String ang;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the pos property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTAdjPoint2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTAdjPoint2D getPos() {
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the pos property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTAdjPoint2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPos(CTAdjPoint2D value) {
|
||||||
|
this.pos = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetPos() {
|
||||||
|
return (this.pos!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the ang property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getAng() {
|
||||||
|
return ang;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the ang property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setAng(String value) {
|
||||||
|
this.ang = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetAng() {
|
||||||
|
return (this.ang!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_ConnectionSiteList complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_ConnectionSiteList">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <element name="cxn" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_ConnectionSite" maxOccurs="unbounded" minOccurs="0"/>
|
||||||
|
* </sequence>
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_ConnectionSiteList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"cxn"
|
||||||
|
})
|
||||||
|
public class CTConnectionSiteList
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected List<CTConnectionSite> cxn;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the cxn property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This accessor method returns a reference to the live list,
|
||||||
|
* not a snapshot. Therefore any modification you make to the
|
||||||
|
* returned list will be present inside the JAXB object.
|
||||||
|
* This is why there is not a <CODE>set</CODE> method for the cxn property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For example, to add a new item, do as follows:
|
||||||
|
* <pre>
|
||||||
|
* getCxn().add(newItem);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Objects of the following type(s) are allowed in the list
|
||||||
|
* {@link CTConnectionSite }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public List<CTConnectionSite> getCxn() {
|
||||||
|
if (cxn == null) {
|
||||||
|
cxn = new ArrayList<CTConnectionSite>();
|
||||||
|
}
|
||||||
|
return this.cxn;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetCxn() {
|
||||||
|
return ((this.cxn!= null)&&(!this.cxn.isEmpty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetCxn() {
|
||||||
|
this.cxn = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,259 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_CustomGeometry2D complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_CustomGeometry2D">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <element name="avLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>
|
||||||
|
* <element name="gdLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuideList" minOccurs="0"/>
|
||||||
|
* <element name="ahLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_AdjustHandleList" minOccurs="0"/>
|
||||||
|
* <element name="cxnLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_ConnectionSiteList" minOccurs="0"/>
|
||||||
|
* <element name="rect" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomRect" minOccurs="0"/>
|
||||||
|
* <element name="pathLst" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Path2DList"/>
|
||||||
|
* </sequence>
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_CustomGeometry2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"avLst",
|
||||||
|
"gdLst",
|
||||||
|
"ahLst",
|
||||||
|
"cxnLst",
|
||||||
|
"rect",
|
||||||
|
"pathLst"
|
||||||
|
})
|
||||||
|
public class CTCustomGeometry2D
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTGeomGuideList avLst;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTGeomGuideList gdLst;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTAdjustHandleList ahLst;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTConnectionSiteList cxnLst;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTGeomRect rect;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", required = true)
|
||||||
|
protected CTPath2DList pathLst;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the avLst property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTGeomGuideList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTGeomGuideList getAvLst() {
|
||||||
|
return avLst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the avLst property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTGeomGuideList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setAvLst(CTGeomGuideList value) {
|
||||||
|
this.avLst = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetAvLst() {
|
||||||
|
return (this.avLst!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the gdLst property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTGeomGuideList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTGeomGuideList getGdLst() {
|
||||||
|
return gdLst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the gdLst property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTGeomGuideList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setGdLst(CTGeomGuideList value) {
|
||||||
|
this.gdLst = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetGdLst() {
|
||||||
|
return (this.gdLst!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the ahLst property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTAdjustHandleList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTAdjustHandleList getAhLst() {
|
||||||
|
return ahLst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the ahLst property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTAdjustHandleList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setAhLst(CTAdjustHandleList value) {
|
||||||
|
this.ahLst = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetAhLst() {
|
||||||
|
return (this.ahLst!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the cxnLst property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTConnectionSiteList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTConnectionSiteList getCxnLst() {
|
||||||
|
return cxnLst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the cxnLst property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTConnectionSiteList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setCxnLst(CTConnectionSiteList value) {
|
||||||
|
this.cxnLst = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetCxnLst() {
|
||||||
|
return (this.cxnLst!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the rect property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTGeomRect }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTGeomRect getRect() {
|
||||||
|
return rect;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the rect property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTGeomRect }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setRect(CTGeomRect value) {
|
||||||
|
this.rect = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetRect() {
|
||||||
|
return (this.rect!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the pathLst property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTPath2DList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTPath2DList getPathLst() {
|
||||||
|
return pathLst;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the pathLst property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTPath2DList }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setPathLst(CTPath2DList value) {
|
||||||
|
this.pathLst = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetPathLst() {
|
||||||
|
return (this.pathLst!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,169 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_EmbeddedWAVAudioFile complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_EmbeddedWAVAudioFile">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute ref="{http://schemas.openxmlformats.org/officeDocument/2006/relationships}embed use="required""/>
|
||||||
|
* <attribute name="name" type="{http://www.w3.org/2001/XMLSchema}string" default="" />
|
||||||
|
* <attribute name="builtIn" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_EmbeddedWAVAudioFile", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTEmbeddedWAVAudioFile
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "embed", namespace = "http://schemas.openxmlformats.org/officeDocument/2006/relationships", required = true)
|
||||||
|
protected String embed;
|
||||||
|
@XmlAttribute(name = "name")
|
||||||
|
protected String name;
|
||||||
|
@XmlAttribute(name = "builtIn")
|
||||||
|
protected Boolean builtIn;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Embedded Audio File Relationship ID
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getEmbed() {
|
||||||
|
return embed;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the embed property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setEmbed(String value) {
|
||||||
|
this.embed = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetEmbed() {
|
||||||
|
return (this.embed!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the name property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
if (name == null) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the name property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setName(String value) {
|
||||||
|
this.name = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetName() {
|
||||||
|
return (this.name!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the builtIn property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link Boolean }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean isBuiltIn() {
|
||||||
|
if (builtIn == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return builtIn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the builtIn property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link Boolean }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setBuiltIn(boolean value) {
|
||||||
|
this.builtIn = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetBuiltIn() {
|
||||||
|
return (this.builtIn!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetBuiltIn() {
|
||||||
|
this.builtIn = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,86 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_FixedPercentage complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_FixedPercentage">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute name="val" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_FixedPercentage" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_FixedPercentage", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTFixedPercentage implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "val", required = true)
|
||||||
|
protected int val;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the val property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getVal() {
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the val property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setVal(int value) {
|
||||||
|
this.val = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetVal() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_GammaTransform complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_GammaTransform">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_GammaTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTGammaTransform implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,129 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
|
||||||
|
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_GeomGuide complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_GeomGuide">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute name="name" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideName" />
|
||||||
|
* <attribute name="fmla" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_GeomGuideFormula" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_GeomGuide", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTGeomGuide
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "name", required = true)
|
||||||
|
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
|
||||||
|
protected String name;
|
||||||
|
@XmlAttribute(name = "fmla", required = true)
|
||||||
|
protected String fmla;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the name property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the name property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setName(String value) {
|
||||||
|
this.name = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetName() {
|
||||||
|
return (this.name!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the fmla property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getFmla() {
|
||||||
|
return fmla;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the fmla property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setFmla(String value) {
|
||||||
|
this.fmla = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetFmla() {
|
||||||
|
return (this.fmla!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,110 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_GeomGuideList complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_GeomGuideList">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <element name="gd" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_GeomGuide" maxOccurs="unbounded" minOccurs="0"/>
|
||||||
|
* </sequence>
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_GeomGuideList", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"gd"
|
||||||
|
})
|
||||||
|
public class CTGeomGuideList
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected List<CTGeomGuide> gd;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the gd property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This accessor method returns a reference to the live list,
|
||||||
|
* not a snapshot. Therefore any modification you make to the
|
||||||
|
* returned list will be present inside the JAXB object.
|
||||||
|
* This is why there is not a <CODE>set</CODE> method for the gd property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For example, to add a new item, do as follows:
|
||||||
|
* <pre>
|
||||||
|
* getGd().add(newItem);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Objects of the following type(s) are allowed in the list
|
||||||
|
* {@link CTGeomGuide }
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public List<CTGeomGuide> getGd() {
|
||||||
|
if (gd == null) {
|
||||||
|
gd = new ArrayList<CTGeomGuide>();
|
||||||
|
}
|
||||||
|
return this.gd;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetGd() {
|
||||||
|
return ((this.gd!= null)&&(!this.gd.isEmpty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetGd() {
|
||||||
|
this.gd = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,188 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_GeomRect complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_GeomRect">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <attribute name="l" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
|
||||||
|
* <attribute name="t" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
|
||||||
|
* <attribute name="r" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
|
||||||
|
* <attribute name="b" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_AdjCoordinate" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_GeomRect", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTGeomRect
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlAttribute(name = "l", required = true)
|
||||||
|
protected String l;
|
||||||
|
@XmlAttribute(name = "t", required = true)
|
||||||
|
protected String t;
|
||||||
|
@XmlAttribute(name = "r", required = true)
|
||||||
|
protected String r;
|
||||||
|
@XmlAttribute(name = "b", required = true)
|
||||||
|
protected String b;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the l property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getL() {
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the l property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setL(String value) {
|
||||||
|
this.l = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetL() {
|
||||||
|
return (this.l!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the t property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getT() {
|
||||||
|
return t;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the t property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setT(String value) {
|
||||||
|
this.t = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetT() {
|
||||||
|
return (this.t!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the r property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getR() {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the r property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setR(String value) {
|
||||||
|
this.r = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetR() {
|
||||||
|
return (this.r!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the b property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public String getB() {
|
||||||
|
return b;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the b property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link String }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setB(String value) {
|
||||||
|
this.b = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetB() {
|
||||||
|
return (this.b!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,62 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_GrayscaleTransform complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_GrayscaleTransform">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_GrayscaleTransform", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
public class CTGrayscaleTransform implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,313 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlElement;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_GroupTransform2D complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_GroupTransform2D">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <element name="off" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>
|
||||||
|
* <element name="ext" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>
|
||||||
|
* <element name="chOff" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_Point2D" minOccurs="0"/>
|
||||||
|
* <element name="chExt" type="{http://schemas.openxmlformats.org/drawingml/2006/main}CT_PositiveSize2D" minOccurs="0"/>
|
||||||
|
* </sequence>
|
||||||
|
* <attribute name="rot" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Angle" default="0" />
|
||||||
|
* <attribute name="flipH" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
|
||||||
|
* <attribute name="flipV" type="{http://www.w3.org/2001/XMLSchema}boolean" default="false" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_GroupTransform2D", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"off",
|
||||||
|
"ext",
|
||||||
|
"chOff",
|
||||||
|
"chExt"
|
||||||
|
})
|
||||||
|
public class CTGroupTransform2D
|
||||||
|
implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTPoint2D off;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTPositiveSize2D ext;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTPoint2D chOff;
|
||||||
|
@XmlElement(namespace = "http://schemas.openxmlformats.org/drawingml/2006/main")
|
||||||
|
protected CTPositiveSize2D chExt;
|
||||||
|
@XmlAttribute(name = "rot")
|
||||||
|
protected Integer rot;
|
||||||
|
@XmlAttribute(name = "flipH")
|
||||||
|
protected Boolean flipH;
|
||||||
|
@XmlAttribute(name = "flipV")
|
||||||
|
protected Boolean flipV;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the off property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTPoint2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTPoint2D getOff() {
|
||||||
|
return off;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the off property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTPoint2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setOff(CTPoint2D value) {
|
||||||
|
this.off = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetOff() {
|
||||||
|
return (this.off!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the ext property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTPositiveSize2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTPositiveSize2D getExt() {
|
||||||
|
return ext;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the ext property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTPositiveSize2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setExt(CTPositiveSize2D value) {
|
||||||
|
this.ext = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetExt() {
|
||||||
|
return (this.ext!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the chOff property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTPoint2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTPoint2D getChOff() {
|
||||||
|
return chOff;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the chOff property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTPoint2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setChOff(CTPoint2D value) {
|
||||||
|
this.chOff = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetChOff() {
|
||||||
|
return (this.chOff!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the chExt property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link CTPositiveSize2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public CTPositiveSize2D getChExt() {
|
||||||
|
return chExt;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the chExt property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link CTPositiveSize2D }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setChExt(CTPositiveSize2D value) {
|
||||||
|
this.chExt = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetChExt() {
|
||||||
|
return (this.chExt!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the rot property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link Integer }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getRot() {
|
||||||
|
if (rot == null) {
|
||||||
|
return 0;
|
||||||
|
} else {
|
||||||
|
return rot;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the rot property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link Integer }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setRot(int value) {
|
||||||
|
this.rot = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetRot() {
|
||||||
|
return (this.rot!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetRot() {
|
||||||
|
this.rot = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the flipH property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link Boolean }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean isFlipH() {
|
||||||
|
if (flipH == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return flipH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the flipH property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link Boolean }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setFlipH(boolean value) {
|
||||||
|
this.flipH = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetFlipH() {
|
||||||
|
return (this.flipH!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetFlipH() {
|
||||||
|
this.flipH = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the flipV property.
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
* possible object is
|
||||||
|
* {@link Boolean }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public boolean isFlipV() {
|
||||||
|
if (flipV == null) {
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return flipV;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the flipV property.
|
||||||
|
*
|
||||||
|
* @param value
|
||||||
|
* allowed object is
|
||||||
|
* {@link Boolean }
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setFlipV(boolean value) {
|
||||||
|
this.flipV = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetFlipV() {
|
||||||
|
return (this.flipV!= null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetFlipV() {
|
||||||
|
this.flipV = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,237 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.sl.draw.binding;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import javax.xml.bind.JAXBElement;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessType;
|
||||||
|
import javax.xml.bind.annotation.XmlAccessorType;
|
||||||
|
import javax.xml.bind.annotation.XmlAttribute;
|
||||||
|
import javax.xml.bind.annotation.XmlElementRef;
|
||||||
|
import javax.xml.bind.annotation.XmlElementRefs;
|
||||||
|
import javax.xml.bind.annotation.XmlTransient;
|
||||||
|
import javax.xml.bind.annotation.XmlType;
|
||||||
|
import com.sun.xml.internal.bind.Locatable;
|
||||||
|
import com.sun.xml.internal.bind.annotation.XmlLocation;
|
||||||
|
import org.xml.sax.Locator;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* <p>Java class for CT_HslColor complex type.
|
||||||
|
*
|
||||||
|
* <p>The following schema fragment specifies the expected content contained within this class.
|
||||||
|
*
|
||||||
|
* <pre>
|
||||||
|
* <complexType name="CT_HslColor">
|
||||||
|
* <complexContent>
|
||||||
|
* <restriction base="{http://www.w3.org/2001/XMLSchema}anyType">
|
||||||
|
* <sequence>
|
||||||
|
* <group ref="{http://schemas.openxmlformats.org/drawingml/2006/main}EG_ColorTransform" maxOccurs="unbounded" minOccurs="0"/>
|
||||||
|
* </sequence>
|
||||||
|
* <attribute name="hue" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_PositiveFixedAngle" />
|
||||||
|
* <attribute name="sat" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
|
||||||
|
* <attribute name="lum" use="required" type="{http://schemas.openxmlformats.org/drawingml/2006/main}ST_Percentage" />
|
||||||
|
* </restriction>
|
||||||
|
* </complexContent>
|
||||||
|
* </complexType>
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
@XmlAccessorType(XmlAccessType.FIELD)
|
||||||
|
@XmlType(name = "CT_HslColor", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", propOrder = {
|
||||||
|
"egColorTransform"
|
||||||
|
})
|
||||||
|
public class CTHslColor implements Locatable
|
||||||
|
{
|
||||||
|
|
||||||
|
@XmlElementRefs({
|
||||||
|
@XmlElementRef(name = "hueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "blueOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "gamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "green", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "lumOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "red", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "redMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "gray", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "shade", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "alphaOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "satOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "greenMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "inv", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "satMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "redOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "sat", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "lum", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "invGamma", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "hueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "greenOff", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "alpha", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "alphaMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "comp", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "hue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "lumMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "tint", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "blueMod", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false),
|
||||||
|
@XmlElementRef(name = "blue", namespace = "http://schemas.openxmlformats.org/drawingml/2006/main", type = JAXBElement.class, required = false)
|
||||||
|
})
|
||||||
|
protected List<JAXBElement<?>> egColorTransform;
|
||||||
|
@XmlAttribute(name = "hue", required = true)
|
||||||
|
protected int hue;
|
||||||
|
@XmlAttribute(name = "sat", required = true)
|
||||||
|
protected int sat;
|
||||||
|
@XmlAttribute(name = "lum", required = true)
|
||||||
|
protected int lum;
|
||||||
|
@XmlLocation
|
||||||
|
@XmlTransient
|
||||||
|
protected Locator locator;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the egColorTransform property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* This accessor method returns a reference to the live list,
|
||||||
|
* not a snapshot. Therefore any modification you make to the
|
||||||
|
* returned list will be present inside the JAXB object.
|
||||||
|
* This is why there is not a <CODE>set</CODE> method for the egColorTransform property.
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* For example, to add a new item, do as follows:
|
||||||
|
* <pre>
|
||||||
|
* getEGColorTransform().add(newItem);
|
||||||
|
* </pre>
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Objects of the following type(s) are allowed in the list
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTAngle }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTGammaTransform }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTGrayscaleTransform }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTFixedPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTInverseTransform }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTInverseGammaTransform }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPositivePercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTComplementTransform }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPositiveFixedAngle }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPositiveFixedPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
* {@link JAXBElement }{@code <}{@link CTPercentage }{@code >}
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public List<JAXBElement<?>> getEGColorTransform() {
|
||||||
|
if (egColorTransform == null) {
|
||||||
|
egColorTransform = new ArrayList<JAXBElement<?>>();
|
||||||
|
}
|
||||||
|
return this.egColorTransform;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetEGColorTransform() {
|
||||||
|
return ((this.egColorTransform!= null)&&(!this.egColorTransform.isEmpty()));
|
||||||
|
}
|
||||||
|
|
||||||
|
public void unsetEGColorTransform() {
|
||||||
|
this.egColorTransform = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the hue property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getHue() {
|
||||||
|
return hue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the hue property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setHue(int value) {
|
||||||
|
this.hue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetHue() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the sat property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getSat() {
|
||||||
|
return sat;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the sat property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setSat(int value) {
|
||||||
|
this.sat = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetSat() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the lum property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public int getLum() {
|
||||||
|
return lum;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the value of the lum property.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public void setLum(int value) {
|
||||||
|
this.lum = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isSetLum() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Locator sourceLocation() {
|
||||||
|
return locator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSourceLocation(Locator newLocator) {
|
||||||
|
locator = newLocator;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user