/** * */ package vroom.optimization.online.jmsa.vrp.visu; import java.awt.Color; import java.awt.Dimension; import java.awt.Paint; import org.apache.commons.collections15.Transformer; import vroom.common.modeling.dataModel.INodeVisit; import vroom.common.modeling.dataModel.attributes.RequestAttributeKey; import vroom.common.modeling.visualization.DefaultInstanceViewer; import vroom.common.utilities.IObservable; import vroom.common.utilities.IObserver; import vroom.common.utilities.Update; import vroom.optimization.online.jmsa.vrp.VRPActualRequest; import vroom.optimization.online.jmsa.vrp.vrpsd.VRPSDActualRequest; /** * <code>DynamicInstanceViewer</code> * <p> * Creation date: Sep 27, 2010 - 6:02:21 PM * * @author Victor Pillac, <a href="http://uniandes.edu.co">Universidad de Los Andes</a>-<a * href="http://copa.uniandes.edu.co">Copa</a> <a href="http://www.emn.fr">Ecole des Mines de Nantes</a>-<a * href="http://www.irccyn.ec-nantes.fr/irccyn/d/en/equipes/Slp">SLP</a> * @version 1.0 */ public class DynamicInstanceViewer extends DefaultInstanceViewer implements IObserver { private static final long serialVersionUID = 1L; public static Color sColorDepot = Color.DARK_GRAY; public static Color sColorUnassignedRequest = Color.WHITE; public static Color sColorAssignedRequest = Color.LIGHT_GRAY; public static Color sColorServedRequest = Color.DARK_GRAY; private final DynamicInstanceGraph mGraph; /** * Creates a new <code>DynamicInstanceViewer</code> * * @param graph * @param preferredSize * @param preferredSize * the preferred size * @param minX * the min x coordinate * @param maxX * the max x coordinate * @param minY * the min y coordinate * @param maxY * the max y coordinate */ public DynamicInstanceViewer(DynamicInstanceGraph graph, Dimension preferredSize, double[] bounds) { super(graph, preferredSize, bounds); mGraph = graph; mGraph.addObserver(this); } /** * Instantiates a new dynamic instance viewer. * * @param graph * the graph */ public DynamicInstanceViewer(DynamicInstanceGraph graph) { super(graph); mGraph = graph; mGraph.addObserver(this); } @Override protected void setDefaultVertexFillPaintTransformer() { getRenderContext().setVertexFillPaintTransformer(new VertexFillPaintTransformer()); } // @Override // protected void setDefaultVertexLabelTransformer() { // getRenderContext().setVertexLabelTransformer(new VertexLabelTransformer()); // } @Override public void update(IObservable source, Update update) { update(); // if (update instanceof GraphUpdate) { // GraphUpdate up = (GraphUpdate) update; // if (up.isNodeUpdate()) { // for (INodeVisit n : up.getNodes()) { // getRenderer().renderVertex(getRenderContext(), getGraphLayout(), n); // getRenderer().renderVertexLabel(getRenderContext(), getGraphLayout(), // n); // } // } // if (up.isArcUpdate()) { // getRenderer().renderEdge(getRenderContext(), getGraphLayout(), // up.getArc()); // getRenderer().renderEdgeLabel(getRenderContext(), getGraphLayout(), // up.getArc()); // } else { // update(); // } // } else { // update(); // } } public class VertexFillPaintTransformer implements Transformer<INodeVisit, Paint> { @Override public Paint transform(INodeVisit node) { if (node.isDepot()) { return sColorDepot; } else if (node instanceof VRPActualRequest) { VRPActualRequest r = (VRPActualRequest) node; if (mGraph.getInstance().isRequestServed(r)) { return sColorServedRequest; } else if (mGraph.getInstance().isRequestAssigned(r)) { return sColorAssignedRequest; } else { return sColorUnassignedRequest; } } else { return sColorUnassignedRequest; } } } public class VertexLabelTransformer implements Transformer<INodeVisit, String> { @Override public String transform(INodeVisit node) { if (node.isDepot()) { return "depot"; } Object demand; if (node instanceof VRPSDActualRequest && ((VRPSDActualRequest) node).isDemandKnown(0)) { demand = ((VRPSDActualRequest) node).getDemand(0); } else { demand = node.getParentRequest().getAttribute(RequestAttributeKey.DEMAND); } return String.format("%s-%s", node.getID(), demand); // return "" + node.getID(); } } public void detach() { mGraph.detach(); } }