/*********************************************************************
*
* 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.ArrayList;
import java.util.Iterator;
import jxl.biff.IntegerHelper;
import jxl.biff.Type;
import jxl.biff.WritableRecordData;
/**
* An external sheet record, used to maintain integrity when formulas
* are copied from read databases
*/
class ExternalSheetRecord extends WritableRecordData
{
/**
* The underlying external sheet data
*/
private byte[] data;
/**
* The list of XTI structures
*/
private ArrayList xtis;
/**
* An XTI structure
*/
private static class XTI
{
int supbookIndex;
int firstTab;
int lastTab;
XTI(int s, int f, int l)
{
supbookIndex = s;
firstTab = f;
lastTab = l;
}
void sheetInserted(int index)
{
if (firstTab >= index)
{
firstTab++;
}
if (lastTab >= index)
{
lastTab++;
}
}
void sheetRemoved(int index)
{
if (firstTab == index)
{
firstTab = 0;
}
if (lastTab == index)
{
lastTab = 0;
}
if (firstTab > index)
{
firstTab--;
}
if (lastTab > index)
{
lastTab--;
}
}
}
/**
* Constructor
*
* @param esf the external sheet record to copy
*/
public ExternalSheetRecord(jxl.read.biff.ExternalSheetRecord esf)
{
super(Type.EXTERNSHEET);
xtis = new ArrayList(esf.getNumRecords());
XTI xti = null;
for (int i = 0 ; i < esf.getNumRecords(); i++)
{
xti = new XTI(esf.getSupbookIndex(i),
esf.getFirstTabIndex(i),
esf.getLastTabIndex(i));
xtis.add(xti);
}
}
/**
* Constructor used for writable workbooks
*/
public ExternalSheetRecord()
{
super(Type.EXTERNSHEET);
xtis = new ArrayList();
}
/**
* Gets the extern sheet index for the specified parameters, creating
* a new xti record if necessary
* @param supbookind the internal supbook reference
* @param sheetind the sheet index
*/
int getIndex(int supbookind, int sheetind)
{
Iterator i = xtis.iterator();
XTI xti = null;
boolean found = false;
int pos = 0;
while (i.hasNext() && !found)
{
xti = (XTI) i.next();
if (xti.supbookIndex == supbookind &&
xti.firstTab == sheetind)
{
found = true;
}
else
{
pos++;
}
}
if (!found)
{
xti = new XTI(supbookind, sheetind, sheetind);
xtis.add(xti);
pos = xtis.size() - 1;
}
return pos;
}
/**
* Gets the binary data for output to file
*
* @return the binary data
*/
public byte[] getData()
{
byte[] data = new byte[2 + xtis.size() * 6];
int pos = 0;
IntegerHelper.getTwoBytes(xtis.size(), data, 0);
pos += 2;
Iterator i = xtis.iterator();
XTI xti = null;
while (i.hasNext())
{
xti = (XTI) i.next();
IntegerHelper.getTwoBytes(xti.supbookIndex, data, pos);
IntegerHelper.getTwoBytes(xti.firstTab, data, pos+2);
IntegerHelper.getTwoBytes(xti.lastTab, data, pos+4);
pos +=6 ;
}
return data;
}
/**
* Gets the supbook index for the specified external sheet
*
* @param the index of the supbook record
* @return the supbook index
*/
public int getSupbookIndex(int index)
{
return ((XTI) xtis.get(index)).supbookIndex;
}
/**
* Gets the first tab index for the specified external sheet
*
* @param the index of the supbook record
* @return the first tab index
*/
public int getFirstTabIndex(int index)
{
return ((XTI) xtis.get(index)).firstTab;
}
/**
* Gets the last tab index for the specified external sheet
*
* @param the index of the supbook record
* @return the last tab index
*/
public int getLastTabIndex(int index)
{
return ((XTI) xtis.get(index)).lastTab;
}
/**
* Called when a sheet has been inserted via the API
* @param the position of the insertion
*/
void sheetInserted(int index)
{
XTI xti = null;
for (Iterator i = xtis.iterator(); i.hasNext() ; )
{
xti = (XTI) i.next();
xti.sheetInserted(index);
}
}
/**
* Called when a sheet has been removed via the API
* @param the position of the insertion
*/
void sheetRemoved(int index)
{
XTI xti = null;
for (Iterator i = xtis.iterator(); i.hasNext() ; )
{
xti = (XTI) i.next();
xti.sheetRemoved(index);
}
}
}
|