/* * JasperReports - Free Java Reporting Library. * Copyright (C) 2001 - 2009 Jaspersoft Corporation. All rights reserved. * http://www.jaspersoft.com * * Unless you have purchased a commercial license agreement from Jaspersoft, * the following license terms apply: * * This program is part of JasperReports. * * JasperReports is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JasperReports 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. * * You should have received a copy of the GNU Lesser General Public License * along with JasperReports. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.jasperreports.engine.export.xmlss; import java.awt.Color; import java.io.IOException; import java.io.Writer; import java.util.Map; import net.sf.jasperreports.engine.JRAlignment; import net.sf.jasperreports.engine.JRFont; import net.sf.jasperreports.engine.JRPrintElement; import net.sf.jasperreports.engine.JRPrintText; import net.sf.jasperreports.engine.JRStyle; import net.sf.jasperreports.engine.type.HorizontalAlignEnum; import net.sf.jasperreports.engine.type.ModeEnum; import net.sf.jasperreports.engine.type.RotationEnum; import net.sf.jasperreports.engine.type.RunDirectionEnum; import net.sf.jasperreports.engine.type.VerticalAlignEnum; import net.sf.jasperreports.engine.util.JRColorUtil; /** * @author sanda zaharia (shertage@users.sourceforge.net) * @version $Id: XmlssCellStyle.java 3665 2010-03-31 14:22:48Z shertage $ */ public class XmlssCellStyle extends XmlssBorderStyle { private static final String ALIGNMENT_LEFT = "Left"; private static final String ALIGNMENT_RIGHT = "Right"; private static final String ALIGNMENT_CENTER = "Center"; private static final String ALIGNMENT_TOP = "Top"; private static final String ALIGNMENT_BOTTOM = "Bottom"; private static final String READING_ORDER_LTR = "LeftToRight"; private static final String READING_ORDER_RTL = "RightToLeft"; private static final String ROTATE_NONE = "0"; private static final String ROTATE_LEFT = "90"; private static final String ROTATE_RIGHT = "-90"; private static final String STYLE_AUTOMATIC = "Automatic"; private static final String STYLE_NONE = "None"; private static final String UNDERLINE_STYLE_SINGLE = "Single"; //private String fill = null; private final String id; private String backcolor = XmlssCellStyle.STYLE_AUTOMATIC; private String horizontalAlignment = XmlssCellStyle.ALIGNMENT_LEFT; private String verticalAlignment = XmlssCellStyle.ALIGNMENT_TOP; private String readingOrder = XmlssCellStyle.READING_ORDER_LTR; private String rotate = XmlssCellStyle.ROTATE_NONE; private String shrinkToFit; private String wrapText = "1"; private JRStyle style; private String verticalPosition = XmlssCellStyle.STYLE_NONE; private String pattern; private String forecolor = XmlssCellStyle.STYLE_AUTOMATIC; private JRFont defaultFont; private String excelFontName; /** * */ public XmlssCellStyle( Writer styleWriter, JRPrintElement element, Color cellBackground, String pattern, boolean isShrinkToFit, JRFont defaultFont, Map fontMap) { super(styleWriter, element); this.style = element.getStyle() != null ? element.getStyle() : element.getDefaultStyleProvider().getDefaultStyle(); this.defaultFont = defaultFont; this.pattern = pattern; this.shrinkToFit = String.valueOf(getBitValue(isShrinkToFit)); if (ModeEnum.OPAQUE == element.getModeValue()) { if(element.getBackcolor() != null) { backcolor = "#" + JRColorUtil.getColorHexa(element.getBackcolor()); } else if(style.getBackcolor() != null) { backcolor = "#" + JRColorUtil.getColorHexa(style.getBackcolor()); } } else { if(cellBackground != null) { backcolor = "#" + JRColorUtil.getColorHexa(cellBackground); } } if(element.getForecolor() != null) { forecolor = "#" + JRColorUtil.getColorHexa(element.getForecolor()); } else if(style.getForecolor() != null) { forecolor = "#" + JRColorUtil.getColorHexa(style.getForecolor()); } RotationEnum rotation = element instanceof JRPrintText ? ((JRPrintText)element).getRotationValue() : RotationEnum.NONE; rotate = getRotation(rotation); if(element instanceof JRPrintText && ((JRPrintText)element).getRunDirectionValue() == RunDirectionEnum.RTL) { readingOrder = XmlssCellStyle.READING_ORDER_RTL; } JRAlignment alignment = element instanceof JRAlignment ? (JRAlignment)element : null; if (alignment != null) { horizontalAlignment = getHorizontalAlignment(alignment.getHorizontalAlignmentValue(), alignment.getVerticalAlignmentValue(), rotation); verticalAlignment = getVerticalAlignment(alignment.getHorizontalAlignmentValue(), alignment.getVerticalAlignmentValue(), rotation); } if(style!= null) { String fontName = style.getFontName(); excelFontName = (fontMap != null && fontMap.containsKey(fontName)) ? (String) fontMap.get(fontName) : fontName; id =horizontalAlignment + "|" + verticalAlignment + "|" + readingOrder + "|" + rotate + "|" + shrinkToFit + "|" + super.getId() + "|" + excelFontName + "|" + style.getFontSize() + "|" + forecolor + "|" + style.isItalic() + "|" + style.isBold() + "|" + style.isStrikeThrough() + "|" + style.isUnderline() + "|" + verticalPosition + "|" + backcolor + "|" + this.pattern; } else { String fontName = defaultFont.getFontName(); excelFontName = (fontMap != null && fontMap.containsKey(fontName)) ? (String) fontMap.get(fontName) : fontName; id =horizontalAlignment + "|" + verticalAlignment + "|" + readingOrder + "|" + rotate + "|" + shrinkToFit + "|" + super.getId() + "|" + excelFontName + "|" + defaultFont.getFontSize() + "|" + forecolor + "|" + defaultFont.isItalic() + "|" + defaultFont.isBold() + "|" + defaultFont.isStrikeThrough() + "|" + defaultFont.isUnderline() + "|" + verticalPosition + "|" + backcolor + "|" + this.pattern; } } /** * */ public String getId() { return id; } /** * */ public void write(String cellStyleName) throws IOException { styleWriter.write("<ss:Style ss:ID=\""); styleWriter.write(cellStyleName); styleWriter.write("\">\n"); styleWriter.write(" <ss:Alignment"); styleWriter.write(" ss:Horizontal=\"" + horizontalAlignment + "\""); styleWriter.write(" ss:Vertical=\"" + verticalAlignment + "\""); styleWriter.write(" ss:ReadingOrder=\"" + readingOrder + "\""); styleWriter.write(" ss:Rotate=\"" + rotate + "\""); styleWriter.write(" ss:ShrinkToFit=\"" + shrinkToFit + "\""); styleWriter.write(" ss:WrapText=\"" + wrapText + "\""); styleWriter.write("/>\n"); styleWriter.write(" <ss:Borders>"); writeBorder(TOP_BORDER); writeBorder(LEFT_BORDER); writeBorder(BOTTOM_BORDER); writeBorder(RIGHT_BORDER); styleWriter.write(" </ss:Borders>\n"); styleWriter.write(" <ss:Font"); styleWriter.write(" ss:FontName=\"" + excelFontName + "\""); if(style != null) { if(style.getFontSize() != null) { styleWriter.write(" ss:Size=\"" + style.getFontSize() + "\""); } if(style.isBold() != null) { styleWriter.write(" ss:Bold=\"" + getBitValue(style.isBold().booleanValue()) + "\""); } if(style.isItalic() != null) { styleWriter.write(" ss:Italic=\"" + getBitValue(style.isItalic().booleanValue()) + "\""); } if(style.isStrikeThrough() != null) { styleWriter.write(" ss:StrikeThrough=\"" + getBitValue(style.isStrikeThrough().booleanValue()) + "\""); } if(style.isUnderline() != null) { styleWriter.write(" ss:Underline=\"" + getUnderlineStyle(style.isUnderline().booleanValue()) + "\""); } } else if(defaultFont != null) { styleWriter.write(" ss:Size=\"" + defaultFont.getFontSize() + "\""); styleWriter.write(" ss:Bold=\"" + getBitValue(defaultFont.isBold()) + "\""); styleWriter.write(" ss:Italic=\"" + getBitValue(defaultFont.isItalic()) + "\""); styleWriter.write(" ss:StrikeThrough=\"" + getBitValue(defaultFont.isStrikeThrough()) + "\""); styleWriter.write(" ss:Underline=\"" + getUnderlineStyle(defaultFont.isUnderline()) + "\""); } styleWriter.write(" ss:Color=\"" + forecolor + "\""); styleWriter.write("/>\n"); styleWriter.write(" <ss:Interior"); styleWriter.write(" ss:Color=\"" + backcolor + "\""); styleWriter.write(" ss:Pattern=\"Solid\""); styleWriter.write("/>\n"); styleWriter.write(" <ss:NumberFormat"); styleWriter.write(" ss:Format=\"" + pattern + "\""); styleWriter.write("/>\n"); styleWriter.write(" <ss:Protection/>\n"); styleWriter.write("</ss:Style>\n"); } /** * */ public static String getVerticalAlignment( HorizontalAlignEnum horizontalAlignment, VerticalAlignEnum verticalAlignment, RotationEnum rotation ) { switch(rotation) { case LEFT: { switch (horizontalAlignment) { case RIGHT : return XmlssCellStyle.ALIGNMENT_TOP; case CENTER : return XmlssCellStyle.ALIGNMENT_CENTER; case JUSTIFIED : case LEFT : default : return XmlssCellStyle.ALIGNMENT_BOTTOM; } } case RIGHT: { switch (horizontalAlignment) { case RIGHT : return XmlssCellStyle.ALIGNMENT_BOTTOM; case CENTER : return XmlssCellStyle.ALIGNMENT_CENTER; case JUSTIFIED : case LEFT : default : return XmlssCellStyle.ALIGNMENT_TOP; } } case UPSIDE_DOWN: case NONE: default: { switch (verticalAlignment) { case BOTTOM : return XmlssCellStyle.ALIGNMENT_BOTTOM; case MIDDLE : return XmlssCellStyle.ALIGNMENT_CENTER; case TOP : default : return XmlssCellStyle.ALIGNMENT_TOP; } } } } /** * */ public static String getHorizontalAlignment( HorizontalAlignEnum horizontalAlignment, VerticalAlignEnum verticalAlignment, RotationEnum rotation ) { switch(rotation) { case LEFT: { switch (verticalAlignment) { case BOTTOM : return XmlssCellStyle.ALIGNMENT_RIGHT; case MIDDLE : return XmlssCellStyle.ALIGNMENT_CENTER; case TOP : default : return XmlssCellStyle.ALIGNMENT_LEFT; } } case RIGHT: { switch (verticalAlignment) { case BOTTOM : return XmlssCellStyle.ALIGNMENT_LEFT; case MIDDLE : return XmlssCellStyle.ALIGNMENT_CENTER; case TOP : default : return XmlssCellStyle.ALIGNMENT_RIGHT; } } case UPSIDE_DOWN: case NONE: default: { switch (horizontalAlignment) { case RIGHT : return XmlssCellStyle.ALIGNMENT_RIGHT; case CENTER : return XmlssCellStyle.ALIGNMENT_CENTER; case JUSTIFIED : case LEFT : default : return XmlssCellStyle.ALIGNMENT_LEFT; } } } } private String getRotation(RotationEnum rotation) { switch (rotation) { case LEFT: return XmlssCellStyle.ROTATE_LEFT; case RIGHT: return XmlssCellStyle.ROTATE_RIGHT; case NONE: default: return XmlssCellStyle.ROTATE_NONE; } } private byte getBitValue(boolean isTrue) { return isTrue ? (byte)1 : 0; } private String getUnderlineStyle(boolean isUnderline) { if(isUnderline) { return XmlssCellStyle.UNDERLINE_STYLE_SINGLE; } return XmlssCellStyle.STYLE_NONE; } }