/*
* JABM - Java Agent-Based Modeling Toolkit
* Copyright (C) 2013 Steve Phelps
*
* 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.
*/
package net.sourceforge.jabm.view;
import java.text.DecimalFormat;
import java.util.LinkedList;
import java.util.Map;
import javax.swing.JComponent;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import net.sourceforge.jabm.event.SimEvent;
import net.sourceforge.jabm.report.ReportVariables;
import net.sourceforge.jabm.report.ReportWithGUI;
import org.springframework.beans.factory.InitializingBean;
/**
* JFrameReportVariables automatically record other ReportVariables to a
* swing JTable on a window whenever they are computed.
*
* @author Steve Phelps
*
*/
public class JFrameReportVariables
implements ReportWithGUI, ReportVariables, TableModel, InitializingBean {
protected LinkedList<TableModelListener> listeners
= new LinkedList<TableModelListener>();
/**
* This report collects the data that we will write.
*/
protected ReportVariables reportVariables;
protected JTable table;
Map<Object, Number> variableBindings;
DecimalFormat format
= new DecimalFormat("#00000.00");
public JFrameReportVariables() {
super();
}
@Override
public void afterPropertiesSet() throws Exception {
table = new JTable(this);
// this.setModel(this);
// this.setPreferredSize(new Dimension(400, 200));
}
@Override
public void compute(SimEvent event) {
this.variableBindings = getVariableBindings();
// reportVariables.compute(event);
notifyTableChanged();
}
@Override
public Map<Object, Number> getVariableBindings() {
return reportVariables.getVariableBindings();
}
@Override
public void eventOccurred(SimEvent event) {
// reportVariables.eventOccurred(event);
}
@Override
public void dispose(SimEvent event) {
// reportVariables.dispose(event);
}
@Override
public void initialise(SimEvent event) {
// reportVariables.initialise(event);
}
public ReportVariables getReportVariables() {
return reportVariables;
}
public void setReportVariables(ReportVariables reportVariables) {
this.reportVariables = reportVariables;
}
public DecimalFormat getFormat() {
return format;
}
public void setFormat(DecimalFormat format) {
this.format = format;
}
@Override
public int getRowCount() {
if (variableBindings == null) {
return 0;
} else {
return this.variableBindings.size();
}
}
@Override
public int getColumnCount() {
return 2;
}
@Override
public String getColumnName(int columnIndex) {
if (columnIndex == 0) {
return "variable";
} else {
return "value";
}
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return String.class;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return false;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
LinkedList<Object> variables = new LinkedList<Object>();
variables.addAll(variableBindings.keySet());
Object variable = variables.get(rowIndex);
if (columnIndex == 0) {
return variable.toString();
} else {
return format.format(variableBindings.get(variable).doubleValue());
}
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
}
@Override
public void addTableModelListener(TableModelListener l) {
listeners.add(l);
}
@Override
public void removeTableModelListener(TableModelListener l) {
listeners.remove(l);
}
public void notifyTableChanged() {
for(TableModelListener l : listeners) {
l.tableChanged(new TableModelEvent(this));
}
}
public String getName() {
return getClass().getName() + "." + reportVariables.getName();
}
@Override
public JComponent getComponent() {
return table;
}
}