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.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: -->
|
||||
<property name="examples.src" location="src/examples/src"/>
|
||||
<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.test.dir}"/>
|
||||
<mkdir dir="${scratchpad.reports.test}"/>
|
||||
<mkdir dir="${geometry.output.tmpdir}"/>
|
||||
<mkdir dir="${ooxml.output.dir}"/>
|
||||
<mkdir dir="${ooxml.output.test.dir}"/>
|
||||
<mkdir dir="${ooxml.reports.test}"/>
|
||||
@ -690,7 +697,38 @@ under the License.
|
||||
</copy>
|
||||
</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}"
|
||||
source="${jdk.version.source}"
|
||||
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.model.*;
|
||||
import org.apache.poi.hslf.record.TextHeaderAtom;
|
||||
import org.apache.poi.sl.usermodel.ShapeType;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.FileOutputStream;
|
||||
@ -312,7 +313,7 @@ public final class ApacheconEU08 {
|
||||
box3.setAnchor(new Rectangle(473, 243, 170, 170));
|
||||
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.setLineWidth(0.75);
|
||||
box4.setLineColor(Color.black);
|
||||
|
@ -24,6 +24,8 @@ import java.awt.geom.Rectangle2D;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.poi.sl.usermodel.TextAlign;
|
||||
|
||||
/**
|
||||
* PPTX Tables
|
||||
*
|
||||
|
@ -519,7 +519,7 @@ public final class HSSFPatriarch implements HSSFShapeContainer, Drawing {
|
||||
}
|
||||
|
||||
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
|
||||
* @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>
|
||||
*/
|
||||
public static double fixedPointToDecimal(int fixedPoint) {
|
||||
public static double fixedPointToDouble(int fixedPoint) {
|
||||
int i = (fixedPoint >> 16);
|
||||
int f = (fixedPoint >> 0) & 0xFFFF;
|
||||
double decimal = (i + f/65536.0);
|
||||
return decimal;
|
||||
double floatPoint = (i + f/65536d);
|
||||
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;
|
||||
|
||||
import org.apache.poi.xslf.usermodel.XSLFSimpleShape;
|
||||
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
|
||||
@ -36,7 +36,7 @@ public abstract class PropertyFetcher<T> {
|
||||
* @param shape the shape being examined
|
||||
* @return true if the desired property was fetched
|
||||
*/
|
||||
public abstract boolean fetch(XSLFSimpleShape shape) ;
|
||||
public abstract boolean fetch(XSLFShape shape) ;
|
||||
|
||||
public T getValue(){
|
||||
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.PackageRelationship;
|
||||
import org.apache.poi.sl.usermodel.LineCap;
|
||||
import org.apache.poi.sl.usermodel.LineDash;
|
||||
import org.apache.poi.util.Internal;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.apache.poi.xslf.model.PropertyFetcher;
|
||||
|
@ -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.InputStream;
|
||||
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 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.PackagePartName;
|
||||
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.IOUtils;
|
||||
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.PresentationDocument;
|
||||
|
||||
import sun.reflect.generics.reflectiveObjects.NotImplementedException;
|
||||
|
||||
import com.sun.org.apache.xml.internal.utils.UnImplNode;
|
||||
|
||||
/**
|
||||
* High level representation of a ooxml slideshow.
|
||||
* 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.
|
||||
*/
|
||||
@Beta
|
||||
public class XMLSlideShow extends POIXMLDocument {
|
||||
public class XMLSlideShow extends POIXMLDocument implements SlideShow {
|
||||
private static POILogger _logger = POILogFactory.getLogger(XMLSlideShow.class);
|
||||
|
||||
private CTPresentation _presentation;
|
||||
@ -437,7 +448,7 @@ public class XMLSlideShow extends POIXMLDocument {
|
||||
*/
|
||||
public int addPicture(byte[] pictureData, int format) {
|
||||
XSLFPictureData img = findPictureData(pictureData);
|
||||
POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format];
|
||||
// POIXMLRelation relDesc = XSLFPictureData.RELATIONS[format];
|
||||
|
||||
if(img == null) {
|
||||
int imageNumber = _pictures.size();
|
||||
@ -485,4 +496,17 @@ public class XMLSlideShow extends POIXMLDocument {
|
||||
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;
|
||||
|
||||
import org.apache.poi.sl.usermodel.AutoShape;
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPresetGeometry2D;
|
||||
@ -35,7 +36,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTShapeNonVisual;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public class XSLFAutoShape extends XSLFTextShape {
|
||||
public class XSLFAutoShape extends XSLFTextShape implements AutoShape {
|
||||
|
||||
/*package*/ XSLFAutoShape(CTShape shape, XSLFSheet sheet) {
|
||||
super(shape, sheet);
|
||||
|
@ -17,25 +17,20 @@
|
||||
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
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.*;
|
||||
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
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class XSLFBackground extends XSLFSimpleShape {
|
||||
public class XSLFBackground extends XSLFSimpleShape implements Background {
|
||||
|
||||
/* package */XSLFBackground(CTBackground shape, XSLFSheet sheet) {
|
||||
super(shape, sheet);
|
||||
|
@ -18,22 +18,18 @@
|
||||
*/
|
||||
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.util.HashMap;
|
||||
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
|
||||
*
|
||||
@ -63,38 +59,35 @@ public class XSLFColor {
|
||||
* If not color information was found in the supplied xml object then a null is returned.
|
||||
*/
|
||||
public Color getColor() {
|
||||
return _color == null ? null : applyColorTransform(_color);
|
||||
return DrawPaint.applyColorTransform(getColorStyle());
|
||||
}
|
||||
|
||||
private Color applyColorTransform(Color color){
|
||||
Color result = color;
|
||||
public ColorStyle getColorStyle() {
|
||||
return new ColorStyle() {
|
||||
public Color getColor() {
|
||||
return _color;
|
||||
}
|
||||
|
||||
int alpha = getAlpha();
|
||||
if(alpha != -1){
|
||||
result = new Color(
|
||||
result.getRed(), result.getGreen(), result.getBlue(),
|
||||
Math.round(255 * alpha * 0.01f));
|
||||
}
|
||||
public int getAlpha() {
|
||||
return getRawValue("alpha");
|
||||
}
|
||||
|
||||
int lumOff = getLumOff();
|
||||
int lumMod = getLumMod();
|
||||
if(lumMod != -1 || lumOff != -1){
|
||||
result = modulateLuminanace(result,
|
||||
lumMod == -1 ? 100 : lumMod,
|
||||
lumOff == -1 ? 0 : lumOff);
|
||||
}
|
||||
public int getLumOff() {
|
||||
return getRawValue("lumOff");
|
||||
}
|
||||
|
||||
int shade = getShade();
|
||||
if(shade != -1){
|
||||
result = shade(result, shade);
|
||||
}
|
||||
public int getLumMod() {
|
||||
return getRawValue("lumMod");
|
||||
}
|
||||
|
||||
int tint = getTint();
|
||||
if(tint != -1){
|
||||
result = tint(result, tint);
|
||||
}
|
||||
public int getShade() {
|
||||
return getRawValue("shade");
|
||||
}
|
||||
|
||||
return result;
|
||||
public int getTint() {
|
||||
return getRawValue("tint");
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
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]);
|
||||
} else {
|
||||
// YK: color is a string like "menuText" or "windowText", we return black for such cases
|
||||
@SuppressWarnings("unused")
|
||||
String colorName = sys.getVal().toString();
|
||||
color = Color.black;
|
||||
}
|
||||
@ -150,6 +144,33 @@ public class XSLFColor {
|
||||
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.
|
||||
* Example:
|
||||
@ -160,56 +181,13 @@ public class XSLFColor {
|
||||
* @return the percentage value in the range [0 .. 100]
|
||||
*/
|
||||
private int getPercentageValue(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()) / 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;
|
||||
int val = getRawValue(elem);
|
||||
return (val == -1) ? val : (val / 1000);
|
||||
}
|
||||
|
||||
private int getAngleValue(String elem){
|
||||
String color = "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 = _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;
|
||||
int val = getRawValue(elem);
|
||||
return (val == -1) ? val : (val / 60000);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -387,7 +365,7 @@ public class XSLFColor {
|
||||
* percentage with 0% indicating minimal shade and 100% indicating maximum
|
||||
* or -1 if the value is not set
|
||||
*/
|
||||
int getShade(){
|
||||
public int getShade(){
|
||||
return getPercentageValue("shade");
|
||||
}
|
||||
|
||||
@ -399,69 +377,11 @@ public class XSLFColor {
|
||||
* percentage with 0% indicating minimal tint and 100% indicating maximum
|
||||
* or -1 if the value is not set
|
||||
*/
|
||||
int getTint(){
|
||||
public int getTint(){
|
||||
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
|
||||
*/
|
||||
|
@ -23,6 +23,7 @@ import org.apache.poi.POIXMLException;
|
||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||
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.Units;
|
||||
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 javax.xml.namespace.QName;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
|
||||
@ -58,8 +60,8 @@ public class XSLFGraphicFrame extends XSLFShape {
|
||||
return _sheet;
|
||||
}
|
||||
|
||||
public int getShapeType(){
|
||||
throw new RuntimeException("NotImplemented");
|
||||
public ShapeType getShapeType(){
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
public int getShapeId(){
|
||||
|
@ -19,9 +19,17 @@
|
||||
|
||||
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.PackageRelationship;
|
||||
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.Units;
|
||||
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.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.
|
||||
*
|
||||
@ -207,30 +208,35 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
||||
public XSLFAutoShape createAutoShape(){
|
||||
XSLFAutoShape sh = getDrawing().createAutoShape();
|
||||
_shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
public XSLFFreeformShape createFreeform(){
|
||||
XSLFFreeformShape sh = getDrawing().createFreeform();
|
||||
_shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
public XSLFTextBox createTextBox(){
|
||||
XSLFTextBox sh = getDrawing().createTextBox();
|
||||
_shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
public XSLFConnectorShape createConnector(){
|
||||
XSLFConnectorShape sh = getDrawing().createConnector();
|
||||
_shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
public XSLFGroupShape createGroup(){
|
||||
XSLFGroupShape sh = getDrawing().createGroup();
|
||||
_shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -251,6 +257,7 @@ public class XSLFGroupShape extends XSLFShape implements XSLFShapeContainer {
|
||||
XSLFPictureShape sh = getDrawing().createPicture(rel.getId());
|
||||
sh.resize();
|
||||
_shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
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.openxml4j.opc.PackagePart;
|
||||
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.xmlbeans.XmlException;
|
||||
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;
|
||||
|
||||
@Beta
|
||||
public final class XSLFNotes extends XSLFSheet {
|
||||
public final class XSLFNotes extends XSLFSheet implements Notes<XSLFShape> {
|
||||
private CTNotesSlide _notes;
|
||||
|
||||
/**
|
||||
@ -80,7 +82,6 @@ public final class XSLFNotes extends XSLFSheet {
|
||||
return getMasterSheet().getTheme();
|
||||
}
|
||||
|
||||
@Override
|
||||
public XSLFNotesMaster getMasterSheet() {
|
||||
for (POIXMLDocumentPart p : getRelations()) {
|
||||
if (p instanceof XSLFNotesMaster){
|
||||
@ -89,4 +90,20 @@ public final class XSLFNotes extends XSLFSheet {
|
||||
}
|
||||
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.openxml4j.opc.PackagePart;
|
||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping;
|
||||
@ -46,7 +47,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public class XSLFNotesMaster extends XSLFSheet {
|
||||
public class XSLFNotesMaster extends XSLFSheet implements MasterSheet<XSLFShape> {
|
||||
private CTNotesMaster _slide;
|
||||
private XSLFTheme _theme;
|
||||
|
||||
@ -93,7 +94,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.NotesMasterDocument;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XSLFSheet getMasterSheet() {
|
||||
public MasterSheet getMasterSheet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@
|
||||
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
import org.apache.poi.sl.usermodel.Shadow;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTOuterShadowEffect;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTSchemeColor;
|
||||
@ -31,7 +32,7 @@ import java.awt.geom.Rectangle2D;
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public class XSLFShadow extends XSLFSimpleShape {
|
||||
public class XSLFShadow extends XSLFSimpleShape implements Shadow {
|
||||
|
||||
private XSLFSimpleShape _parent;
|
||||
|
||||
|
@ -19,13 +19,25 @@
|
||||
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.Color;
|
||||
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.util.Internal;
|
||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||
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.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
|
||||
@ -33,24 +45,42 @@ import org.apache.xmlbeans.XmlObject;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public abstract class XSLFShape {
|
||||
public abstract class XSLFShape implements Shape {
|
||||
protected final XmlObject _shape;
|
||||
protected final XSLFSheet _sheet;
|
||||
protected XSLFShapeContainer _parent;
|
||||
|
||||
/**
|
||||
* @return the position of this shape within the drawing canvas.
|
||||
* The coordinates are expressed in points
|
||||
*/
|
||||
public abstract Rectangle2D getAnchor();
|
||||
private CTShapeProperties _spPr;
|
||||
private CTShapeStyle _spStyle;
|
||||
private CTNonVisualDrawingProps _nvPr;
|
||||
private CTPlaceholder _ph;
|
||||
|
||||
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
|
||||
*/
|
||||
public abstract XmlObject getXmlObject();
|
||||
public XmlObject getXmlObject() {
|
||||
return _shape;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return human-readable name of this shape, e.g. "Rectange 3"
|
||||
@ -118,84 +148,6 @@ public abstract class XSLFShape {
|
||||
*/
|
||||
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.
|
||||
* This method is called recursively for each shape when merging slides
|
||||
@ -212,4 +164,402 @@ public abstract class XSLFShape {
|
||||
|
||||
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;
|
||||
|
||||
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||
|
||||
/**
|
||||
* 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
|
||||
@ -55,27 +57,6 @@ public interface XSLFShapeContainer extends Iterable<XSLFShape> {
|
||||
*/
|
||||
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).
|
||||
* 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.TargetMode;
|
||||
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||
import org.apache.poi.sl.usermodel.Sheet;
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.apache.poi.util.IOUtils;
|
||||
import org.apache.poi.util.Internal;
|
||||
@ -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.CTShape;
|
||||
|
||||
import com.sun.org.apache.xml.internal.utils.UnImplNode;
|
||||
|
||||
import javax.xml.namespace.QName;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.io.IOException;
|
||||
@ -51,7 +56,7 @@ import java.util.Map;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@Beta
|
||||
public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer {
|
||||
public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeContainer, Sheet {
|
||||
private XSLFCommonSlideData _commonSlideData;
|
||||
private XSLFDrawing _drawing;
|
||||
private List<XSLFShape> _shapes;
|
||||
@ -142,6 +147,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFAutoShape sh = getDrawing().createAutoShape();
|
||||
shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -149,6 +155,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFFreeformShape sh = getDrawing().createFreeform();
|
||||
shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -156,6 +163,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFTextBox sh = getDrawing().createTextBox();
|
||||
shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -163,6 +171,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFConnectorShape sh = getDrawing().createConnector();
|
||||
shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -170,6 +179,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFGroupShape sh = getDrawing().createGroup();
|
||||
shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -191,6 +201,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
sh.resize();
|
||||
|
||||
getShapeList().add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -198,6 +209,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
List<XSLFShape> shapes = getShapeList();
|
||||
XSLFTable sh = getDrawing().createTable();
|
||||
shapes.add(sh);
|
||||
sh.setParent(this);
|
||||
return sh;
|
||||
}
|
||||
|
||||
@ -219,6 +231,12 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
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
|
||||
* (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 master of this sheet.
|
||||
*/
|
||||
public abstract XSLFSheet getMasterSheet();
|
||||
|
||||
protected XSLFTextShape getTextShapeByType(Placeholder type){
|
||||
for(XSLFShape shape : this.getShapes()){
|
||||
if(shape instanceof XSLFTextShape) {
|
||||
@ -486,7 +498,7 @@ public abstract class XSLFSheet extends POIXMLDocumentPart implements XSLFShapeC
|
||||
* @param graphics
|
||||
*/
|
||||
public void draw(Graphics2D graphics){
|
||||
XSLFSheet master = getMasterSheet();
|
||||
XSLFSheet master = (XSLFSheet)getMasterSheet();
|
||||
if(getFollowMasterGraphics() && master != null) master.draw(graphics);
|
||||
|
||||
graphics.setRenderingHint(XSLFRenderingHint.GROUP_TRANSFORM, new AffineTransform());
|
||||
|
@ -19,26 +19,25 @@
|
||||
|
||||
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.Units;
|
||||
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.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||
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;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
||||
|
||||
/**
|
||||
* Represents a single (non-group) shape in a .pptx slide show
|
||||
@ -46,24 +45,11 @@ import java.util.List;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
public abstract class XSLFSimpleShape extends XSLFShape implements SimpleShape {
|
||||
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) {
|
||||
_shape = shape;
|
||||
_sheet = sheet;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XmlObject getXmlObject() {
|
||||
return _shape;
|
||||
super(shape,sheet);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -78,16 +64,16 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
*
|
||||
* @param type
|
||||
*/
|
||||
public void setShapeType(XSLFShapeType type){
|
||||
public void setShapeType(ShapeType type){
|
||||
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);
|
||||
}
|
||||
|
||||
public XSLFShapeType getShapeType(){
|
||||
public ShapeType getShapeType(){
|
||||
CTShape shape = (CTShape) getXmlObject();
|
||||
STShapeType.Enum geom = shape.getSpPr().getPrstGeom().getPrst();
|
||||
return XSLFShapeType.forInt(geom.intValue());
|
||||
return ShapeType.forId(geom.intValue(), true);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -100,101 +86,6 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
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
|
||||
public void setRotation(double theta) {
|
||||
CTShapeProperties spPr = getSpPr();
|
||||
@ -314,7 +205,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
*/
|
||||
public double getLineWidth() {
|
||||
PropertyFetcher<Double> fetcher = new PropertyFetcher<Double>() {
|
||||
public boolean fetch(XSLFSimpleShape shape) {
|
||||
public boolean fetch(XSLFShape shape) {
|
||||
CTShapeProperties spPr = shape.getSpPr();
|
||||
CTLineProperties ln = spPr.getLn();
|
||||
if (ln != null) {
|
||||
@ -371,7 +262,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
public LineDash getLineDash() {
|
||||
|
||||
PropertyFetcher<LineDash> fetcher = new PropertyFetcher<LineDash>() {
|
||||
public boolean fetch(XSLFSimpleShape shape) {
|
||||
public boolean fetch(XSLFShape shape) {
|
||||
CTShapeProperties spPr = shape.getSpPr();
|
||||
CTLineProperties ln = spPr.getLn();
|
||||
if (ln != null) {
|
||||
@ -421,7 +312,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
*/
|
||||
public LineCap getLineCap() {
|
||||
PropertyFetcher<LineCap> fetcher = new PropertyFetcher<LineCap>() {
|
||||
public boolean fetch(XSLFSimpleShape shape) {
|
||||
public boolean fetch(XSLFShape shape) {
|
||||
CTShapeProperties spPr = shape.getSpPr();
|
||||
CTLineProperties ln = spPr.getLn();
|
||||
if (ln != null) {
|
||||
@ -499,7 +390,7 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
*/
|
||||
public XSLFShadow getShadow() {
|
||||
PropertyFetcher<CTOuterShadowEffect> fetcher = new PropertyFetcher<CTOuterShadowEffect>() {
|
||||
public boolean fetch(XSLFSimpleShape shape) {
|
||||
public boolean fetch(XSLFShape shape) {
|
||||
CTShapeProperties spPr = shape.getSpPr();
|
||||
if (spPr.isSetEffectLst()) {
|
||||
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);
|
||||
}
|
||||
|
||||
@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
|
||||
*/
|
||||
CustomGeometry getGeometry(){
|
||||
public CustomGeometry getGeometry(){
|
||||
CTShapeProperties spPr = getSpPr();
|
||||
CustomGeometry geom;
|
||||
PresetGeometries dict = PresetGeometries.getInstance();
|
||||
@ -622,23 +434,16 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
throw new IllegalStateException("Unknown shape geometry: " + name);
|
||||
}
|
||||
} 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 {
|
||||
geom = dict.get("rect");
|
||||
}
|
||||
return geom;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* draw any content within this shape (image, text, etc.).
|
||||
*
|
||||
* @param graphics the graphics to draw into
|
||||
*/
|
||||
public void drawContent(Graphics2D graphics){
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
void copy(XSLFShape sh){
|
||||
super.copy(sh);
|
||||
@ -943,4 +748,30 @@ public abstract class XSLFSimpleShape extends XSLFShape {
|
||||
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;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.io.IOException;
|
||||
|
||||
import org.apache.poi.POIXMLDocumentPart;
|
||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||
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.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.CTGroupTransform2D;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPoint2D;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D;
|
||||
import org.openxmlformats.schemas.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.CTGroupShape;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGroupShapeNonVisual;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTSlide;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.SldDocument;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTBackground;
|
||||
|
||||
import java.awt.Graphics2D;
|
||||
import java.io.IOException;
|
||||
|
||||
@Beta
|
||||
public final class XSLFSlide extends XSLFSheet {
|
||||
public final class XSLFSlide extends XSLFSheet implements Slide {
|
||||
private final CTSlide _slide;
|
||||
private XSLFSlideLayout _layout;
|
||||
private XSLFComments _comments;
|
||||
@ -111,7 +113,6 @@ public final class XSLFSlide extends XSLFSheet {
|
||||
return "sld";
|
||||
}
|
||||
|
||||
@Override
|
||||
public XSLFSlideLayout getMasterSheet(){
|
||||
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
|
||||
public void draw(Graphics2D graphics){
|
||||
|
||||
@ -239,4 +249,26 @@ public final class XSLFSlide extends XSLFSheet {
|
||||
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.openxml4j.opc.PackagePart;
|
||||
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.Internal;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
@ -30,7 +31,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.SldLayoutDocument;
|
||||
import java.io.IOException;
|
||||
|
||||
@Beta
|
||||
public class XSLFSlideLayout extends XSLFSheet {
|
||||
public class XSLFSlideLayout extends XSLFSheet implements MasterSheet {
|
||||
private CTSlideLayout _layout;
|
||||
private XSLFSlideMaster _master;
|
||||
|
||||
|
@ -19,6 +19,7 @@ package org.apache.poi.xslf.usermodel;
|
||||
import org.apache.poi.POIXMLDocumentPart;
|
||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||
import org.apache.poi.sl.usermodel.MasterSheet;
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.apache.xmlbeans.XmlException;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTColorMapping;
|
||||
@ -53,7 +54,7 @@ import java.util.Map;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public class XSLFSlideMaster extends XSLFSheet {
|
||||
public class XSLFSlideMaster extends XSLFSheet implements MasterSheet {
|
||||
private CTSlideMaster _slide;
|
||||
private Map<String, XSLFSlideLayout> _layouts;
|
||||
private XSLFTheme _theme;
|
||||
@ -82,7 +83,7 @@ import java.util.Map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public XSLFSheet getMasterSheet() {
|
||||
public MasterSheet getMasterSheet() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@ -177,5 +178,4 @@ import java.util.Map;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -21,6 +21,7 @@ package org.apache.poi.xslf.usermodel;
|
||||
|
||||
import java.awt.Color;
|
||||
|
||||
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTLineEndProperties;
|
||||
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.Graphics2D;
|
||||
import java.awt.font.LineBreakMeasurer;
|
||||
import java.awt.font.TextAttribute;
|
||||
import java.awt.font.TextLayout;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.text.AttributedCharacterIterator;
|
||||
import java.text.AttributedString;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
|
||||
import org.apache.poi.hslf.model.TextPainter;
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.apache.poi.util.Internal;
|
||||
import org.apache.poi.util.Units;
|
||||
import org.apache.poi.sl.usermodel.TextParagraph;
|
||||
import org.apache.poi.util.*;
|
||||
import org.apache.poi.xslf.model.ParagraphPropertyFetcher;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTColor;
|
||||
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.drawingml.x2006.main.*;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
||||
|
||||
@ -65,16 +37,10 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
||||
* @since POI-3.8
|
||||
*/
|
||||
@Beta
|
||||
public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
public class XSLFTextParagraph implements TextParagraph {
|
||||
private final CTTextParagraph _p;
|
||||
private final List<XSLFTextRun> _runs;
|
||||
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){
|
||||
_p = p;
|
||||
@ -122,7 +88,7 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
return _p;
|
||||
}
|
||||
|
||||
XSLFTextShape getParentShape() {
|
||||
public XSLFTextShape getParentShape() {
|
||||
return _shape;
|
||||
|
||||
}
|
||||
@ -194,7 +160,7 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
/**
|
||||
* Specifies the alignment that is to be applied to the paragraph.
|
||||
* 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
|
||||
*/
|
||||
@ -408,6 +374,26 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
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
|
||||
@ -711,10 +697,6 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
return "[" + getClass() + "]" + getText();
|
||||
}
|
||||
|
||||
List<TextFragment> getTextLines(){
|
||||
return _lines;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns wrapping width to break lines in this paragraph
|
||||
*
|
||||
@ -754,244 +736,6 @@ public class XSLFTextParagraph implements Iterable<XSLFTextRun>{
|
||||
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(){
|
||||
CTPlaceholder ph = _shape.getCTPlaceholder();
|
||||
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
|
||||
XSLFSheet masterSheet = _shape.getSheet();
|
||||
while (masterSheet.getMasterSheet() != null){
|
||||
masterSheet = masterSheet.getMasterSheet();
|
||||
masterSheet = (XSLFSheet)masterSheet.getMasterSheet();
|
||||
}
|
||||
|
||||
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.text.AttributedString;
|
||||
|
||||
import org.apache.poi.sl.usermodel.TextRun;
|
||||
import org.apache.poi.util.Beta;
|
||||
import org.apache.poi.xslf.model.CharacterPropertyFetcher;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun;
|
||||
@ -45,7 +46,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.CTPlaceholder;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public class XSLFTextRun {
|
||||
public class XSLFTextRun implements TextRun {
|
||||
private final CTRegularTextRun _r;
|
||||
private final XSLFTextParagraph _p;
|
||||
|
||||
|
@ -23,26 +23,20 @@ import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.geom.Rectangle2D;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.*;
|
||||
|
||||
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.Units;
|
||||
import org.apache.poi.xslf.model.PropertyFetcher;
|
||||
import org.apache.poi.xslf.model.TextBodyPropertyFetcher;
|
||||
import org.apache.xmlbeans.XmlObject;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
||||
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;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.*;
|
||||
|
||||
/**
|
||||
* Represents a shape that can hold text.
|
||||
@ -50,7 +44,7 @@ import org.openxmlformats.schemas.presentationml.x2006.main.STPlaceholderType;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
@Beta
|
||||
public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<XSLFTextParagraph>{
|
||||
public abstract class XSLFTextShape extends XSLFSimpleShape implements TextShape {
|
||||
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
|
||||
@ -453,6 +453,9 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<
|
||||
// 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();
|
||||
DrawFactory fact = DrawFactory.getInstance(graphics);
|
||||
fact.getDrawable(this);
|
||||
|
||||
breakText(graphics);
|
||||
return drawParagraphs(graphics, 0, 0);
|
||||
}
|
||||
@ -475,121 +478,6 @@ public abstract class XSLFTextShape extends XSLFSimpleShape implements Iterable<
|
||||
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
|
||||
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;
|
||||
|
||||
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.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType;
|
||||
@ -270,12 +274,12 @@ public class TestXSLFAutoShape extends TestCase {
|
||||
XSLFSlide slide = ppt.createSlide();
|
||||
|
||||
XSLFAutoShape shape = slide.createAutoShape();
|
||||
assertEquals(XSLFShapeType.RECT, shape.getShapeType());
|
||||
assertEquals(ShapeType.RECT, shape.getShapeType());
|
||||
|
||||
shape.setShapeType(XSLFShapeType.TRIANGLE);
|
||||
assertEquals(XSLFShapeType.TRIANGLE, shape.getShapeType());
|
||||
shape.setShapeType(ShapeType.TRIANGLE);
|
||||
assertEquals(ShapeType.TRIANGLE, shape.getShapeType());
|
||||
|
||||
for(XSLFShapeType tp : XSLFShapeType.values()) {
|
||||
for(ShapeType tp : ShapeType.values()) {
|
||||
shape.setShapeType(tp);
|
||||
assertEquals(tp, shape.getShapeType());
|
||||
}
|
||||
|
@ -17,6 +17,8 @@
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.sl.usermodel.ShapeType;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.*;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTConnector;
|
||||
|
||||
@ -112,12 +114,12 @@ public class TestXSLFConnectorShape extends TestCase {
|
||||
XSLFSlide slide = pptx.createSlide();
|
||||
|
||||
XSLFAutoShape rect1 = slide.createAutoShape();
|
||||
rect1.setShapeType(XSLFShapeType.RECT);
|
||||
rect1.setShapeType(ShapeType.RECT);
|
||||
rect1.setAnchor(new Rectangle(100, 100, 100, 100));
|
||||
rect1.setFillColor(Color.blue);
|
||||
|
||||
XSLFAutoShape rect2 = slide.createAutoShape();
|
||||
rect2.setShapeType(XSLFShapeType.RECT);
|
||||
rect2.setShapeType(ShapeType.RECT);
|
||||
rect2.setAnchor(new Rectangle(300, 300, 100, 100));
|
||||
rect2.setFillColor(Color.red);
|
||||
|
||||
|
@ -20,6 +20,8 @@ import java.awt.Color;
|
||||
|
||||
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.xslf.XSLFTestDataSamples;
|
||||
import org.openxmlformats.schemas.drawingml.x2006.main.CTEffectStyleItem;
|
||||
|
@ -17,6 +17,8 @@
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
import junit.framework.TestCase;
|
||||
|
||||
import org.apache.poi.sl.usermodel.VerticalAlignment;
|
||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||
import org.openxmlformats.schemas.presentationml.x2006.main.CTGraphicalObjectFrame;
|
||||
|
||||
|
@ -17,6 +17,9 @@
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
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.POILogger;
|
||||
import org.apache.poi.xslf.XSLFTestDataSamples;
|
||||
|
@ -17,6 +17,9 @@
|
||||
package org.apache.poi.xslf.usermodel;
|
||||
|
||||
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.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties;
|
||||
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.Record;
|
||||
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.StringUtil;
|
||||
|
||||
@ -63,7 +65,7 @@ public final class ActiveXShape extends Picture {
|
||||
* this picture in the <code>Slide</code>
|
||||
* @param parent the parent shape of this picture
|
||||
*/
|
||||
protected ActiveXShape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected ActiveXShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
@ -78,7 +80,7 @@ public final class ActiveXShape extends Picture {
|
||||
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||
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.LINESTYLE__COLOR, 0x8000001);
|
||||
setEscherProperty(EscherProperties.LINESTYLE__NOLINEDRAWDASH, 0x80008);
|
||||
|
@ -18,6 +18,8 @@
|
||||
package org.apache.poi.hslf.model;
|
||||
|
||||
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 java.awt.geom.Rectangle2D;
|
||||
@ -33,20 +35,20 @@ import java.awt.geom.Rectangle2D;
|
||||
*/
|
||||
public class AutoShape extends TextShape {
|
||||
|
||||
protected AutoShape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected AutoShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
public AutoShape(int type, Shape parent){
|
||||
public AutoShape(ShapeType type, ShapeContainer<Shape> parent){
|
||||
super(null, parent);
|
||||
_escherContainer = createSpContainer(type, parent instanceof ShapeGroup);
|
||||
}
|
||||
|
||||
public AutoShape(int type){
|
||||
public AutoShape(ShapeType type){
|
||||
this(type, null);
|
||||
}
|
||||
|
||||
protected EscherContainerRecord createSpContainer(int shapeType, boolean isChild){
|
||||
protected EscherContainerRecord createSpContainer(ShapeType shapeType, boolean isChild){
|
||||
_escherContainer = super.createSpContainer(isChild);
|
||||
|
||||
setShapeType(shapeType);
|
||||
@ -110,7 +112,7 @@ public class AutoShape extends TextShape {
|
||||
ShapeOutline outline = AutoShapes.getShapeOutline(getShapeType());
|
||||
Rectangle2D anchor = getLogicalAnchor2D();
|
||||
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;
|
||||
}
|
||||
java.awt.Shape shape = outline.getOutline(this);
|
||||
|
@ -26,6 +26,7 @@ import java.awt.geom.Rectangle2D;
|
||||
import java.awt.geom.RoundRectangle2D;
|
||||
|
||||
import org.apache.poi.ddf.EscherProperties;
|
||||
import org.apache.poi.sl.usermodel.ShapeType;
|
||||
|
||||
/**
|
||||
* Stores definition of auto-shapes.
|
||||
@ -45,8 +46,8 @@ public final class AutoShapes {
|
||||
*
|
||||
* @return the shape outline
|
||||
*/
|
||||
public static ShapeOutline getShapeOutline(int type){
|
||||
ShapeOutline outline = shapes[type];
|
||||
public static ShapeOutline getShapeOutline(ShapeType type){
|
||||
ShapeOutline outline = shapes[type.nativeId];
|
||||
return outline;
|
||||
}
|
||||
|
||||
@ -68,14 +69,14 @@ public final class AutoShapes {
|
||||
static {
|
||||
shapes = new ShapeOutline[255];
|
||||
|
||||
shapes[ShapeTypes.Rectangle] = new ShapeOutline(){
|
||||
shapes[ShapeType.RECT.nativeId] = new ShapeOutline(){
|
||||
public java.awt.Shape getOutline(Shape shape){
|
||||
Rectangle2D path = new Rectangle2D.Float(0, 0, 21600, 21600);
|
||||
return path;
|
||||
}
|
||||
};
|
||||
|
||||
shapes[ShapeTypes.RoundRectangle] = new ShapeOutline(){
|
||||
shapes[ShapeType.ROUND_RECT.nativeId] = new ShapeOutline(){
|
||||
public java.awt.Shape getOutline(Shape shape){
|
||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 5400);
|
||||
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){
|
||||
Ellipse2D path = new Ellipse2D.Float(0, 0, 21600, 21600);
|
||||
return path;
|
||||
}
|
||||
};
|
||||
|
||||
shapes[ShapeTypes.Diamond] = new ShapeOutline(){
|
||||
shapes[ShapeType.DIAMOND.nativeId] = new ShapeOutline(){
|
||||
public java.awt.Shape getOutline(Shape shape){
|
||||
GeneralPath path = new GeneralPath();
|
||||
path.moveTo(10800, 0);
|
||||
@ -103,7 +104,7 @@ public final class AutoShapes {
|
||||
};
|
||||
|
||||
//m@0,l,21600r21600
|
||||
shapes[ShapeTypes.IsocelesTriangle] = new ShapeOutline(){
|
||||
shapes[ShapeType.TRIANGLE.nativeId] = new ShapeOutline(){
|
||||
public java.awt.Shape getOutline(Shape shape){
|
||||
int adjval = shape.getEscherProperty(EscherProperties.GEOMETRY__ADJUSTVALUE, 10800);
|
||||
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){
|
||||
GeneralPath path = new GeneralPath();
|
||||
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){
|
||||
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){
|
||||
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){
|
||||
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){
|
||||
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){
|
||||
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){
|
||||
|
||||
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){
|
||||
//m0@0 l@1@0 @1,0 @2,0 @2@0,21600@0,10800,21600xe
|
||||
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){
|
||||
//m0@0 l@1@0 @1,21600@2,21600@2@0,21600@0,10800,xe
|
||||
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){
|
||||
//m@0, l@0@1 ,0@1,0@2@0@2@0,21600,21600,10800xe
|
||||
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){
|
||||
//m@0, l@0@1,21600@1,21600@2@0@2@0,21600,,10800xe
|
||||
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){
|
||||
//m10800,qx0@1l0@2qy10800,21600,21600@2l21600@1qy10800,xem0@1qy10800@0,21600@1nfe
|
||||
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){
|
||||
//m21600,qx10800@0l10800@2qy0@11,10800@3l10800@1qy21600,21600e
|
||||
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){
|
||||
//m,qx10800@0 l10800@2qy21600@11,10800@3l10800@1qy,21600e
|
||||
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){
|
||||
return new Line2D.Float(0, 0, 21600, 21600);
|
||||
}
|
||||
|
@ -17,16 +17,22 @@
|
||||
|
||||
package org.apache.poi.hslf.model;
|
||||
|
||||
import org.apache.poi.ddf.EscherContainerRecord;
|
||||
import org.apache.poi.hslf.usermodel.PictureData;
|
||||
import org.apache.poi.hslf.blip.Bitmap;
|
||||
import org.apache.poi.util.POILogger;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
import java.awt.*;
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.Image;
|
||||
import java.awt.Rectangle;
|
||||
import java.awt.image.BufferedImage;
|
||||
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
|
||||
*
|
||||
@ -34,7 +40,7 @@ import java.io.ByteArrayInputStream;
|
||||
*/
|
||||
public final class Background extends Shape {
|
||||
|
||||
protected Background(EscherContainerRecord escherRecord, Shape parent) {
|
||||
protected Background(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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.EscherProperties;
|
||||
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.POILogger;
|
||||
|
||||
@ -60,7 +62,7 @@ public final class Freeform extends AutoShape {
|
||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||
* @param parent the parent of the shape
|
||||
*/
|
||||
protected Freeform(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected Freeform(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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
|
||||
* in a table then the parent is Table.
|
||||
*/
|
||||
public Freeform(Shape parent){
|
||||
super(null, parent);
|
||||
_escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);
|
||||
public Freeform(ShapeContainer<Shape> parent){
|
||||
super((EscherContainerRecord)null, parent);
|
||||
_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
|
||||
*/
|
||||
protected static Hyperlink[] find(TextRun run){
|
||||
ArrayList lst = new ArrayList();
|
||||
List<Hyperlink> lst = new ArrayList<Hyperlink>();
|
||||
SlideShow ppt = run.getSheet().getSlideShow();
|
||||
//document-level container which stores info about all links in a presentation
|
||||
ExObjList exobj = ppt.getDocumentRecord().getExObjList();
|
||||
@ -177,7 +177,7 @@ public final class Hyperlink {
|
||||
* @return found hyperlink or <code>null</code>
|
||||
*/
|
||||
protected static Hyperlink find(Shape shape){
|
||||
ArrayList lst = new ArrayList();
|
||||
List<Hyperlink> lst = new ArrayList<Hyperlink>();
|
||||
SlideShow ppt = shape.getSheet().getSlideShow();
|
||||
//document-level container which stores info about all links in a presentation
|
||||
ExObjList exobj = ppt.getDocumentRecord().getExObjList();
|
||||
@ -198,7 +198,7 @@ public final class Hyperlink {
|
||||
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++) {
|
||||
//see if we have InteractiveInfo in the textrun's records
|
||||
if( records[i] instanceof InteractiveInfo){
|
||||
|
@ -18,6 +18,8 @@
|
||||
package org.apache.poi.hslf.model;
|
||||
|
||||
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.Line2D;
|
||||
@ -95,11 +97,11 @@ public final class Line extends SimpleShape {
|
||||
public static final int LINE_TRIPLE = 4;
|
||||
|
||||
|
||||
protected Line(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected Line(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
public Line(Shape parent){
|
||||
public Line(ShapeContainer<Shape> parent){
|
||||
super(null, parent);
|
||||
_escherContainer = createSpContainer(parent instanceof ShapeGroup);
|
||||
}
|
||||
@ -112,7 +114,7 @@ public final class Line extends SimpleShape {
|
||||
_escherContainer = super.createSpContainer(isChild);
|
||||
|
||||
EscherSpRecord spRecord = _escherContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||
short type = (ShapeTypes.Line << 4) | 0x2;
|
||||
short type = (short)((ShapeType.LINE.nativeId << 4) | 0x2);
|
||||
spRecord.setOptions(type);
|
||||
|
||||
//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.record.*;
|
||||
import org.apache.poi.hslf.usermodel.SlideShow;
|
||||
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||
|
||||
/**
|
||||
* 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 parent the parent shape
|
||||
*/
|
||||
public MovieShape(int movieIdx, int idx, Shape parent) {
|
||||
public MovieShape(int movieIdx, int idx, ShapeContainer<Shape> parent) {
|
||||
super(idx, parent);
|
||||
setMovieIndex(movieIdx);
|
||||
}
|
||||
@ -66,7 +67,7 @@ public final class MovieShape extends Picture {
|
||||
* this picture in the <code>Slide</code>
|
||||
* @param parent the parent shape of this picture
|
||||
*/
|
||||
protected MovieShape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected MovieShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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.ExEmbed;
|
||||
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.POILogger;
|
||||
|
||||
@ -51,7 +52,7 @@ public final class OLEShape extends Picture {
|
||||
* @param idx the index of the picture
|
||||
* @param parent the parent shape
|
||||
*/
|
||||
public OLEShape(int idx, Shape parent) {
|
||||
public OLEShape(int idx, ShapeContainer<Shape> parent) {
|
||||
super(idx, parent);
|
||||
}
|
||||
|
||||
@ -62,7 +63,7 @@ public final class OLEShape extends Picture {
|
||||
* this picture in the <code>Slide</code>
|
||||
* @param parent the parent shape of this picture
|
||||
*/
|
||||
protected OLEShape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected OLEShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
|
@ -1456,7 +1456,7 @@ public final class PPGraphics2D extends Graphics2D implements Cloneable {
|
||||
* @param hints the rendering hints to be set
|
||||
* @see RenderingHints
|
||||
*/
|
||||
public void addRenderingHints(Map hints){
|
||||
public void addRenderingHints(Map<?,?> 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
|
||||
* @see RenderingHints
|
||||
*/
|
||||
public void setRenderingHints(Map hints){
|
||||
this._hints = new RenderingHints(hints);
|
||||
public void setRenderingHints(Map<?,?> 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.usermodel.PictureData;
|
||||
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.StringUtil;
|
||||
import org.apache.poi.util.Units;
|
||||
@ -96,7 +98,7 @@ public class Picture extends SimpleShape {
|
||||
* @param idx the index of the picture
|
||||
* @param parent the parent shape
|
||||
*/
|
||||
public Picture(int idx, Shape parent) {
|
||||
public Picture(int idx, ShapeContainer<Shape> parent) {
|
||||
super(null, parent);
|
||||
_escherContainer = createSpContainer(idx, parent instanceof ShapeGroup);
|
||||
}
|
||||
@ -108,7 +110,7 @@ public class Picture extends SimpleShape {
|
||||
* this picture in the <code>Slide</code>
|
||||
* @param parent the parent shape of this picture
|
||||
*/
|
||||
protected Picture(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected Picture(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
@ -136,7 +138,7 @@ public class Picture extends SimpleShape {
|
||||
_escherContainer.setOptions((short)15);
|
||||
|
||||
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
|
||||
EscherOptRecord opt = getEscherOptRecord();
|
||||
@ -295,6 +297,6 @@ public class Picture extends SimpleShape {
|
||||
EscherSimpleProperty prop = getEscherProperty(opt, propertyId);
|
||||
if (prop == null) return 0;
|
||||
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.hslf.record.OEPlaceholderAtom;
|
||||
import org.apache.poi.hslf.exceptions.HSLFException;
|
||||
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||
|
||||
import java.io.ByteArrayOutputStream;
|
||||
|
||||
@ -30,11 +31,11 @@ import java.io.ByteArrayOutputStream;
|
||||
*/
|
||||
public final class Placeholder extends TextBox {
|
||||
|
||||
protected Placeholder(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected Placeholder(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
public Placeholder(Shape parent){
|
||||
public Placeholder(ShapeContainer<Shape> parent){
|
||||
super(parent);
|
||||
}
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
package org.apache.poi.hslf.model;
|
||||
|
||||
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 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 parent the parent of the shape
|
||||
*/
|
||||
protected Polygon(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected Polygon(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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
|
||||
* in a table then the parent is Table.
|
||||
*/
|
||||
public Polygon(Shape parent){
|
||||
super(null, parent);
|
||||
_escherContainer = createSpContainer(ShapeTypes.NotPrimitive, parent instanceof ShapeGroup);
|
||||
public Polygon(ShapeContainer<Shape> parent){
|
||||
super((EscherContainerRecord)null, parent);
|
||||
_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.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.POILogFactory;
|
||||
import org.apache.poi.util.Units;
|
||||
@ -43,7 +45,7 @@ import java.awt.geom.Rectangle2D;
|
||||
*
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
public abstract class Shape {
|
||||
public abstract class Shape implements org.apache.poi.sl.usermodel.Shape<Shape> {
|
||||
|
||||
// For logging
|
||||
protected POILogger logger = POILogFactory.getLogger(this.getClass());
|
||||
@ -83,7 +85,7 @@ public abstract class Shape {
|
||||
* Parent of this shape.
|
||||
* <code>null</code> for the topmost shapes.
|
||||
*/
|
||||
protected Shape _parent;
|
||||
protected ShapeContainer<Shape> _parent;
|
||||
|
||||
/**
|
||||
* 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 parent the parent of this Shape
|
||||
*/
|
||||
protected Shape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected Shape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
_escherContainer = escherRecord;
|
||||
_parent = parent;
|
||||
}
|
||||
@ -114,7 +116,7 @@ public abstract class Shape {
|
||||
/**
|
||||
* @return the parent of this shape
|
||||
*/
|
||||
public Shape getParent(){
|
||||
public ShapeContainer<Shape> getParent(){
|
||||
return _parent;
|
||||
}
|
||||
|
||||
@ -122,25 +124,25 @@ public abstract class Shape {
|
||||
* @return name of the shape.
|
||||
*/
|
||||
public String getShapeName(){
|
||||
return ShapeTypes.typeName(getShapeType());
|
||||
return getShapeType().nativeName;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return type of the shape.
|
||||
* @see org.apache.poi.hslf.record.RecordTypes
|
||||
*/
|
||||
public int getShapeType(){
|
||||
public ShapeType getShapeType(){
|
||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||
return spRecord.getShapeType();
|
||||
return ShapeType.forId(spRecord.getShapeType(), false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param type type of the shape.
|
||||
* @see org.apache.poi.hslf.record.RecordTypes
|
||||
*/
|
||||
public void setShapeType(int type){
|
||||
public void setShapeType(ShapeType type){
|
||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||
spRecord.setShapeType( (short) type );
|
||||
spRecord.setShapeType( (short) type.nativeId );
|
||||
spRecord.setVersion( (short) 0x2 );
|
||||
}
|
||||
|
||||
@ -395,7 +397,7 @@ public abstract class Shape {
|
||||
EscherSimpleProperty op = getEscherProperty(opt, opacityProperty);
|
||||
int defaultOpacity = 0x00010000;
|
||||
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);
|
||||
}
|
||||
|
||||
@ -456,7 +458,7 @@ public abstract class Shape {
|
||||
* @return the hyperlink assigned to this shape
|
||||
* or <code>null</code> if not found.
|
||||
*/
|
||||
public Hyperlink getHyperlink(){
|
||||
public Hyperlink getHyperlink(){
|
||||
return Hyperlink.find(this);
|
||||
}
|
||||
|
||||
@ -477,44 +479,47 @@ public abstract class Shape {
|
||||
return getEscherChild(EscherOptRecord.RECORD_ID);
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the shape is horizontally flipped
|
||||
*
|
||||
* @return whether the shape is horizontally flipped
|
||||
*/
|
||||
public boolean getFlipHorizontal(){
|
||||
@Override
|
||||
public boolean getFlipHorizontal(){
|
||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||
return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPHORIZ) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Whether the shape is vertically flipped
|
||||
*
|
||||
* @return whether the shape is vertically flipped
|
||||
*/
|
||||
@Override
|
||||
public void setFlipHorizontal(boolean flip) {
|
||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||
int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPHORIZ;
|
||||
spRecord.setFlags(flag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean getFlipVertical(){
|
||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||
return (spRecord.getFlags()& EscherSpRecord.FLAG_FLIPVERT) != 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotation angle in degrees
|
||||
*
|
||||
* @return rotation angle in degrees
|
||||
*/
|
||||
public int getRotation(){
|
||||
int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION);
|
||||
int angle = (rot >> 16) % 360;
|
||||
@Override
|
||||
public void setFlipVertical(boolean flip) {
|
||||
EscherSpRecord spRecord = getEscherChild(EscherSpRecord.RECORD_ID);
|
||||
int flag = spRecord.getFlags() | EscherSpRecord.FLAG_FLIPVERT;
|
||||
spRecord.setFlags(flag);
|
||||
}
|
||||
|
||||
@Override
|
||||
public double getRotation(){
|
||||
int rot = getEscherProperty(EscherProperties.TRANSFORM__ROTATION);
|
||||
double angle = Units.fixedPointToDouble(rot) % 360.0;
|
||||
return angle;
|
||||
}
|
||||
|
||||
/**
|
||||
* Rotate this shape
|
||||
*
|
||||
* @param theta the rotation angle in degrees
|
||||
*/
|
||||
public void setRotation(int theta){
|
||||
setEscherProperty(EscherProperties.TRANSFORM__ROTATION, (theta << 16));
|
||||
@Override
|
||||
public void setRotation(double theta){
|
||||
int rot = Units.doubleToFixedPoint(theta % 360.0);
|
||||
setEscherProperty(EscherProperties.TRANSFORM__ROTATION, rot);
|
||||
}
|
||||
|
||||
@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.Record;
|
||||
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.POILogger;
|
||||
|
||||
@ -49,14 +51,14 @@ public final class ShapeFactory {
|
||||
/**
|
||||
* 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){
|
||||
return createShapeGroup(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;
|
||||
EscherRecord opt = Shape.getEscherChild((EscherContainerRecord)spContainer.getChild(0), (short)0xF122);
|
||||
if(opt != null){
|
||||
@ -80,17 +82,17 @@ public final class ShapeFactory {
|
||||
return group;
|
||||
}
|
||||
|
||||
public static Shape createSimpeShape(EscherContainerRecord spContainer, Shape parent){
|
||||
public static Shape createSimpeShape(EscherContainerRecord spContainer, ShapeContainer<Shape> parent){
|
||||
Shape shape = null;
|
||||
EscherSpRecord spRecord = spContainer.getChildById(EscherSpRecord.RECORD_ID);
|
||||
|
||||
int type = spRecord.getShapeType();
|
||||
ShapeType type = ShapeType.forId(spRecord.getShapeType(), false);
|
||||
switch (type){
|
||||
case ShapeTypes.TextBox:
|
||||
case TEXT_BOX:
|
||||
shape = new TextBox(spContainer, parent);
|
||||
break;
|
||||
case ShapeTypes.HostControl:
|
||||
case ShapeTypes.PictureFrame: {
|
||||
case HOST_CONTROL:
|
||||
case FRAME: {
|
||||
InteractiveInfo info = getClientDataRecord(spContainer, RecordTypes.InteractiveInfo.typeID);
|
||||
OEShapeAtom oes = getClientDataRecord(spContainer, RecordTypes.OEShapeAtom.typeID);
|
||||
if(info != null && info.getInteractiveInfoAtom() != null){
|
||||
@ -111,10 +113,10 @@ public final class ShapeFactory {
|
||||
if(shape == null) shape = new Picture(spContainer, parent);
|
||||
break;
|
||||
}
|
||||
case ShapeTypes.Line:
|
||||
case LINE:
|
||||
shape = new Line(spContainer, parent);
|
||||
break;
|
||||
case ShapeTypes.NotPrimitive: {
|
||||
case NOT_PRIMITIVE: {
|
||||
EscherOptRecord opt = Shape.getEscherChild(spContainer, EscherOptRecord.RECORD_ID);
|
||||
EscherProperty prop = Shape.getEscherProperty(opt, EscherProperties.GEOMETRY__VERTICES);
|
||||
if(prop != null)
|
||||
|
@ -30,6 +30,8 @@ import org.apache.poi.ddf.EscherContainerRecord;
|
||||
import org.apache.poi.ddf.EscherRecord;
|
||||
import org.apache.poi.ddf.EscherSpRecord;
|
||||
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.POILogger;
|
||||
|
||||
@ -38,7 +40,7 @@ import org.apache.poi.util.POILogger;
|
||||
*
|
||||
* @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.
|
||||
@ -55,7 +57,7 @@ public class ShapeGroup extends Shape{
|
||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||
* @param parent the parent of the shape
|
||||
*/
|
||||
protected ShapeGroup(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected ShapeGroup(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
@ -63,31 +65,7 @@ public class ShapeGroup extends Shape{
|
||||
* @return the shapes contained in this group container
|
||||
*/
|
||||
public Shape[] getShapes() {
|
||||
// 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());
|
||||
}
|
||||
}
|
||||
|
||||
// Put the shapes into an array, and return
|
||||
List<Shape> shapeList = getShapeList();
|
||||
Shape[] shapes = shapeList.toArray(new Shape[shapeList.size()]);
|
||||
return shapes;
|
||||
}
|
||||
@ -179,7 +157,7 @@ public class ShapeGroup extends Shape{
|
||||
spcont.addChildRecord(spg);
|
||||
|
||||
EscherSpRecord sp = new EscherSpRecord();
|
||||
short type = (ShapeTypes.NotPrimitive << 4) + 2;
|
||||
short type = (short)((ShapeType.NOT_PRIMITIVE.nativeId << 4) + 2);
|
||||
sp.setOptions(type);
|
||||
sp.setFlags(EscherSpRecord.FLAG_HAVEANCHOR | EscherSpRecord.FLAG_GROUP);
|
||||
spcont.addChildRecord(sp);
|
||||
@ -260,9 +238,10 @@ public class ShapeGroup extends Shape{
|
||||
*
|
||||
* @return type of the shape.
|
||||
*/
|
||||
public int getShapeType(){
|
||||
public ShapeType getShapeType(){
|
||||
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);
|
||||
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.TextSpecInfoAtom;
|
||||
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.POILogger;
|
||||
|
||||
@ -56,7 +57,7 @@ import org.apache.poi.util.POILogger;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
|
||||
public abstract class Sheet {
|
||||
public abstract class Sheet implements ShapeContainer<Shape> {
|
||||
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)
|
||||
*/
|
||||
public Shape[] getShapes() {
|
||||
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> 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()]);
|
||||
List<Shape> shapeList = getShapeList();
|
||||
return shapeList.toArray(new Shape[shapeList.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.InteractiveInfoAtom;
|
||||
import org.apache.poi.hslf.record.Record;
|
||||
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||
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 parent the parent of the shape
|
||||
*/
|
||||
protected SimpleShape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected SimpleShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent){
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
@ -191,7 +192,7 @@ public abstract class SimpleShape extends Shape {
|
||||
*
|
||||
* @return style of the line.
|
||||
*/
|
||||
public int getLineStyle(){
|
||||
public int getStrokeStyle(){
|
||||
EscherOptRecord opt = getEscherOptRecord();
|
||||
EscherSimpleProperty prop = getEscherProperty(opt, EscherProperties.LINESTYLE__LINESTYLE);
|
||||
return prop == null ? Line.LINE_SIMPLE : prop.getPropertyValue();
|
||||
@ -221,10 +222,12 @@ public abstract class SimpleShape extends Shape {
|
||||
Rectangle2D anchor = getAnchor2D();
|
||||
|
||||
//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>();
|
||||
for (Shape top=this; (top = top.getParent()) != null; ) {
|
||||
lst.add(0, (ShapeGroup)top);
|
||||
for (ShapeContainer<Shape> parent=this.getParent();
|
||||
parent instanceof ShapeGroup;
|
||||
parent = ((ShapeGroup)parent).getParent()) {
|
||||
lst.add(0, (ShapeGroup)parent);
|
||||
}
|
||||
|
||||
AffineTransform tx = new AffineTransform();
|
||||
@ -243,8 +246,8 @@ public abstract class SimpleShape extends Shape {
|
||||
anchor = tx.createTransformedShape(anchor).getBounds2D();
|
||||
}
|
||||
|
||||
int angle = getRotation();
|
||||
if(angle != 0){
|
||||
double angle = getRotation();
|
||||
if(angle != 0.){
|
||||
double centerX = anchor.getX() + anchor.getWidth()/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.SSSlideInfoAtom;
|
||||
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.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
|
||||
@ -47,8 +48,7 @@ import org.apache.poi.hslf.record.SlideListWithText.SlideAtomsSet;
|
||||
* @author Yegor Kozlov
|
||||
*/
|
||||
|
||||
public final class Slide extends Sheet
|
||||
{
|
||||
public final class Slide extends Sheet {
|
||||
private int _slideNo;
|
||||
private SlideAtomsSet _atomSet;
|
||||
private TextRun[] _runs;
|
||||
@ -180,7 +180,7 @@ public final class Slide extends Sheet
|
||||
*/
|
||||
public TextBox addTitle() {
|
||||
Placeholder pl = new Placeholder();
|
||||
pl.setShapeType(ShapeTypes.Rectangle);
|
||||
pl.setShapeType(ShapeType.RECT);
|
||||
pl.getTextRun().setRunType(TextHeaderAtom.TITLE_TYPE);
|
||||
pl.setText("Click to edit title");
|
||||
pl.setAnchor(new java.awt.Rectangle(54, 48, 612, 90));
|
||||
|
@ -18,6 +18,7 @@
|
||||
package org.apache.poi.hslf.model;
|
||||
|
||||
import org.apache.poi.ddf.*;
|
||||
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||
import org.apache.poi.util.LittleEndian;
|
||||
|
||||
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 parent the parent of the shape
|
||||
*/
|
||||
public Table(EscherContainerRecord escherRecord, Shape parent) {
|
||||
public Table(EscherContainerRecord escherRecord, ShapeContainer<Shape> parent) {
|
||||
super(escherRecord, parent);
|
||||
}
|
||||
|
||||
@ -125,7 +126,7 @@ public final class Table extends ShapeGroup {
|
||||
TableCell cell = cells[i][0];
|
||||
int rowHeight = cell.getAnchor().height*MASTER_DPI/POINT_DPI;
|
||||
byte[] val = new byte[4];
|
||||
LittleEndian.putInt(val, rowHeight);
|
||||
LittleEndian.putInt(val, 0, rowHeight);
|
||||
p.setElement(i, val);
|
||||
for (int j = 0; j < cells[i].length; j++) {
|
||||
TableCell c = cells[i][j];
|
||||
@ -149,11 +150,11 @@ public final class Table extends ShapeGroup {
|
||||
}
|
||||
|
||||
protected void initTable(){
|
||||
Shape[] sh = getShapes();
|
||||
Arrays.sort(sh, new Comparator(){
|
||||
public int compare( Object o1, Object o2 ) {
|
||||
Rectangle anchor1 = ((Shape)o1).getAnchor();
|
||||
Rectangle anchor2 = ((Shape)o2).getAnchor();
|
||||
List<Shape> shapeList = getShapeList();
|
||||
Collections.sort(shapeList, new Comparator<Shape>(){
|
||||
public int compare( Shape o1, Shape o2 ) {
|
||||
Rectangle anchor1 = o1.getAnchor();
|
||||
Rectangle anchor2 = o2.getAnchor();
|
||||
int delta = anchor1.y - anchor2.y;
|
||||
if(delta == 0) delta = anchor1.x - anchor2.x;
|
||||
return delta;
|
||||
@ -161,23 +162,23 @@ public final class Table extends ShapeGroup {
|
||||
});
|
||||
int y0 = -1;
|
||||
int maxrowlen = 0;
|
||||
ArrayList lst = new ArrayList();
|
||||
ArrayList row = null;
|
||||
for (int i = 0; i < sh.length; i++) {
|
||||
if(sh[i] instanceof TextShape){
|
||||
Rectangle anchor = sh[i].getAnchor();
|
||||
List<List<Shape>> lst = new ArrayList<List<Shape>>();
|
||||
List<Shape> row = null;
|
||||
for (Shape sh : shapeList) {
|
||||
if(sh instanceof TextShape){
|
||||
Rectangle anchor = sh.getAnchor();
|
||||
if(anchor.y != y0){
|
||||
y0 = anchor.y;
|
||||
row = new ArrayList();
|
||||
row = new ArrayList<Shape>();
|
||||
lst.add(row);
|
||||
}
|
||||
row.add(sh[i]);
|
||||
row.add(sh);
|
||||
maxrowlen = Math.max(maxrowlen, row.size());
|
||||
}
|
||||
}
|
||||
cells = new TableCell[lst.size()][maxrowlen];
|
||||
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++) {
|
||||
TextShape tx = (TextShape)row.get(j);
|
||||
cells[i][j] = new TableCell(tx.getSpContainer(), getParent());
|
||||
@ -318,7 +319,7 @@ public final class Table extends ShapeGroup {
|
||||
private Line cloneBorder(Line line){
|
||||
Line border = createBorder();
|
||||
border.setLineWidth(line.getLineWidth());
|
||||
border.setLineStyle(line.getLineStyle());
|
||||
border.setLineStyle(line.getStrokeStyle());
|
||||
border.setLineDashing(line.getLineDashing());
|
||||
border.setLineColor(line.getLineColor());
|
||||
return border;
|
||||
|
@ -17,9 +17,13 @@
|
||||
|
||||
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
|
||||
@ -38,10 +42,10 @@ public final class TableCell extends TextBox {
|
||||
/**
|
||||
* 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
|
||||
*/
|
||||
protected TableCell(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected TableCell(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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
|
||||
* in a table then the parent is Table.
|
||||
*/
|
||||
public TableCell(Shape parent){
|
||||
public TableCell(ShapeContainer<Shape> parent){
|
||||
super(parent);
|
||||
|
||||
setShapeType(ShapeTypes.Rectangle);
|
||||
setShapeType(ShapeType.RECT);
|
||||
//_txtrun.setRunType(TextHeaderAtom.HALF_BODY_TYPE);
|
||||
//_txtrun.getRichTextRuns()[0].setFlag(false, 0, false);
|
||||
}
|
||||
|
@ -18,6 +18,8 @@
|
||||
package org.apache.poi.hslf.model;
|
||||
|
||||
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.
|
||||
@ -36,7 +38,7 @@ public class TextBox extends TextShape {
|
||||
* @param escherRecord <code>EscherSpContainer</code> container which holds information about this shape
|
||||
* @param parent the parent of the shape
|
||||
*/
|
||||
protected TextBox(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected TextBox(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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
|
||||
* in a table then the parent is Table.
|
||||
*/
|
||||
public TextBox(Shape parent){
|
||||
public TextBox(ShapeContainer<Shape> parent){
|
||||
super(parent);
|
||||
}
|
||||
|
||||
@ -67,7 +69,7 @@ public class TextBox extends TextShape {
|
||||
protected EscherContainerRecord createSpContainer(boolean isChild){
|
||||
_escherContainer = super.createSpContainer(isChild);
|
||||
|
||||
setShapeType(ShapeTypes.TextBox);
|
||||
setShapeType(ShapeType.TEXT_BOX);
|
||||
|
||||
//set default properties for a TextBox
|
||||
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.Record;
|
||||
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.TextBytesAtom;
|
||||
import org.apache.poi.hslf.record.TextCharsAtom;
|
||||
import org.apache.poi.hslf.record.TextHeaderAtom;
|
||||
import org.apache.poi.hslf.record.TxInteractiveInfoAtom;
|
||||
import org.apache.poi.hslf.usermodel.RichTextRun;
|
||||
import org.apache.poi.sl.usermodel.ShapeContainer;
|
||||
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 parent the parent of the shape
|
||||
*/
|
||||
protected TextShape(EscherContainerRecord escherRecord, Shape parent){
|
||||
protected TextShape(EscherContainerRecord escherRecord, ShapeContainer<Shape> 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
|
||||
* in a table then the parent is Table.
|
||||
*/
|
||||
public TextShape(Shape parent){
|
||||
public TextShape(ShapeContainer<Shape> parent){
|
||||
super(null, parent);
|
||||
_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.EscherTextboxRecord;
|
||||
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.POILogger;
|
||||
|
||||
@ -95,7 +95,7 @@ public final class PPDrawing extends RecordAtom {
|
||||
final DefaultEscherRecordFactory erf = new DefaultEscherRecordFactory();
|
||||
final List<EscherRecord> escherChildren = new ArrayList<EscherRecord>();
|
||||
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) {
|
||||
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
|
||||
final List<EscherTextboxWrapper> textboxes = new ArrayList<EscherTextboxWrapper>();
|
||||
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) {
|
||||
@ -131,7 +131,7 @@ public final class PPDrawing extends RecordAtom {
|
||||
found.add(w);
|
||||
}
|
||||
}
|
||||
return (EscherTextboxWrapper[]) found.toArray(new EscherTextboxWrapper[found.size()]);
|
||||
return found.toArray(new EscherTextboxWrapper[found.size()]);
|
||||
}
|
||||
private StyleTextProp9Atom findInSpContainer(final EscherContainerRecord spContainer) {
|
||||
final EscherContainerRecord escherContainerF011 = findFirstEscherContainerRecordOfType((short)0xf011, spContainer);
|
||||
@ -301,7 +301,7 @@ public final class PPDrawing extends RecordAtom {
|
||||
spContainer.addChildRecord(spgr);
|
||||
|
||||
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);
|
||||
spContainer.addChildRecord(sp);
|
||||
spgrContainer.addChildRecord(spContainer);
|
||||
@ -311,7 +311,7 @@ public final class PPDrawing extends RecordAtom {
|
||||
spContainer.setOptions((short)15);
|
||||
spContainer.setRecordId(EscherContainerRecord.SP_CONTAINER);
|
||||
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);
|
||||
spContainer.addChildRecord(sp);
|
||||
|
||||
@ -393,7 +393,7 @@ public final class PPDrawing extends RecordAtom {
|
||||
result.add(child);
|
||||
}
|
||||
}
|
||||
return (EscherContainerRecord[]) result.toArray(new EscherContainerRecord[result.size()]);
|
||||
return result.toArray(new EscherContainerRecord[result.size()]);
|
||||
}
|
||||
protected Record buildFromUnknownEscherRecord(UnknownEscherRecord unknown) {
|
||||
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 {
|
||||
NONE,
|
||||
SMALL,
|
||||
ALL
|
||||
public interface DrawFontManager {
|
||||
|
||||
/**
|
||||
* 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