350 lines
12 KiB
Java
350 lines
12 KiB
Java
/*
|
|
* lilgpMonitor Utility for monitoring lilgp statistics files
|
|
* version 1.0
|
|
* 12-May-97
|
|
*
|
|
* Copyright (C) 1997 Michigan State University
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of version 2 of the GNU General
|
|
* Public License as published by the Free Software Foundation.
|
|
*
|
|
* 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, write to:
|
|
*
|
|
* Free Software Foundation, Inc.
|
|
* 59 Temple Place - Suite 330
|
|
* Boston, MA
|
|
* 02111-1307
|
|
* USA.
|
|
*
|
|
* Ryan Shoemaker shoema16@cps.msu.edu
|
|
* Dr. Bill Punch punch@cps.msu.edu
|
|
*
|
|
* Computer Science Department
|
|
* A-714 Wells Hall
|
|
* Michigan State University
|
|
* East Lansing, Michigan 48824
|
|
* USA
|
|
*
|
|
*/
|
|
|
|
import java.awt.*;
|
|
|
|
public class ControlPanel extends Panel {
|
|
|
|
String viewItems[] = {
|
|
"Gen Fitness - Mean", "Gen Fitness - Best", "Gen Fitness - Worst",
|
|
"Gen Tree Size - Mean", "Gen Tree Depth - Mean",
|
|
"Gen Tree Size - Best", "Gen Tree Depth - Best",
|
|
"Gen Tree Size - Worst", "Gen Tree Depth - Worst",
|
|
"Fitness - Mean", "Fitness - Best", "Fitness - Worst",
|
|
"Tree Size - Mean", "Tree Depth - Mean",
|
|
"Tree Size - Best", "Tree Depth - Best",
|
|
"Tree Size - Worst", "Tree Depth - Worst" };
|
|
|
|
CheckboxGroup theScalesGroup;
|
|
Checkbox[] theScales;
|
|
Choice metricOne, metricTwo;
|
|
List subpopOne, subpopTwo;
|
|
TextField redMaxBox, blueMaxBox;
|
|
|
|
lilgpMonitor theMonitor;
|
|
Graph theGraph;
|
|
|
|
GridBagConstraints constraints;
|
|
GridBagLayout layout;
|
|
|
|
int curSelOne, curSelTwo;
|
|
|
|
public ControlPanel(lilgpMonitor lm, Graph g) {
|
|
// our reference to the graph and the main class....
|
|
theMonitor = lm;
|
|
theGraph = g;
|
|
|
|
// build the scale selector
|
|
theScalesGroup = new CheckboxGroup();
|
|
theScales = new Checkbox[3];
|
|
theScales[0] = new Checkbox("Red", theScalesGroup, false);
|
|
theScales[1] = new Checkbox("Blue", theScalesGroup, false);
|
|
theScales[2] = new Checkbox("Independent", theScalesGroup, true);
|
|
redMaxBox = new TextField(3);
|
|
blueMaxBox = new TextField(3);
|
|
|
|
GroupPanel redPanel = new GroupPanel("Red Scale");
|
|
GroupPanel bluePanel = new GroupPanel("Blue Scale");
|
|
GroupPanel indPanel = new GroupPanel("Independent Scales");
|
|
Panel scalesPanel = new Panel();
|
|
|
|
redPanel.setLayout(new FlowLayout());
|
|
redPanel.add(theScales[0]);
|
|
redPanel.add(new Label("y-max"));
|
|
redPanel.add(redMaxBox);
|
|
|
|
bluePanel.setLayout(new FlowLayout());
|
|
bluePanel.add(theScales[1]);
|
|
bluePanel.add(new Label("y-max"));
|
|
bluePanel.add(blueMaxBox);
|
|
|
|
indPanel.setLayout(new FlowLayout());
|
|
indPanel.add(theScales[2]);
|
|
|
|
scalesPanel.setLayout(new FlowLayout());
|
|
scalesPanel.add(redPanel);
|
|
scalesPanel.add(indPanel);
|
|
scalesPanel.add(bluePanel);
|
|
|
|
// choose the first metric
|
|
metricOne = new Choice();
|
|
metricOne.addItem("None");
|
|
for(int i = 0; i < viewItems.length; i++) {
|
|
metricOne.addItem(viewItems[i]);
|
|
}
|
|
metricOne.select(1);
|
|
|
|
// choose the subpop for the first metric
|
|
subpopOne = new List(3, false);
|
|
subpopOne.addItem("* Overall");
|
|
subpopOne.select(0);
|
|
curSelOne = 0;
|
|
|
|
// choose the second metric
|
|
metricTwo = new Choice();
|
|
metricTwo.addItem("None");
|
|
for(int i = 0; i < viewItems.length; i++) {
|
|
metricTwo.addItem(viewItems[i]);
|
|
}
|
|
metricTwo.select(0);
|
|
curSelTwo = 0;
|
|
|
|
// choose the subpop for the second metric
|
|
subpopTwo = new List(3, false);
|
|
subpopTwo.addItem("* Overall");
|
|
subpopTwo.select(0);
|
|
|
|
// make the labels
|
|
Label l1 = new Label("Primary (red)", Label.RIGHT);
|
|
Label l2 = new Label("Secondary (blue)", Label.RIGHT);
|
|
Label l3 = new Label("Subpop", Label.RIGHT);
|
|
Label l4 = new Label("Subpop", Label.RIGHT);
|
|
Label l5 = new Label("double-click to select subpopulations");
|
|
|
|
// put it together
|
|
layout = new GridBagLayout();
|
|
setLayout(layout);
|
|
constraints = new GridBagConstraints();
|
|
|
|
addComponent(scalesPanel, 0, 0, 4, 1, 1, 1, GridBagConstraints.NONE, GridBagConstraints.CENTER);
|
|
addComponent(l1, 0, 1, 1, 1, 1, 1, GridBagConstraints.NONE, GridBagConstraints.EAST);
|
|
addComponent(metricOne, 1, 1, 1, 1, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER);
|
|
addComponent(l2, 2, 1, 1, 1, 1, 1, GridBagConstraints.NONE, GridBagConstraints.EAST);
|
|
addComponent(metricTwo, 3, 1, 1, 1, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER);
|
|
addComponent(l3, 0, 2, 1, 1, 1, 1, GridBagConstraints.NONE, GridBagConstraints.EAST);
|
|
addComponent(subpopOne, 1, 2, 1, 1, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER);
|
|
addComponent(l4, 2, 2, 1, 1, 1, 1, GridBagConstraints.NONE, GridBagConstraints.EAST);
|
|
addComponent(subpopTwo, 3, 2, 1, 1, 1, 1, GridBagConstraints.HORIZONTAL, GridBagConstraints.CENTER);
|
|
addComponent(l5, 0, 3, 4, 1, 1, 1, GridBagConstraints.NONE, GridBagConstraints.CENTER);
|
|
}
|
|
|
|
public void addComponent(Component component, int gx, int gy, int gw, int gh,
|
|
int wx, int wy, int fill, int anchor)
|
|
{
|
|
// fill in the constraints
|
|
constraints.gridx = gx;
|
|
constraints.gridy = gy;
|
|
constraints.gridwidth = gw;
|
|
constraints.gridheight = gh;
|
|
constraints.weightx = wx;
|
|
constraints.weighty = wy;
|
|
constraints.fill = fill;
|
|
constraints.anchor = anchor;
|
|
|
|
// give a 3 pixel margin on top & bottom of each component
|
|
constraints.insets = new Insets(3, 1, 3, 1);
|
|
|
|
// set the constraints and add the component
|
|
layout.setConstraints(component, constraints);
|
|
add(component);
|
|
}
|
|
|
|
public boolean action(Event e, Object arg) {
|
|
if ((e.target == metricOne) || (e.target == metricTwo)) {
|
|
updateGraph();
|
|
return true;
|
|
}
|
|
else if ((e.target == subpopOne) || (e.target == subpopTwo)) {
|
|
// Win95 won't catch the LIST_SELECT events, so the user
|
|
// has to double-click the item to generate a ACTION_EVENT.....
|
|
if (e.target == subpopOne) {
|
|
updateList(subpopOne, subpopOne.getSelectedIndex());
|
|
}
|
|
else if (e.target == subpopTwo) {
|
|
updateList(subpopTwo, subpopTwo.getSelectedIndex());
|
|
}
|
|
|
|
updateGraph();
|
|
return true;
|
|
}
|
|
else if ((e.target == theScales[0]) ||
|
|
(e.target == theScales[1]) ||
|
|
(e.target == theScales[2])) {
|
|
theGraph.updateScale(theScalesGroup.getCurrent().getLabel());
|
|
updateGraph();
|
|
return true;
|
|
}
|
|
else if (e.target == redMaxBox) {
|
|
/*
|
|
String contents = redMaxBox.getText().trim();
|
|
if (contents.length() == 0) {
|
|
theGraph.updateUserScale("RED", 0);
|
|
updateGraph();
|
|
}
|
|
else if (isPositiveDouble(contents)) {
|
|
theGraph.updateUserScale("RED", toDouble(contents));
|
|
updateGraph();
|
|
}
|
|
*/
|
|
updateGraph();
|
|
return true;
|
|
}
|
|
else if (e.target == blueMaxBox) {
|
|
/*
|
|
String contents = blueMaxBox.getText().trim();
|
|
if (contents.length() == 0) {
|
|
theGraph.updateUserScale("BLUE", 0);
|
|
updateGraph();
|
|
}
|
|
else if (isPositiveDouble(contents)) {
|
|
theGraph.updateUserScale("BLUE", toDouble(contents));
|
|
updateGraph();
|
|
}
|
|
*/
|
|
updateGraph();
|
|
return true;
|
|
}
|
|
else {
|
|
return super.action(e, arg);
|
|
}
|
|
}
|
|
|
|
public void addPop(String popLabel) {
|
|
subpopOne.addItem(popLabel);
|
|
subpopTwo.addItem(popLabel);
|
|
}
|
|
|
|
public void removePop(int popIndex) {
|
|
subpopOne.delItem(popIndex);
|
|
subpopTwo.delItem(popIndex);
|
|
}
|
|
|
|
|
|
public void updateGraph() {
|
|
// grab the current settings
|
|
int m_one = metricOne.getSelectedIndex();
|
|
int m_two = metricTwo.getSelectedIndex();
|
|
int p_one = subpopOne.getSelectedIndex();
|
|
int p_two = subpopTwo.getSelectedIndex();
|
|
|
|
if (subpopOne.countItems() >= curSelOne+1) {
|
|
p_one = curSelOne;
|
|
updateList(subpopOne, curSelOne);
|
|
}
|
|
else {
|
|
p_one = 0;
|
|
subpopOne.replaceItem("* Overall", 0);
|
|
subpopOne.select(0);
|
|
curSelOne = 0;
|
|
}
|
|
|
|
if (subpopTwo.countItems() >= curSelTwo+1) {
|
|
p_two = curSelTwo;
|
|
updateList(subpopTwo, curSelTwo);
|
|
}
|
|
else {
|
|
p_two = 0;
|
|
subpopTwo.replaceItem("* Overall", 0);
|
|
subpopTwo.select(0);
|
|
curSelTwo = 0;
|
|
}
|
|
|
|
theMonitor.updateGraphData(m_one, m_two, p_one, p_two);
|
|
|
|
String contents = redMaxBox.getText().trim();
|
|
if (contents.length() == 0) {
|
|
theGraph.updateUserScale("RED", 0);
|
|
//updateGraph();
|
|
}
|
|
else if (isPositiveDouble(contents)) {
|
|
theGraph.updateUserScale("RED", toDouble(contents));
|
|
//updateGraph();
|
|
}
|
|
|
|
contents = blueMaxBox.getText().trim();
|
|
if (contents.length() == 0) {
|
|
theGraph.updateUserScale("BLUE", 0);
|
|
//updateGraph();
|
|
}
|
|
else if (isPositiveDouble(contents)) {
|
|
theGraph.updateUserScale("BLUE", toDouble(contents));
|
|
//updateGraph();
|
|
}
|
|
}
|
|
|
|
public void updateList(List l, int index) {
|
|
if (l == subpopOne) {
|
|
if ((curSelOne == 0) && (index != 0)) {
|
|
l.replaceItem(" Overall", 0);
|
|
l.replaceItem(new String("* pop " + index), index);
|
|
}
|
|
else if ((curSelOne != 0) && (index != 0)) {
|
|
l.replaceItem(new String(" pop " + curSelOne), curSelOne);
|
|
l.replaceItem(new String("* pop " + index), index);
|
|
}
|
|
else if ((curSelOne != 0) && (index == 0)) {
|
|
l.replaceItem(new String(" pop " + curSelOne), curSelOne);
|
|
l.replaceItem("* Overall", 0);
|
|
}
|
|
|
|
l.select(index);
|
|
curSelOne = index;
|
|
}
|
|
else if (l == subpopTwo) {
|
|
if ((curSelTwo == 0) && (index != 0)) {
|
|
l.replaceItem(" Overall", 0);
|
|
l.replaceItem(new String("* pop " + index), index);
|
|
}
|
|
else if ((curSelTwo != 0) && (index != 0)) {
|
|
l.replaceItem(new String(" pop " + curSelTwo), curSelTwo);
|
|
l.replaceItem(new String("* pop " + index), index);
|
|
}
|
|
else if ((curSelTwo != 0) && (index == 0)) {
|
|
l.replaceItem(new String(" pop " + curSelTwo), curSelTwo);
|
|
l.replaceItem("* Overall", 0);
|
|
}
|
|
|
|
l.select(index);
|
|
curSelTwo = index;
|
|
}
|
|
}
|
|
|
|
private double toDouble(String s) {
|
|
return Double.valueOf(s).doubleValue();
|
|
}
|
|
|
|
private boolean isPositiveDouble(String s) {
|
|
try {
|
|
Double.valueOf(s);
|
|
}
|
|
catch (NumberFormatException e) {
|
|
System.err.println("the y-max value must be a positive double");
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
} |