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