/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2009 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.engine.classic.core.modules.parser.bundle.writer;
import java.awt.Color;
import java.awt.Stroke;
import java.io.IOException;
import java.util.Locale;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.pentaho.reporting.engine.classic.core.ElementAlignment;
import org.pentaho.reporting.engine.classic.core.layout.BandLayoutManager;
import org.pentaho.reporting.engine.classic.core.layout.StackedLayoutManager;
import org.pentaho.reporting.engine.classic.core.layout.StaticLayoutManager;
import org.pentaho.reporting.engine.classic.core.modules.parser.bundle.BundleNamespaces;
import org.pentaho.reporting.engine.classic.core.style.BandStyleKeys;
import org.pentaho.reporting.engine.classic.core.style.BorderStyle;
import org.pentaho.reporting.engine.classic.core.style.BoxSizing;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleKeys;
import org.pentaho.reporting.engine.classic.core.style.ElementStyleSheet;
import org.pentaho.reporting.engine.classic.core.style.TextStyleKeys;
import org.pentaho.reporting.engine.classic.core.util.StrokeUtility;
import org.pentaho.reporting.engine.classic.core.util.beans.ColorValueConverter;
import org.pentaho.reporting.libraries.base.util.CSVQuoter;
import org.pentaho.reporting.libraries.base.util.ObjectUtilities;
import org.pentaho.reporting.libraries.formatting.FastDecimalFormat;
import org.pentaho.reporting.libraries.xmlns.common.AttributeList;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriter;
import org.pentaho.reporting.libraries.xmlns.writer.XmlWriterSupport;
/**
* Todo: Document Me
*
* @author Thomas Morgner
*/
public class StyleWriterUtility
{
private static final Log logger = LogFactory.getLog(StyleWriterUtility.class);
private static final FastDecimalFormat percentageLengthFormat = new FastDecimalFormat("0.###'%'", Locale.US);
private static final FastDecimalFormat absoluteLengthFormat = new FastDecimalFormat("0.###", Locale.US);
private StyleWriterUtility()
{
}
public static void writeStyleRule(final String namespace, final String tagName,
final XmlWriter writer, final ElementStyleSheet style,
final boolean writeName)
throws IOException
{
if (namespace == null)
{
throw new NullPointerException();
}
if (tagName == null)
{
throw new NullPointerException();
}
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final String parentList = StyleWriterUtility.computeParentStyleList(style);
if (parentList == null && style.getDefinedPropertyNamesArray().length == 0)
{
return;
}
final AttributeList attList = new AttributeList();
if (writeName)
{
attList.setAttribute(BundleNamespaces.STYLE, "name", style.getName());
}
if (parentList != null)
{
attList.setAttribute(BundleNamespaces.STYLE, "parent", parentList);
}
writer.writeTag(namespace, tagName, attList, XmlWriterSupport.OPEN);
StyleWriterUtility.writeBandStyles(writer, style);
StyleWriterUtility.writePageBandStyles(writer, style);
StyleWriterUtility.writeCommonStyles(writer, style);
StyleWriterUtility.writeContentStyles(writer, style);
StyleWriterUtility.writeTextStyles(writer, style);
StyleWriterUtility.writeSpatialStyles(writer, style);
StyleWriterUtility.writeBorderStyles(writer, style);
writer.writeCloseTag();
}
public static void writeBorderStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(ElementStyleKeys.BACKGROUND_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BACKGROUND_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "background-color", ColorValueConverter.colorToString(
value));
}
if (style.isLocalKey(ElementStyleKeys.PADDING_TOP) &&
style.isLocalKey(ElementStyleKeys.PADDING_LEFT) &&
style.isLocalKey(ElementStyleKeys.PADDING_BOTTOM) &&
style.isLocalKey(ElementStyleKeys.PADDING_RIGHT))
{
final double paddingTop = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_TOP, 0);
final double paddingLeft = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_LEFT, 0);
final double paddingBottom = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_BOTTOM, 0);
final double paddingRight = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_RIGHT, 0);
if (paddingTop == paddingLeft &&
paddingTop == paddingRight &&
paddingTop == paddingBottom)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding", absoluteLengthFormat.format(paddingTop));
}
else
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-top", absoluteLengthFormat.format(paddingTop));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-left", absoluteLengthFormat.format(paddingLeft));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-bottom", absoluteLengthFormat.format(
paddingBottom));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-right", absoluteLengthFormat.format(paddingRight));
}
}
else
{
if (style.isLocalKey(ElementStyleKeys.PADDING_TOP))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_TOP, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-top", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.PADDING_LEFT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_LEFT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-left", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.PADDING_BOTTOM))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_BOTTOM, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-bottom", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.PADDING_RIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.PADDING_RIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "padding-right", absoluteLengthFormat.format(value));
}
}
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_WIDTH) &&
style.isLocalKey(ElementStyleKeys.BORDER_LEFT_WIDTH) &&
style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_WIDTH) &&
style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_WIDTH))
{
final double top = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_WIDTH, 0);
final double left = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_LEFT_WIDTH, 0);
final double bottom = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_WIDTH, 0);
final double right = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_RIGHT_WIDTH, 0);
if (top == left &&
top == right &&
top == bottom)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-width", absoluteLengthFormat.format(top));
}
else
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-width", absoluteLengthFormat.format(top));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-width", absoluteLengthFormat.format(left));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-width", absoluteLengthFormat.format(bottom));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-width", absoluteLengthFormat.format(right));
}
}
else
{
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-width", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_LEFT_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_LEFT_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-width", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-width", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_RIGHT_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-width", absoluteLengthFormat.format(value));
}
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BREAK_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BREAK_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-break-width", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_COLOR) &&
style.isLocalKey(ElementStyleKeys.BORDER_LEFT_COLOR) &&
style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_COLOR) &&
style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_COLOR))
{
final Color top = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_TOP_COLOR);
final Color left = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_COLOR);
final Color bottom = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_COLOR);
final Color right = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_COLOR);
if (ObjectUtilities.equal(top, left) &&
ObjectUtilities.equal(top, right) &&
ObjectUtilities.equal(top, bottom))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-color", ColorValueConverter.colorToString(top));
}
else
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-color", ColorValueConverter.colorToString(
top));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-color", ColorValueConverter.colorToString(
left));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-color", ColorValueConverter.colorToString(
bottom));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-color", ColorValueConverter.colorToString(
right));
}
}
else
{
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_TOP_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-color", ColorValueConverter.colorToString(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_LEFT_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-color", ColorValueConverter.colorToString(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-color", ColorValueConverter.colorToString(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-color", ColorValueConverter.colorToString(
value));
}
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BREAK_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.BORDER_BREAK_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-break-color", ColorValueConverter.colorToString(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_STYLE) &&
style.isLocalKey(ElementStyleKeys.BORDER_LEFT_STYLE) &&
style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_STYLE) &&
style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_STYLE))
{
final Object top = style.getStyleProperty(ElementStyleKeys.BORDER_TOP_STYLE);
final Object left = style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_STYLE);
final Object bottom = style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_STYLE);
final Object right = style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_STYLE);
if (ObjectUtilities.equal(top, left) &&
ObjectUtilities.equal(top, right) &&
ObjectUtilities.equal(top, bottom))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-style", top.toString());
}
else
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-style", top.toString());
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-style", left.toString());
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-style", bottom.toString());
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-style", right.toString());
}
}
else
{
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_STYLE))
{
final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_TOP_STYLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-style", value.toString());
}
if (style.isLocalKey(ElementStyleKeys.BORDER_LEFT_STYLE))
{
final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_LEFT_STYLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-left-style", value.toString());
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_STYLE))
{
final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_BOTTOM_STYLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-style", value.toString());
}
if (style.isLocalKey(ElementStyleKeys.BORDER_RIGHT_STYLE))
{
final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_RIGHT_STYLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-right-style", value.toString());
}
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BREAK_STYLE))
{
final Object value = style.getStyleProperty(ElementStyleKeys.BORDER_BREAK_STYLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-break-style", value.toString());
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH) &&
style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH) &&
style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH) &&
style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH))
{
final double bottomLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH, 0);
final double bottomRight = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH, 0);
final double topLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH, 0);
final double topRight = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH, 0);
if (bottomLeft == bottomRight &&
bottomLeft == topRight &&
bottomLeft == topLeft)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-radius-width", absoluteLengthFormat.format(
bottomLeft));
}
else
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-radius-width", absoluteLengthFormat.format(
topLeft));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-radius-width", absoluteLengthFormat.format(
topRight));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-radius-width",
absoluteLengthFormat.format(bottomLeft));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-radius-width",
absoluteLengthFormat.format(bottomRight));
}
}
else
{
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-width", absoluteLengthFormat.format(value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-width", absoluteLengthFormat.format(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-width", absoluteLengthFormat.format(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-width", absoluteLengthFormat.format(
value));
}
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT) &&
style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT) &&
style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT) &&
style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT))
{
final double bottomLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT, 0);
final double bottomRight = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT, 0);
final double topLeft = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT, 0);
final double topRight = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT, 0);
if (bottomLeft == bottomRight &&
bottomLeft == topRight &&
bottomLeft == topLeft)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-radius-height", absoluteLengthFormat.format(
bottomLeft));
}
else
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-radius-height", absoluteLengthFormat.format(
topLeft));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-radius-height",
absoluteLengthFormat.format(topRight));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-radius-height",
absoluteLengthFormat.format(bottomLeft));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-radius-height",
absoluteLengthFormat.format(bottomRight));
}
}
else
{
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_LEFT_RADIUS_HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-left-height", absoluteLengthFormat.format(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_TOP_RIGHT_RADIUS_HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-top-right-height", absoluteLengthFormat.format(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_LEFT_RADIUS_HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-left-height", absoluteLengthFormat.format(
value));
}
if (style.isLocalKey(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.BORDER_BOTTOM_RIGHT_RADIUS_HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "border-bottom-right-height", absoluteLengthFormat.format(
value));
}
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "border-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
public static void writeSpatialStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(ElementStyleKeys.POS_X))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.POS_X, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "x", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.POS_Y))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.POS_Y, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "y", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.MIN_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.MIN_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "min-width", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.MIN_HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.MIN_HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "min-height", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "width", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "height", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.MAX_WIDTH))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.MAX_WIDTH, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "max-width", formatLength(value));
}
if (style.isLocalKey(ElementStyleKeys.MAX_HEIGHT))
{
final double value = style.getDoubleStyleProperty(ElementStyleKeys.MAX_HEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "max-height", formatLength(value));
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "spatial-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
public static void writeTextStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(TextStyleKeys.FONT))
{
final String value = (String) style.getStyleProperty(TextStyleKeys.FONT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "font-face", value);
}
if (style.isLocalKey(TextStyleKeys.BOLD))
{
final boolean value = style.getBooleanStyleProperty(TextStyleKeys.BOLD);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "bold", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.ITALIC))
{
final boolean value = style.getBooleanStyleProperty(TextStyleKeys.ITALIC);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "italic", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.EMBEDDED_FONT))
{
final boolean value = style.getBooleanStyleProperty(TextStyleKeys.EMBEDDED_FONT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "embedded", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.UNDERLINED))
{
final boolean value = style.getBooleanStyleProperty(TextStyleKeys.UNDERLINED);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "underline", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.STRIKETHROUGH))
{
final boolean value = style.getBooleanStyleProperty(TextStyleKeys.STRIKETHROUGH);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "strikethrough", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.EXCEL_WRAP_TEXT))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.EXCEL_WRAP_TEXT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "excel-text-wrapping", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.TRIM_TEXT_CONTENT))
{
final boolean value = style.getBooleanStyleProperty(TextStyleKeys.TRIM_TEXT_CONTENT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "trim-text-content", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.FONTENCODING))
{
final String value = (String) style.getStyleProperty(TextStyleKeys.FONTENCODING);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "encoding", value);
}
if (style.isLocalKey(TextStyleKeys.RESERVED_LITERAL))
{
final String value = (String) style.getStyleProperty(TextStyleKeys.RESERVED_LITERAL);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "ellipsis", value);
}
if (style.isLocalKey(TextStyleKeys.FONTSIZE))
{
final int value = style.getIntStyleProperty(TextStyleKeys.FONTSIZE, 0);
if (value > 0)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "font-size", String.valueOf(value));
}
}
if (style.isLocalKey(TextStyleKeys.LINEHEIGHT))
{
final double value = style.getDoubleStyleProperty(TextStyleKeys.LINEHEIGHT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "line-height", formatLength(value));
}
if (style.isLocalKey(TextStyleKeys.WORD_SPACING))
{
final int value = style.getIntStyleProperty(TextStyleKeys.WORD_SPACING, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "word-spacing", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.X_MIN_LETTER_SPACING))
{
final int value = style.getIntStyleProperty(TextStyleKeys.X_MIN_LETTER_SPACING, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "min-letter-spacing", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.X_OPTIMUM_LETTER_SPACING))
{
final int value = style.getIntStyleProperty(TextStyleKeys.X_OPTIMUM_LETTER_SPACING, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "optimum-letter-spacing", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.X_MAX_LETTER_SPACING))
{
final int value = style.getIntStyleProperty(TextStyleKeys.X_MAX_LETTER_SPACING, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "max-letter-spacing", String.valueOf(value));
}
if (style.isLocalKey(TextStyleKeys.FONT_SMOOTH))
{
final Object value = style.getStyleProperty(TextStyleKeys.FONT_SMOOTH);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "font-smooth", value.toString());
}
if (style.isLocalKey(TextStyleKeys.TEXT_WRAP))
{
final Object value = style.getStyleProperty(TextStyleKeys.TEXT_WRAP);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "text-wrap", value.toString());
}
if (style.isLocalKey(TextStyleKeys.WHITE_SPACE_COLLAPSE))
{
final Object value = style.getStyleProperty(TextStyleKeys.WHITE_SPACE_COLLAPSE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "whitespace-collapse", value.toString());
}
if (style.isLocalKey(TextStyleKeys.VERTICAL_TEXT_ALIGNMENT))
{
final Object value = style.getStyleProperty(TextStyleKeys.VERTICAL_TEXT_ALIGNMENT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "whitespace-collapse", value.toString());
}
if (style.isLocalKey(TextStyleKeys.TEXT_INDENT))
{
final double value = style.getDoubleStyleProperty(TextStyleKeys.TEXT_INDENT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "text-indent", formatFloat(value));
}
if (style.isLocalKey(TextStyleKeys.FIRST_LINE_INDENT))
{
final double value = style.getDoubleStyleProperty(TextStyleKeys.FIRST_LINE_INDENT, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "first-line-indent", formatFloat(value));
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "text-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
public static void writeContentStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(ElementStyleKeys.DRAW_SHAPE))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.DRAW_SHAPE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "draw-shape", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.FILL_SHAPE))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.FILL_SHAPE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "fill-shape", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.SCALE))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.SCALE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "scale", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.KEEP_ASPECT_RATIO))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.KEEP_ASPECT_RATIO);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "keep-aspect-ratio", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.DYNAMIC_HEIGHT))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.DYNAMIC_HEIGHT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "dynamic-height", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.PAINT))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.PAINT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "color", ColorValueConverter.colorToString(value));
}
if (style.isLocalKey(ElementStyleKeys.FILL_COLOR))
{
final Color value = (Color) style.getStyleProperty(ElementStyleKeys.FILL_COLOR);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "fill-color", ColorValueConverter.colorToString(value));
}
if (style.isLocalKey(ElementStyleKeys.EXCEL_DATA_FORMAT_STRING))
{
final String value = (String) style.getStyleProperty(ElementStyleKeys.EXCEL_DATA_FORMAT_STRING);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "excel-cell-format", value);
}
if (style.isLocalKey(ElementStyleKeys.ANTI_ALIASING))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.ANTI_ALIASING);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "anti-aliasing", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.STROKE))
{
final Stroke s = (Stroke) style.getStyleProperty(ElementStyleKeys.STROKE);
final float strokeWidth = StrokeUtility.getStrokeWidth(s);
final BorderStyle strokeType = StrokeUtility.translateStrokeStyle(s);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "stroke-weight", absoluteLengthFormat.format(strokeWidth));
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "stroke-style", strokeType.toString());
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "content-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
public static void writeCommonStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(ElementStyleKeys.ANCHOR_NAME))
{
final String value = (String) style.getStyleProperty(ElementStyleKeys.ANCHOR_NAME);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "anchor-name", value);
}
if (style.isLocalKey(ElementStyleKeys.HREF_TARGET))
{
final String value = (String) style.getStyleProperty(ElementStyleKeys.HREF_TARGET);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "href-target", value);
}
if (style.isLocalKey(ElementStyleKeys.HREF_TITLE))
{
final String value = (String) style.getStyleProperty(ElementStyleKeys.HREF_TITLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "href-title", value);
}
if (style.isLocalKey(ElementStyleKeys.HREF_WINDOW))
{
final String value = (String) style.getStyleProperty(ElementStyleKeys.HREF_WINDOW);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "href-window", value);
}
if (style.isLocalKey(ElementStyleKeys.BOX_SIZING))
{
final BoxSizing value = (BoxSizing) style.getStyleProperty(ElementStyleKeys.BOX_SIZING);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "box-sizing", value.toString());
}
if (style.isLocalKey(ElementStyleKeys.VISIBLE))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.VISIBLE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "visible", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.INVISIBLE_CONSUMES_SPACE))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.INVISIBLE_CONSUMES_SPACE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "invisible-consumes-space", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.WIDOWS))
{
final int value = style.getIntStyleProperty(ElementStyleKeys.WIDOWS, -1);
if (value >= 0)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "widows", String.valueOf(value));
}
}
if (style.isLocalKey(ElementStyleKeys.ORPHANS))
{
final int value = style.getIntStyleProperty(ElementStyleKeys.ORPHANS, -1);
if (value >= 0)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "orphans", String.valueOf(value));
}
}
if (style.isLocalKey(ElementStyleKeys.OVERFLOW_X))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.OVERFLOW_X);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "overflow-x", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.OVERFLOW_Y))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.OVERFLOW_Y);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "overflow-y", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.AVOID_PAGEBREAK_INSIDE))
{
final boolean value = style.getBooleanStyleProperty(ElementStyleKeys.AVOID_PAGEBREAK_INSIDE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "avoid-page-break", String.valueOf(value));
}
if (style.isLocalKey(ElementStyleKeys.ALIGNMENT))
{
final ElementAlignment value = (ElementAlignment) style.getStyleProperty(ElementStyleKeys.ALIGNMENT);
if (ElementAlignment.CENTER.equals(value))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "center");
}
else if (ElementAlignment.RIGHT.equals(value))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "right");
}
else if (ElementAlignment.LEFT.equals(value))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "alignment", "left");
}
}
if (style.isLocalKey(ElementStyleKeys.VALIGNMENT))
{
final ElementAlignment value = (ElementAlignment) style.getStyleProperty(ElementStyleKeys.VALIGNMENT);
if (ElementAlignment.MIDDLE.equals(value))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "vertical-alignment", "middle");
}
else if (ElementAlignment.BOTTOM.equals(value))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "vertical-alignment", "bottom");
}
else if (ElementAlignment.TOP.equals(value))
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "vertical-alignment", "top");
}
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "common-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
public static void writePageBandStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(BandStyleKeys.REPEAT_HEADER))
{
final boolean value = style.getBooleanStyleProperty(BandStyleKeys.REPEAT_HEADER);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "repeat", String.valueOf(value));
}
if (style.isLocalKey(BandStyleKeys.DISPLAY_ON_FIRSTPAGE))
{
final boolean value = style.getBooleanStyleProperty(BandStyleKeys.DISPLAY_ON_FIRSTPAGE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "display-on-first-page", String.valueOf(value));
}
if (style.isLocalKey(BandStyleKeys.DISPLAY_ON_LASTPAGE))
{
final boolean value = style.getBooleanStyleProperty(BandStyleKeys.DISPLAY_ON_LASTPAGE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "display-on-last-page", String.valueOf(value));
}
if (style.isLocalKey(BandStyleKeys.STICKY))
{
final boolean value = style.getBooleanStyleProperty(BandStyleKeys.STICKY);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "sticky", String.valueOf(value));
}
if (style.isLocalKey(BandStyleKeys.FIXED_POSITION))
{
final double value = style.getDoubleStyleProperty(BandStyleKeys.FIXED_POSITION, 0);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "fixed-position", formatLength(value));
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "page-band-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
private static String formatFloat(final double value)
{
return absoluteLengthFormat.format(value);
}
private static String formatLength(final double value)
{
if (value >= 0)
{
return absoluteLengthFormat.format(value);
}
else
{
return percentageLengthFormat.format(-value);
}
}
public static void writeBandStyles(final XmlWriter writer, final ElementStyleSheet style)
throws IOException
{
if (writer == null)
{
throw new NullPointerException();
}
if (style == null)
{
throw new NullPointerException();
}
final AttributeList bandStyleAtts = new AttributeList();
if (style.isLocalKey(BandStyleKeys.COMPUTED_SHEETNAME))
{
final String value = (String) style.getStyleProperty(BandStyleKeys.COMPUTED_SHEETNAME);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "computed-sheetname", value);
}
if (style.isLocalKey(BandStyleKeys.BOOKMARK))
{
final String value = (String) style.getStyleProperty(BandStyleKeys.BOOKMARK);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "bookmark", value);
}
if (style.isLocalKey(BandStyleKeys.PAGEBREAK_BEFORE))
{
final boolean value = style.getBooleanStyleProperty(BandStyleKeys.PAGEBREAK_BEFORE);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "pagebreak-before", String.valueOf(value));
}
if (style.isLocalKey(BandStyleKeys.PAGEBREAK_AFTER))
{
final boolean value = style.getBooleanStyleProperty(BandStyleKeys.PAGEBREAK_AFTER);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "pagebreak-after", String.valueOf(value));
}
if (style.isLocalKey(BandStyleKeys.LAYOUT))
{
final String value = (String) style.getStyleProperty(BandStyleKeys.LAYOUT);
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "layout", String.valueOf(value));
}
else if (style.isLocalKey(BandLayoutManager.LAYOUTMANAGER))
{
logger.warn("Converted old 'layout-manager' style definition into the new 'layout' style.");
final Object value = style.getStyleProperty(BandLayoutManager.LAYOUTMANAGER);
if (value instanceof StaticLayoutManager)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "layout", "canvas");
}
else if (value instanceof StackedLayoutManager)
{
bandStyleAtts.setAttribute(BundleNamespaces.STYLE, "layout", "block");
}
}
if (bandStyleAtts.isEmpty() == false)
{
writer.writeTag(BundleNamespaces.STYLE, "band-styles", bandStyleAtts, XmlWriterSupport.CLOSE);
}
}
public static String computeParentStyleList(final ElementStyleSheet styleSheet)
{
if (styleSheet == null)
{
throw new NullPointerException();
}
final ElementStyleSheet[] sheets = styleSheet.getParents();
final CSVQuoter quoter = new CSVQuoter(' ', '\'');
StringBuffer parents = null;
for (int i = 0; i < sheets.length; i++)
{
final ElementStyleSheet sheet = sheets[i];
if (sheet.isGlobalDefault())
{
continue;
}
if (parents == null)
{
parents = new StringBuffer(sheets.length * 30);
}
final String quoted = quoter.doQuoting(sheet.getName());
if (parents.length() > 0)
{
parents.append(' ');
}
parents.append(quoted);
}
if (parents == null)
{
return null;
}
return parents.toString();
}
}