package com.kreative.paint.material; import java.awt.Font; import java.awt.FontFormatException; import java.awt.GraphicsEnvironment; import java.io.IOException; import java.io.InputStream; import java.util.SortedMap; import java.util.TreeMap; import com.kreative.paint.material.fontlist.FontList; import com.kreative.paint.material.fontlist.FontListParser; public class FontLoader { private final MaterialLoader loader; private final SortedMap<String,Font> fonts; private final MaterialList<FontList> lists; public FontLoader(MaterialLoader loader) { this.loader = loader; this.fonts = new TreeMap<String,Font>(); this.lists = new MaterialList<FontList>(); } public SortedMap<String,Font> getFonts() { if (isEmpty()) loadResources(); return fonts; } public MaterialList<FontList> getFontLists() { if (isEmpty()) loadResources(); if (lists.isEmpty()) createLists(); return lists; } private boolean isEmpty() { return fonts.isEmpty() && lists.isEmpty(); } private void loadResources() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); String[] fontFamilyNames = ge.getAvailableFontFamilyNames(); for (String fontName : fontFamilyNames) { Font font = new Font(fontName, Font.PLAIN, 1); fonts.put(fontName, font); } for (MaterialResource r : loader.listResources()) { if (r.isFormat("ttf", false)) { try { InputStream in = r.getInputStream(); Font font = Font.createFont(Font.TRUETYPE_FONT, in); in.close(); String fontName = font.getFamily(); fonts.put(fontName, font); } catch (IOException e) { System.err.println("Warning: Failed to load font " + r.getResourceName() + "."); e.printStackTrace(); } catch (FontFormatException e) { System.err.println("Warning: Failed to load font " + r.getResourceName() + "."); e.printStackTrace(); } } else if (r.isFormat("rfpx", false)) { try { InputStream in = r.getInputStream(); FontList list = FontListParser.parse(r.getResourceName(), in); in.close(); String name = (list.name != null) ? list.name : r.getResourceName(); lists.add(name, list); } catch (IOException e) { System.err.println("Warning: Failed to compile font list " + r.getResourceName() + "."); e.printStackTrace(); } } } } private void createLists() { System.err.println("Notice: No font lists found. Generating generic font lists."); lists.add("CSS", new FontList("CSS", "serif", "sans-serif", "monospace", "cursive", "fantasy" )); lists.add("General", new FontList("General", "Courier", "Helvetica", "Palatino", "Symbol", "Times" )); lists.add("Java", new FontList("Java", "Dialog", "DialogInput", "Monospaced", "SansSerif", "Serif" )); } }