package com.bc.ceres.swing.figure.support; import com.bc.ceres.core.Assert; import com.bc.ceres.grender.Rendering; import com.bc.ceres.swing.figure.FigureStyle; import com.bc.ceres.swing.figure.Symbol; import java.awt.geom.Rectangle2D; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.util.HashMap; import java.util.Map; /** * A symbol with a (well-known) name. * * @author Norman Fomferra * @since Ceres 0.13 */ public class NamedSymbol implements Symbol { public final static NamedSymbol PLUS = new NamedSymbol("plus", PointSymbol.createPlus(14.0)); public final static NamedSymbol CROSS = new NamedSymbol("cross", PointSymbol.createCross(14.0)); public final static NamedSymbol STAR = new NamedSymbol("star", PointSymbol.createStar(14.0)); public final static NamedSymbol SQUARE = new NamedSymbol("square", ShapeSymbol.createSquare(14.0)); public final static NamedSymbol CIRCLE = new NamedSymbol("circle", ShapeSymbol.createCircle(14.0)); public final static NamedSymbol PIN = new NamedSymbol("pin", ShapeSymbol.createPin(24.0)); private final static Map<String, NamedSymbol> symbols = getDeclaredSymbols(); private final String name; private final Symbol symbol; public static NamedSymbol getSymbol(String name) { return symbols.get(name.toLowerCase()); } public NamedSymbol(String name, Symbol symbol) { Assert.notNull(name, "name"); Assert.notNull(symbol, "symbol"); this.name = name; this.symbol = symbol; } public String getName() { return name; } public Symbol getSymbol() { return symbol; } @Override public boolean isHitBy(double x, double y) { return symbol.isHitBy(x, y); } @Override public Rectangle2D getBounds() { return symbol.getBounds(); } @Override public void draw(Rendering rendering, FigureStyle style) { symbol.draw(rendering, style); } @Override public String toString() { return getName(); } private static Map<String, NamedSymbol> getDeclaredSymbols() { HashMap<String, NamedSymbol> symbols = new HashMap<String, NamedSymbol>(); Field[] declaredFields = NamedSymbol.class.getDeclaredFields(); for (Field declaredField : declaredFields) { int modifiers = declaredField.getModifiers(); if (Symbol.class.isAssignableFrom(declaredField.getType()) && Modifier.isPublic(modifiers) && Modifier.isFinal(modifiers) && Modifier.isStatic(modifiers)) { NamedSymbol symbol; try { symbol = (NamedSymbol) declaredField.get(null); } catch (Exception e) { throw new IllegalStateException(e); } symbols.put(symbol.getName(), symbol); } } return symbols; } }