package simulationWindow;
import java.awt.Color;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JFrame;
import sim.display.Controller;
import sim.display.Display2D;
import sim.display.GUIState;
import sim.engine.SimState;
import sim.engine.Steppable;
import sim.portrayal.grid.SparseGridPortrayal2D;
import sim.portrayal.simple.RectanglePortrayal2D;
import sim.util.gui.SimpleColorMap;
import simulation.SimulationModel;
import simulation.StatsManager;
import simulation.entity.Carnivorious;
import simulation.entity.Grass;
import simulation.entity.Herbivorious;
import utils.Constants;
public class SimulationView extends GUIState implements PropertyChangeListener{
private static final int FRAME_SIZE = 500;
private SimulationModel model;
private Display2D display;
private SparseGridPortrayal2D yard;
private JFrame mainWindow;
private SimpleColorMap colorMap = new SimpleColorMap(0,Constants.VEGETATION_MAX_WEIGHT_PER_CELL,new Color(240,227,181),new Color(78,214,30));
private StatsManager stats;
public SimulationView(SimulationModel model, StatsManager myManager) {
super(model);
this.model = model;
model.getPropertyChangeSupport().addPropertyChangeListener(this);
stats=myManager;
}
public void init(Controller c) {
super.init(c);
display = new Display2D(FRAME_SIZE, FRAME_SIZE, this);
display.setClipping(false);
mainWindow = display.createFrame();
mainWindow.setTitle("Simulation IA04");
c.registerFrame(mainWindow);
mainWindow.setVisible(true);
yard = new SparseGridPortrayal2D();
display.attach(yard, "Yard");
}
public SparseGridPortrayal2D getYard() {
return yard;
}
public void start() {
super.start();
setupPortrayals();
}
private void setupPortrayals() {
yard.setField(model.getYard());
RectanglePortrayal2D herbivoriousPortrayal = new RectanglePortrayal2D();
herbivoriousPortrayal.paint = Color.BLUE;
herbivoriousPortrayal.filled = true;
herbivoriousPortrayal.scale = 1;
yard.setPortrayalForClass(Herbivorious.class, herbivoriousPortrayal);
RectanglePortrayal2D carnivoriousPortrayal = new RectanglePortrayal2D();
carnivoriousPortrayal.paint = Color.RED;
carnivoriousPortrayal.filled = true;
carnivoriousPortrayal.scale = 1;
yard.setPortrayalForClass(Carnivorious.class, carnivoriousPortrayal);
display.reset();
display.setBackdrop(Color.WHITE);
display.repaint();
}
@SuppressWarnings({ "deprecation", "serial" })
@Override
public void propertyChange(PropertyChangeEvent arg0) {
if(arg0.getPropertyName().compareTo("grown")==0){
//System.err.println("grown received !");
Grass[][] grasses = (Grass[][]) arg0.getNewValue();
for(int i=0;i<model.getYard().getWidth();i++){
for(int j=0;j<model.getYard().getHeight();j++){
RectanglePortrayal2D r = new RectanglePortrayal2D();
r.paint=colorMap.getColor(model.getVegetationAt(i, j));
r.filled=true;
r.scale=1;
yard.setPortrayalForObject(grasses[i][j], r);
}
}
}else if(arg0.getPropertyName().compareTo("model_initialized")==0){
model.getVegetationManager().getPropertyChangeSupport().addPropertyChangeListener(this);
}else if(arg0.getPropertyName().compareTo("species_initialized")==0){
System.out.println("species_initialized propertychange received !");
scheduleImmediateRepeat(true, new Steppable()
{
int mySteps=0;;
@SuppressWarnings("static-access")
public void step(SimState state) {
double x = model.schedule.time();
// now add the data
if (x >= state.schedule.EPOCH && x < state.schedule.AFTER_SIMULATION) {
mySteps++;
mySteps=(int) (mySteps%model.getStepByDay());
if(mySteps==0) {
stats.updateCharts(model.StepToDay(x));
}
}
}
});
stats.createFrames(controller);
}
}
}