package sample; import static rescuecore2.misc.java.JavaTools.instantiate; import rescuecore2.messages.control.KVTimestep; import rescuecore2.view.ViewComponent; import rescuecore2.view.ViewListener; import rescuecore2.view.RenderedObject; import rescuecore2.score.ScoreFunction; import rescuecore2.Constants; import rescuecore2.Timestep; import rescuecore2.standard.view.AnimatedWorldModelViewer; import java.awt.Dimension; import java.awt.BorderLayout; import java.awt.GridLayout; import java.awt.Color; import java.awt.Font; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.SwingUtilities; import java.util.List; import java.text.NumberFormat; import rescuecore2.standard.components.StandardViewer; /** A simple viewer. */ public class SampleViewer extends StandardViewer { private static final int DEFAULT_FONT_SIZE = 20; private static final int PRECISION = 3; private static final String FONT_SIZE_KEY = "viewer.font-size"; private static final String MAXIMISE_KEY = "viewer.maximise"; private static final String TEAM_NAME_KEY = "viewer.team-name"; private ScoreFunction scoreFunction; private ViewComponent viewer; private JLabel timeLabel; private JLabel scoreLabel; private JLabel teamLabel; private NumberFormat format; @Override protected void postConnect() { super.postConnect(); int fontSize = config.getIntValue(FONT_SIZE_KEY, DEFAULT_FONT_SIZE); String teamName = config.getValue(TEAM_NAME_KEY, ""); scoreFunction = makeScoreFunction(); format = NumberFormat.getInstance(); format.setMaximumFractionDigits(PRECISION); JFrame frame = new JFrame("Viewer " + getViewerID() + " (" + model.getAllEntities().size() + " entities)"); viewer = new AnimatedWorldModelViewer(); viewer.initialise(config); viewer.view(model); // CHECKSTYLE:OFF:MagicNumber viewer.setPreferredSize(new Dimension(500, 500)); // CHECKSTYLE:ON:MagicNumber timeLabel = new JLabel("Time: Not started", JLabel.CENTER); teamLabel = new JLabel(teamName, JLabel.LEFT); scoreLabel = new JLabel("Score: Unknown", JLabel.RIGHT); timeLabel.setBackground(Color.WHITE); timeLabel.setOpaque(true); timeLabel.setFont(timeLabel.getFont().deriveFont(Font.PLAIN, fontSize)); teamLabel.setBackground(Color.WHITE); teamLabel.setOpaque(true); teamLabel.setFont(timeLabel.getFont().deriveFont(Font.PLAIN, fontSize)); scoreLabel.setBackground(Color.WHITE); scoreLabel.setOpaque(true); scoreLabel.setFont(timeLabel.getFont().deriveFont(Font.PLAIN, fontSize)); frame.add(viewer, BorderLayout.CENTER); // CHECKSTYLE:OFF:MagicNumber JPanel labels = new JPanel(new GridLayout(1, 3)); // CHECKSTYLE:ON:MagicNumber labels.add(teamLabel); labels.add(timeLabel); labels.add(scoreLabel); frame.add(labels, BorderLayout.NORTH); frame.pack(); if (config.getBooleanValue(MAXIMISE_KEY, false)) { frame.setExtendedState(JFrame.MAXIMIZED_BOTH); } frame.setVisible(true); viewer.addViewListener(new ViewListener() { @Override public void objectsClicked(ViewComponent view, List<RenderedObject> objects) { for (RenderedObject next : objects) { System.out.println(next.getObject()); } } @Override public void objectsRollover(ViewComponent view, List<RenderedObject> objects) { } }); } @Override protected void handleTimestep(final KVTimestep t) { super.handleTimestep(t); SwingUtilities.invokeLater(new Runnable() { public void run() { timeLabel.setText("Time: " + t.getTime()); scoreLabel.setText("Score: " + format.format(scoreFunction.score(model, new Timestep(t.getTime())))); viewer.view(model, t.getCommands()); viewer.repaint(); } }); } @Override public String toString() { return "Sample viewer"; } private ScoreFunction makeScoreFunction() { String className = config.getValue(Constants.SCORE_FUNCTION_KEY); ScoreFunction result = instantiate(className, ScoreFunction.class); result.initialise(model, config); return result; } }