package manager;
import agent.Agent;
import environment.Cell;
import environment.World;
import gui.GUIWorld;
import gui.MainJFrame;
import gui.WorldsContainerJPanel;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.Observable;
import java.util.Observer;
import constants.EventConstants;
import constants.GUIConstants;
import gui.CommandJPanel;
import java.util.List;
import parameters.UserGuiParams;
/**
*
* @author Marco Celesti
*/
public class GUIController extends Observable implements Observer, PropertyChangeListener {
protected MainJFrame mainJFrame;
private WorldsContainerJPanel worldsContainer;
private CommandJPanel commandJPanel;
private List<GUIWorldController> controllers = new ArrayList<GUIWorldController>();
public GUIController(int nWorlds) {
mainJFrame = new MainJFrame();
worldsContainer = new WorldsContainerJPanel();
worldsContainer.addPropertyChangeListener(this);
commandJPanel = new CommandJPanel();
commandJPanel.addPropertyChangeListener(this);
for (int i = 0; i < nWorlds; i++) {
GUIWorldController controller = new GUIWorldController();
controller.addObserver(this);
controllers.add(controller);
}
}
public void addWorld(World world) {
GUIWorld guiWorld = controllers.get(world.getId()).createGUIWorld(world);
worldsContainer.addWorld(guiWorld);
guiWorld.repaint();
}
public void pack() {
if (UserGuiParams.GUI) {
mainJFrame.setWorldsContainer(worldsContainer);
if (UserGuiParams.COMMAND_PANEL) {
mainJFrame.setCommandContainer(commandJPanel);
}
mainJFrame.setVisible(true);
}
}
public void createAgent(Agent agent) {
int idWorld = agent.getWorld().getId();
controllers.get(idWorld).updateGUIAgent(agent);
}
public void update(Observable o, Object arg) {
String event = (String) arg;
if (event.equals(EventConstants.AGENT_EVENT)) {
Agent agent = (Agent) o;
int idWorld = agent.getWorld().getId();
if (!agent.isAlive()) {
killGuiAgent(agent);
} else {
controllers.get(idWorld).updateGUIAgent(agent);
}
} else if (event.equals(EventConstants.CELL_EVENT)) {
World world = (World) o;
int idWorld = world.getId();
Cell cell = world.getChangedCell();
controllers.get(idWorld).updateGUICell(cell);
}
}
public void propertyChange(PropertyChangeEvent evt) {
if (evt.getPropertyName().equals(GUIConstants.PHOTO)) {
setChanged();
notifyObservers(GUIConstants.PHOTO);
}
}
private void killGuiAgent(Agent agent) {
controllers.get(agent.getWorld().getId()).killGUIAgent(agent);
}
public void resetGrid(World world) {
controllers.get(world.getId()).resetGUIGrid(world);
}
public void writeInfo(String info) {
commandJPanel.writeInfo(info);
}
}