git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1839255 13f79535-47bb-0310-9956-ffa450edef68tags/REL_4_0_0_FINAL
@@ -52,7 +52,7 @@ public abstract class XDDFColor { | |||
} | |||
@Internal | |||
protected static XDDFColor forColorContainer(CTColor container) { | |||
public static XDDFColor forColorContainer(CTColor container) { | |||
if (container.isSetHslClr()) { | |||
return new XDDFColorHsl(container.getHslClr(), container); | |||
} else if (container.isSetPrstClr()) { | |||
@@ -70,7 +70,7 @@ public abstract class XDDFColor { | |||
} | |||
@Internal | |||
protected CTColor getColorContainer() { | |||
public CTColor getColorContainer() { | |||
return container; | |||
} | |||
@@ -26,7 +26,7 @@ public class XDDFEffectContainer { | |||
private CTEffectContainer container; | |||
@Internal | |||
protected XDDFEffectContainer(CTEffectContainer container) { | |||
public XDDFEffectContainer(CTEffectContainer container) { | |||
this.container = container; | |||
} | |||
@@ -26,7 +26,7 @@ public class XDDFEffectList { | |||
private CTEffectList list; | |||
@Internal | |||
protected XDDFEffectList(CTEffectList list) { | |||
public XDDFEffectList(CTEffectList list) { | |||
this.list = list; | |||
} | |||
@@ -26,7 +26,7 @@ public class XDDFExtensionList { | |||
private CTOfficeArtExtensionList list; | |||
@Internal | |||
protected XDDFExtensionList(CTOfficeArtExtensionList list) { | |||
public XDDFExtensionList(CTOfficeArtExtensionList list) { | |||
this.list = list; | |||
} | |||
@@ -38,7 +38,7 @@ public class XDDFGradientFillProperties implements XDDFFillProperties { | |||
} | |||
@Internal | |||
protected CTGradientFillProperties getXmlObject() { | |||
public CTGradientFillProperties getXmlObject() { | |||
return props; | |||
} | |||
@@ -34,7 +34,7 @@ public class XDDFGroupFillProperties implements XDDFFillProperties { | |||
} | |||
@Internal | |||
protected CTGroupFillProperties getXmlObject() { | |||
public CTGroupFillProperties getXmlObject() { | |||
return props; | |||
} | |||
} |
@@ -34,12 +34,12 @@ public class XDDFLineProperties { | |||
} | |||
@Internal | |||
protected XDDFLineProperties(CTLineProperties properties) { | |||
public XDDFLineProperties(CTLineProperties properties) { | |||
this.props = properties; | |||
} | |||
@Internal | |||
protected CTLineProperties getXmlObject() { | |||
public CTLineProperties getXmlObject() { | |||
return props; | |||
} | |||
@@ -34,7 +34,7 @@ public class XDDFNoFillProperties implements XDDFFillProperties { | |||
} | |||
@Internal | |||
protected CTNoFillProperties getXmlObject() { | |||
public CTNoFillProperties getXmlObject() { | |||
return props; | |||
} | |||
} |
@@ -34,7 +34,7 @@ public class XDDFPatternFillProperties implements XDDFFillProperties { | |||
} | |||
@Internal | |||
protected CTPatternFillProperties getXmlObject() { | |||
public CTPatternFillProperties getXmlObject() { | |||
return props; | |||
} | |||
@@ -0,0 +1,37 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; | |||
@Beta | |||
public class XDDFPicture { | |||
private CTBlip blip; | |||
@Internal | |||
public XDDFPicture(CTBlip blip) { | |||
this.blip = blip; | |||
} | |||
@Internal | |||
public CTBlip getXmlObject() { | |||
return blip; | |||
} | |||
} |
@@ -19,7 +19,6 @@ package org.apache.poi.xddf.usermodel; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlip; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTBlipFillProperties; | |||
@Beta | |||
@@ -35,27 +34,23 @@ public class XDDFPictureFillProperties implements XDDFFillProperties { | |||
} | |||
@Internal | |||
protected CTBlipFillProperties getXmlObject() { | |||
public CTBlipFillProperties getXmlObject() { | |||
return props; | |||
} | |||
@Internal | |||
public CTBlip getCTBlip() { | |||
public XDDFPicture getPicture() { | |||
if (props.isSetBlip()) { | |||
return props.getBlip(); | |||
return new XDDFPicture(props.getBlip()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
@Internal | |||
public void setBlip(CTBlip blip) { | |||
if (blip == null) { | |||
if (props.isSetBlip()) { | |||
props.unsetBlip(); | |||
} | |||
public void setPicture(XDDFPicture picture) { | |||
if (picture == null) { | |||
props.unsetBlip(); | |||
} else { | |||
props.setBlip(blip); | |||
props.setBlip(picture.getXmlObject()); | |||
} | |||
} | |||
@@ -40,12 +40,13 @@ public class XDDFSolidFillProperties implements XDDFFillProperties { | |||
setColor(color); | |||
} | |||
protected XDDFSolidFillProperties(CTSolidColorFillProperties properties) { | |||
@Internal | |||
public XDDFSolidFillProperties(CTSolidColorFillProperties properties) { | |||
this.props = properties; | |||
} | |||
@Internal | |||
protected CTSolidColorFillProperties getXmlObject() { | |||
public CTSolidColorFillProperties getXmlObject() { | |||
return props; | |||
} | |||
@@ -18,20 +18,25 @@ | |||
package org.apache.poi.xddf.usermodel.chart; | |||
import java.util.List; | |||
import java.util.Optional; | |||
import java.util.function.Function; | |||
import java.util.stream.Collectors; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.text.TextContainer; | |||
import org.apache.poi.xddf.usermodel.text.XDDFTextBody; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTChart; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegend; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTShapeProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
/** | |||
* Represents a DrawingML chart legend | |||
*/ | |||
@Beta | |||
public final class XDDFChartLegend { | |||
public final class XDDFChartLegend implements TextContainer { | |||
/** | |||
* Underlying CTLegend bean | |||
@@ -89,7 +94,7 @@ public final class XDDFChartLegend { | |||
public XDDFTextBody getTextBody() { | |||
if (legend.isSetTxPr()) { | |||
return new XDDFTextBody(legend.getTxPr()); | |||
return new XDDFTextBody(this, legend.getTxPr()); | |||
} else { | |||
return null; | |||
} | |||
@@ -189,4 +194,16 @@ public final class XDDFChartLegend { | |||
public void setOverlay(boolean value) { | |||
legend.getOverlay().setVal(value); | |||
} | |||
public <R> Optional<R> findDefinedParagraphProperty( | |||
Function<CTTextParagraphProperties, Boolean> isSet, | |||
Function<CTTextParagraphProperties, R> getter) { | |||
return Optional.empty(); // chart legend has no (indirect) paragraph properties | |||
} | |||
public <R> Optional<R> findDefinedRunProperty( | |||
Function<CTTextCharacterProperties, Boolean> isSet, | |||
Function<CTTextCharacterProperties, R> getter) { | |||
return Optional.empty(); // chart legend has no (indirect) paragraph properties | |||
} | |||
} |
@@ -17,13 +17,19 @@ | |||
package org.apache.poi.xddf.usermodel.chart; | |||
import java.util.Optional; | |||
import java.util.function.Function; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.text.TextContainer; | |||
import org.apache.poi.xddf.usermodel.text.XDDFTextBody; | |||
import org.openxmlformats.schemas.drawingml.x2006.chart.CTLegendEntry; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
@Beta | |||
public class XDDFLegendEntry { | |||
public class XDDFLegendEntry implements TextContainer { | |||
private CTLegendEntry entry; | |||
@Internal | |||
@@ -38,7 +44,7 @@ public class XDDFLegendEntry { | |||
public XDDFTextBody getTextBody() { | |||
if (entry.isSetTxPr()) { | |||
return new XDDFTextBody(entry.getTxPr()); | |||
return new XDDFTextBody(this, entry.getTxPr()); | |||
} else { | |||
return null; | |||
} | |||
@@ -101,4 +107,16 @@ public class XDDFLegendEntry { | |||
return null; | |||
} | |||
} | |||
public <R> Optional<R> findDefinedParagraphProperty( | |||
Function<CTTextParagraphProperties, Boolean> isSet, | |||
Function<CTTextParagraphProperties, R> getter) { | |||
return Optional.empty(); // legend entry has no (indirect) paragraph properties | |||
} | |||
public <R> Optional<R> findDefinedRunProperty( | |||
Function<CTTextCharacterProperties, Boolean> isSet, | |||
Function<CTTextCharacterProperties, R> getter) { | |||
return Optional.empty(); // legend entry has no (indirect) paragraph properties | |||
} | |||
} |
@@ -0,0 +1,83 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAutonumberScheme; | |||
public enum AutonumberScheme { | |||
ALPHABETIC_LOWERCASE_PARENTHESES_BOTH(STTextAutonumberScheme.ALPHA_LC_PAREN_BOTH), | |||
ALPHABETIC_LOWERCASE_PARENTHESIS_RIGHT(STTextAutonumberScheme.ALPHA_LC_PAREN_R), | |||
ALPHABETIC_LOWERCASE_PERIOD(STTextAutonumberScheme.ALPHA_LC_PERIOD), | |||
ALPHABETIC_UPPERCASE_PARENTHESES_BOTH(STTextAutonumberScheme.ALPHA_UC_PAREN_BOTH), | |||
ALPHABETIC_UPPERCASE_PARENTHESIS_RIGHT(STTextAutonumberScheme.ALPHA_UC_PAREN_R), | |||
ALPHABETIC_UPPERCASE_PERIOD(STTextAutonumberScheme.ALPHA_UC_PERIOD), | |||
ARABIC_1_MINUS(STTextAutonumberScheme.ARABIC_1_MINUS), | |||
ARABIC_2_MINUS(STTextAutonumberScheme.ARABIC_2_MINUS), | |||
ARABIC_DOUBLE_BYTE_PERIOD(STTextAutonumberScheme.ARABIC_DB_PERIOD), | |||
ARABIC_DOUBLE_BYTE_PLAIN(STTextAutonumberScheme.ARABIC_DB_PLAIN), | |||
ARABIC_PARENTHESES_BOTH(STTextAutonumberScheme.ARABIC_PAREN_BOTH), | |||
ARABIC_PARENTHESIS_RIGHT(STTextAutonumberScheme.ARABIC_PAREN_R), | |||
ARABIC_PERIOD(STTextAutonumberScheme.ARABIC_PERIOD), | |||
ARABIC_PLAIN(STTextAutonumberScheme.ARABIC_PLAIN), | |||
CIRCLE_NUMBER_DOUBLE_BYTE_PLAIN(STTextAutonumberScheme.CIRCLE_NUM_DB_PLAIN), | |||
CIRCLE_NUMBER_WINGDINGS_BLACK_PLAIN(STTextAutonumberScheme.CIRCLE_NUM_WD_BLACK_PLAIN), | |||
CIRCLE_NUMBER_WINGDINGS_WHITE_PLAIN(STTextAutonumberScheme.CIRCLE_NUM_WD_WHITE_PLAIN), | |||
EAST_ASIAN_CHINESE_SIMPLIFIED_PERIOD(STTextAutonumberScheme.EA_1_CHS_PERIOD), | |||
EAST_ASIAN_CHINESE_SIMPLIFIED_PLAIN(STTextAutonumberScheme.EA_1_CHS_PLAIN), | |||
EAST_ASIAN_CHINESE_TRADITIONAL_PERIOD(STTextAutonumberScheme.EA_1_CHT_PERIOD), | |||
EAST_ASIAN_CHINESE_TRADITIONAL_PLAIN(STTextAutonumberScheme.EA_1_CHT_PLAIN), | |||
EAST_ASIAN_JAPANESE_DOUBLE_BYTE_PERIOD(STTextAutonumberScheme.EA_1_JPN_CHS_DB_PERIOD), | |||
EAST_ASIAN_JAPANESE_KOREAN_PERIOD(STTextAutonumberScheme.EA_1_JPN_KOR_PERIOD), | |||
EAST_ASIAN_JAPANESE_KOREAN_PLAIN(STTextAutonumberScheme.EA_1_JPN_KOR_PLAIN), | |||
HEBREW_2_MINUS(STTextAutonumberScheme.HEBREW_2_MINUS), | |||
HINDI_ALPHA_1_PERIOD(STTextAutonumberScheme.HINDI_ALPHA_1_PERIOD), | |||
HINDI_ALPHA_PERIOD(STTextAutonumberScheme.HINDI_ALPHA_PERIOD), | |||
HINDI_NUMBER_PARENTHESIS_RIGHT(STTextAutonumberScheme.HINDI_NUM_PAREN_R), | |||
HINDI_NUMBER_PERIOD(STTextAutonumberScheme.HINDI_NUM_PERIOD), | |||
ROMAN_LOWERCASE_PARENTHESES_BOTH(STTextAutonumberScheme.ROMAN_LC_PAREN_BOTH), | |||
ROMAN_LOWERCASE_PARENTHESIS_RIGHT(STTextAutonumberScheme.ROMAN_LC_PAREN_R), | |||
ROMAN_LOWERCASE_PERIOD(STTextAutonumberScheme.ROMAN_LC_PERIOD), | |||
ROMAN_UPPERCASE_PARENTHESES_BOTH(STTextAutonumberScheme.ROMAN_UC_PAREN_BOTH), | |||
ROMAN_UPPERCASE_PARENTHESIS_RIGHT(STTextAutonumberScheme.ROMAN_UC_PAREN_R), | |||
ROMAN_UPPERCASE_PERIOD(STTextAutonumberScheme.ROMAN_UC_PERIOD), | |||
THAI_ALPHABETIC_PARENTHESES_BOTH(STTextAutonumberScheme.THAI_ALPHA_PAREN_BOTH), | |||
THAI_ALPHABETIC_PARENTHESIS_RIGHT(STTextAutonumberScheme.THAI_ALPHA_PAREN_R), | |||
THAI_ALPHABETIC_PERIOD(STTextAutonumberScheme.THAI_ALPHA_PERIOD), | |||
THAI_NUMBER_PARENTHESES_BOTH(STTextAutonumberScheme.THAI_NUM_PAREN_BOTH), | |||
THAI_NUMBER_PARENTHESIS_RIGHT(STTextAutonumberScheme.THAI_NUM_PAREN_R), | |||
THAI_NUMBER_PERIOD(STTextAutonumberScheme.THAI_NUM_PERIOD); | |||
final STTextAutonumberScheme.Enum underlying; | |||
AutonumberScheme(STTextAutonumberScheme.Enum scheme) { | |||
this.underlying = scheme; | |||
} | |||
private final static HashMap<STTextAutonumberScheme.Enum, AutonumberScheme> reverse = new HashMap<STTextAutonumberScheme.Enum, AutonumberScheme>(); | |||
static { | |||
for (AutonumberScheme value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static AutonumberScheme valueOf(STTextAutonumberScheme.Enum scheme) { | |||
return reverse.get(scheme); | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextCapsType; | |||
public enum CapsType { | |||
ALL(STTextCapsType.ALL), | |||
NONE(STTextCapsType.NONE), | |||
SMALL(STTextCapsType.SMALL); | |||
final STTextCapsType.Enum underlying; | |||
CapsType(STTextCapsType.Enum caps) { | |||
this.underlying = caps; | |||
} | |||
private final static HashMap<STTextCapsType.Enum, CapsType> reverse = new HashMap<STTextCapsType.Enum, CapsType>(); | |||
static { | |||
for (CapsType value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static CapsType valueOf(STTextCapsType.Enum caps) { | |||
return reverse.get(caps); | |||
} | |||
} |
@@ -0,0 +1,47 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextFontAlignType; | |||
public enum FontAlignment { | |||
AUTOMATIC(STTextFontAlignType.AUTO), | |||
BOTTOM(STTextFontAlignType.B), | |||
BASELINE(STTextFontAlignType.BASE), | |||
CENTER(STTextFontAlignType.CTR), | |||
TOP(STTextFontAlignType.T); | |||
final STTextFontAlignType.Enum underlying; | |||
FontAlignment(STTextFontAlignType.Enum align) { | |||
this.underlying = align; | |||
} | |||
private final static HashMap<STTextFontAlignType.Enum, FontAlignment> reverse = new HashMap<STTextFontAlignType.Enum, FontAlignment>(); | |||
static { | |||
for (FontAlignment value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static FontAlignment valueOf(STTextFontAlignType.Enum align) { | |||
return reverse.get(align); | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; | |||
public enum StrikeType { | |||
DOUBLE_STRIKE(STTextStrikeType.DBL_STRIKE), | |||
NO_STRIKE(STTextStrikeType.NO_STRIKE), | |||
SINGLE_STRIKE(STTextStrikeType.SNG_STRIKE); | |||
final STTextStrikeType.Enum underlying; | |||
StrikeType(STTextStrikeType.Enum strike) { | |||
this.underlying = strike; | |||
} | |||
private final static HashMap<STTextStrikeType.Enum, StrikeType> reverse = new HashMap<STTextStrikeType.Enum, StrikeType>(); | |||
static { | |||
for (StrikeType value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static StrikeType valueOf(STTextStrikeType.Enum strike) { | |||
return reverse.get(strike); | |||
} | |||
} |
@@ -0,0 +1,46 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextTabAlignType; | |||
public enum TabAlignment { | |||
CENTER(STTextTabAlignType.CTR), | |||
DECIMAL(STTextTabAlignType.DEC), | |||
LEFT(STTextTabAlignType.L), | |||
RIGHT(STTextTabAlignType.R); | |||
final STTextTabAlignType.Enum underlying; | |||
TabAlignment(STTextTabAlignType.Enum align) { | |||
this.underlying = align; | |||
} | |||
private final static HashMap<STTextTabAlignType.Enum, TabAlignment> reverse = new HashMap<STTextTabAlignType.Enum, TabAlignment>(); | |||
static { | |||
for (TabAlignment value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static TabAlignment valueOf(STTextTabAlignType.Enum align) { | |||
return reverse.get(align); | |||
} | |||
} |
@@ -0,0 +1,49 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextAlignType; | |||
public enum TextAlignment { | |||
CENTER(STTextAlignType.CTR), | |||
DISTRIBUTED(STTextAlignType.DIST), | |||
JUSTIFIED(STTextAlignType.JUST), | |||
JUSTIFIED_LOW(STTextAlignType.JUST_LOW), | |||
LEFT(STTextAlignType.L), | |||
RIGHT(STTextAlignType.R), | |||
THAI_DISTRIBUTED(STTextAlignType.THAI_DIST); | |||
final STTextAlignType.Enum underlying; | |||
TextAlignment(STTextAlignType.Enum align) { | |||
this.underlying = align; | |||
} | |||
private final static HashMap<STTextAlignType.Enum, TextAlignment> reverse = new HashMap<STTextAlignType.Enum, TextAlignment>(); | |||
static { | |||
for (TextAlignment value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static TextAlignment valueOf(STTextAlignType.Enum align) { | |||
return reverse.get(align); | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.Optional; | |||
import java.util.function.Function; | |||
import org.apache.poi.util.Beta; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
@Beta | |||
public interface TextContainer { | |||
<R> Optional<R> findDefinedParagraphProperty(Function<CTTextParagraphProperties, Boolean> isSet, | |||
Function<CTTextParagraphProperties, R> getter); | |||
<R> Optional<R> findDefinedRunProperty(Function<CTTextCharacterProperties, Boolean> isSet, | |||
Function<CTTextCharacterProperties, R> getter); | |||
} |
@@ -0,0 +1,60 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.HashMap; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; | |||
public enum UnderlineType { | |||
DASH(STTextUnderlineType.DASH), | |||
DASH_HEAVY(STTextUnderlineType.DASH_HEAVY), | |||
DASH_LONG(STTextUnderlineType.DASH_LONG), | |||
DASH_LONG_HEAVY(STTextUnderlineType.DASH_LONG_HEAVY), | |||
DOUBLE(STTextUnderlineType.DBL), | |||
DOT_DASH(STTextUnderlineType.DOT_DASH), | |||
DOT_DASH_HEAVY(STTextUnderlineType.DOT_DASH_HEAVY), | |||
DOT_DOT_DASH(STTextUnderlineType.DOT_DOT_DASH), | |||
DOT_DOT_DASH_HEAVY(STTextUnderlineType.DOT_DOT_DASH_HEAVY), | |||
DOTTED(STTextUnderlineType.DOTTED), | |||
DOTTED_HEAVY(STTextUnderlineType.DOTTED_HEAVY), | |||
HEAVY(STTextUnderlineType.HEAVY), | |||
NONE(STTextUnderlineType.NONE), | |||
SINGLE(STTextUnderlineType.SNG), | |||
WAVY(STTextUnderlineType.WAVY), | |||
WAVY_DOUBLE(STTextUnderlineType.WAVY_DBL), | |||
WAVY_HEAVY(STTextUnderlineType.WAVY_HEAVY), | |||
WORDS(STTextUnderlineType.WORDS); | |||
final STTextUnderlineType.Enum underlying; | |||
UnderlineType(STTextUnderlineType.Enum underline) { | |||
this.underlying = underline; | |||
} | |||
private final static HashMap<STTextUnderlineType.Enum, UnderlineType> reverse = new HashMap<STTextUnderlineType.Enum, UnderlineType>(); | |||
static { | |||
for (UnderlineType value : values()) { | |||
reverse.put(value.underlying, value); | |||
} | |||
} | |||
static UnderlineType valueOf(STTextUnderlineType.Enum underline) { | |||
return reverse.get(underline); | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
@Beta | |||
public interface XDDFAutoFit { | |||
int getFontScale(); | |||
int getLineSpaceReduction(); | |||
} |
@@ -0,0 +1,78 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFExtensionList; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBodyProperties; | |||
@Beta | |||
public class XDDFBodyProperties { | |||
private CTTextBodyProperties props; | |||
@Internal | |||
protected XDDFBodyProperties(CTTextBodyProperties properties) { | |||
this.props = properties; | |||
} | |||
@Internal | |||
protected CTTextBodyProperties getXmlObject() { | |||
return props; | |||
} | |||
public XDDFAutoFit getAutoFit() { | |||
if (props.isSetNoAutofit()) { | |||
return new XDDFNoAutoFit(props.getNoAutofit()); | |||
} else if (props.isSetNormAutofit()) { | |||
return new XDDFNormalAutoFit(props.getNormAutofit()); | |||
} else if (props.isSetSpAutoFit()) { | |||
return new XDDFShapeAutoFit(props.getSpAutoFit()); | |||
} | |||
return new XDDFNoAutoFit(); | |||
} | |||
public void setAutoFit(XDDFAutoFit autofit) { | |||
props.unsetNoAutofit(); | |||
props.unsetNormAutofit(); | |||
props.unsetSpAutoFit(); | |||
if (autofit instanceof XDDFNoAutoFit) { | |||
props.setNoAutofit(((XDDFNoAutoFit) autofit).getXmlObject()); | |||
} else if (autofit instanceof XDDFNormalAutoFit) { | |||
props.setNormAutofit(((XDDFNormalAutoFit) autofit).getXmlObject()); | |||
} else if (autofit instanceof XDDFShapeAutoFit) { | |||
props.setSpAutoFit(((XDDFShapeAutoFit) autofit).getXmlObject()); | |||
} | |||
} | |||
public XDDFExtensionList getExtensionList() { | |||
if (props.isSetExtLst()) { | |||
return new XDDFExtensionList(props.getExtLst()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setExtensionList(XDDFExtensionList list) { | |||
if (list == null) { | |||
props.unsetExtLst(); | |||
} else { | |||
props.setExtLst(list.getXmlObject()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
@Beta | |||
public abstract class XDDFBulletSize { | |||
public static enum Kind { | |||
PERCENT, | |||
POINTS, | |||
TEXT; | |||
} | |||
@Internal | |||
protected XDDFBulletSize() { | |||
} | |||
public abstract Kind getType(); | |||
} |
@@ -0,0 +1,46 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizeFollowText; | |||
@Beta | |||
public class XDDFBulletSizeFollowText extends XDDFBulletSize { | |||
private CTTextBulletSizeFollowText follow; | |||
public XDDFBulletSizeFollowText() { | |||
this(CTTextBulletSizeFollowText.Factory.newInstance()); | |||
} | |||
@Internal | |||
protected XDDFBulletSizeFollowText(CTTextBulletSizeFollowText follow) { | |||
this.follow = follow; | |||
} | |||
@Internal | |||
protected CTTextBulletSizeFollowText getXmlObject() { | |||
return follow; | |||
} | |||
@Override | |||
public Kind getType() { | |||
return Kind.TEXT; | |||
} | |||
} |
@@ -0,0 +1,57 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePercent; | |||
@Beta | |||
public class XDDFBulletSizePercent extends XDDFBulletSize { | |||
private CTTextBulletSizePercent percent; | |||
private Double scale; | |||
public XDDFBulletSizePercent(double value) { | |||
this(CTTextBulletSizePercent.Factory.newInstance(), null); | |||
setPercent(value); | |||
} | |||
@Internal | |||
protected XDDFBulletSizePercent(CTTextBulletSizePercent percent, Double scale) { | |||
this.percent = percent; | |||
this.scale = (scale == null) ? 0.001 : scale * 0.001; | |||
} | |||
@Internal | |||
protected CTTextBulletSizePercent getXmlObject() { | |||
return percent; | |||
} | |||
@Override | |||
public Kind getType() { | |||
return Kind.PERCENT; | |||
} | |||
public double getPercent() { | |||
return percent.getVal() * scale; | |||
} | |||
public void setPercent(double value) { | |||
percent.setVal((int)(1000 * value)); | |||
} | |||
} |
@@ -0,0 +1,55 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBulletSizePoint; | |||
@Beta | |||
public class XDDFBulletSizePoints extends XDDFBulletSize { | |||
private CTTextBulletSizePoint points; | |||
public XDDFBulletSizePoints(double value) { | |||
this(CTTextBulletSizePoint.Factory.newInstance()); | |||
setPoints(value); | |||
} | |||
@Internal | |||
protected XDDFBulletSizePoints(CTTextBulletSizePoint points) { | |||
this.points = points; | |||
} | |||
@Internal | |||
protected CTTextBulletSizePoint getXmlObject() { | |||
return points; | |||
} | |||
@Override | |||
public Kind getType() { | |||
return Kind.POINTS; | |||
} | |||
public double getPoints() { | |||
return points.getVal() * 0.01; | |||
} | |||
public void setPoints(double value) { | |||
points.setVal((int)(100 * value)); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
@Beta | |||
public abstract class XDDFBulletStyle { | |||
} |
@@ -0,0 +1,61 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextAutonumberBullet; | |||
@Beta | |||
public class XDDFBulletStyleAutoNumbered extends XDDFBulletStyle { | |||
private CTTextAutonumberBullet style; | |||
@Internal | |||
protected XDDFBulletStyleAutoNumbered(CTTextAutonumberBullet style) { | |||
this.style =style; | |||
} | |||
@Internal | |||
protected CTTextAutonumberBullet getXmlObject() { | |||
return style; | |||
} | |||
public AutonumberScheme getType() { | |||
return AutonumberScheme.valueOf(style.getType()); | |||
} | |||
public void setType(AutonumberScheme scheme) { | |||
style.setType(scheme.underlying); | |||
} | |||
public int getStartAt() { | |||
if (style.isSetStartAt()) { | |||
return style.getStartAt(); | |||
} else { | |||
return 1; | |||
} | |||
} | |||
public void setStartAt(Integer value) { | |||
if (value == null) { | |||
style.unsetStartAt(); | |||
} else { | |||
style.setStartAt(value); | |||
} | |||
} | |||
} |
@@ -0,0 +1,45 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharBullet; | |||
@Beta | |||
public class XDDFBulletStyleCharacter extends XDDFBulletStyle { | |||
private CTTextCharBullet style; | |||
@Internal | |||
protected XDDFBulletStyleCharacter(CTTextCharBullet style) { | |||
this.style = style; | |||
} | |||
@Internal | |||
protected CTTextCharBullet getXmlObject() { | |||
return style; | |||
} | |||
public String getCharacter() { | |||
return style.getChar(); | |||
} | |||
public void setCharacter(String value) { | |||
style.setChar(value); | |||
} | |||
} |
@@ -0,0 +1,37 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNoBullet; | |||
@Beta | |||
public class XDDFBulletStyleNone extends XDDFBulletStyle { | |||
private CTTextNoBullet style; | |||
@Internal | |||
protected XDDFBulletStyleNone(CTTextNoBullet style) { | |||
this.style = style; | |||
} | |||
@Internal | |||
protected CTTextNoBullet getXmlObject() { | |||
return style; | |||
} | |||
} |
@@ -0,0 +1,48 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFPicture; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBlipBullet; | |||
@Beta | |||
public class XDDFBulletStylePicture extends XDDFBulletStyle { | |||
private CTTextBlipBullet style; | |||
@Internal | |||
protected XDDFBulletStylePicture(CTTextBlipBullet style) { | |||
this.style = style; | |||
} | |||
@Internal | |||
protected CTTextBlipBullet getXmlObject() { | |||
return style; | |||
} | |||
public XDDFPicture getPicture() { | |||
return new XDDFPicture(style.getBlip()); | |||
} | |||
public void setPicture(XDDFPicture picture) { | |||
if (picture != null) { | |||
style.setBlip(picture.getXmlObject()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,104 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.common.usermodel.fonts.FontGroup; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont; | |||
@Beta | |||
public class XDDFFont { | |||
private FontGroup group; | |||
private CTTextFont font; | |||
public static XDDFFont unsetFontForGroup(FontGroup group) { | |||
return new XDDFFont(group, null); | |||
} | |||
public XDDFFont(FontGroup group, String typeface, Byte charset, Byte pitch, byte[] panose) { | |||
this(group, CTTextFont.Factory.newInstance()); | |||
if (typeface == null) { | |||
font.unsetTypeface(); | |||
} else { | |||
font.setTypeface(typeface); | |||
} | |||
if (charset == null) { | |||
font.unsetCharset(); | |||
} else { | |||
font.setCharset(charset); | |||
} | |||
if (pitch == null) { | |||
font.unsetPitchFamily(); | |||
} else { | |||
font.setPitchFamily(pitch); | |||
} | |||
if (panose == null || panose.length == 0) { | |||
font.unsetPanose(); | |||
} else { | |||
font.setPanose(panose); | |||
} | |||
} | |||
@Internal | |||
protected XDDFFont(FontGroup group, CTTextFont font) { | |||
this.group = group; | |||
this.font = font; | |||
} | |||
@Internal | |||
protected CTTextFont getXmlObject() { | |||
return font; | |||
} | |||
public FontGroup getGroup() { | |||
return group; | |||
} | |||
public String getTypeface() { | |||
if (font.isSetTypeface()) { | |||
return font.getTypeface(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public Byte getCharset() { | |||
if (font.isSetCharset()) { | |||
return font.getCharset(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public Byte getPitchFamily() { | |||
if (font.isSetPitchFamily()) { | |||
return font.getPitchFamily(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public byte[] getPanose() { | |||
if (font.isSetPanose()) { | |||
return font.getPanose(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
} |
@@ -0,0 +1,176 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFExtensionList; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTHyperlink; | |||
@Beta | |||
public class XDDFHyperlink { | |||
private CTHyperlink link; | |||
public XDDFHyperlink(String id) { | |||
this(CTHyperlink.Factory.newInstance()); | |||
this.link.setId(id);; | |||
} | |||
public XDDFHyperlink(String id, String action) { | |||
this(id); | |||
this.link.setAction(action); | |||
} | |||
@Internal | |||
protected XDDFHyperlink(CTHyperlink link) { | |||
this.link = link; | |||
} | |||
@Internal | |||
protected CTHyperlink getXmlObject() { | |||
return link; | |||
} | |||
public String getAction() { | |||
if (link.isSetAction()) { | |||
return link.getAction(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public String getId() { | |||
if (link.isSetId()) { | |||
return link.getId(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public Boolean getEndSound() { | |||
if (link.isSetEndSnd()) { | |||
return link.getEndSnd(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setEndSound(Boolean ends) { | |||
if (ends == null) { | |||
link.unsetEndSnd(); | |||
} else { | |||
link.setEndSnd(ends); | |||
} | |||
} | |||
public Boolean getHighlightClick() { | |||
if (link.isSetHighlightClick()) { | |||
return link.getHighlightClick(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setHighlightClick(Boolean highlights) { | |||
if (highlights == null) { | |||
link.unsetHighlightClick(); | |||
} else { | |||
link.setHighlightClick(highlights); | |||
} | |||
} | |||
public Boolean getHistory() { | |||
if (link.isSetHistory()) { | |||
return link.getHistory(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setHistory(Boolean history) { | |||
if (history == null) { | |||
link.unsetHistory(); | |||
} else { | |||
link.setHistory(history); | |||
} | |||
} | |||
public String getInvalidURL() { | |||
if (link.isSetInvalidUrl()) { | |||
return link.getInvalidUrl(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setInvalidURL(String invalid) { | |||
if (invalid == null) { | |||
link.unsetInvalidUrl(); | |||
} else { | |||
link.setInvalidUrl(invalid); | |||
} | |||
} | |||
public String getTargetFrame() { | |||
if (link.isSetTgtFrame()) { | |||
return link.getTgtFrame(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setTargetFrame(String frame) { | |||
if (frame == null) { | |||
link.unsetTgtFrame(); | |||
} else { | |||
link.setTgtFrame(frame); | |||
} | |||
} | |||
public String getTooltip() { | |||
if (link.isSetTooltip()) { | |||
return link.getTooltip(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setTooltip(String tooltip) { | |||
if (tooltip == null) { | |||
link.unsetTooltip(); | |||
} else { | |||
link.setTooltip(tooltip); | |||
} | |||
} | |||
public XDDFExtensionList getExtensionList() { | |||
if (link.isSetExtLst()) { | |||
return new XDDFExtensionList(link.getExtLst()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setExtensionList(XDDFExtensionList list) { | |||
if (list == null) { | |||
link.unsetExtLst(); | |||
} else { | |||
link.setExtLst(list.getXmlObject()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,51 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNoAutofit; | |||
@Beta | |||
public class XDDFNoAutoFit implements XDDFAutoFit { | |||
private CTTextNoAutofit autofit; | |||
public XDDFNoAutoFit() { | |||
this(CTTextNoAutofit.Factory.newInstance()); | |||
} | |||
@Internal | |||
protected XDDFNoAutoFit(CTTextNoAutofit autofit) { | |||
this.autofit = autofit; | |||
} | |||
@Internal | |||
protected CTTextNoAutofit getXmlObject() { | |||
return autofit; | |||
} | |||
@Override | |||
public int getFontScale() { | |||
return 100_000; | |||
} | |||
@Override | |||
public int getLineSpaceReduction() { | |||
return 0; | |||
} | |||
} |
@@ -0,0 +1,75 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextNormalAutofit; | |||
@Beta | |||
public class XDDFNormalAutoFit implements XDDFAutoFit { | |||
private CTTextNormalAutofit autofit; | |||
public XDDFNormalAutoFit() { | |||
this(CTTextNormalAutofit.Factory.newInstance()); | |||
} | |||
@Internal | |||
protected XDDFNormalAutoFit(CTTextNormalAutofit autofit) { | |||
this.autofit = autofit; | |||
} | |||
@Internal | |||
protected CTTextNormalAutofit getXmlObject() { | |||
return autofit; | |||
} | |||
@Override | |||
public int getFontScale() { | |||
if (autofit.isSetFontScale()) { | |||
return autofit.getFontScale(); | |||
} else { | |||
return 100_000; | |||
} | |||
} | |||
public void setFontScale(Integer value) { | |||
if (value == null) { | |||
autofit.unsetFontScale(); | |||
} else { | |||
autofit.setFontScale(value); | |||
} | |||
} | |||
@Override | |||
public int getLineSpaceReduction() { | |||
if (autofit.isSetLnSpcReduction()) { | |||
return autofit.getLnSpcReduction(); | |||
} else { | |||
return 0; | |||
} | |||
} | |||
public void setLineSpaceReduction(Integer value) { | |||
if (value == null) { | |||
autofit.unsetLnSpcReduction(); | |||
} else { | |||
autofit.setLnSpcReduction(value); | |||
} | |||
} | |||
} |
@@ -0,0 +1,159 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.common.usermodel.fonts.FontGroup; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFColor; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
@Beta | |||
public class XDDFParagraphBulletProperties { | |||
private CTTextParagraphProperties props; | |||
@Internal | |||
protected XDDFParagraphBulletProperties(CTTextParagraphProperties properties) { | |||
this.props = properties; | |||
} | |||
public XDDFBulletStyle getBulletStyle() { | |||
if (props.isSetBuAutoNum()) { | |||
return new XDDFBulletStyleAutoNumbered(props.getBuAutoNum()); | |||
} else if (props.isSetBuBlip()) { | |||
return new XDDFBulletStylePicture(props.getBuBlip()); | |||
} else if (props.isSetBuChar()) { | |||
return new XDDFBulletStyleCharacter(props.getBuChar()); | |||
} else if (props.isSetBuNone()) { | |||
return new XDDFBulletStyleNone(props.getBuNone()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setBulletStyle(XDDFBulletStyle style) { | |||
props.unsetBuAutoNum(); | |||
props.unsetBuBlip(); | |||
props.unsetBuChar(); | |||
props.unsetBuNone(); | |||
if (style != null) { | |||
if (style instanceof XDDFBulletStyleAutoNumbered) { | |||
props.setBuAutoNum(((XDDFBulletStyleAutoNumbered) style).getXmlObject()); | |||
} else if (style instanceof XDDFBulletStyleCharacter) { | |||
props.setBuChar(((XDDFBulletStyleCharacter) style).getXmlObject()); | |||
} else if (style instanceof XDDFBulletStyleNone) { | |||
props.setBuNone(((XDDFBulletStyleNone) style).getXmlObject()); | |||
} else if (style instanceof XDDFBulletStylePicture) { | |||
props.setBuBlip(((XDDFBulletStylePicture) style).getXmlObject()); | |||
} | |||
} | |||
} | |||
public XDDFColor getBulletColor() { | |||
if (props.isSetBuClr()) { | |||
return XDDFColor.forColorContainer(props.getBuClr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setBulletColor(XDDFColor color) { | |||
props.unsetBuClrTx(); | |||
if (color == null) { | |||
props.unsetBuClr(); | |||
} else { | |||
props.setBuClr(color.getColorContainer()); | |||
} | |||
} | |||
public void setBulletColorFollowText() { | |||
props.unsetBuClr(); | |||
if (props.isSetBuClrTx()) { | |||
// nothing to do: already set | |||
} else { | |||
props.addNewBuClrTx(); | |||
} | |||
} | |||
public XDDFFont getBulletFont() { | |||
if (props.isSetBuFont()) { | |||
return new XDDFFont(FontGroup.SYMBOL, props.getBuFont()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setBulletFont(XDDFFont font) { | |||
props.unsetBuFontTx(); | |||
if (font == null) { | |||
props.unsetBuFont(); | |||
} else { | |||
props.setBuFont(font.getXmlObject()); | |||
} | |||
} | |||
public void setBulletFontFollowText() { | |||
props.unsetBuFont(); | |||
if (props.isSetBuFontTx()) { | |||
// nothing to do: already set | |||
} else { | |||
props.addNewBuFontTx(); | |||
} | |||
} | |||
public XDDFBulletSize getBulletSize() { | |||
if (props.isSetBuSzPct()) { | |||
return new XDDFBulletSizePercent(props.getBuSzPct(), null); | |||
} else if (props.isSetBuSzPts()) { | |||
return new XDDFBulletSizePoints(props.getBuSzPts()); | |||
} else if (props.isSetBuSzTx()) { | |||
return new XDDFBulletSizeFollowText(props.getBuSzTx()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setBulletSize(XDDFBulletSize size) { | |||
props.unsetBuSzPct(); | |||
props.unsetBuSzPts(); | |||
props.unsetBuSzTx(); | |||
if (size != null) { | |||
if (size instanceof XDDFBulletSizeFollowText) { | |||
props.setBuSzTx(((XDDFBulletSizeFollowText) size).getXmlObject()); | |||
} else if (size instanceof XDDFBulletSizePercent) { | |||
props.setBuSzPct(((XDDFBulletSizePercent) size).getXmlObject()); | |||
} else if (size instanceof XDDFBulletSizePoints) { | |||
props.setBuSzPts(((XDDFBulletSizePoints) size).getXmlObject()); | |||
} | |||
} | |||
} | |||
public void clearAll() { | |||
props.unsetBuAutoNum(); | |||
props.unsetBuBlip(); | |||
props.unsetBuChar(); | |||
props.unsetBuNone(); | |||
props.unsetBuClr(); | |||
props.unsetBuClrTx(); | |||
props.unsetBuFont(); | |||
props.unsetBuFontTx(); | |||
props.unsetBuSzPct(); | |||
props.unsetBuSzPts(); | |||
props.unsetBuSzTx(); | |||
} | |||
} |
@@ -0,0 +1,258 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.Collections; | |||
import java.util.List; | |||
import java.util.stream.Collectors; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.util.Units; | |||
import org.apache.poi.xddf.usermodel.XDDFExtensionList; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
@Beta | |||
public class XDDFParagraphProperties { | |||
private CTTextParagraphProperties props; | |||
private XDDFParagraphBulletProperties bullet; | |||
@Internal | |||
protected XDDFParagraphProperties(CTTextParagraphProperties properties) { | |||
this.props = properties; | |||
this.bullet = new XDDFParagraphBulletProperties(properties); | |||
} | |||
@Internal | |||
protected CTTextParagraphProperties getXmlObject() { | |||
return props; | |||
} | |||
public XDDFParagraphBulletProperties getBulletProperties() { | |||
return bullet; | |||
} | |||
public int getLevel() { | |||
if (props.isSetLvl()) { | |||
return 1 + props.getLvl(); | |||
} else { | |||
return 0; | |||
} | |||
} | |||
public void setLevel(Integer level) { | |||
if (level == null) { | |||
props.unsetLvl(); | |||
} else if (level < 1 || 9 < level) { | |||
throw new IllegalArgumentException("Minimum inclusive: 1. Maximum inclusive: 9."); | |||
} else { | |||
props.setLvl(level - 1); | |||
} | |||
} | |||
public XDDFRunProperties getDefaultRunProperties() { | |||
if (props.isSetDefRPr()) { | |||
return new XDDFRunProperties(props.getDefRPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setDefaultRunProperties(XDDFRunProperties properties) { | |||
if (properties == null) { | |||
props.unsetDefRPr(); | |||
} else { | |||
props.setDefRPr(properties.getXmlObject()); | |||
} | |||
} | |||
public void setEastAsianLineBreak(Boolean value) { | |||
if (value == null) { | |||
props.unsetEaLnBrk(); | |||
} else { | |||
props.setEaLnBrk(value); | |||
} | |||
} | |||
public void setLatinLineBreak(Boolean value) { | |||
if (value == null) { | |||
props.unsetLatinLnBrk(); | |||
} else { | |||
props.setLatinLnBrk(value); | |||
} | |||
} | |||
public void setHangingPunctuation(Boolean value) { | |||
if (value == null) { | |||
props.unsetHangingPunct(); | |||
} else { | |||
props.setHangingPunct(value); | |||
} | |||
} | |||
public void setRightToLeft(Boolean value) { | |||
if (value == null) { | |||
props.unsetRtl(); | |||
} else { | |||
props.setRtl(value); | |||
} | |||
} | |||
public void setFontAlignment(FontAlignment align) { | |||
if (align == null) { | |||
props.unsetFontAlgn(); | |||
} else { | |||
props.setFontAlgn(align.underlying); | |||
} | |||
} | |||
public void setTextAlignment(TextAlignment align) { | |||
if (align == null) { | |||
props.unsetAlgn(); | |||
} else { | |||
props.setAlgn(align.underlying); | |||
} | |||
} | |||
public void setDefaultTabSize(Double points) { | |||
if (points == null) { | |||
props.unsetDefTabSz(); | |||
} else { | |||
props.setDefTabSz(Units.toEMU(points)); | |||
} | |||
} | |||
public void setIndentation(Double points) { | |||
if (points == null) { | |||
props.unsetIndent(); | |||
} else if (points < -4032 || 4032 < points) { | |||
throw new IllegalArgumentException("Minimum inclusive = -4032. Maximum inclusive = 4032."); | |||
} else { | |||
props.setIndent(Units.toEMU(points)); | |||
} | |||
} | |||
public void setMarginLeft(Double points) { | |||
if (points == null) { | |||
props.unsetMarL(); | |||
} else if (points < 0 || 4032 < points) { | |||
throw new IllegalArgumentException("Minimum inclusive = 0. Maximum inclusive = 4032."); | |||
} else { | |||
props.setMarL(Units.toEMU(points)); | |||
} | |||
} | |||
public void setMarginRight(Double points) { | |||
if (points == null) { | |||
props.unsetMarR(); | |||
} else if (points < 0 || 4032 < points) { | |||
throw new IllegalArgumentException("Minimum inclusive = 0. Maximum inclusive = 4032."); | |||
} else { | |||
props.setMarR(Units.toEMU(points)); | |||
} | |||
} | |||
public void setLineSpacing(XDDFSpacing spacing) { | |||
if (spacing == null) { | |||
props.unsetLnSpc(); | |||
} else { | |||
props.setLnSpc(spacing.getXmlObject()); | |||
} | |||
} | |||
public void setSpaceAfter(XDDFSpacing spacing) { | |||
if (spacing == null) { | |||
props.unsetSpcAft(); | |||
} else { | |||
props.setSpcAft(spacing.getXmlObject()); | |||
} | |||
} | |||
public void setSpaceBefore(XDDFSpacing spacing) { | |||
if (spacing == null) { | |||
props.unsetSpcBef(); | |||
} else { | |||
props.setSpcBef(spacing.getXmlObject()); | |||
} | |||
} | |||
public XDDFTabStop addTabStop() { | |||
if (!props.isSetTabLst()) { | |||
props.addNewTabLst(); | |||
} | |||
return new XDDFTabStop(props.getTabLst().addNewTab()); | |||
} | |||
public XDDFTabStop insertTabStop(int index) { | |||
if (!props.isSetTabLst()) { | |||
props.addNewTabLst(); | |||
} | |||
return new XDDFTabStop(props.getTabLst().insertNewTab(index)); | |||
} | |||
public void removeTabStop(int index) { | |||
if (props.isSetTabLst()) { | |||
props.getTabLst().removeTab(index); | |||
} | |||
} | |||
public XDDFTabStop getTabStop(int index) { | |||
if (props.isSetTabLst()) { | |||
return new XDDFTabStop(props.getTabLst().getTabArray(index)); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public List<XDDFTabStop> getTabStops() { | |||
if (props.isSetTabLst()) { | |||
return Collections.unmodifiableList(props | |||
.getTabLst() | |||
.getTabList() | |||
.stream() | |||
.map(gs -> new XDDFTabStop(gs)) | |||
.collect(Collectors.toList())); | |||
} else { | |||
return Collections.emptyList(); | |||
} | |||
} | |||
public int countTabStops() { | |||
if (props.isSetTabLst()) { | |||
return props.getTabLst().sizeOfTabArray(); | |||
} else { | |||
return 0; | |||
} | |||
} | |||
public XDDFExtensionList getExtensionList() { | |||
if (props.isSetExtLst()) { | |||
return new XDDFExtensionList(props.getExtLst()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setExtensionList(XDDFExtensionList list) { | |||
if (list == null) { | |||
props.unsetExtLst(); | |||
} else { | |||
props.setExtLst(list.getXmlObject()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,335 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.Locale; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFColor; | |||
import org.apache.poi.xddf.usermodel.XDDFEffectContainer; | |||
import org.apache.poi.xddf.usermodel.XDDFEffectList; | |||
import org.apache.poi.xddf.usermodel.XDDFExtensionList; | |||
import org.apache.poi.xddf.usermodel.XDDFFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFGradientFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFGroupFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFLineProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFNoFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFPatternFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFPictureFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextFont; | |||
@Beta | |||
public class XDDFRunProperties { | |||
private CTTextCharacterProperties props; | |||
public XDDFRunProperties() { | |||
this(CTTextCharacterProperties.Factory.newInstance()); | |||
} | |||
@Internal | |||
protected XDDFRunProperties(CTTextCharacterProperties properties) { | |||
this.props = properties; | |||
} | |||
@Internal | |||
protected CTTextCharacterProperties getXmlObject() { | |||
return props; | |||
} | |||
public void setBaseline(Integer value) { | |||
if (value == null) { | |||
props.unsetBaseline(); | |||
} else { | |||
props.setBaseline(value); | |||
} | |||
} | |||
public void setDirty(Boolean dirty) { | |||
if (dirty == null) { | |||
props.unsetDirty(); | |||
} else { | |||
props.setDirty(dirty); | |||
} | |||
} | |||
public void setSpellError(Boolean error) { | |||
if (error == null) { | |||
props.unsetErr(); | |||
} else { | |||
props.setErr(error); | |||
} | |||
} | |||
public void setNoProof(Boolean noproof) { | |||
if (noproof == null) { | |||
props.unsetNoProof(); | |||
} else { | |||
props.setNoProof(noproof); | |||
} | |||
} | |||
public void setNormalizeHeights(Boolean normalize) { | |||
if (normalize == null) { | |||
props.unsetNormalizeH(); | |||
} else { | |||
props.setNormalizeH(normalize); | |||
} | |||
} | |||
public void setKumimoji(Boolean kumimoji) { | |||
if (kumimoji == null) { | |||
props.unsetKumimoji(); | |||
} else { | |||
props.setKumimoji(kumimoji); | |||
} | |||
} | |||
public void setBold(Boolean bold) { | |||
if (bold == null) { | |||
props.unsetB(); | |||
} else { | |||
props.setB(bold); | |||
} | |||
} | |||
public void setItalic(Boolean italic) { | |||
if (italic == null) { | |||
props.unsetI(); | |||
} else { | |||
props.setI(italic); | |||
} | |||
} | |||
public void setFontSize(Double size) { | |||
if (size == null) { | |||
props.unsetSz(); | |||
} else if (size < 1 || 400 < size) { | |||
throw new IllegalArgumentException("Minimum inclusive = 1. Maximum inclusive = 400."); | |||
} else { | |||
props.setSz((int)(100 * size)); | |||
} | |||
} | |||
public void setFillProperties(XDDFFillProperties properties) { | |||
props.unsetBlipFill(); | |||
props.unsetGradFill(); | |||
props.unsetGrpFill(); | |||
props.unsetNoFill(); | |||
props.unsetPattFill(); | |||
props.unsetSolidFill(); | |||
if (properties == null) { | |||
return; | |||
} | |||
if (properties instanceof XDDFGradientFillProperties) { | |||
props.setGradFill(((XDDFGradientFillProperties) properties).getXmlObject()); | |||
} else if (properties instanceof XDDFGroupFillProperties) { | |||
props.setGrpFill(((XDDFGroupFillProperties) properties).getXmlObject()); | |||
} else if (properties instanceof XDDFNoFillProperties) { | |||
props.setNoFill(((XDDFNoFillProperties) properties).getXmlObject()); | |||
} else if (properties instanceof XDDFPatternFillProperties) { | |||
props.setPattFill(((XDDFPatternFillProperties) properties).getXmlObject()); | |||
} else if (properties instanceof XDDFPictureFillProperties) { | |||
props.setBlipFill(((XDDFPictureFillProperties) properties).getXmlObject()); | |||
} else if (properties instanceof XDDFSolidFillProperties) { | |||
props.setSolidFill(((XDDFSolidFillProperties) properties).getXmlObject()); | |||
} | |||
} | |||
public void setCharacterKerning(Double kerning) { | |||
if (kerning == null) { | |||
props.unsetKern(); | |||
} else if (kerning < 0 || 4000 < kerning) { | |||
throw new IllegalArgumentException("Minimum inclusive = 0. Maximum inclusive = 4000."); | |||
} else { | |||
props.setKern((int)(100*kerning)); | |||
} | |||
} | |||
public void setCharacterSpacing(Double spacing) { | |||
if (spacing == null) { | |||
props.unsetSpc(); | |||
} else if (spacing < -4000 || 4000 < spacing) { | |||
throw new IllegalArgumentException("Minimum inclusive = -4000. Maximum inclusive = 4000."); | |||
} else { | |||
props.setSpc((int)(100*spacing)); | |||
} | |||
} | |||
public void setFonts(XDDFFont[] fonts) { | |||
for (XDDFFont font: fonts) { | |||
CTTextFont xml = font.getXmlObject(); | |||
switch (font.getGroup()) { | |||
case COMPLEX_SCRIPT: | |||
if (xml == null) { | |||
props.unsetCs(); | |||
} else { | |||
props.setCs(xml); | |||
} | |||
case EAST_ASIAN: | |||
if (xml == null) { | |||
props.unsetEa(); | |||
} else { | |||
props.setEa(xml); | |||
} | |||
case LATIN: | |||
if (xml == null) { | |||
props.unsetLatin(); | |||
} else { | |||
props.setLatin(xml); | |||
} | |||
case SYMBOL: | |||
if (xml == null) { | |||
props.unsetSym(); | |||
} else { | |||
props.setSym(xml); | |||
} | |||
} | |||
} | |||
} | |||
public void setUnderline(UnderlineType underline) { | |||
if (underline == null) { | |||
props.unsetU(); | |||
} else { | |||
props.setU(underline.underlying); | |||
} | |||
} | |||
public void setStrikeThrough(StrikeType strike) { | |||
if (strike == null) { | |||
props.unsetStrike(); | |||
} else { | |||
props.setStrike(strike.underlying); | |||
} | |||
} | |||
public void setCapitals(CapsType caps) { | |||
if (caps == null) { | |||
props.unsetCap(); | |||
} else { | |||
props.setCap(caps.underlying); | |||
} | |||
} | |||
public void setHyperlink(XDDFHyperlink link) { | |||
if (link == null) { | |||
props.unsetHlinkClick(); | |||
} else { | |||
props.setHlinkClick(link.getXmlObject()); | |||
} | |||
} | |||
public void setMouseOver(XDDFHyperlink link) { | |||
if (link == null) { | |||
props.unsetHlinkMouseOver(); | |||
} else { | |||
props.setHlinkMouseOver(link.getXmlObject()); | |||
} | |||
} | |||
public void setLanguage(Locale lang) { | |||
if (lang == null) { | |||
props.unsetLang(); | |||
} else { | |||
props.setLang(lang.toLanguageTag()); | |||
} | |||
} | |||
public void setAlternativeLanguage(Locale lang) { | |||
if (lang == null) { | |||
props.unsetAltLang(); | |||
} else { | |||
props.setAltLang(lang.toLanguageTag()); | |||
} | |||
} | |||
public void setHighlight(XDDFColor color) { | |||
if (color == null) { | |||
props.unsetHighlight(); | |||
} else { | |||
props.setHighlight(color.getColorContainer()); | |||
} | |||
} | |||
public void setLineProperties(XDDFLineProperties properties) { | |||
if (properties == null) { | |||
props.unsetLn(); | |||
} else { | |||
props.setLn(properties.getXmlObject()); | |||
} | |||
} | |||
public void setBookmark(String bookmark) { | |||
if (bookmark == null) { | |||
props.unsetBmk(); | |||
} else { | |||
props.setBmk(bookmark); | |||
} | |||
} | |||
public XDDFExtensionList getExtensionList() { | |||
if (props.isSetExtLst()) { | |||
return new XDDFExtensionList(props.getExtLst()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setExtensionList(XDDFExtensionList list) { | |||
if (list == null) { | |||
props.unsetExtLst(); | |||
} else { | |||
props.setExtLst(list.getXmlObject()); | |||
} | |||
} | |||
public XDDFEffectContainer getEffectContainer() { | |||
if (props.isSetEffectDag()) { | |||
return new XDDFEffectContainer(props.getEffectDag()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setEffectContainer(XDDFEffectContainer container) { | |||
if (container == null) { | |||
props.unsetEffectDag(); | |||
} else { | |||
props.setEffectDag(container.getXmlObject()); | |||
} | |||
} | |||
public XDDFEffectList getEffectList() { | |||
if (props.isSetEffectLst()) { | |||
return new XDDFEffectList(props.getEffectLst()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setEffectList(XDDFEffectList list) { | |||
if (list == null) { | |||
props.unsetEffectLst(); | |||
} else { | |||
props.setEffectLst(list.getXmlObject()); | |||
} | |||
} | |||
} |
@@ -0,0 +1,51 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextShapeAutofit; | |||
@Beta | |||
public class XDDFShapeAutoFit implements XDDFAutoFit { | |||
private CTTextShapeAutofit autofit; | |||
public XDDFShapeAutoFit() { | |||
this(CTTextShapeAutofit.Factory.newInstance()); | |||
} | |||
@Internal | |||
protected XDDFShapeAutoFit(CTTextShapeAutofit autofit) { | |||
this.autofit = autofit; | |||
} | |||
@Internal | |||
protected CTTextShapeAutofit getXmlObject() { | |||
return autofit; | |||
} | |||
@Override | |||
public int getFontScale() { | |||
return 100_000; | |||
} | |||
@Override | |||
public int getLineSpaceReduction() { | |||
return 0; | |||
} | |||
} |
@@ -0,0 +1,44 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; | |||
@Beta | |||
public abstract class XDDFSpacing { | |||
public static enum Kind { | |||
PERCENT, | |||
POINTS; | |||
} | |||
protected CTTextSpacing spacing; | |||
@Internal | |||
protected XDDFSpacing(CTTextSpacing spacing) { | |||
this.spacing = spacing; | |||
} | |||
public abstract Kind getType(); | |||
@Internal | |||
protected CTTextSpacing getXmlObject() { | |||
return spacing; | |||
} | |||
} |
@@ -0,0 +1,56 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacingPercent; | |||
@Beta | |||
public class XDDFSpacingPercent extends XDDFSpacing { | |||
private CTTextSpacingPercent percent; | |||
private Double scale; | |||
public XDDFSpacingPercent(double value) { | |||
this(CTTextSpacing.Factory.newInstance(), CTTextSpacingPercent.Factory.newInstance(), null); | |||
spacing.unsetSpcPts(); | |||
spacing.setSpcPct(percent); | |||
setPercent(value); | |||
} | |||
@Internal | |||
protected XDDFSpacingPercent(CTTextSpacing parent, CTTextSpacingPercent percent, Double scale) { | |||
super(parent); | |||
this.percent = percent; | |||
this.scale = (scale == null) ? 0.001 : scale * 0.001; | |||
} | |||
@Override | |||
public Kind getType() { | |||
return Kind.PERCENT; | |||
} | |||
public double getPercent() { | |||
return percent.getVal() * scale; | |||
} | |||
public void setPercent(double value) { | |||
percent.setVal((int)(1000 * value)); | |||
} | |||
} |
@@ -0,0 +1,54 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacingPoint; | |||
@Beta | |||
public class XDDFSpacingPoints extends XDDFSpacing { | |||
private CTTextSpacingPoint points; | |||
public XDDFSpacingPoints(double value) { | |||
this(CTTextSpacing.Factory.newInstance(), CTTextSpacingPoint.Factory.newInstance()); | |||
spacing.unsetSpcPct(); | |||
spacing.setSpcPts(points); | |||
setPoints(value); | |||
} | |||
@Internal | |||
protected XDDFSpacingPoints(CTTextSpacing parent, CTTextSpacingPoint points) { | |||
super(parent); | |||
this.points = points; | |||
} | |||
@Override | |||
public Kind getType() { | |||
return Kind.POINTS; | |||
} | |||
public double getPoints() { | |||
return points.getVal() * 0.01; | |||
} | |||
public void setPoints(double value) { | |||
points.setVal((int)(100 * value)); | |||
} | |||
} |
@@ -0,0 +1,70 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.util.Units; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextTabStop; | |||
@Beta | |||
public class XDDFTabStop { | |||
private CTTextTabStop stop; | |||
@Internal | |||
protected XDDFTabStop(CTTextTabStop stop) { | |||
this.stop = stop; | |||
} | |||
@Internal | |||
protected CTTextTabStop getXmlObject() { | |||
return stop; | |||
} | |||
public TabAlignment getAlignment() { | |||
if (stop.isSetAlgn()) { | |||
return TabAlignment.valueOf(stop.getAlgn()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setAlignment(TabAlignment align) { | |||
if (align == null) { | |||
stop.unsetAlgn(); | |||
} else { | |||
stop.setAlgn(align.underlying); | |||
} | |||
} | |||
public Double getPosition() { | |||
if (stop.isSetPos()) { | |||
return Units.toPoints(stop.getPos()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setPosition(Double position) { | |||
if (position == null) { | |||
stop.unsetPos(); | |||
} else { | |||
stop.setPos(Units.toEMU(position)); | |||
} | |||
} | |||
} |
@@ -17,25 +17,350 @@ | |||
package org.apache.poi.xddf.usermodel.text; | |||
import java.util.Collections; | |||
import java.util.List; | |||
import java.util.Optional; | |||
import java.util.function.Function; | |||
import java.util.stream.Collectors; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextBody; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextListStyle; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
@Beta | |||
public class XDDFTextBody { | |||
private CTTextBody body; | |||
private CTTextBody _body; | |||
private TextContainer _parent; | |||
public XDDFTextBody() { | |||
this(CTTextBody.Factory.newInstance()); | |||
public XDDFTextBody(TextContainer parent) { | |||
this(parent, CTTextBody.Factory.newInstance()); | |||
this._body.addNewBodyPr(); | |||
} | |||
@Internal | |||
public XDDFTextBody(CTTextBody body) { | |||
this.body = body; | |||
public XDDFTextBody(TextContainer parent, CTTextBody body) { | |||
this._parent = parent; | |||
this._body = body; | |||
} | |||
@Internal | |||
public CTTextBody getXmlObject() { | |||
return body; | |||
return _body; | |||
} | |||
public TextContainer getParentShape() { | |||
return _parent; | |||
} | |||
public XDDFTextParagraph addNewParagraph() { | |||
return new XDDFTextParagraph(_body.addNewP(), this); | |||
} | |||
public XDDFTextParagraph insertNewParagraph(int index) { | |||
return new XDDFTextParagraph(_body.insertNewP(index), this); | |||
} | |||
public void removeParagraph(int index) { | |||
_body.removeP(index); | |||
} | |||
public XDDFTextParagraph getParagraph(int index) { | |||
return new XDDFTextParagraph(_body.getPArray(index), this); | |||
} | |||
public List<XDDFTextParagraph> getParagraphs() { | |||
return Collections.unmodifiableList(_body | |||
.getPList() | |||
.stream() | |||
.map(ds -> new XDDFTextParagraph(ds, this)) | |||
.collect(Collectors.toList())); | |||
} | |||
public XDDFBodyProperties getBodyProperties() { | |||
return new XDDFBodyProperties(_body.getBodyPr()); | |||
} | |||
public void setBodyProperties(XDDFBodyProperties properties) { | |||
if (properties == null) { | |||
_body.addNewBodyPr(); | |||
} else { | |||
_body.setBodyPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getDefaultProperties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetDefPPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getDefPPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setDefaultProperties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetDefPPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setDefPPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel1Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl1PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl1PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel1Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl1PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl1PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel2Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl2PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl2PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel2Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl2PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl2PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel3Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl3PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl3PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel3Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl3PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl3PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel4Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl4PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl4PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel4Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl4PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl4PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel5Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl5PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl5PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel5Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl5PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl5PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel6Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl6PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl6PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel6Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl6PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl6PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel7Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl7PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl7PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel7Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl7PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl7PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel8Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl8PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl8PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel8Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl8PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl8PPr(properties.getXmlObject()); | |||
} | |||
} | |||
public XDDFParagraphProperties getLevel9Properties() { | |||
if (_body.isSetLstStyle() && _body.getLstStyle().isSetLvl9PPr()) { | |||
return new XDDFParagraphProperties(_body.getLstStyle().getLvl9PPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setLevel9Properties(XDDFParagraphProperties properties) { | |||
if (properties == null) { | |||
if (_body.isSetLstStyle()) { | |||
_body.getLstStyle().unsetLvl9PPr(); | |||
} | |||
} else { | |||
CTTextListStyle style = _body.isSetLstStyle() ? _body.getLstStyle() : _body.addNewLstStyle(); | |||
style.setLvl9PPr(properties.getXmlObject()); | |||
} | |||
} | |||
@Internal | |||
protected <R> Optional<R> findDefinedParagraphProperty(Function<CTTextParagraphProperties, Boolean> isSet, | |||
Function<CTTextParagraphProperties, R> getter, int level) { | |||
if (_body.isSetLstStyle() && level >= 0) { | |||
CTTextListStyle list = _body.getLstStyle(); | |||
CTTextParagraphProperties props = level == 0 ? list.getDefPPr() : retrieveProperties(list, level); | |||
if (props != null && isSet.apply(props)) { | |||
return Optional.of(getter.apply(props)); | |||
} else { | |||
return findDefinedParagraphProperty(isSet, getter, level - 1); | |||
} | |||
} else { | |||
return _parent.findDefinedParagraphProperty(isSet, getter); | |||
} | |||
} | |||
@Internal | |||
protected <R> Optional<R> findDefinedRunProperty(Function<CTTextCharacterProperties, Boolean> isSet, | |||
Function<CTTextCharacterProperties, R> getter, int level) { | |||
if (_body.isSetLstStyle() && level >= 0) { | |||
CTTextListStyle list = _body.getLstStyle(); | |||
CTTextParagraphProperties props = level == 0 ? list.getDefPPr() : retrieveProperties(list, level); | |||
if (props != null && props.isSetDefRPr() && isSet.apply(props.getDefRPr())) { | |||
return Optional.of(getter.apply(props.getDefRPr())); | |||
} else { | |||
return findDefinedRunProperty(isSet, getter, level - 1); | |||
} | |||
} else { | |||
return _parent.findDefinedRunProperty(isSet, getter); | |||
} | |||
} | |||
private CTTextParagraphProperties retrieveProperties(CTTextListStyle list, int level) { | |||
switch(level) { | |||
case 1: if (list.isSetLvl1PPr()) { | |||
return list.getLvl1PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 2: if (list.isSetLvl2PPr()) { | |||
return list.getLvl2PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 3: if (list.isSetLvl3PPr()) { | |||
return list.getLvl3PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 4: if (list.isSetLvl4PPr()) { | |||
return list.getLvl4PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 5: if (list.isSetLvl5PPr()) { | |||
return list.getLvl5PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 6: if (list.isSetLvl6PPr()) { | |||
return list.getLvl6PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 7: if (list.isSetLvl7PPr()) { | |||
return list.getLvl7PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 8: if (list.isSetLvl8PPr()) { | |||
return list.getLvl8PPr(); | |||
} else { | |||
return null; | |||
} | |||
case 9: if (list.isSetLvl9PPr()) { | |||
return list.getLvl9PPr(); | |||
} else { | |||
return null; | |||
} | |||
default: return null; | |||
} | |||
} | |||
} |
@@ -0,0 +1,723 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.ArrayList; | |||
import java.util.Collections; | |||
import java.util.Iterator; | |||
import java.util.List; | |||
import java.util.Optional; | |||
import java.util.function.Function; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.util.LocaleUtil; | |||
import org.apache.poi.util.Units; | |||
import org.apache.poi.xddf.usermodel.XDDFColor; | |||
import org.apache.xmlbeans.QNameSet; | |||
import org.apache.xmlbeans.XmlObject; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraph; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextParagraphProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextSpacing; | |||
/** | |||
* Represents a paragraph of text within the containing text body. | |||
* The paragraph is the highest level text separation mechanism. | |||
*/ | |||
@Beta | |||
public class XDDFTextParagraph { | |||
private XDDFTextBody _parent; | |||
private XDDFParagraphProperties _properties; | |||
private final CTTextParagraph _p; | |||
private final ArrayList<XDDFTextRun> _runs; | |||
@Internal | |||
protected XDDFTextParagraph(CTTextParagraph paragraph, XDDFTextBody parent) { | |||
this._p = paragraph; | |||
this._parent = parent; | |||
final int count = paragraph.sizeOfBrArray() | |||
+ paragraph.sizeOfFldArray() | |||
+ paragraph.sizeOfRArray(); | |||
this._runs = new ArrayList<>(count); | |||
for (XmlObject xo : _p.selectChildren(QNameSet.ALL)) { | |||
if (xo instanceof CTTextLineBreak) { | |||
_runs.add(new XDDFTextRun((CTTextLineBreak) xo, this)); | |||
} else if (xo instanceof CTTextField) { | |||
_runs.add(new XDDFTextRun((CTTextField) xo, this)); | |||
} else if (xo instanceof CTRegularTextRun) { | |||
_runs.add(new XDDFTextRun((CTRegularTextRun) xo, this)); | |||
} | |||
} | |||
} | |||
public String getText() { | |||
StringBuilder out = new StringBuilder(); | |||
for (XDDFTextRun r : _runs) { | |||
out.append(r.getText()); | |||
} | |||
return out.toString(); | |||
} | |||
public XDDFTextBody getParentBody() { | |||
return _parent; | |||
} | |||
public List<XDDFTextRun> getTextRuns(){ | |||
return _runs; | |||
} | |||
public Iterator<XDDFTextRun> iterator(){ | |||
return _runs.iterator(); | |||
} | |||
/** | |||
* Append a line break. | |||
* | |||
* @return text run representing this line break ('\n'). | |||
*/ | |||
public XDDFTextRun appendLineBreak(){ | |||
CTTextLineBreak br = _p.addNewBr(); | |||
// by default, line break has the font properties of the last text run | |||
for (int i = _runs.size() - 1; i <= 0; i--){ | |||
CTTextCharacterProperties prevProps = _runs.get(i).getProperties(); | |||
// let's find one that is not undefined | |||
if (prevProps != null) { | |||
br.setRPr((CTTextCharacterProperties) prevProps.copy()); | |||
break; | |||
} | |||
} | |||
XDDFTextRun run = new XDDFTextRun(br, this); | |||
_runs.add(run); | |||
return run; | |||
} | |||
/** | |||
* Append a new text field. | |||
* | |||
* @return the new text field. | |||
*/ | |||
public XDDFTextRun appendField(String id, String type, String text){ | |||
CTTextField f = _p.addNewFld(); | |||
f.setId(id); | |||
f.setType(type); | |||
f.setT(text); | |||
CTTextCharacterProperties rPr = f.addNewRPr(); | |||
rPr.setLang(LocaleUtil.getUserLocale().toLanguageTag()); | |||
XDDFTextRun run = new XDDFTextRun(f, this); | |||
_runs.add(run); | |||
return run; | |||
} | |||
/** | |||
* Append a new run of text. | |||
* | |||
* @return the new run of text. | |||
*/ | |||
public XDDFTextRun appendRegularRun(String text){ | |||
CTRegularTextRun r = _p.addNewR(); | |||
r.setT(text); | |||
CTTextCharacterProperties rPr = r.addNewRPr(); | |||
rPr.setLang(LocaleUtil.getUserLocale().toLanguageTag()); | |||
XDDFTextRun run = new XDDFTextRun(r, this); | |||
_runs.add(run); | |||
return run; | |||
} | |||
/** | |||
* Returns the alignment that is applied to the paragraph. | |||
* | |||
* If this attribute is omitted, then a value of left is implied. | |||
* @return alignment that is applied to the paragraph | |||
*/ | |||
public TextAlignment getTextAlignment() { | |||
return findDefinedParagraphProperty(props -> props.isSetAlgn(), props -> props.getAlgn()) | |||
.map(align -> TextAlignment.valueOf(align)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Specifies the alignment that is to be applied to the paragraph. | |||
* Possible values for this include left, right, centered, justified and distributed, | |||
* | |||
* @param align text alignment | |||
*/ | |||
public void setTextAlignment(TextAlignment align) { | |||
if (align != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setTextAlignment(align); | |||
} | |||
} | |||
/** | |||
* Returns where vertically on a line of text the actual words are positioned. This deals | |||
* with vertical placement of the characters with respect to the baselines. | |||
* | |||
* If this attribute is omitted, then a value of baseline is implied. | |||
* @return alignment that is applied to the paragraph | |||
*/ | |||
public FontAlignment getFontAlignment() { | |||
return findDefinedParagraphProperty(props -> props.isSetFontAlgn(), props -> props.getFontAlgn()) | |||
.map(align -> FontAlignment.valueOf(align)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Determines where vertically on a line of text the actual words are positioned. This deals | |||
* with vertical placement of the characters with respect to the baselines. For instance | |||
* having text anchored to the top baseline, anchored to the bottom baseline, centered in | |||
* between, etc. | |||
* | |||
* @param align text font alignment | |||
*/ | |||
public void setFontAlignment(FontAlignment align) { | |||
if (align != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setFontAlignment(align); | |||
} | |||
} | |||
/** | |||
* | |||
* @return the indentation, in points, applied to the first line of text in the paragraph. | |||
*/ | |||
public Double getIndentation() { | |||
return findDefinedParagraphProperty(props -> props.isSetIndent(), props -> props.getIndent()) | |||
.map(emu -> Units.toPoints(emu)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Specifies the indentation size that will be applied to the first line of text in the paragraph. | |||
* | |||
* @param points the indentation in points. | |||
* The value <code>null</code> unsets the indentation for this paragraph. | |||
* <dl> | |||
* <dt>Minimum inclusive =</dt><dd>-4032</dd> | |||
* <dt>Maximum inclusive =</dt><dd>4032</dd> | |||
* </dt> | |||
*/ | |||
public void setIndentation(Double points) { | |||
if (points != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setIndentation(points);; | |||
} | |||
} | |||
/** | |||
* | |||
* @return the left margin, in points, of the paragraph. | |||
*/ | |||
public Double getMarginLeft() { | |||
return findDefinedParagraphProperty(props -> props.isSetMarL(), props -> props.getMarL()) | |||
.map(emu -> Units.toPoints(emu)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Specifies the left margin of the paragraph. This is specified in addition to the text body | |||
* inset and applies only to this text paragraph. That is the text body inset and the LeftMargin | |||
* attributes are additive with respect to the text position. | |||
* | |||
* @param points the margin in points. | |||
* The value <code>null</code> unsets the left margin for this paragraph. | |||
* <dl> | |||
* <dt>Minimum inclusive =</dt><dd>0</dd> | |||
* <dt>Maximum inclusive =</dt><dd>4032</dd> | |||
* </dt> | |||
*/ | |||
public void setMarginLeft(Double points) { | |||
if (points != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setMarginLeft(points); | |||
} | |||
} | |||
/** | |||
* | |||
* @return the right margin, in points, of the paragraph. | |||
*/ | |||
public Double getMarginRight() { | |||
return findDefinedParagraphProperty(props -> props.isSetMarR(), props -> props.getMarR()) | |||
.map(emu -> Units.toPoints(emu)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Specifies the right margin of the paragraph. This is specified in addition to the text body | |||
* inset and applies only to this text paragraph. That is the text body inset and the RightMargin | |||
* attributes are additive with respect to the text position. | |||
* | |||
* @param points the margin in points. | |||
* The value <code>null</code> unsets the right margin for this paragraph. | |||
* <dl> | |||
* <dt>Minimum inclusive =</dt><dd>0</dd> | |||
* <dt>Maximum inclusive =</dt><dd>4032</dd> | |||
* </dt> | |||
*/ | |||
public void setMarginRight(Double points) { | |||
if (points != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setMarginRight(points); | |||
} | |||
} | |||
/** | |||
* | |||
* @return the default size for a tab character within this paragraph in points. | |||
*/ | |||
public Double getDefaultTabSize() { | |||
return findDefinedParagraphProperty(props -> props.isSetDefTabSz(), props -> props.getDefTabSz()) | |||
.map(emu -> Units.toPoints(emu)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Specifies the default size for a tab character within this paragraph. | |||
* | |||
* @param points the default tab size in points. | |||
* The value <code>null</code> unsets the default tab size for this paragraph. | |||
*/ | |||
public void setDefaultTabSize(Double points) { | |||
if (points != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setDefaultTabSize(points); | |||
} | |||
} | |||
/** | |||
* Returns the vertical line spacing that is to be used within a paragraph. | |||
* This may be specified in two different ways, percentage spacing or font points spacing: | |||
* <p> | |||
* If line spacing is a percentage of normal line height, result is instance of XDDFSpacingPercent. | |||
* If line spacing is expressed in points, result is instance of XDDFSpacingPoints. | |||
* </p> | |||
* | |||
* @return the vertical line spacing. | |||
*/ | |||
public XDDFSpacing getLineSpacing() { | |||
return findDefinedParagraphProperty(props -> props.isSetLnSpc(), props -> props.getLnSpc()) | |||
.map(spacing -> extractSpacing(spacing)) | |||
.orElse(null); | |||
} | |||
/** | |||
* This element specifies the vertical line spacing that is to be used within a paragraph. | |||
* This may be specified in two different ways, percentage spacing or font points spacing: | |||
* <p> | |||
* If spacing is instance of XDDFSpacingPercent, then line spacing is a percentage of normal line height. | |||
* If spacing is instance of XDDFSpacingPoints, then line spacing is expressed in points. | |||
* </p> | |||
* Examples: | |||
* <pre><code> | |||
* // spacing will be 120% of the size of the largest text on each line | |||
* paragraph.setLineSpacing(new XDDFSpacingPercent(120)); | |||
* | |||
* // spacing will be 200% of the size of the largest text on each line | |||
* paragraph.setLineSpacing(new XDDFSpacingPercent(200)); | |||
* | |||
* // spacing will be 48 points | |||
* paragraph.setLineSpacing(new XDDFSpacingPoints(48.0)); | |||
* </code></pre> | |||
* | |||
* @param linespacing the vertical line spacing | |||
*/ | |||
public void setLineSpacing(XDDFSpacing linespacing) { | |||
if (linespacing != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setLineSpacing(linespacing); | |||
} | |||
} | |||
/** | |||
* The amount of vertical white space before the paragraph. | |||
* This may be specified in two different ways, percentage spacing or font points spacing: | |||
* <p> | |||
* If spacing is a percentage of normal line height, result is instance of XDDFSpacingPercent. | |||
* If spacing is expressed in points, result is instance of XDDFSpacingPoints. | |||
* </p> | |||
* | |||
* @return the vertical white space before the paragraph. | |||
*/ | |||
public XDDFSpacing getSpaceBefore() { | |||
return findDefinedParagraphProperty(props -> props.isSetSpcBef(), props -> props.getSpcBef()) | |||
.map(spacing -> extractSpacing(spacing)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Set the amount of vertical white space that will be present before the paragraph. | |||
* This may be specified in two different ways, percentage spacing or font points spacing: | |||
* <p> | |||
* If spacing is instance of XDDFSpacingPercent, then spacing is a percentage of normal line height. | |||
* If spacing is instance of XDDFSpacingPoints, then spacing is expressed in points. | |||
* </p> | |||
* Examples: | |||
* <pre><code> | |||
* // The paragraph will be formatted to have a spacing before the paragraph text. | |||
* // The spacing will be 200% of the size of the largest text on each line | |||
* paragraph.setSpaceBefore(new XDDFSpacingPercent(200)); | |||
* | |||
* // The spacing will be a size of 48 points | |||
* paragraph.setSpaceBefore(new XDDFSpacingPoints(48.0)); | |||
* </code></pre> | |||
* | |||
* @param spaceBefore the vertical white space before the paragraph. | |||
*/ | |||
public void setSpaceBefore(XDDFSpacing spaceBefore) { | |||
if (spaceBefore != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setSpaceBefore(spaceBefore); | |||
} | |||
} | |||
/** | |||
* The amount of vertical white space after the paragraph. | |||
* This may be specified in two different ways, percentage spacing or font points spacing: | |||
* <p> | |||
* If spacing is a percentage of normal line height, result is instance of XDDFSpacingPercent. | |||
* If spacing is expressed in points, result is instance of XDDFSpacingPoints. | |||
* </p> | |||
* | |||
* @return the vertical white space after the paragraph. | |||
*/ | |||
public XDDFSpacing getSpaceAfter() { | |||
return findDefinedParagraphProperty(props -> props.isSetSpcAft(), props -> props.getSpcAft()) | |||
.map(spacing -> extractSpacing(spacing)) | |||
.orElse(null); | |||
} | |||
/** | |||
* Set the amount of vertical white space that will be present after the paragraph. | |||
* This may be specified in two different ways, percentage spacing or font points spacing: | |||
* <p> | |||
* If spacing is instance of XDDFSpacingPercent, then spacing is a percentage of normal line height. | |||
* If spacing is instance of XDDFSpacingPoints, then spacing is expressed in points. | |||
* </p> | |||
* Examples: | |||
* <pre><code> | |||
* // The paragraph will be formatted to have a spacing after the paragraph text. | |||
* // The spacing will be 200% of the size of the largest text on each line | |||
* paragraph.setSpaceAfter(new XDDFSpacingPercent(200)); | |||
* | |||
* // The spacing will be a size of 48 points | |||
* paragraph.setSpaceAfter(new XDDFSpacingPoints(48.0)); | |||
* </code></pre> | |||
* | |||
* @param spaceAfter the vertical white space after the paragraph. | |||
*/ | |||
public void setSpaceAfter(XDDFSpacing spaceAfter) { | |||
if (spaceAfter != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setSpaceAfter(spaceAfter); | |||
} | |||
} | |||
/** | |||
* | |||
* @return the color of bullet characters within a given paragraph. | |||
* A <code>null</code> value means to use the text font color. | |||
*/ | |||
public XDDFColor getBulletColor(){ | |||
return findDefinedParagraphProperty( | |||
props -> props.isSetBuClr() || props.isSetBuClrTx(), | |||
props -> new XDDFParagraphBulletProperties(props).getBulletColor() | |||
).orElse(null); | |||
} | |||
/** | |||
* Set the color to be used on bullet characters within a given paragraph. | |||
* | |||
* @param color the bullet color | |||
*/ | |||
public void setBulletColor(XDDFColor color) { | |||
if (color != null || _p.isSetPPr()) { | |||
getOrCreateBulletProperties().setBulletColor(color); | |||
} | |||
} | |||
/** | |||
* Specifies the color to be used on bullet characters has to follow text color within a given paragraph. | |||
*/ | |||
public void setBulletColorFollowText() { | |||
getOrCreateBulletProperties().setBulletColorFollowText(); | |||
} | |||
/** | |||
* | |||
* @return the font of bullet characters within a given paragraph. | |||
* A <code>null</code> value means to use the text font font. | |||
*/ | |||
public XDDFFont getBulletFont(){ | |||
return findDefinedParagraphProperty( | |||
props -> props.isSetBuFont() || props.isSetBuFontTx(), | |||
props -> new XDDFParagraphBulletProperties(props).getBulletFont() | |||
).orElse(null); | |||
} | |||
/** | |||
* Set the font to be used on bullet characters within a given paragraph. | |||
* | |||
* @param font the bullet font | |||
*/ | |||
public void setBulletFont(XDDFFont font) { | |||
if (font != null || _p.isSetPPr()) { | |||
getOrCreateBulletProperties().setBulletFont(font); | |||
} | |||
} | |||
/** | |||
* Specifies the font to be used on bullet characters has to follow text font within a given paragraph. | |||
*/ | |||
public void setBulletFontFollowText() { | |||
getOrCreateBulletProperties().setBulletFontFollowText(); | |||
} | |||
/** | |||
* Returns the bullet size that is to be used within a paragraph. | |||
* This may be specified in three different ways, follows text size, percentage size and font points size: | |||
* <p> | |||
* If returned value is instance of XDDFBulletSizeFollowText, then bullet size is text size; | |||
* If returned value is instance of XDDFBulletSizePercent, then bullet size is a percentage of the font size; | |||
* If returned value is instance of XDDFBulletSizePoints, then bullet size is specified in points. | |||
* </p> | |||
* | |||
* @return the bullet size | |||
*/ | |||
public XDDFBulletSize getBulletSize(){ | |||
return findDefinedParagraphProperty( | |||
props -> props.isSetBuSzPct() || props.isSetBuSzPts() || props.isSetBuSzTx(), | |||
props -> new XDDFParagraphBulletProperties(props).getBulletSize() | |||
).orElse(null); | |||
} | |||
/** | |||
* Sets the bullet size that is to be used within a paragraph. | |||
* This may be specified in three different ways, follows text size, percentage size and font points size: | |||
* <p> | |||
* If given value is instance of XDDFBulletSizeFollowText, then bullet size is text size; | |||
* If given value is instance of XDDFBulletSizePercent, then bullet size is a percentage of the font size; | |||
* If given value is instance of XDDFBulletSizePoints, then bullet size is specified in points. | |||
* </p> | |||
* | |||
* @param size the bullet size specification | |||
*/ | |||
public void setBulletSize(XDDFBulletSize size) { | |||
if (size != null || _p.isSetPPr()) { | |||
getOrCreateBulletProperties().setBulletSize(size); | |||
} | |||
} | |||
public XDDFBulletStyle getBulletStyle(){ | |||
return findDefinedParagraphProperty( | |||
props -> props.isSetBuAutoNum() || props.isSetBuBlip() || props.isSetBuChar() || props.isSetBuNone(), | |||
props -> new XDDFParagraphBulletProperties(props).getBulletStyle() | |||
).orElse(null); | |||
} | |||
public void setBulletStyle(XDDFBulletStyle style) { | |||
if (style != null || _p.isSetPPr()) { | |||
getOrCreateBulletProperties().setBulletStyle(style); | |||
} | |||
} | |||
public boolean hasEastAsianLineBreak() { | |||
return findDefinedParagraphProperty(props -> props.isSetEaLnBrk(), props -> props.getEaLnBrk()) | |||
.orElse(false); | |||
} | |||
public void setEastAsianLineBreak(Boolean value) { | |||
if (value != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setEastAsianLineBreak(value); | |||
} | |||
} | |||
public boolean hasLatinLineBreak() { | |||
return findDefinedParagraphProperty(props -> props.isSetLatinLnBrk(), props -> props.getLatinLnBrk()) | |||
.orElse(false); | |||
} | |||
public void setLatinLineBreak(Boolean value) { | |||
if (value != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setLatinLineBreak(value); | |||
} | |||
} | |||
public boolean hasHangingPunctuation() { | |||
return findDefinedParagraphProperty(props -> props.isSetHangingPunct(), props -> props.getHangingPunct()) | |||
.orElse(false); | |||
} | |||
public void setHangingPunctuation(Boolean value) { | |||
if (value != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setHangingPunctuation(value); | |||
} | |||
} | |||
public boolean isRightToLeft() { | |||
return findDefinedParagraphProperty(props -> props.isSetRtl(), props -> props.getRtl()) | |||
.orElse(false); | |||
} | |||
public void setRightToLeft(Boolean value) { | |||
if (value != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setRightToLeft(value); | |||
} | |||
} | |||
public XDDFTabStop addTabStop() { | |||
return getOrCreateProperties().addTabStop(); | |||
} | |||
public XDDFTabStop insertTabStop(int index) { | |||
return getOrCreateProperties().insertTabStop(index); | |||
} | |||
public void removeTabStop(int index) { | |||
if (_p.isSetPPr()) { | |||
getProperties().removeTabStop(index); | |||
} | |||
} | |||
public XDDFTabStop getTabStop(int index) { | |||
if (_p.isSetPPr()) { | |||
return getProperties().getTabStop(index); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public List<XDDFTabStop> getTabStops() { | |||
if (_p.isSetPPr()) { | |||
return getProperties().getTabStops(); | |||
} else { | |||
return Collections.emptyList(); | |||
} | |||
} | |||
public int countTabStops() { | |||
if (_p.isSetPPr()) { | |||
return getProperties().countTabStops(); | |||
} else { | |||
return 0; | |||
} | |||
} | |||
public XDDFParagraphBulletProperties getOrCreateBulletProperties() { | |||
return getOrCreateProperties().getBulletProperties(); | |||
} | |||
public XDDFParagraphBulletProperties getBulletProperties() { | |||
if (_p.isSetPPr()) { | |||
return getProperties().getBulletProperties(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public XDDFRunProperties getDefaultRunProperties() { | |||
if (_p.isSetPPr()) { | |||
return getProperties().getDefaultRunProperties(); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setDefaultRunProperties(XDDFRunProperties properties) { | |||
if (properties != null || _p.isSetPPr()) { | |||
getOrCreateProperties().setDefaultRunProperties(properties); | |||
} | |||
} | |||
public XDDFRunProperties getAfterLastRunProperties() { | |||
if (_p.isSetEndParaRPr()) { | |||
return new XDDFRunProperties(_p.getEndParaRPr()); | |||
} else { | |||
return null; | |||
} | |||
} | |||
public void setAfterLastRunProperties(XDDFRunProperties properties) { | |||
if (properties == null) { | |||
_p.unsetEndParaRPr(); | |||
} else { | |||
_p.setEndParaRPr(properties.getXmlObject()); | |||
} | |||
} | |||
private XDDFSpacing extractSpacing(CTTextSpacing spacing) { | |||
if (spacing.isSetSpcPct()) { | |||
double scale = 1 - _parent.getBodyProperties().getAutoFit().getLineSpaceReduction() / 100_000.0; | |||
return new XDDFSpacingPercent(spacing, spacing.getSpcPct(), scale); | |||
} else if (spacing.isSetSpcPts()) { | |||
return new XDDFSpacingPoints(spacing, spacing.getSpcPts()); | |||
} | |||
return null; | |||
} | |||
private XDDFParagraphProperties getProperties() { | |||
if (_properties == null) { | |||
_properties = new XDDFParagraphProperties(_p.getPPr()); | |||
} | |||
return _properties; | |||
} | |||
private XDDFParagraphProperties getOrCreateProperties() { | |||
if (!_p.isSetPPr()) { | |||
_properties = new XDDFParagraphProperties(_p.addNewPPr()); | |||
} | |||
return getProperties(); | |||
} | |||
protected <R> Optional<R> findDefinedParagraphProperty(Function<CTTextParagraphProperties, Boolean> isSet, | |||
Function<CTTextParagraphProperties, R> getter) { | |||
if (_p.isSetPPr()) { | |||
int level = _p.getPPr().isSetLvl() ? 1 + _p.getPPr().getLvl() : 0; | |||
return findDefinedParagraphProperty(isSet, getter, level); | |||
} else { | |||
return _parent.findDefinedParagraphProperty(isSet, getter, 0); | |||
} | |||
} | |||
private <R> Optional<R> findDefinedParagraphProperty(Function<CTTextParagraphProperties, Boolean> isSet, | |||
Function<CTTextParagraphProperties, R> getter, int level) { | |||
final CTTextParagraphProperties props = _p.getPPr(); | |||
if (props != null && isSet.apply(props)) { | |||
return Optional.ofNullable(getter.apply(props)); | |||
} else { | |||
return _parent.findDefinedParagraphProperty(isSet, getter, level); | |||
} | |||
} | |||
protected <R> Optional<R> findDefinedRunProperty(Function<CTTextCharacterProperties, Boolean> isSet, | |||
Function<CTTextCharacterProperties, R> getter) { | |||
if (_p.isSetPPr()) { | |||
int level = _p.getPPr().isSetLvl() ? 1 + _p.getPPr().getLvl() : 0; | |||
return findDefinedRunProperty(isSet, getter, level); | |||
} else { | |||
return _parent.findDefinedRunProperty(isSet, getter, 0); | |||
} | |||
} | |||
private <R> Optional<R> findDefinedRunProperty(Function<CTTextCharacterProperties, Boolean> isSet, | |||
Function<CTTextCharacterProperties, R> getter, int level) { | |||
final CTTextCharacterProperties props = _p.getPPr().isSetDefRPr() ? _p.getPPr().getDefRPr() : null; | |||
if (props != null && isSet.apply(props)) { | |||
return Optional.ofNullable(getter.apply(props)); | |||
} else { | |||
return _parent.findDefinedRunProperty(isSet, getter, level); | |||
} | |||
} | |||
} |
@@ -0,0 +1,557 @@ | |||
/* ==================================================================== | |||
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.xddf.usermodel.text; | |||
import java.util.LinkedList; | |||
import java.util.Locale; | |||
import java.util.Optional; | |||
import java.util.function.Function; | |||
import org.apache.poi.POIXMLRelation; | |||
import org.apache.poi.common.usermodel.fonts.FontGroup; | |||
import org.apache.poi.openxml4j.opc.PackagePart; | |||
import org.apache.poi.openxml4j.opc.PackagePartName; | |||
import org.apache.poi.openxml4j.opc.PackageRelationship; | |||
import org.apache.poi.openxml4j.opc.TargetMode; | |||
import org.apache.poi.util.Beta; | |||
import org.apache.poi.util.Internal; | |||
import org.apache.poi.xddf.usermodel.XDDFColor; | |||
import org.apache.poi.xddf.usermodel.XDDFFillProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFLineProperties; | |||
import org.apache.poi.xddf.usermodel.XDDFSolidFillProperties; | |||
import org.apache.poi.xssf.usermodel.XSSFFont; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTRegularTextRun; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextCharacterProperties; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextField; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.CTTextLineBreak; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextCapsType; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextStrikeType; | |||
import org.openxmlformats.schemas.drawingml.x2006.main.STTextUnderlineType; | |||
@Beta | |||
public class XDDFTextRun { | |||
private XDDFTextParagraph _parent; | |||
private XDDFRunProperties _properties; | |||
private CTTextLineBreak _tlb; | |||
private CTTextField _tf; | |||
private CTRegularTextRun _rtr; | |||
@Internal | |||
protected XDDFTextRun(CTTextLineBreak run, XDDFTextParagraph parent) { | |||
this._tlb = run; | |||
this._parent = parent; | |||
} | |||
@Internal | |||
protected XDDFTextRun(CTTextField run, XDDFTextParagraph parent) { | |||
this._tf = run; | |||
this._parent = parent; | |||
} | |||
@Internal | |||
protected XDDFTextRun(CTRegularTextRun run, XDDFTextParagraph parent) { | |||
this._rtr = run; | |||
this._parent = parent; | |||
} | |||
public XDDFTextParagraph getParentParagraph() { | |||
return _parent; | |||
} | |||
public boolean isLineBreak() { | |||
return _tlb != null; | |||
} | |||
public boolean isField() { | |||
return _tf != null; | |||
} | |||
public boolean isRegularRun() { | |||
return _rtr != null; | |||
} | |||
public String getText() { | |||
if (isLineBreak()) { | |||
return "\n"; | |||
} else if (isField()) { | |||
return _tf.getT(); | |||
} else { | |||
return _rtr.getT(); | |||
} | |||
} | |||
public void setText(String text) { | |||
if (isField()) { | |||
_tf.setT(text); | |||
} else if (isRegularRun()) { | |||
_rtr.setT(text); | |||
} | |||
} | |||
public void setDirty(Boolean dirty) { | |||
getOrCreateProperties().setDirty(dirty); | |||
} | |||
public Boolean getDirty() { | |||
return findDefinedProperty(props -> props.isSetDirty(), props -> props.getDirty()) | |||
.orElse(null); | |||
} | |||
public void setSpellError(Boolean error) { | |||
getOrCreateProperties().setSpellError(error); | |||
} | |||
public Boolean getSpellError() { | |||
return findDefinedProperty(props -> props.isSetErr(), props -> props.getErr()) | |||
.orElse(null); | |||
} | |||
public void setNoProof(Boolean noproof) { | |||
getOrCreateProperties().setNoProof(noproof); | |||
} | |||
public Boolean getNoProof() { | |||
return findDefinedProperty(props -> props.isSetNoProof(), props -> props.getNoProof()) | |||
.orElse(null); | |||
} | |||
public void setNormalizeHeights(Boolean normalize) { | |||
getOrCreateProperties().setNormalizeHeights(normalize); | |||
} | |||
public Boolean getNormalizeHeights() { | |||
return findDefinedProperty(props -> props.isSetNormalizeH(), props -> props.getNormalizeH()) | |||
.orElse(null); | |||
} | |||
public void setKumimoji(Boolean kumimoji) { | |||
getOrCreateProperties().setKumimoji(kumimoji); | |||
} | |||
public boolean isKumimoji() { | |||
return findDefinedProperty(props -> props.isSetKumimoji(), props -> props.getKumimoji()) | |||
.orElse(false); | |||
} | |||
/** | |||
* Specifies whether this run of text will be formatted as bold text. | |||
* | |||
* @param bold whether this run of text will be formatted as bold text. | |||
*/ | |||
public void setBold(Boolean bold) { | |||
getOrCreateProperties().setBold(bold); | |||
} | |||
/** | |||
* @return whether this run of text is formatted as bold text. | |||
*/ | |||
public boolean isBold() { | |||
return findDefinedProperty(props -> props.isSetB(), props -> props.getB()) | |||
.orElse(false); | |||
} | |||
/** | |||
* @param italic whether this run of text is formatted as italic text. | |||
*/ | |||
public void setItalic(Boolean italic) { | |||
getOrCreateProperties().setItalic(italic); | |||
} | |||
/** | |||
* @return whether this run of text is formatted as italic text. | |||
*/ | |||
public boolean isItalic() { | |||
return findDefinedProperty(props -> props.isSetI(), props -> props.getI()) | |||
.orElse(false); | |||
} | |||
/** | |||
* @param strike which strike style this run of text is formatted with. | |||
*/ | |||
public void setStrikeThrough(StrikeType strike) { | |||
getOrCreateProperties().setStrikeThrough(strike); | |||
} | |||
/** | |||
* @return whether this run of text is formatted as striked text. | |||
*/ | |||
public boolean isStrikeThrough() { | |||
return findDefinedProperty(props -> props.isSetStrike(), props -> props.getStrike()) | |||
.map(strike -> strike != STTextStrikeType.NO_STRIKE) | |||
.orElse(false); | |||
} | |||
/** | |||
* @return which strike style this run of text is formatted with. | |||
*/ | |||
public StrikeType getStrikeThrough() { | |||
return findDefinedProperty(props -> props.isSetStrike(), props -> props.getStrike()) | |||
.map(strike -> StrikeType.valueOf(strike)) | |||
.orElse(null); | |||
} | |||
/** | |||
* @param underline which underline style this run of text is formatted with. | |||
*/ | |||
public void setUnderline(UnderlineType underline) { | |||
getOrCreateProperties().setUnderline(underline); | |||
} | |||
/** | |||
* @return whether this run of text is formatted as underlined text. | |||
*/ | |||
public boolean isUnderline() { | |||
return findDefinedProperty(props -> props.isSetU(), props -> props.getU()) | |||
.map(underline -> underline != STTextUnderlineType.NONE) | |||
.orElse(false); | |||
} | |||
/** | |||
* @return which underline style this run of text is formatted with. | |||
*/ | |||
public UnderlineType getUnderline() { | |||
return findDefinedProperty(props -> props.isSetU(), props -> props.getU()) | |||
.map(underline -> UnderlineType.valueOf(underline)) | |||
.orElse(null); | |||
} | |||
/** | |||
* @param caps which caps style this run of text is formatted with. | |||
*/ | |||
public void setCapitals(CapsType caps) { | |||
getOrCreateProperties().setCapitals(caps); | |||
} | |||
/** | |||
* @return whether this run of text is formatted as capitalized text. | |||
*/ | |||
public boolean isCapitals() { | |||
return findDefinedProperty(props -> props.isSetCap(), props -> props.getCap()) | |||
.map(caps -> caps != STTextCapsType.NONE) | |||
.orElse(false); | |||
} | |||
/** | |||
* @return which caps style this run of text is formatted with. | |||
*/ | |||
public CapsType getCapitals() { | |||
return findDefinedProperty(props -> props.isSetCap(), props -> props.getCap()) | |||
.map(caps -> CapsType.valueOf(caps)) | |||
.orElse(null); | |||
} | |||
/** | |||
* @return whether a run of text will be formatted as a subscript text. Default is false. | |||
*/ | |||
public boolean isSubscript() { | |||
return findDefinedProperty(props -> props.isSetBaseline(), props -> props.getBaseline()) | |||
.map(baseline -> baseline < 0) | |||
.orElse(false); | |||
} | |||
/** | |||
* @return whether a run of text will be formatted as a superscript text. Default is false. | |||
*/ | |||
public boolean isSuperscript() { | |||
return findDefinedProperty(props -> props.isSetBaseline(), props -> props.getBaseline()) | |||
.map(baseline -> baseline > 0) | |||
.orElse(false); | |||
} | |||
/** | |||
* Set the baseline for both the superscript and subscript fonts. | |||
* <p> | |||
* The size is specified using a percentage. | |||
* Positive values indicate superscript, negative values indicate subscript. | |||
* </p> | |||
* | |||
* @param offset | |||
*/ | |||
public void setBaseline(Double offset){ | |||
getOrCreateProperties().setBaseline((int)(offset * 1000)); | |||
} | |||
/** | |||
* Set whether the text in this run is formatted as superscript. | |||
* <p> | |||
* The size is specified using a percentage. | |||
* </p> | |||
* | |||
* @param offset | |||
*/ | |||
public void setSuperscript(Double offset){ | |||
setBaseline(offset == null ? null : Math.abs(offset)); | |||
} | |||
/** | |||
* Set whether the text in this run is formatted as subscript. | |||
* <p> | |||
* The size is specified using a percentage. | |||
* </p> | |||
* | |||
* @param offset | |||
*/ | |||
public void setSubscript(Double offset){ | |||
setBaseline(offset == null ? null : -Math.abs(offset)); | |||
} | |||
public void setFillProperties(XDDFFillProperties properties) { | |||
getOrCreateProperties().setFillProperties(properties); | |||
} | |||
public void setFontColor(XDDFColor color) { | |||
XDDFSolidFillProperties props = new XDDFSolidFillProperties(); | |||
props.setColor(color); | |||
setFillProperties(props); | |||
} | |||
public XDDFColor getFontColor() { | |||
XDDFSolidFillProperties solid = findDefinedProperty(props -> props.isSetSolidFill(), props -> props.getSolidFill()) | |||
.map(props -> new XDDFSolidFillProperties(props)) | |||
.orElse(new XDDFSolidFillProperties()); | |||
return solid.getColor(); | |||
} | |||
/** | |||
* <em>Note</em>: In order to get fonts to unset the property for a given font family use | |||
* {@link XDDFFont#unsetFontForGroup(FontGroup)} | |||
* | |||
* @param fonts to set or unset on the run. | |||
*/ | |||
public void setFonts(XDDFFont[] fonts) { | |||
getOrCreateProperties().setFonts(fonts); | |||
} | |||
public XDDFFont[] getFonts() { | |||
LinkedList<XDDFFont> list = new LinkedList<>(); | |||
findDefinedProperty(props -> props.isSetCs(), props -> props.getCs()) | |||
.map(font -> new XDDFFont(FontGroup.COMPLEX_SCRIPT, font)) | |||
.ifPresent(font -> list.add(font)); | |||
findDefinedProperty(props -> props.isSetEa(), props -> props.getEa()) | |||
.map(font -> new XDDFFont(FontGroup.EAST_ASIAN, font)) | |||
.ifPresent(font -> list.add(font)); | |||
findDefinedProperty(props -> props.isSetLatin(), props -> props.getLatin()) | |||
.map(font -> new XDDFFont(FontGroup.LATIN, font)) | |||
.ifPresent(font -> list.add(font)); | |||
findDefinedProperty(props -> props.isSetSym(), props -> props.getSym()) | |||
.map(font -> new XDDFFont(FontGroup.SYMBOL, font)) | |||
.ifPresent(font -> list.add(font)); | |||
return list.toArray(new XDDFFont[list.size()]); | |||
} | |||
/** | |||
* @param size font size in points. | |||
* The value <code>null</code> unsets the size for this run. | |||
* <dl> | |||
* <dt>Minimum inclusive =</dt><dd>1</dd> | |||
* <dt>Maximum inclusive =</dt><dd>400</dd> | |||
* </dt> | |||
* | |||
*/ | |||
public void setFontSize(Double size) { | |||
getOrCreateProperties().setFontSize(size); | |||
} | |||
public Double getFontSize() { | |||
Integer size = findDefinedProperty(props -> props.isSetSz(), props -> props.getSz()) | |||
.orElse(100 * XSSFFont.DEFAULT_FONT_SIZE); // default font size | |||
double scale = _parent.getParentBody().getBodyProperties().getAutoFit().getFontScale() / 10_000_000.0; | |||
return size * scale; | |||
} | |||
/** | |||
* Set the kerning of characters within a text run. | |||
* <p> | |||
* The value <code>null</code> unsets the kerning for this run. | |||
* </p> | |||
* | |||
* @param kerning character kerning in points. | |||
* <dl> | |||
* <dt>Minimum inclusive =</dt><dd>0</dd> | |||
* <dt>Maximum inclusive =</dt><dd>4000</dd> | |||
* </dt> | |||
*/ | |||
public void setCharacterKerning(Double kerning){ | |||
getOrCreateProperties().setCharacterKerning(kerning); | |||
} | |||
/** | |||
* | |||
* @return the kerning of characters within a text run, | |||
* If this attribute is omitted then returns <code>null</code>. | |||
*/ | |||
public Double getCharacterKerning() { | |||
return findDefinedProperty(props -> props.isSetKern(), props -> props.getKern()) | |||
.map(kerning -> 0.01 * kerning) | |||
.orElse(null); | |||
} | |||
/** | |||
* Set the spacing between characters within a text run. | |||
* <p> | |||
* The spacing is specified in points. Positive values will cause the text to expand, | |||
* negative values to condense. | |||
* </p> | |||
* <p> | |||
* The value <code>null</code> unsets the spacing for this run. | |||
* </p> | |||
* | |||
* @param spacing character spacing in points. | |||
* <dl> | |||
* <dt>Minimum inclusive =</dt><dd>-4000</dd> | |||
* <dt>Maximum inclusive =</dt><dd>4000</dd> | |||
* </dt> | |||
*/ | |||
public void setCharacterSpacing(Double spacing){ | |||
getOrCreateProperties().setCharacterSpacing(spacing); | |||
} | |||
/** | |||
* | |||
* @return the spacing between characters within a text run, | |||
* If this attribute is omitted then returns <code>null</code>. | |||
*/ | |||
public Double getCharacterSpacing() { | |||
return findDefinedProperty(props -> props.isSetSpc(), props -> props.getSpc()) | |||
.map(spacing -> 0.01 * spacing) | |||
.orElse(null); | |||
} | |||
public void setBookmark(String bookmark) { | |||
getOrCreateProperties().setBookmark(bookmark); | |||
} | |||
public String getBookmark() { | |||
return findDefinedProperty(props -> props.isSetBmk(), props -> props.getBmk()) | |||
.orElse(null); | |||
} | |||
public XDDFHyperlink linkToExternal(String url, PackagePart localPart, POIXMLRelation relation) { | |||
PackageRelationship rel = localPart.addExternalRelationship(url, relation.getRelation()); | |||
XDDFHyperlink link = new XDDFHyperlink(rel.getId()); | |||
getOrCreateProperties().setHyperlink(link); | |||
return link; | |||
} | |||
public XDDFHyperlink linkToAction(String action) { | |||
XDDFHyperlink link = new XDDFHyperlink("", action); | |||
getOrCreateProperties().setHyperlink(link); | |||
return link; | |||
} | |||
public XDDFHyperlink linkToInternal(String action, PackagePart localPart, POIXMLRelation relation, PackagePartName target) { | |||
PackageRelationship rel = localPart.addRelationship(target, TargetMode.INTERNAL, relation.getRelation()); | |||
XDDFHyperlink link = new XDDFHyperlink(rel.getId(), action); | |||
getOrCreateProperties().setHyperlink(link); | |||
return link; | |||
} | |||
public XDDFHyperlink getHyperlink() { | |||
return findDefinedProperty(props -> props.isSetHlinkClick(), props -> props.getHlinkClick()) | |||
.map(link -> new XDDFHyperlink(link)) | |||
.orElse(null); | |||
} | |||
public XDDFHyperlink createMouseOver(String action) { | |||
XDDFHyperlink link = new XDDFHyperlink("", action); | |||
getOrCreateProperties().setMouseOver(link); | |||
return link; | |||
} | |||
public XDDFHyperlink getMouseOver() { | |||
return findDefinedProperty(props -> props.isSetHlinkMouseOver(), props -> props.getHlinkMouseOver()) | |||
.map(link -> new XDDFHyperlink(link)) | |||
.orElse(null); | |||
} | |||
public void setLanguage(Locale lang) { | |||
getOrCreateProperties().setLanguage(lang); | |||
} | |||
public Locale getLanguage() { | |||
return findDefinedProperty(props -> props.isSetLang(), props -> props.getLang()) | |||
.map(lang -> Locale.forLanguageTag(lang)) | |||
.orElse(null); | |||
} | |||
public void setAlternativeLanguage(Locale lang) { | |||
getOrCreateProperties().setAlternativeLanguage(lang); | |||
} | |||
public Locale getAlternativeLanguage() { | |||
return findDefinedProperty(props -> props.isSetAltLang(), props -> props.getAltLang()) | |||
.map(lang -> Locale.forLanguageTag(lang)) | |||
.orElse(null); | |||
} | |||
public void setHighlight(XDDFColor color) { | |||
getOrCreateProperties().setHighlight(color); | |||
} | |||
public XDDFColor getHighlight() { | |||
return findDefinedProperty(props -> props.isSetHighlight(), props -> props.getHighlight()) | |||
.map(color -> XDDFColor.forColorContainer(color)) | |||
.orElse(null); | |||
} | |||
public void setLineProperties(XDDFLineProperties properties) { | |||
getOrCreateProperties().setLineProperties(properties); | |||
} | |||
public XDDFLineProperties getLineProperties() { | |||
return findDefinedProperty(props -> props.isSetLn(), props -> props.getLn()) | |||
.map(props -> new XDDFLineProperties(props)) | |||
.orElse(null); | |||
} | |||
private <R> Optional<R> findDefinedProperty(Function<CTTextCharacterProperties, Boolean> isSet, Function<CTTextCharacterProperties, R> getter) { | |||
CTTextCharacterProperties props = getProperties(); | |||
if (props != null && isSet.apply(props)) { | |||
return Optional.ofNullable(getter.apply(props)); | |||
} else { | |||
return _parent.findDefinedRunProperty(isSet, getter); | |||
} | |||
} | |||
@Internal | |||
protected CTTextCharacterProperties getProperties() { | |||
if (isLineBreak() && _tlb.isSetRPr()) { | |||
return _tlb.getRPr(); | |||
} else if (isField() && _tf.isSetRPr()) { | |||
return _tf.getRPr(); | |||
} else if (isRegularRun() && _rtr.isSetRPr()) { | |||
return _rtr.getRPr(); | |||
} | |||
return null; | |||
} | |||
private XDDFRunProperties getOrCreateProperties() { | |||
if (_properties == null) { | |||
if (isLineBreak()) { | |||
_properties = new XDDFRunProperties(_tlb.isSetRPr() ? _tlb.getRPr() : _tlb.addNewRPr()); | |||
} else if (isField()) { | |||
_properties = new XDDFRunProperties(_tf.isSetRPr() ? _tf.getRPr() : _tf.addNewRPr()); | |||
} else if (isRegularRun()) { | |||
_properties = new XDDFRunProperties(_rtr.isSetRPr() ? _rtr.getRPr() : _rtr.addNewRPr()); | |||
} | |||
} | |||
return _properties; | |||
} | |||
} |