/* Copyright 2006 by Sean Luke and George Mason University Licensed under the Academic Free License version 3.0 See the file "LICENSE" for more information */ package sim.portrayal.simple; import sim.display.*; import sim.field.grid.*; import sim.portrayal.*; import sim.portrayal.grid.*; import java.awt.*; import sim.util.*; /** The ValuePortrayal2D is the default portrayal for ValueGridPortrayal2Ds. It requires a parent (the ValueGridPortrayal2D), which it uses to determine the correct colors for a given object. The objects portrayed must be instances of MutableDouble, where the value represents the level of the color. */ public class ValuePortrayal2D extends RectanglePortrayal2D { public ValuePortrayal2D() { } /** @deprecated */ public ValuePortrayal2D(ValueGridPortrayal2D parent) { super(null); // no color -- we'll determine the color during portrayal } /** @deprecated does nothing now */ public void setParent(ValueGridPortrayal2D parent) { } public void draw(Object object, Graphics2D graphics, DrawInfo2D info) { ValueGridPortrayal2D parent = (ValueGridPortrayal2D) (info.fieldPortrayal); double levelHere = ((MutableDouble)object).val; Color c = parent.getMap().getColor(levelHere); if (c.getAlpha() != 0) { paint = c; super.draw(object, graphics, info); } } public static abstract class Filter { int x; int y; ValueGridPortrayal2D fieldPortrayal; String name; public Filter(LocationWrapper wrapper) { fieldPortrayal = (ValueGridPortrayal2D)(wrapper.getFieldPortrayal()); Int2D loc = (Int2D)(wrapper.getLocation()); x = loc.x; y = loc.y; name = fieldPortrayal.getValueName() + " at " + wrapper.getLocationName(); } public String toString() { return name; } } // the only reason for these two subclasses is that they differ in the data // type of their property (double vs int). This allows us to guarantee that // ints are displayed or set as opposed to doubles in the Inspector. No // big whoop -- it's more a formatting thing than anything else. public static class DoubleFilter extends Filter { public DoubleFilter(LocationWrapper wrapper) { super(wrapper); } public double getValue() { return ((DoubleGrid2D)fieldPortrayal.getField()).field[x][y]; } public void setValue(double val) { ((DoubleGrid2D)fieldPortrayal.getField()).field[x][y] = fieldPortrayal.newValue(x,y,val); } // static inner classes don't need serialVersionUIDs } public static class IntFilter extends Filter { public IntFilter(LocationWrapper wrapper) { super(wrapper); } public int getValue() { return ((IntGrid2D)fieldPortrayal.getField()).field[x][y]; } public void setValue(int val) { ((IntGrid2D)fieldPortrayal.getField()).field[x][y] = (int)fieldPortrayal.newValue(x,y,val); } // static inner classes don't need serialVersionUIDs } public Inspector getInspector(LocationWrapper wrapper, GUIState state) { if (((ValueGridPortrayal2D)(wrapper.getFieldPortrayal())).getField() instanceof DoubleGrid2D) return sim.portrayal.Inspector.getInspector(new DoubleFilter(wrapper), state, "Properties"); else return sim.portrayal.Inspector.getInspector(new IntFilter(wrapper) ,state, "Properties"); // static inner classes don't need serialVersionUIDs } public String getStatus(LocationWrapper wrapper) { return getName(wrapper) + ": " + ((MutableDouble)(wrapper.getObject())).val; } public String getName(LocationWrapper wrapper) { ValueGridPortrayal2D portrayal = (ValueGridPortrayal2D)(wrapper.getFieldPortrayal()); return portrayal.getValueName() + " at " + wrapper.getLocationName(); } }