package com.revolsys.swing.field;
import java.awt.Component;
import java.awt.Font;
import java.awt.GraphicsEnvironment;
import java.lang.ref.Reference;
import java.lang.ref.WeakReference;
import java.util.HashMap;
import java.util.Map;
import javax.swing.DefaultListCellRenderer;
import javax.swing.JList;
import javax.swing.ListCellRenderer;
import com.revolsys.datatype.DataTypes;
public class FontChooserField extends ComboBox<String> {
private static final String[] FONT_NAMES = getFontNames();
private static final Map<String, Reference<Font>> fontCache = new HashMap<>();
@SuppressWarnings("rawtypes")
private static final ListCellRenderer RENDERER = new DefaultListCellRenderer() {
private static final long serialVersionUID = 1L;
@Override
public Component getListCellRendererComponent(final JList list, final Object value,
final int index, final boolean isSelected, final boolean cellHasFocus) {
final String fontName = DataTypes.toString(value);
final Font font = FontChooserField.getFont(fontName);
final Component renderer = super.getListCellRendererComponent(list, value, index, isSelected,
cellHasFocus);
renderer.setFont(font);
return renderer;
}
};
private static final long serialVersionUID = 1L;
private static Font getFont(final String name) {
Reference<Font> reference = fontCache.get(name);
if (reference != null) {
final Font font = reference.get();
if (font != null) {
return font;
}
}
final Font font = new Font(name, Font.PLAIN, 16);
reference = new WeakReference<>(font);
fontCache.put(name, reference);
return font;
}
public static String[] getFontNames() {
return GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
}
@SuppressWarnings("unchecked")
public FontChooserField(final String fieldName, final String fontName) {
super(fieldName, newModel(FONT_NAMES), null, RENDERER);
setSelectedItem(fontName);
}
}