/* * ParameterSpaceManager.java * * Created on December 10, 2005, 12:26 PM */ package Current.manage.ParameterSpace; import Current.manage.*; import java.util.*; import java.lang.ref.WeakReference; import java.awt.*; import java.awt.geom.*; import java.io.Serializable; /** * This component allows arbitrary components to render to the parameter * space at will. * * @author pat */ public class ParameterSpaceManager implements ParameterSpaceRenderer { public static class ColorSettings implements Serializable { /** title of these settings */ public String getTitle() { return "parameter space colors"; } public Color lineColor=new Color(127,127,127,255); public static final String lineColor_name="line color"; public Color rightTriangleColor=Color.red; public static final String rightTriangleColor_name="right triangles color"; public Color spaceColor=Color.black; public static final String spaceColor_name="background color"; public Color outsideColor=new Color(0,0,50); public static final String outsideColor_name="exterior color"; public Color borderColor=Color.white; public static final String borderColor_name="border color"; public Color gridColor=new Color(127,127,127,127); public static final String gridColor_name="grid color"; } private class RendererData { //public ParameterSpaceRenderer r; public WeakReference ref; public boolean visible; public RendererData(ParameterSpaceRenderer r) { ref=new WeakReference(r); visible=true; } public boolean stillGood() { return ref.get()!=null; } public ParameterSpaceRenderer getRenderer() { return (ParameterSpaceRenderer)(ref.get()); } } public ColorSettings color_settings; public boolean showBorder=true; private Manager M; // this is the bounding box for the parameter space. private final GeneralPath space=new GeneralPath(); private LinkedList renderers; private LinkedList hidden; /** Creates a new instance of ParameterSpaceManager */ public ParameterSpaceManager(Manager M) { this.M=M; renderers=new LinkedList(); space.moveTo(0,0); space.lineTo(1,0); space.lineTo(1,1); space.lineTo(0,1); space.closePath(); color_settings=(ColorSettings)(M.settings.getDefault(ColorSettings.class)); M.addListener(this); //readSettings(); } /** Add me to the list of components that render to the canvas * I want to draw first! (meaning everything else will draw on top of me */ public void addRendererBottom(ParameterSpaceRenderer me) { //System.out.println("new renderer: "+me.getClass().getName()); renderers.addFirst(new RendererData(me)); } /** Add me to the list of components that render to the canvas * I want to draw last! (meaning I draw on top of everything else) */ public void addRendererTop(ParameterSpaceRenderer me) { //System.out.println("new renderer: "+me.getClass().getName()); renderers.addLast(new RendererData(me)); } /** This is a function that removes all references of the given object */ public void remove(Object obj){ RendererData rd; for (ListIterator it=renderers.listIterator(); it.hasNext();){ rd=((RendererData)it.next()); if (rd.stillGood()) { if (rd.getRenderer()==obj) { it.remove(); } } else { it.remove(); System.err.println("Warning: ParameterSpaceManager removing something manually"); } } } /** This is a function that hides all references of the given object */ public void hide(ParameterSpaceRenderer obj){ RendererData rd; for (ListIterator it=renderers.listIterator(); it.hasNext();){ rd=((RendererData)it.next()); if (rd.stillGood()) { if (rd.getRenderer()==obj) { rd.visible=false; } } else { it.remove(); System.err.println("Warning: ParameterSpaceManager removing something manually"); } } } public void render(Graphics2D g, AffineTransform T){ //System.out.println("rendering parameter space"); { // draw the bounding rectangle g.setColor(color_settings.spaceColor); g.fill(T.createTransformedShape(space)); } if (showBorder) { { g.setColor(color_settings.borderColor); g.draw(T.createTransformedShape(space)); } { // draw the right triangle lines GeneralPath gp=new GeneralPath(); gp.moveTo(1,0); gp.lineTo(1,1); gp.lineTo(0,1); gp.closePath(); g.setColor(color_settings.rightTriangleColor); g.draw(T.createTransformedShape(gp)); } } // defer the rest of the drawing to the individual renderers RendererData rd; for (ListIterator it=renderers.listIterator(); it.hasNext();){ rd=((RendererData)it.next()); if ((rd.stillGood())&&(rd.visible)) { rd.getRenderer().render(g,T); } else { it.remove(); System.err.println("Warning: ParameterSpaceManager removing something manually"); } } } public void raise(String classname) { LinkedList ll=new LinkedList(); RendererData rd; for (ListIterator it=renderers.listIterator(); it.hasNext();){ rd=((RendererData)it.next()); if (rd.stillGood()) { if (rd.getRenderer().getClass().getName().equals(classname)) { it.remove(); ll.addLast(rd); } } else { it.remove(); System.err.println("Warning: ParameterSpaceManager removing something manually"); } } for (ListIterator it=ll.listIterator(); it.hasNext(); ) { renderers.addLast(it.next()); } } public String getTitle() { return "parameter space"; } public void mcbReceive(ColorSettings cs) { M.spaceChanged(); } }