package iamrescue.belief.gui;
import iamrescue.agent.firebrigade.FastFirePredictor;
import iamrescue.agent.firebrigade.FirePredictor;
import iamrescue.belief.IAMWorldModel;
import iamrescue.routing.IRoutingModule;
import iamrescue.routing.gui.BuildingImportanceLayer;
import iamrescue.routing.gui.RoutingGraphLayer;
import iamrescue.routing.gui.SearchLayer;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextField;
import rescuecore2.GUIComponent;
import rescuecore2.config.Config;
import rescuecore2.view.EntityInspector;
import rescuecore2.view.RenderedObject;
import rescuecore2.view.ViewComponent;
import rescuecore2.view.ViewListener;
import rescuecore2.worldmodel.Entity;
import rescuecore2.worldmodel.EntityID;
import rescuecore2.worldmodel.WorldModel;
/**
* A KernelGUIComponent that will view a standard world model.
*/
public class IAMWorldModelViewerComponent implements GUIComponent {
private static final int SIZE = 500;
private IAMWorldModelViewer viewer;
private EntityInspector inspector;
private JTextField field;
private JComponent view;
private WorldModel<? extends Entity> world;
private RoutingGraphLayer routingGraphLayer;
private SearchLayer searchLayer;
private FirePredictor firePredictor;
private BuildingImportanceLayer fireLayer;
/**
* Construct a StandardWorldModelViewerComponent.
*/
public IAMWorldModelViewerComponent() {
viewer = new IAMWorldModelViewer();
inspector = new EntityInspector();
field = new JTextField();
viewer.setPreferredSize(new Dimension(SIZE, SIZE));
viewer.addViewListener(new ViewListener() {
@Override
public void objectsClicked(ViewComponent v,
List<RenderedObject> objects) {
for (RenderedObject next : objects) {
if (next.getObject() instanceof Entity) {
inspector.inspect((Entity) next.getObject());
field.setText("");
return;
}
}
}
@Override
public void objectsRollover(ViewComponent v,
List<RenderedObject> objects) {
}
});
field.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
String s = field.getText();
try {
int id = Integer.parseInt(s);
EntityID eid = new EntityID(id);
Entity e = world.getEntity(eid);
inspector.inspect(e);
} catch (NumberFormatException e) {
field.setText("");
}
}
});
JSplitPane split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, viewer,
new JScrollPane(inspector));
view = new JPanel(new BorderLayout());
view.add(split, BorderLayout.CENTER);
view.add(field, BorderLayout.NORTH);
}
public void showRoutingLayer() {
routingGraphLayer.setVisible(true);
}
public void showFireLayer(FastFirePredictor firePredictor) {
if (fireLayer == null) {
fireLayer = new BuildingImportanceLayer(firePredictor);
viewer.addLayer(fireLayer);
fireLayer.setVisible(true);
viewer.repaint();
}
}
public void simulationStarted(Config config, IAMWorldModel worldModel,
IRoutingModule routing) {
viewer.initialise(config);
world = worldModel;
routingGraphLayer = new RoutingGraphLayer(routing);
viewer.addLayer(routingGraphLayer);
searchLayer = new SearchLayer((IAMWorldModel) world);
viewer.addLayer(searchLayer);
routingGraphLayer.setVisible(false);
searchLayer.setVisible(false);
viewer.view(world);
viewer.repaint();
}
public void timestepCompleted(IAMWorldModel worldModel) {
viewer.view(worldModel);
viewer.repaint();
}
@Override
public JComponent getGUIComponent() {
return view;
}
@Override
public String getGUIComponentName() {
return "World view";
}
/**
*
*/
public void showSearchLayer() {
searchLayer.setVisible(true);
}
}