/*********************************************************************
*
* Copyright (C) 2002 Andrew Khan
*
* This library 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 2.1 of the License, or (at your option) any later version.
*
* This library 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 this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
***************************************************************************/
package jxl.write.biff;
import java.util.List;
import jxl.biff.IntegerHelper;
import jxl.biff.Type;
import jxl.biff.WritableRecordData;
import jxl.write.Number;
/**
* Contains an array of RK numbers
*/
class MulRKRecord extends WritableRecordData
{
/**
* The row containing these numbers
*/
private int row;
/**
* The first column these rk number occur on
*/
private int colFirst;
/**
* The last column these rk number occur on
*/
private int colLast;
/**
* The array of rk numbers
*/
private int[] rknumbers;
/**
* The array of xf indices
*/
private int[] xfIndices;
/**
* Constructs the rk numbers from the integer cells
*
* @param numbers A list of jxl.write.Number objects
*/
public MulRKRecord(List numbers)
{
super(Type.MULRK);
row = ((Number)numbers.get(0)).getRow();
colFirst = ((Number)numbers.get(0)).getColumn();
colLast = colFirst + numbers.size() - 1;
rknumbers = new int[numbers.size()];
xfIndices = new int[numbers.size()];
for (int i = 0; i < numbers.size(); i++)
{
rknumbers[i] = (int) ((Number)numbers.get(i)).getValue();
xfIndices[i] = ( (CellValue) numbers.get(i)).getXFIndex();
}
}
/**
* Gets the binary data for output to file
*
* @return the binary data
*/
public byte[] getData()
{
byte[] data = new byte[rknumbers.length * 6 + 6];
// Set up the row and the first column
IntegerHelper.getTwoBytes(row, data, 0);
IntegerHelper.getTwoBytes(colFirst, data, 2);
// Add all the rk numbers
int pos = 4;
int rkValue = 0;
byte[] rkBytes = new byte[4];
for (int i = 0; i < rknumbers.length; i++)
{
IntegerHelper.getTwoBytes(xfIndices[i], data, pos);
// To represent an int as an Excel RK value, we have to
// undergo some outrageous jiggery pokery, as follows:
// Gets the bit representation of the number
rkValue = rknumbers[i] << 2;
// Set the integer bit
rkValue |= 0x2;
IntegerHelper.getFourBytes(rkValue, data, pos+2);
pos+=6;
}
// Write the number of rk numbers in this record
IntegerHelper.getTwoBytes(colLast, data, pos);
return data;
}
}
|