blob: ec5769009d9bfc7e63e4c3e2b56613bb2738046e [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.components.elementprocessor.impl.poi.hssf.elements;
import java.io.IOException;
import java.util.Hashtable;
import org.apache.cocoon.components.elementprocessor.ElementProcessor;
import org.apache.cocoon.components.elementprocessor.types.Attribute;
import org.apache.cocoon.components.elementprocessor.types.BooleanConverter;
import org.apache.cocoon.components.elementprocessor.types.BooleanResult;
import org.apache.cocoon.components.elementprocessor.types.NumericConverter;
import org.apache.cocoon.components.elementprocessor.types.NumericResult;
import org.apache.cocoon.components.elementprocessor.types.Validator;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.util.HSSFColor;
/**
* No-op implementation of ElementProcessor to handle the "Style" tag
*
* This element is a container of other elements and has several
* attributes
*
* This element is not used in HSSFSerializer 1.0
*
* @author Marc Johnson (marc_johnson27591@hotmail.com)
* @author Andrew C. Oliver (acoliver2@users.sourceforge.net)
* @version CVS $Id$
*/
public class EPStyle extends BaseElementProcessor {
private static final String _general_format = "General";
private HorizontalAlignment _h_align;
private VerticalAlignment _v_align;
private BooleanResult _wrap_text;
private StyleOrientation _orient;
private NumericResult _shade;
private NumericResult _indent;
private ColorCode _fore;
private ColorCode _back;
private ColorCode _pattern_color;
private String _format;
private static final String _h_align_attribute = "HAlign";
private static final String _v_align_attribute = "VAlign";
private static final String _wrap_text_attribute = "WrapText";
private static final String _orient_attribute = "Orient";
private static final String _shade_attribute = "Shade";
private static final String _indent_attribute = "Indent";
private static final String _fore_attribute = "Fore";
private static final String _back_attribute = "Back";
private static final String _pattern_color_attribute = "PatternColor";
private static final String _format_attribute = "Format";
private boolean invalid;
private static final Validator _shade_validator = new Validator() {
public IOException validate(final Number number) {
return StyleShading.isValid(number.intValue()) ? null
: new IOException("\"" + number + "\" is not a legal value");
}
};
/**
* constructor
*/
public EPStyle() {
super(null);
_h_align = null;
_v_align = null;
_wrap_text = null;
_orient = null;
_shade = null;
_indent = null;
_fore = null;
_back = null;
_pattern_color = null;
_format = null;
}
/**
* Override of Initialize() implementation
* @param attributes the array of Attribute instances; may be empty, will
* never be null
* @param parent the parent ElementProcessor; may be null
* @exception IOException if anything is wrong
*/
public void initialize(final Attribute[] attributes,
final ElementProcessor parent) throws IOException {
super.initialize(attributes, parent);
EPStyleRegion sregion = (EPStyleRegion)parent;
if (sregion.isValid()) {
Hashtable colorhash = sregion.getColorHash();
HSSFCellStyle style = sregion.getStyle();
short cnvhalign =
convertAlignment(getHorizontalAlignment().getCode());
style.setAlignment(cnvhalign);
short cnvvalign =
convertVAlignment(getVerticalAlignment().getCode());
style.setVerticalAlignment(cnvvalign);
style.setFillPattern((short)getShade());
Workbook workbook = getWorkbook();
HSSFDataFormat dataformat = workbook.createDataFormat();
if (getShade() == 1) {
// TODO: change to constant when upgrade to new HSSF
// solid w/foreground, bg doesn't matter
if (getLogger().isDebugEnabled()) {
getLogger().debug("shade = 1");
}
HSSFColor color =
(HSSFColor)colorhash.get(getBackgroundColor().toString());
if (color == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("s1 BG couldn't find color for "
+ getBackgroundColor().toString());
}
color = new HSSFColor.WHITE();
}
style.setFillForegroundColor(color.getIndex());
color = (HSSFColor)colorhash.get(getPatternColor().toString());
if (color == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("s1 PC couldn't find color for "
+ getPatternColor().toString());
}
color = new HSSFColor.BLACK();
}
style.setFillBackgroundColor(color.getIndex());
} else {
HSSFColor color =
(HSSFColor)colorhash.get(getBackgroundColor().toString());
if (color == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug(
"BG couldn't find color for "
+ getBackgroundColor().toString());
}
color = new HSSFColor.BLACK();
}
style.setFillBackgroundColor(color.getIndex());
color = (HSSFColor)colorhash.get(getPatternColor().toString());
if (color == null) {
if (getLogger().isDebugEnabled()) {
getLogger().debug("PC couldn't find color for "
+ getPatternColor().toString());
}
color = new HSSFColor.WHITE();
}
style.setFillForegroundColor(color.getIndex());
}
style.setWrapText(getWrapText());
style.setLocked(true);
String format = null;
try {
format = getFormat();
} catch (NullPointerException e) {
format = _general_format;
}
if (!_general_format.equals(format)) {
short valuenumber;
format = kludgeForGnumericMisformats(format);
format = kludgeForGnumericDateDivergence(format);
if (getLogger().isDebugEnabled()) {
getLogger().debug("setting format to " + format);
}
Object o =
workbook.getValidate(format, dataformat.getFormat(format));
Short sh = null;
sh = (Short)o;
valuenumber = sh.shortValue();
style.setDataFormat(valuenumber);
}
} else {
invalid = true;
}
}
/**
* @return true if horizontal alignment general bit is set
* @exception IOException
*/
public boolean isHorizontalGeneral() throws IOException {
return getHorizontalAlignment().isGeneral();
}
/**
* @return true if horizontal alignment left bit is set
* @exception IOException
*/
public boolean isHorizontalLeft() throws IOException {
return getHorizontalAlignment().isLeft();
}
/**
* @return true if horizontal alignment right bit is set
* @exception IOException
*/
public boolean isHorizontalRight() throws IOException {
return getHorizontalAlignment().isRight();
}
/**
* @return true if horizontal alignment center bit is set
* @exception IOException
*/
public boolean isHorizontalCenter() throws IOException {
return getHorizontalAlignment().isCenter();
}
/**
* @return true if horizontal alignment fill bit is set
* @exception IOException
*/
public boolean isHorizontalFill() throws IOException {
return getHorizontalAlignment().isFill();
}
/**
* @return true if horizontal alignment justify bit is set
* @exception IOException
*/
public boolean isHorizontalJustify() throws IOException {
return getHorizontalAlignment().isJustify();
}
/**
* @return true if horizontal alignment center across selection bit is set
* @exception IOException
*/
public boolean isHorizontalCenterAcrossSelection() throws IOException {
return getHorizontalAlignment().isCenterAcrossSelection();
}
/**
* @return true if vertical alignment top bit is set
* @exception IOException
*/
public boolean isVerticalTop() throws IOException {
return getVerticalAlignment().isTop();
}
/**
* @return true if vertical alignment bottom bit is set
* @exception IOException
*/
public boolean isVerticalBottom() throws IOException {
return getVerticalAlignment().isBottom();
}
/**
* @return true if vertical alignment center bit is set
* @exception IOException
*/
public boolean isVerticalCenter() throws IOException {
return getVerticalAlignment().isCenter();
}
/**
* @return true if vertical alignment justify bit is set
* @exception IOException
*/
public boolean isVerticalJustify() throws IOException {
return getVerticalAlignment().isJustify();
}
/**
* @return true if wrap text is enabled
* @exception IOException
*/
public boolean getWrapText() throws IOException {
if (_wrap_text == null) {
_wrap_text =
BooleanConverter.extractBoolean(getValue(_wrap_text_attribute));
}
return _wrap_text.booleanValue();
}
/**
* @return true if style orientation horiz bit is set
* @exception IOException
*/
public boolean isStyleOrientationHoriz() throws IOException {
return getStyleOrientation().isHoriz();
}
/**
* @return true if style orientation vert horiz text bit is set
* @exception IOException
*/
public boolean isStyleOrientationVertHorizText() throws IOException {
return getStyleOrientation().isVertHorizText();
}
/**
* @return true if style orientation vert vert text bit is set
* @exception IOException
*/
public boolean isStyleOrientationVertVertText() throws IOException {
return getStyleOrientation().isVertVertText();
}
/**
* @return true if style orientation vert vert text2 bit is set
* @exception IOException
*/
public boolean isStyleOrientationVertVertText2() throws IOException {
return getStyleOrientation().isVertVertText2();
}
/**
* @return shade as one of the public variables in StyleShading
* @exception IOException
*/
public int getShade() throws IOException {
if (_shade == null) {
_shade = NumericConverter.extractInteger(
getValue(_shade_attribute), _shade_validator);
}
return _shade.intValue();
}
/**
* @return indent
* @exception IOException
*/
public int getIndent() throws IOException {
if (_indent == null) {
_indent =
NumericConverter.extractInteger(getValue(_indent_attribute));
}
return _indent.intValue();
}
/**
* @return foreground color
* @exception IOException
*/
public ColorCode getForegroundColor() throws IOException {
if (_fore == null) {
_fore = new ColorCode(getValue(_fore_attribute));
}
return _fore;
}
/**
* @return background color
* @exception IOException
*/
public ColorCode getBackgroundColor() throws IOException {
if (_back == null) {
_back = new ColorCode(getValue(_back_attribute));
}
return _back;
}
/**
* @return pattern color
* @exception IOException
*/
public ColorCode getPatternColor() throws IOException {
if (_pattern_color == null) {
_pattern_color = new ColorCode(getValue(_pattern_color_attribute));
}
return _pattern_color;
}
/**
* @return format string
* @exception IOException
*/
public String getFormat() throws IOException {
if (_format == null) {
_format = getValue(_format_attribute);
/*
* if (_format == null) { throw new IOException("missing " +
* _format_attribute + " attribute");
*/
}
return _format;
}
private HorizontalAlignment getHorizontalAlignment() throws IOException {
if (_h_align == null) {
_h_align = new HorizontalAlignment(getValue(_h_align_attribute));
}
return _h_align;
}
private VerticalAlignment getVerticalAlignment() throws IOException {
if (_v_align == null) {
_v_align = new VerticalAlignment(getValue(_v_align_attribute));
}
return _v_align;
}
private StyleOrientation getStyleOrientation() throws IOException {
if (_orient == null) {
_orient = new StyleOrientation(getValue(_orient_attribute));
}
return _orient;
}
/**
* @return instance created in the EPStyles instance from
* HSSFColor.getTripletHash();
* @see org.apache.poi.hssf.util.HSSFColor#getTripletHash()
*/
Hashtable getColorHash() {
return ((EPStyleRegion)getAncestor(EPStyleRegion.class)).getColorHash();
}
/**
* @return the HSSFCellStyle object associated with this style region.
*/
HSSFCellStyle getStyle() {
return ((EPStyleRegion)getAncestor(EPStyleRegion.class)).getStyle();
}
/**
* @return validity (used to determine whether this is a big wasteful
* region with no purpose (gnumeric does this)
*/
public boolean isValid() {
return (!invalid);
}
/**
* deal with mismatch between gnumeric align and Excel
*/
private short convertAlignment(short alignment) {
short retval = HSSFCellStyle.ALIGN_GENERAL; // its 0
switch (alignment) {
case 1 :
retval = HSSFCellStyle.ALIGN_GENERAL;
break;
case 2 :
retval = HSSFCellStyle.ALIGN_LEFT;
break;
case 4 :
retval = HSSFCellStyle.ALIGN_RIGHT;
break;
case 8 :
retval = HSSFCellStyle.ALIGN_CENTER;
break;
case 16 :
retval = HSSFCellStyle.ALIGN_FILL;
break;
case 32 :
retval = HSSFCellStyle.ALIGN_JUSTIFY;
break;
case 64 :
retval = HSSFCellStyle.ALIGN_CENTER_SELECTION;
break;
default :
retval = HSSFCellStyle.ALIGN_GENERAL;
}
return retval;
}
/**
* deal with mismatch between gnumeric valign and Excel
*/
private short convertVAlignment(short alignment) {
short retval = HSSFCellStyle.VERTICAL_TOP; // its 0
switch (alignment) {
case 1 :
retval = HSSFCellStyle.VERTICAL_TOP;
break;
case 2 :
retval = HSSFCellStyle.VERTICAL_BOTTOM;
break;
case 4 :
retval = HSSFCellStyle.VERTICAL_CENTER;
break;
case 8 :
retval = HSSFCellStyle.VERTICAL_JUSTIFY;
break;
default :
retval = HSSFCellStyle.VERTICAL_TOP;
}
return retval;
}
/**
* Takes in a Gnumeric format string and applies some rules to it. Some
* versions of Gnumeric seem to leave off the first parenthesis which
* causes them not to match the Excel-style format string. (which of course
* makes it a little hard to match)
*/
private String kludgeForGnumericMisformats(String format) {
String retval = format;
if (getLogger().isDebugEnabled()) {
getLogger().debug("going out of the format kludger " + retval);
getLogger().debug("first )=" + format.indexOf(')'));
getLogger().debug("first (=" + format.indexOf('('));
}
if (format.indexOf(')') < format.indexOf('(')
&& (format.indexOf(')') != -1)) {
retval = "(" + format;
}
if (getLogger().isDebugEnabled()) {
getLogger().debug("going out of the format kludger " + retval);
}
return retval;
}
private String kludgeForGnumericDateDivergence(String format) {
String retval = format;
if (getLogger().isDebugEnabled()) {
getLogger().debug(
"going into the format kludgeForGnumericDateDivergence"
+ retval);
}
if (retval.equals("mm/dd/yy")) {
retval = "m/d/yy";
} else if (retval.equals("dd-mmm-yy")) {
retval = "d-mmm-yy";
} else if (retval.equals("dd-mmm")) {
retval = "d-mmm";
}
if (getLogger().isDebugEnabled()) {
getLogger().debug(
"going out of the format kludgeForGnumericDateDivergence"
+ retval);
}
return retval;
}
} // end public class EPStyle