/*
* 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.spreadsheet;
import org.jopendocument.dom.ODPackage;
import org.jopendocument.dom.StyleDesc;
import org.jopendocument.dom.StyleProperties;
import org.jopendocument.dom.StyleStyle;
import org.jopendocument.dom.XMLVersion;
import org.jopendocument.dom.text.ParagraphStyle.SyleParagraphProperties;
import org.jopendocument.dom.text.TextStyle.SyleTextProperties;
import java.awt.Color;
import java.util.Arrays;
import java.util.regex.Pattern;
import org.jdom.Element;
import org.jdom.Namespace;
public class CellStyle extends StyleStyle {
static public enum Side {
TOP, BOTTOM, LEFT, RIGHT
}
static public final String STYLE_FAMILY = "table-cell";
// from section 18.728 in v1.2-part1
public static final StyleDesc<CellStyle> DESC = new StyleDesc<CellStyle>(CellStyle.class, XMLVersion.OD, STYLE_FAMILY, "ce", "table", Arrays.asList("table:body", "table:covered-table-cell",
"table:even-rows", "table:first-column", "table:first-row", "table:last-column", "table:last-row", "table:odd-columns", "table:odd-rows", "table:table-cell")) {
{
this.getMultiRefElementsMap().putAll("table:default-cell-style-name", "table:table-column", "table:table-row");
}
@Override
public CellStyle create(ODPackage pkg, Element e) {
return new CellStyle(pkg, e);
}
};
private SyleTableCellProperties cellProps;
private SyleTextProperties textProps;
private SyleParagraphProperties pProps;
public CellStyle(final ODPackage pkg, Element tableColElem) {
super(pkg, tableColElem);
}
public final Color getBackgroundColor() {
return getTableCellProperties().getBackgroundColor();
}
public final SyleTableCellProperties getTableCellProperties() {
if (this.cellProps == null)
this.cellProps = new SyleTableCellProperties(this);
return this.cellProps;
}
public final SyleTextProperties getTextProperties() {
if (this.textProps == null)
this.textProps = new SyleTextProperties(this);
return this.textProps;
}
public final SyleParagraphProperties getParagraphProperties() {
if (this.pProps == null)
this.pProps = new SyleParagraphProperties(this);
return this.pProps;
}
/**
* See section 15.11 of OpenDocument v1.1 : Table Cell Formatting Properties.
*
* @author Sylvain CUAZ
*/
public static class SyleTableCellProperties extends StyleProperties {
private static final Pattern spacePattern = Pattern.compile(" +");
public SyleTableCellProperties(StyleStyle style) {
super(style, STYLE_FAMILY);
}
public final String getBorder(final Side s) {
return getSideAttribute(s, "border", this.getNS("fo"));
}
/**
* If the line style for the border is double, specify the width of the inner and outer
* lines and the distance between them. See section 15.5.26.
*
* @param s which side.
* @return the width of the inner line, the distance between the two lines, the width of the
* outer line, <code>null</code> if the line style of the border is not double.
*/
public final String[] getBorderLineWidth(final Side s) {
final String res = getSideAttribute(s, "border-line-width", this.getElement().getNamespace("style"));
return res == null ? null : spacePattern.split(res);
}
private final String getSideAttribute(final Side s, final String attrName, final Namespace ns) {
final String allBorder = getElement().getAttributeValue(attrName, ns);
final String res;
if (allBorder != null)
res = allBorder;
else
res = getElement().getAttributeValue(attrName + "-" + s.name().toLowerCase(), ns);
return res;
}
public final int getRotationAngle() {
final String s = this.getElement().getAttributeValue("rotation-angle", this.getElement().getNamespace("style"));
return s == null ? 0 : Integer.parseInt(s);
}
public final boolean isContentPrinted() {
return parseBoolean(this.getElement().getAttributeValue("print-content", this.getElement().getNamespace("style")), true);
}
public final boolean isContentRepeated() {
return parseBoolean(this.getElement().getAttributeValue("repeat-content", this.getElement().getNamespace("style")), false);
}
public final boolean isShrinkToFit() {
return parseBoolean(this.getElement().getAttributeValue("shrink-to-fit", this.getElement().getNamespace("style")), false);
}
}
}