/******************************************************************************* * TurtleKit 3 - Agent Based and Artificial Life Simulation Platform * Copyright (C) 2011-2014 Fabien Michel * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package turtlekit.viewer; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Graphics; import java.awt.event.ActionEvent; import java.util.Map; import javax.swing.AbstractAction; import javax.swing.JFrame; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; import javax.swing.JToolBar; import madkit.simulation.probe.SingleAgentProbe; import turtlekit.agr.TKOrganization; import turtlekit.kernel.Patch; import turtlekit.kernel.TKEnvironment; import turtlekit.pheromone.Pheromone; import turtlekit.pheromone.PheromoneView; @GenericViewer public class PheromoneViewer extends TKDefaultViewer { private SingleAgentProbe<TKEnvironment, Map<String, Pheromone<Float>>> pheroProbe; private Pheromone<Float> selectedPheromone; private double max; private JToolBar tb; private PheromoneView defaultView; private int redCanal; private int blueCanal; private int greenCanal; @Override protected void activate() { super.activate(); setSynchronousPainting(false); } @Override protected void initProbes() { super.initProbes(); pheroProbe = new SingleAgentProbe<>( getCommunity(), TKOrganization.MODEL_GROUP, TKOrganization.ENVIRONMENT_ROLE, "pheromones"); addProbe(pheroProbe); } public Pheromone<Float> setSelectedPheromone(String name) { getFrame().setTitle("phero view on "+name); selectedPheromone = pheroProbe.getPropertyValue().get(name); if(selectedPheromone == null){ for(Pheromone<Float> p : pheroProbe.getPropertyValue().values()){ selectedPheromone = p; break;//TODO ugly } } if (selectedPheromone != null) { if (tb != null) { getFrame().remove(tb); } tb = new JToolBar(); defaultView = new PheromoneView(selectedPheromone); tb.add(defaultView); getFrame().add(tb, BorderLayout.PAGE_END); getFrame().validate(); getFrame().pack(); } return selectedPheromone; } @Override public void setupFrame(JFrame frame) { super.setupFrame(frame); JMenuBar menuB = frame.getJMenuBar(); JMenu menu = new JMenu("pheros"); for (final Pheromone<Float> p : pheroProbe.getPropertyValue().values()) { setSelectedPheromone(p.getName()); menu.add(new JMenuItem(new AbstractAction(p.getName()) { @Override public void actionPerformed(ActionEvent e) { setSelectedPheromone(p.getName()); } })); } menuB.add(menu); } @Override protected void render(Graphics g) { if (selectedPheromone != null) { max = Math.log10(selectedPheromone.getMaximum() + 1) / 256; if(max == 0) max = 1; redCanal = defaultView.getRed().getValue(); greenCanal = defaultView.getGreen().getValue(); blueCanal = defaultView.getBlue().getValue(); // timer.setText(selectedPheromone.toString()); } super.render(g); } @Override public void paintPatch(final Graphics g, final Patch p, final int x, final int y, final int index) { if (selectedPheromone != null) { final double value = selectedPheromone.get(index); if (value > 10) { int r = (int) (Math.log10(value + 1) / max); r += redCanal; if (r > 255) r = 255; g.setColor(new Color(r, greenCanal, blueCanal)); g.fillRect(x, y, cellSize, cellSize); } } else { super.paintPatch(g, p, x, y, index); } } public Pheromone<Float> getSelectedPheromone() { return selectedPheromone; } public void setSelectedPheromone(Pheromone<Float> selectedPheromone) { this.selectedPheromone = selectedPheromone; } // // public Pheromone selectPheromone(String name) { //// getFrame().setTitle("phero view "+name); // selectedPheromone = pheroProbe.getPropertyValue().get(name); // if(tb != null){ // getFrame().remove(tb); // } // tb = new JToolBar(); // tb.add(selectedPheromone.getDefaultView()); // getFrame().add(tb,BorderLayout.PAGE_END); // getFrame().validate(); // return selectedPheromone; // } // }