/*********************************************************************
*
* 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.biff;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import jxl.common.Assert;
import jxl.write.biff.File;
/**
* A container for the list of fonts used in this workbook
*/
public class Fonts
{
/**
* The list of fonts
*/
private ArrayList fonts;
/**
* The default number of fonts
*/
private static final int numDefaultFonts = 4;
/**
* Constructor
*/
public Fonts()
{
fonts = new ArrayList();
}
/**
* Adds a font record to this workbook. If the FontRecord passed in has not
* been initialized, then its font index is determined based upon the size
* of the fonts list. The FontRecord's initialized method is called, and
* it is added to the list of fonts.
*
* @param f the font to add
*/
public void addFont(FontRecord f)
{
if (!f.isInitialized())
{
int pos = fonts.size();
// Remember that the pos with index 4 is skipped
if (pos >= 4)
{
pos++;
}
f.initialize(pos);
fonts.add(f);
}
}
/**
* Used by FormattingRecord for retrieving the fonts for the
* hardcoded styles
*
* @param index the index of the font to return
* @return the font with the specified font index
*/
public FontRecord getFont(int index)
{
// remember to allow for the fact that font index 4 is not used
if (index > 4)
{
index--;
}
return (FontRecord) fonts.get(index);
}
/**
* Writes out the list of fonts
*
* @param outputFile the compound file to write the data to
* @exception IOException
*/
public void write(File outputFile) throws IOException
{
Iterator i = fonts.iterator();
FontRecord font = null;
while (i.hasNext())
{
font = (FontRecord) i.next();
outputFile.write(font);
}
}
/**
* Rationalizes all the fonts, removing any duplicates
*
* @return the mappings between new indexes and old ones
*/
IndexMapping rationalize()
{
IndexMapping mapping = new IndexMapping(fonts.size() + 1);
// allow for skipping record 4
ArrayList newfonts = new ArrayList();
FontRecord fr = null;
int numremoved = 0;
// Preserve the default fonts
for (int i = 0; i < numDefaultFonts; i++)
{
fr = (FontRecord) fonts.get(i);
newfonts.add(fr);
mapping.setMapping(fr.getFontIndex(), fr.getFontIndex());
}
// Now do the rest
Iterator it = null;
FontRecord fr2 = null;
boolean duplicate = false;
for (int i = numDefaultFonts; i < fonts.size(); i++)
{
fr = (FontRecord) fonts.get(i);
// Compare to all the fonts currently on the list
duplicate = false;
it = newfonts.iterator();
while (it.hasNext() && !duplicate)
{
fr2 = (FontRecord) it.next();
if (fr.equals(fr2))
{
duplicate = true;
mapping.setMapping(fr.getFontIndex(),
mapping.getNewIndex(fr2.getFontIndex()));
numremoved++;
}
}
if (!duplicate)
{
// Add to the new list
newfonts.add(fr);
int newindex = fr.getFontIndex() - numremoved;
Assert.verify(newindex > 4);
mapping.setMapping(fr.getFontIndex(), newindex);
}
}
// Iterate through the remaining fonts, updating all the font indices
it = newfonts.iterator();
while (it.hasNext())
{
fr = (FontRecord) it.next();
fr.initialize(mapping.getNewIndex(fr.getFontIndex()));
}
fonts = newfonts;
return mapping;
}
}
|