COSC-4P82-Final-Project/lib/lilgp/lilgpMonitor/src/ControlPanel.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;
}
}