package eduni.simanim; import java.util.Vector; import java.util.Enumeration; import java.util.StringTokenizer; import java.text.NumberFormat; import java.net.*; import java.io.*; import java.applet.*; import java.awt.*; import eduni.simjava.*; import eduni.simdiag.*; /** * The trace output class for animations. Do not use this class * directly, instead use Anim_applet. * @version 1.0, 4 September * @version 1.1, 24 March 1997 - updates for JDK 1.1 * @author Ross McNab */ public class Sim_anim extends Panel implements Sim_output, Traceable { private int width, height; // Our width and height private int traceCount; // How many traces we've seen private Vector events; private Vector entities; private Param_type_list ptypes; private String msgString; private Image staticImage; // Off screen buffer for drawing graphics private Graphics staticGraphics; // and it's graphics region static private NumberFormat nf; private long lastsimtime; // Time for last sim step (ms) private Vector sends = new Vector(); // Stores list of send events for messages /* Javabeans trace event output */ private Vector traceListeners = new Vector(); private TraceEventObject lastTraceEvent; public synchronized void addTraceListener(TraceListener l) { traceListeners.addElement(l); } public synchronized void removeTraceListener(TraceListener l) { traceListeners.removeElement(l); } public void forwardTrace(TraceEventObject e) { Vector l; TraceEventObject weo = new TraceEventObject(this,e); synchronized(this) { l = (Vector)traceListeners.clone(); } for (int i=0; i timestamp) break; switch(ev.type) { case(Anim_event.SEND): sends.addElement(ev.src_port); ev.src_port.set_data(ev.data.toString()); break; case(Anim_event.PARAM): ev.src_ent.set_params(ev.data.toString()); ev.src_ent.draw(staticGraphics); break; } ev_index++; } // end while // Ok repaint these updates update_msgString("Running: sim time = "+nf.format(timestamp)); dispTrace(); //update_static(); show_update(simThread); // Now animate all the sends we encountered if(sends.size() > 0) { for(i=0; i<=anim_steps; i++) { for (e = sends.elements(); e.hasMoreElements() ;) { port = (Anim_port)e.nextElement(); if(i == anim_steps) { port.move_msg(-1.0); } else port.move_msg((1.0*i)/anim_steps); } show_update(simThread); } } } } while (running); // Our work here is done: Sim_system.run_stop(); show_update(simThread); update_msgString("Sim completed: sim time = "+nf.format(timestamp)); draw_all_static(); genTraceTail(); show_update(simThread); } }