jxl.biff.Fonts Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jxl Show documentation
Show all versions of jxl Show documentation
JExcelApi is a java library which provides the ability to read, write, and modify Microsoft Excel spreadsheets.
The newest version!
/*********************************************************************
*
* 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;
}
}