mirror of
https://github.com/apache/poi.git
synced 2026-02-27 20:40:08 +08:00
git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/trunk@353542 13f79535-47bb-0310-9956-ffa450edef68
144 lines
4.3 KiB
Java
144 lines
4.3 KiB
Java
package org.apache.poi.hssf.usermodel;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Properties;
|
|
import java.util.StringTokenizer;
|
|
|
|
/**
|
|
* Stores width and height details about a font.
|
|
*
|
|
* @author Glen Stampoultzis (glens at apache.org)
|
|
*/
|
|
public class FontDetails
|
|
{
|
|
private String fontName;
|
|
private int height;
|
|
private Map charWidths = new HashMap();
|
|
|
|
/**
|
|
* Construct the font details with the given name and height.
|
|
*
|
|
* @param fontName The font name.
|
|
* @param height The height of the font.
|
|
*/
|
|
public FontDetails( String fontName, int height )
|
|
{
|
|
this.fontName = fontName;
|
|
this.height = height;
|
|
}
|
|
|
|
public String getFontName()
|
|
{
|
|
return fontName;
|
|
}
|
|
|
|
public int getHeight()
|
|
{
|
|
return height;
|
|
}
|
|
|
|
public void addChar( char c, int width )
|
|
{
|
|
charWidths.put(new Character(c), new Integer(width));
|
|
}
|
|
|
|
/**
|
|
* Retrieves the width of the specified character. If the metrics for
|
|
* a particular character are not available it defaults to returning the
|
|
* width for the 'W' character.
|
|
*/
|
|
public int getCharWidth( char c )
|
|
{
|
|
Integer widthInteger = (Integer)(charWidths.get(new Character(c)));
|
|
if (widthInteger == null && c != 'W')
|
|
return getCharWidth('W');
|
|
else
|
|
return widthInteger.intValue();
|
|
}
|
|
|
|
public void addChars( char[] characters, int[] widths )
|
|
{
|
|
for ( int i = 0; i < characters.length; i++ )
|
|
{
|
|
charWidths.put( new Character(characters[i]), new Integer(widths[i]));
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Create an instance of <code>FontDetails</code> by loading them from the
|
|
* provided property object.
|
|
* @param fontName the font name
|
|
* @param fontMetricsProps the property object holding the details of this
|
|
* particular font.
|
|
* @return a new FontDetails instance.
|
|
*/
|
|
public static FontDetails create( String fontName, Properties fontMetricsProps )
|
|
{
|
|
String heightStr = fontMetricsProps.getProperty( "font." + fontName + ".height");
|
|
String widthsStr = fontMetricsProps.getProperty( "font." + fontName + ".widths");
|
|
String charactersStr = fontMetricsProps.getProperty( "font." + fontName + ".characters");
|
|
int height = Integer.parseInt(heightStr);
|
|
FontDetails d = new FontDetails(fontName, height);
|
|
String[] charactersStrArray = split(charactersStr, ",", -1);
|
|
String[] widthsStrArray = split(widthsStr, ",", -1);
|
|
if (charactersStrArray.length != widthsStrArray.length)
|
|
throw new RuntimeException("Number of characters does not number of widths for font " + fontName);
|
|
for ( int i = 0; i < widthsStrArray.length; i++ )
|
|
{
|
|
if (charactersStrArray[i].length() != 0)
|
|
d.addChar(charactersStrArray[i].charAt(0), Integer.parseInt(widthsStrArray[i]));
|
|
}
|
|
return d;
|
|
}
|
|
|
|
/**
|
|
* Gets the width of all characters in a string.
|
|
*
|
|
* @param str The string to measure.
|
|
* @return The width of the string for a 10 point font.
|
|
*/
|
|
public int getStringWidth(String str)
|
|
{
|
|
int width = 0;
|
|
for (int i = 0; i < str.length(); i++)
|
|
{
|
|
width += getCharWidth(str.charAt(i));
|
|
}
|
|
return width;
|
|
}
|
|
|
|
/**
|
|
* Split the given string into an array of strings using the given
|
|
* delimiter.
|
|
*/
|
|
private static String[] split(String text, String separator, int max)
|
|
{
|
|
StringTokenizer tok = new StringTokenizer(text, separator);
|
|
int listSize = tok.countTokens();
|
|
if(max != -1 && listSize > max)
|
|
listSize = max;
|
|
String list[] = new String[listSize];
|
|
for(int i = 0; tok.hasMoreTokens(); i++)
|
|
{
|
|
if(max != -1 && i == listSize - 1)
|
|
{
|
|
StringBuffer buf = new StringBuffer((text.length() * (listSize - i)) / listSize);
|
|
while(tok.hasMoreTokens())
|
|
{
|
|
buf.append(tok.nextToken());
|
|
if(tok.hasMoreTokens())
|
|
buf.append(separator);
|
|
}
|
|
list[i] = buf.toString().trim();
|
|
break;
|
|
}
|
|
list[i] = tok.nextToken().trim();
|
|
}
|
|
|
|
return list;
|
|
}
|
|
|
|
|
|
}
|