001    package railo.commons.lang.font;
002    
003    import java.awt.Font;
004    import java.awt.FontMetrics;
005    import java.awt.Graphics2D;
006    import java.awt.GraphicsEnvironment;
007    import java.awt.image.BufferedImage;
008    import java.util.Iterator;
009    
010    import railo.runtime.exp.ExpressionException;
011    import railo.runtime.type.Array;
012    import railo.runtime.type.ArrayImpl;
013    
014    public class FontUtil {
015    
016            private static Array fonts;
017            private static Graphics2D graphics;
018    
019            public synchronized static Array getAvailableFontsAsStringArray() {
020                    Iterator it = getAvailableFonts(false).iterator();
021                    Array arr=new ArrayImpl();
022                    while(it.hasNext()) {
023                            arr.appendEL(((Font)it.next()).getFontName());
024                    }
025                    return arr;
026            }
027            private synchronized static Array getAvailableFonts(boolean duplicate) {
028                    if (fonts == null) {
029                
030                            fonts = new ArrayImpl();
031                    GraphicsEnvironment graphicsEvn = GraphicsEnvironment.getLocalGraphicsEnvironment();
032                    Font[] availableFonts = graphicsEvn.getAllFonts();
033                    for (int i = 0; i < availableFonts.length; i++) {
034                                    fonts.appendEL(availableFonts[i]);
035                    }
036                    
037                    }
038                    if(!duplicate) return fonts;
039                    return (Array) fonts.duplicate(false);
040            }
041    
042            public static String toString(Font font) {
043                    if(font==null) return null;
044                    return font.getFontName();
045            }
046    
047            public static Font getFont(String font, Font defaultValue) {
048                    Font f=Font.decode(font);
049                    if(f!=null) return f;
050                    // font name
051                    Iterator it = getAvailableFonts(false).iterator();
052                    while(it.hasNext()) {
053                            f=(Font) it.next();
054                            if(f.getFontName().equalsIgnoreCase(font)) return f;
055                    }
056                    // family
057                    it = getAvailableFonts(false).iterator();
058                    while(it.hasNext()) {
059                            f=(Font) it.next();
060                            if(f.getFamily().equalsIgnoreCase(font)) return f;
061                    }
062                    return defaultValue;
063            }
064            
065            public static Font getFont(String font) throws ExpressionException {
066                    Font f = getFont(font,null);
067                    if(f!=null) return f;
068                    throw new ExpressionException("no font with name ["+font+"] available"
069                            ,"to get available fonts call function ImageFonts()");
070            }
071            
072            public static FontMetrics getFontMetrics(Font font) {
073                    if(graphics==null) {
074                            graphics = new BufferedImage(1, 1,BufferedImage.TYPE_INT_ARGB).createGraphics();
075                    }
076                    return graphics.getFontMetrics(font);
077            }
078    }