/* * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. * * Copyright 2008 jOpenDocument, by ILM Informatique. All rights reserved. * * The contents of this file are subject to the terms of the GNU * General Public License Version 3 only ("GPL"). * You may not use this file except in compliance with the License. * You can obtain a copy of the License at http://www.gnu.org/licenses/gpl-3.0.html * See the License for the specific language governing permissions and limitations under the License. * * When distributing the software, include this License Header Notice in each file. * */ package org.jopendocument.dom.text; import org.jopendocument.dom.XMLVersion; import org.jopendocument.dom.ODSingleXMLDocument; import java.util.HashSet; import java.util.Set; import org.jdom.Attribute; import org.jdom.Element; import org.jdom.JDOMException; import org.jdom.xpath.XPath; /** * A text paragraph, the basic unit of text. See ยง4.1 of the OpenDocument specification. */ public class Paragraph extends TextNode<ParagraphStyle> { static Element createEmpty(XMLVersion ns) { return new Element("p", ns.getTEXT()); } static private XPath textStylesPath = null; static private Set<String> getTextStyles(final Element elem) { final Set<String> res = new HashSet<String>(); synchronized (Paragraph.class) { if (textStylesPath == null) try { textStylesPath = XPath.newInstance(".//text:span/@text:style-name"); } catch (JDOMException e) { // shouldn't happen since it's a constant throw new IllegalStateException(e); } try { for (final Object o : textStylesPath.selectNodes(elem)) res.add(((Attribute) o).getValue()); } catch (JDOMException e) { throw new IllegalArgumentException("could'nt evaluate with " + elem, e); } } return res; } public Paragraph(Element elem) { super(elem, ParagraphStyle.class); } public Paragraph(XMLVersion ns) { this(createEmpty(ns)); } public Paragraph() { this(XMLVersion.getDefault()); } public Paragraph(String text) { this(); addContent(text); } public final void setStyle(String styleName) { getElement().setAttribute("style-name", styleName, getElement().getNamespace()); } public final void addContent(String text) { this.getElement().addContent(text); } public final void addTab() { this.getElement().addContent(new Element("tab", getElement().getNamespace())); } public final void addStyledContent(String text, String styleName) { if (styleName.equals(getStyleName())) { this.addContent(text); } else { final Element span = new Element("span", getElement().getNamespace()); span.setAttribute("style-name", styleName, getElement().getNamespace()); span.addContent(text); getElement().addContent(span); } } private final Set<String> getUsedTextStyles() { return getTextStyles(getElement()); } protected void checkDocument(ODSingleXMLDocument doc) { if (this.getStyleName() != null && getStyle(doc.getPackage(), doc.getDocument()) == null) throw new IllegalArgumentException("unknown style " + getStyleName() + " in " + doc); for (final String styleName : this.getUsedTextStyles()) { if (doc.getStyle(TextStyle.STYLE_FAMILY, styleName) == null) { throw new IllegalArgumentException(this + " is using a text:span with an undefined style : " + styleName); } } } @Override public String toString() { return this.getClass().getSimpleName() + " " + this.getElement().getText(); } }