blob: a43248cda9217a8636777cf6ff81bfce5376db39 [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.openoffice.xmerge.converter.xml.sxc.pexcel.records;
import java.io.OutputStream;
import java.io.InputStream;
import java.io.IOException;
import java.awt.Color;
import org.openoffice.xmerge.util.Debug;
import org.openoffice.xmerge.util.EndianConverter;
import org.openoffice.xmerge.util.ColourConverter;
import org.openoffice.xmerge.converter.xml.sxc.Format;
import org.openoffice.xmerge.converter.xml.sxc.pexcel.PocketExcelConstants;
/**
* Represents a BIFF Record descibing extended formatting information
*
*/
public class ExtendedFormat implements BIFFRecord,
org.openoffice.xmerge.converter.xml.OfficeConstants {
private byte[] ixfnt = new byte[2]; // Index to Font Record
private byte[] ixnf = new byte[2];
private byte[] fattributes = new byte[4];
private byte[] fBaseAttr = new byte[2]; // base attribute flags
private byte[] fTextAttr = new byte[2]; // text attribute flags
private byte[] icvFore = new byte[2]; // Background colour of the cell
private byte[] icvFill = new byte[2];
private byte bRight; // Right border Style
private byte bTop; // Top border style
private byte bLeft; // Left border style
private byte bBottom; // Bottom border style
private byte backstyle;
private byte borderstyle;
public static final int TOP_BORDER = 0x01;
public static final int LEFT_BORDER = 0x02;
public static final int BOTTOM_BORDER = 0x04;
public static final int RIGHT_BORDER = 0x08;
// Horizontal Alignment Styles
public static final int NORMAL_ALIGN = 0x00;
public static final int LEFT_ALIGN = 0x01;
public static final int CENTER_ALIGN = 0x02;
public static final int RIGHT_ALIGN = 0x03;
// Vertical Alignment Styles
public static final int TOP_ALIGN = 0x10;
public static final int MIDDLE_ALIGN = 0x20;
public static final int BOTTOM_ALIGN = 0x30;
public static final int WORD_WRAP = 0x08;
/**
* Constructs an <code>ExtendedFormat</code> from the
* <code>InputStream</code>
*
* @param is <code>InputStream</code> to read from
*/
public ExtendedFormat(InputStream is) throws IOException {
read(is);
}
/**
* Constructs a pocket Excel Document using defualt values and sets the
* font index using the specified attribute
*
* @param ixfnt index of the font this format should use
*/
public ExtendedFormat(int ixfnt, Format fmt) {
this.ixfnt = EndianConverter.writeShort((short)ixfnt);
String category = fmt.getCategory();
if(category.equalsIgnoreCase(CELLTYPE_CURRENCY)) {
this.ixnf = EndianConverter.writeShort((short) 0);
} else if(category.equalsIgnoreCase(CELLTYPE_DATE)) {
this.ixnf = EndianConverter.writeShort((short) 0x12);
} else if(category.equalsIgnoreCase(CELLTYPE_TIME)) {
this.ixnf = EndianConverter.writeShort((short) 0x1E);
} else {
this.ixnf = EndianConverter.writeShort((short) 0);
}
this.fattributes = new byte[] {(byte)0xFF,(byte)0xFF,(byte)0xFF,(byte)0xFF};
this.fBaseAttr = new byte[] {(byte)0x02,(byte)0x00};
this.fTextAttr = new byte[] {(byte)0x00, (byte)0x00};
int align = fmt.getAlign();
// Horizontal alignment
if(align==Format.CENTER_ALIGN) {
fTextAttr[0] |= CENTER_ALIGN;
} else if(align==Format.LEFT_ALIGN) {
fTextAttr[0] |= LEFT_ALIGN;
} else if(align==Format.RIGHT_ALIGN) {
fTextAttr[0] |= RIGHT_ALIGN;
} else {
fTextAttr[0] |= NORMAL_ALIGN;
}
int vertAlign = fmt.getVertAlign();
// Vertical alignment
if(vertAlign==Format.TOP_ALIGN) {
fTextAttr[0] |= TOP_ALIGN;
} else if(vertAlign==Format.BOTTOM_ALIGN) {
fTextAttr[0] |= BOTTOM_ALIGN;
} else if(vertAlign==Format.MIDDLE_ALIGN) {
fTextAttr[0] |= MIDDLE_ALIGN;
} else {
fTextAttr[0] |= BOTTOM_ALIGN;
}
if(fmt.getAttribute(Format.WORD_WRAP)) {
fTextAttr[0] |= WORD_WRAP;
}
if(fmt.getAttribute(Format.LEFT_BORDER)) {
fTextAttr[1] |= LEFT_BORDER;
}
if(fmt.getAttribute(Format.RIGHT_BORDER)) {
fTextAttr[1] |= RIGHT_BORDER;
}
if(fmt.getAttribute(Format.TOP_BORDER)) {
fTextAttr[1] |= TOP_BORDER;
}
if(fmt.getAttribute(Format.BOTTOM_BORDER)) {
fTextAttr[1] |= BOTTOM_BORDER;
}
Color background = fmt.getBackground();
if( background != null ) {
ColourConverter cc = new ColourConverter(PocketExcelConstants.cLookup);
icvFill = EndianConverter.writeShort(cc.convertFromRGB(background));
} else {
icvFill = new byte[] {(byte)0xFF,(byte)0x00};
}
icvFore = new byte[] {(byte)0xFF,(byte)0x00};
bRight = (byte) 0xFF;
bTop = (byte) 0xFF;
bLeft = (byte) 0xFF;
bBottom = (byte) 0xFF;
backstyle = (byte) 0x00;
borderstyle = (byte) 0x00;
}
/**
* Get the font index this format uses
*
* @return the font index
*/
public int getFontIndex() {
return EndianConverter.readShort(ixfnt);
}
/**
* Get the font index this format uses
*
* @return the font index
*/
public int getFormatIndex() {
return EndianConverter.readShort(ixnf);
}
/**
* Get the font index this format uses
*
* @return the font index
*/
public int getTextAttr() {
return EndianConverter.readShort(fTextAttr);
}
/**
* Get the background color this format uses
*
* @return the background color
*/
public Color getBackground() {
short rgb = EndianConverter.readShort(icvFill);
Color c = null;
if(rgb!=0xFF) {
ColourConverter cc = new ColourConverter(PocketExcelConstants.cLookup);
c = cc.convertToRGB(rgb);
}
return c;
}
/**
* Get the Vertical alignment for this Format
*
* @return the alignment
*/
public int getVertAlign() {
int mask = MIDDLE_ALIGN | BOTTOM_ALIGN | TOP_ALIGN;
int masked = fTextAttr[0] & mask;
if(masked == MIDDLE_ALIGN)
return Format.MIDDLE_ALIGN;
if(masked == BOTTOM_ALIGN)
return Format.BOTTOM_ALIGN;
if(masked == TOP_ALIGN)
return Format.TOP_ALIGN;
return Format.BOTTOM_ALIGN;
}
/**
* Get the alignment for this Format
*
* @return the alignment
*/
public int getAlign() {
int mask = LEFT_ALIGN | CENTER_ALIGN | RIGHT_ALIGN;
int masked = fTextAttr[0] & mask;
if(masked == MIDDLE_ALIGN)
return Format.LEFT_ALIGN;
if(masked == CENTER_ALIGN)
return Format.CENTER_ALIGN;
if(masked == RIGHT_ALIGN)
return Format.RIGHT_ALIGN;
return Format.LEFT_ALIGN;
}
/**
* Is the word wrap set
*
* @return true if it is selected
*/
public boolean isWordWrap() {
return (!((fTextAttr[0] & WORD_WRAP) == 0));
}
/**
* Get the border style
*
* @param side the side to test
* @return true if it is selected
*/
public boolean isBorder(int side) {
return (!((fTextAttr[1] & side) == 0));
}
/**
* Compare two ExtendedFormat to see if the font index is the same
*
* @param the ExtendedFormat to be used in the comaprison
* @return boolean if the two are the same otherwise false
*/
public boolean compareTo(ExtendedFormat rhs) {
if(EndianConverter.readShort(icvFill) !=
EndianConverter.readShort(rhs.icvFill))
return false;
if(this.getTextAttr() != rhs.getTextAttr())
return false;
if(this.getVertAlign() != rhs.getVertAlign())
return false;
if(this.getAlign() != rhs.getAlign())
return false;
if (this.getFontIndex() != rhs.getFontIndex())
return false;
if (this.getFormatIndex() != rhs.getFormatIndex())
return false;
return true;
}
/**
* Get the hex code for this particular <code>BIFFRecord</code>
*
* @return the hex code for <code>ExtendedFormat</code>
*/
public short getBiffType() {
return PocketExcelConstants.EXTENDED_FORMAT;
}
/**
* Reads the extended format from the <code>Inputstream</code>
*
* @param input the <code>Inputstream</code>to read
* @return toal number of bytes read
*/
public int read(InputStream input) throws IOException {
int numOfBytesRead = input.read(ixfnt);
numOfBytesRead += input.read(ixnf);
numOfBytesRead += input.read(fattributes);
numOfBytesRead += input.read(fBaseAttr);
numOfBytesRead += input.read(fTextAttr);
numOfBytesRead += input.read(icvFore);
numOfBytesRead += input.read(icvFill);
bRight = (byte) input.read();
bTop = (byte) input.read();
bLeft = (byte) input.read();
bBottom = (byte) input.read();
backstyle = (byte) input.read();
borderstyle = (byte) input.read();
numOfBytesRead += 6;
Debug.log(Debug.TRACE,"\tixfnt : "+ EndianConverter.readShort(ixfnt) +
" ixnf : " + EndianConverter.readShort(ixnf) +
" fattributes : " + EndianConverter.readInt(fattributes) +
" fBaseAttr : " + EndianConverter.readShort(fBaseAttr) +
"\n\tfTextAttr : " + EndianConverter.readShort(fTextAttr) +
" icvFore : " + EndianConverter.readShort(icvFore) +
" icvFill : " + EndianConverter.readShort(icvFill) +
" bRight : " + bRight +
"\n\tbTop : " + bTop +
" bLeft : " + bLeft +
" bBottom : " + bBottom +
" backstyle : " + backstyle +
" borderstyle : " + borderstyle);
return numOfBytesRead;
}
/**
* Writes the ExtendedFormat to the <code>Outputstream<code>
*
* @param output the <code>Outputstream</code>to write to
*/
public void write(OutputStream output) throws IOException {
output.write(getBiffType());
output.write(ixfnt);
output.write(ixnf);
output.write(fattributes);
output.write(fBaseAttr);
output.write(fTextAttr);
output.write(icvFore);
output.write(icvFill);
output.write(bRight);
output.write(bTop);
output.write(bLeft);
output.write(bBottom);
output.write(backstyle);
output.write(borderstyle);
Debug.log(Debug.TRACE,"Writing ExtendedFormat record");
}
}