/* ControlPanel class */
import java.awt.*;
import java.applet.*;
import java.io.*;
import java.net.*;
import java.util.*;
/**
* This class extends the java.awt.Panel
class to form
* a panel which holds the buttons/choices/labels that control
* the animation of the algorithm.
*
* @see Panel
*/
public class ControlPanel extends Panel {
private AlgAnimFrame frame;
private Button runButton;
private Button stopButton;
private Button stepButton, skipButton;
private Font font;
/**
* Creates a panel to hold the control buttons of the animation
* tool.
* @param frame The parent window frame that contains this panel
* @param algname The algorithm name parsed from the applet parameter
*/
public ControlPanel(AlgAnimFrame frame, String algname) {
setBackground( Color.lightGray );
setLayout( new FlowLayout(FlowLayout.LEFT) );
this.frame = frame;
stopButton = new Button(" ") {
public void paint(Graphics g) {
Dimension d = size();
if (isEnabled())
g.setColor(Color.black);
else
g.setColor(Color.gray);
g.fillRect(d.width/3, 6, d.width/3, d.height - 12);
g.setColor(Color.gray);
g.drawRect(d.width/3, 6, d.width/3, d.height - 12);
}
};
stopButton.disable();
this.add(stopButton);
runButton = new Button(" ") {
public void paint(Graphics g) {
Dimension d = size();
int[] xPts = new int[3], yPts = new int[3];
xPts[0] = xPts[1] = d.width/3;
xPts[2] = 2*d.width/3;
yPts[0] = 5; yPts[1] = d.height - 5;
yPts[2] = d.height/2;
if (isEnabled())
g.setColor(Color.black);
else
g.setColor(Color.gray);
g.fillPolygon(xPts, yPts, 3);
g.setColor(Color.gray);
g.drawPolygon(xPts, yPts, 3);
}
};
this.add(runButton);
stepButton = new Button(" ") {
public void paint(Graphics g) {
Dimension d = size();
int[] xPts = new int[3], yPts = new int[3];
xPts[0] = xPts[1] = d.width/3 + 1;
xPts[2] = 2*d.width/3 + 1;
yPts[0] = 5; yPts[1] = d.height - 5;
yPts[2] = d.height/2;
if (isEnabled())
g.setColor(Color.black);
else
g.setColor(Color.gray);
g.fillPolygon(xPts, yPts, 3);
g.fillRect(d.width/3 - 2, 5, 2, d.height - 9);
g.setColor(Color.gray);
g.drawPolygon(xPts, yPts, 3);
}
};
this.add(stepButton);
skipButton = new Button(" ") {
public void paint(Graphics g) {
Dimension d = size();
int[] xPts = new int[3], yPts = new int[3];
xPts[0] = xPts[1] = d.width/4;
xPts[2] = d.width/2;
yPts[0] = 5; yPts[1] = d.height - 5;
yPts[2] = d.height/2;
if (isEnabled())
g.setColor(Color.black);
else
g.setColor(Color.gray);
g.fillPolygon(xPts, yPts, 3);
g.setColor(Color.gray);
g.drawPolygon(xPts, yPts, 3);
xPts[0] = xPts[1] = d.width/2;
xPts[2] = 3*d.width/4;
yPts[0] = 5; yPts[1] = d.height - 5;
yPts[2] = d.height/2;
if (isEnabled())
g.setColor(Color.black);
else
g.setColor(Color.gray);
g.fillPolygon(xPts, yPts, 3);
g.setColor(Color.gray);
g.drawPolygon(xPts, yPts, 3);
}
};
this.add(skipButton);
} // ControlPanel()
/**
* Action handler for the buttons and choice buttons in the control
* panel.
* @param e Event invoked
* @param arg Object that invokes the event
*/
public boolean action(Event e, Object arg) {
Object target = e.target;
if (target == runButton) {
skipButton.enable();
frame.setSkip(false);
frame.setText(0, "Running algorithm continuously...");
frame.startAlg();
skipButton.disable();
return true;
} else if (target == stopButton) {
frame.setText(0, "Stop button pressed...");
frame.setStep(false);
if (frame.getAlg().isAlive())
frame.getAlg().stop();
frame.finishAlg();
skipButton.enable();
return true;
} else if (target == stepButton) {
frame.setText(0, "Executing next step...");
frame.setSkip(false);
skipButton.enable();
frame.setStep(true);
if (!frame.getAlg().isAlive())
frame.startAlg();
// else
//frame.getAlg().resume();
return true;
} else if (target == skipButton) {
frame.startAlg();
frame.setText(0, "Skipping to the next phase...");
frame.setSkip(true);
skipButton.disable();
return true;
}
return false;
} // action()
/**
* @return Run button to initiate the animation of the algorithm.
*/
public Button getRunButton() {
return runButton;
}
/**
* @return Stop button to terminate the execution of algorithm.
*/
public Button getStopButton() {
return stopButton;
}
/**
* @return Step button to trace through the execution of the algorithm.
* If the Run
button has already been pressed, the
* execution mode will be switched from RUN
to
* STEP
.
*/
public Button getStepButton() {
return stepButton;
}
/**
* @return Skip button to bypass the animation of the algorithm.
*/
public Button getSkipButton() {
return skipButton;
}
} // class ControlPanel