package org.jboss.seam.excel.css; import org.jboss.seam.core.Interpolator; import org.jboss.seam.excel.ExcelWorkbookException; import org.jboss.seam.excel.jxl.JXLFactory; /** * Property builder implementations for parsing css style arrays. * @author karlsnic * */ public class PropertyBuilders { // Wildcard symbol for column widths private static final String COLUMN_WIDTH_WILDCARD = "*"; public static class ForceType extends StringPropertyBuilder {} public static class ColumnWidths implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; String indexedKey = CSSNames.COLUMN_WIDTHS + i; if (COLUMN_WIDTH_WILDCARD.equals(value)) { // Skip it, just moving along } else if (isNumeric(value)) { styleMap.put(indexedKey, Integer.parseInt(value)); } else { String message = Interpolator.instance().interpolate("Column widths must be numerical or *, not #0", value); throw new ExcelWorkbookException(message); } } return styleMap; } } public static class ColumnWidth extends IntegerPropertyBuilder { } public static class ColumnAutoSize extends BooleanPropertyBuilder { } public static class ColumnHidden extends BooleanPropertyBuilder { } public static class ColumnExport extends BooleanPropertyBuilder { } public static class BorderBottomLineStyle extends StringPropertyBuilder { } public static class BorderBottomColor extends StringPropertyBuilder { } public static class BorderBottomShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isColor(values[i])) { styleMap.put(CSSNames.BORDER_BOTTOM_COLOR, value); } else if (JXLFactory.isBorderLineStyle(values[i])) { styleMap.put(CSSNames.BORDER_BOTTOM_LINE_STYLE, value); } else { throw new ExcelWorkbookException("Border bottom shorthand can only handle line style and color"); } } return styleMap; } } public static class BorderRightLineStyle extends StringPropertyBuilder { } public static class BorderRightColor extends StringPropertyBuilder { } public static class BorderRightShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isColor(values[i])) { styleMap.put(CSSNames.BORDER_RIGHT_COLOR, value); } else if (JXLFactory.isBorderLineStyle(values[i])) { styleMap.put(CSSNames.BORDER_RIGHT_LINE_STYLE, value); } else { throw new ExcelWorkbookException("Border right shorthand can only handle line style and color"); } } return styleMap; } } public static class BorderTopLineStyle extends StringPropertyBuilder { } public static class BorderTopColor extends StringPropertyBuilder { } public static class BorderTopShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isColor(values[i])) { styleMap.put(CSSNames.BORDER_TOP_COLOR, value); } else if (JXLFactory.isBorderLineStyle(values[i])) { styleMap.put(CSSNames.BORDER_TOP_LINE_STYLE, value); } else { throw new ExcelWorkbookException("Border top shorthand can only handle line style and color"); } } return styleMap; } } public static class BorderLeftLineStyle extends StringPropertyBuilder { } public static class BorderLeftColor extends StringPropertyBuilder { } public static class BorderLeftShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isColor(values[i])) { styleMap.put(CSSNames.BORDER_LEFT_COLOR, value); } else if (JXLFactory.isBorderLineStyle(values[i])) { styleMap.put(CSSNames.BORDER_LEFT_LINE_STYLE, value); } else { throw new ExcelWorkbookException("Border left shorthand can only handle line style and color"); } } return styleMap; } } public static class BorderShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isColor(value)) { styleMap.put(CSSNames.BORDER_LEFT_COLOR, values[1]); styleMap.put(CSSNames.BORDER_RIGHT_COLOR, values[1]); styleMap.put(CSSNames.BORDER_TOP_COLOR, values[1]); styleMap.put(CSSNames.BORDER_BOTTOM_COLOR, values[1]); } else if (JXLFactory.isBorderLineStyle(value)) { styleMap.put(CSSNames.BORDER_LEFT_LINE_STYLE, values[0]); styleMap.put(CSSNames.BORDER_RIGHT_LINE_STYLE, values[0]); styleMap.put(CSSNames.BORDER_TOP_LINE_STYLE, values[0]); styleMap.put(CSSNames.BORDER_BOTTOM_LINE_STYLE, values[0]); } else { throw new ExcelWorkbookException("Border shorthand can only handle line style and color"); } } return styleMap; } } public static class BackgroundColor extends StringPropertyBuilder { } public static class BackgroundPattern extends StringPropertyBuilder { } public static class BackgroundShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isPattern(values[i])) { styleMap.put(CSSNames.BACKGROUND_PATTERN, value); } else if (JXLFactory.isColor(values[i])) { styleMap.put(CSSNames.BACKGROUND_COLOR, value); } else { throw new ExcelWorkbookException("Background shorthand can only handle color and pattern"); } } return styleMap; } } public static class FontFamily extends MergingStringPropertyBuilder { } private static String collectString(String[] values, String delimiter) { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < values.length; i++) { if (i > 0) { buffer.append(delimiter); } buffer.append(values[i]); } return buffer.toString(); } private static class MergingStringPropertyBuilder extends StringPropertyBuilder { @Override public StyleMap parseProperty(String key, String[] values) { String concatValues = collectString(values, " "); return super.parseProperty(key, new String[] {concatValues}); } } public static class FontSize extends IntegerPropertyBuilder { } public static class FontColor extends StringPropertyBuilder { } public static class FontItalic extends BooleanPropertyBuilder { } public static class FontScriptStyle extends StringPropertyBuilder { } public static class FontUnderlineStyle extends StringPropertyBuilder { } public static class FontBold extends BooleanPropertyBuilder { } public static class FontStruckOut extends BooleanPropertyBuilder { } // "12 'Times New Roman'" public static class FontShorthand implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); String valueString = collectString(values, " "); int firstQuote = valueString.indexOf("'"); int lastQuote = valueString.lastIndexOf("'"); if (firstQuote > 0 && lastQuote > 0 && firstQuote != lastQuote) { String fontName = valueString.substring(firstQuote, lastQuote); styleMap.put(CSSNames.FONT_FAMILY, fontName); String pre = valueString.substring(0, firstQuote - 1).trim(); String post = valueString.substring(lastQuote + 1).trim(); valueString = pre + post; values = valueString.split(" "); } for (int i = 0; i < values.length; i++) { String value = values[i]; if (JXLFactory.isScriptStyle(value)) { styleMap.put(CSSNames.FONT_SCRIPT_STYLE, value); } else if (JXLFactory.isColor(value)) { styleMap.put(CSSNames.FONT_COLOR, value); } else if (JXLFactory.isUnderlineStyle(value)) { styleMap.put(CSSNames.FONT_UNDERLINE_STYLE, value); } else if ("italic".equals(value.toLowerCase())) { styleMap.put(CSSNames.FONT_ITALIC, Boolean.TRUE); } else if ("bold".equals(value.toLowerCase())) { styleMap.put(CSSNames.FONT_BOLD, Boolean.TRUE); } else if ("struck_out".equals(value.toLowerCase())) { styleMap.put(CSSNames.FONT_STRUCK_OUT, Boolean.TRUE); } else if (isNumeric(value)) { styleMap.put(CSSNames.FONT_SIZE, Integer.parseInt(value)); } else { styleMap.put(CSSNames.FONT_FAMILY, value); } } return styleMap; } } private static boolean isNumeric(String value) { try { Integer.parseInt(value); } catch (NumberFormatException e) { return false; } return true; } private static boolean isBoolean(String value) { return "true".equalsIgnoreCase(value) || "false".equalsIgnoreCase(value); } public static class VericalAlignment extends StringPropertyBuilder { } public static class Wrap extends BooleanPropertyBuilder { } public static class ShrinkToFit extends BooleanPropertyBuilder { } public static class Locked extends BooleanPropertyBuilder { } public static class Orientation extends StringPropertyBuilder { } public static class Indentation extends IntegerPropertyBuilder { } public static class Alignment extends StringPropertyBuilder { } public static class FormatMask extends MergingStringPropertyBuilder { } private static class StringPropertyBuilder implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { StyleMap styleMap = new StyleMap(); styleMap.put(key, values[0]); return styleMap; } } private static class IntegerPropertyBuilder implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { String value = values[0]; if (!isNumeric(value)) { String message = Interpolator.instance().interpolate("#0 is not a number in #1", value, key); throw new ExcelWorkbookException(message); } StyleMap styleMap = new StyleMap(); styleMap.put(key, Integer.parseInt(value)); return styleMap; } } private static class BooleanPropertyBuilder implements PropertyBuilder { public StyleMap parseProperty(String key, String[] values) { String value = values[0]; if (!isBoolean(value)) { String message = Interpolator.instance().interpolate("#0 is not a boolean in #1", value, key); throw new ExcelWorkbookException(message); } StyleMap styleMap = new StyleMap(); styleMap.put(key, Boolean.parseBoolean(value)); return styleMap; } } }