You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@poi.apache.org by ab...@apache.org on 2018/08/26 21:18:55 UTC

svn commit: r1839255 [3/3] - in /poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel: ./ chart/ text/

Added: poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java
URL: http://svn.apache.org/viewvc/poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java?rev=1839255&view=auto
==============================================================================
--- poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java (added)
+++ poi/trunk/src/ooxml/java/org/apache/poi/xddf/usermodel/text/XDDFTextRun.java Sun Aug 26 21:18:54 2018
@@ -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;
+    }
+}



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@poi.apache.org
For additional commands, e-mail: commits-help@poi.apache.org