/*
HTML code for applet:
*/
package com.singularsys.jepexamples.applets;
import java.applet.Applet;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.List;
import java.awt.TextField;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.util.HashMap;
import java.util.Map;
import com.singularsys.jep.Jep;
import com.singularsys.jep.JepException;
import com.singularsys.jep.ParseException;
import com.singularsys.jep.Variable;
import com.singularsys.jep.parser.Node;
/**
* This applet is a demonstration of the possible applications of the Jep
* mathematical expression parser.
* The FunctionPlotter class arranges the text field and GraphCanvas classes
* and requests a repainting of the graph when the expression in the text
* field changes. All plotting (and interaction with the Jep API) is performed
* in GraphCanvas class.
*/
public class FunctionPlotter extends Applet implements ItemListener {
private static final long serialVersionUID = 330L;
/** The expression field */
TextField exprField;
/** List of equations */
List list = new List(20);
Map map = new HashMap();
/** The canvas for plotting the graph */
private FunctionCanvas graphCanvas;
protected Jep jep;
/**
* Initializes the applet FunctionPlotter
*/
@Override
public void init () {
try {
jep = initJep();
initComponents(jep);
} catch (JepException e) {
e.printStackTrace();
}
}
/**
* Initialize the jep instance
* @return the new instance
* @throws JepException
*/
protected Jep initJep() throws JepException {
Jep j = new Jep();
// Allow implicit multiplication
j.setImplicitMul(true);
return j;
}
/**
* Sets the layout of the applet window to BorderLayout, creates all
* the components and associates them with event listeners if necessary.
* @param j
* @throws JepException
*/
private void initComponents (Jep j) throws JepException {
setLayout(new BorderLayout());
setBackground (java.awt.Color.white);
// get the initial expression from the parameters
String expr = getParameter("initialExpression");
// set default expression if none specified
if (expr==null)
expr="x*sin(1/x)";
exprField = new java.awt.TextField(expr);
// adjust various settings for the expression field
exprField.setBackground (java.awt.Color.white);
exprField.setName ("exprField");
exprField.setFont (new java.awt.Font ("Dialog", 0, 14));
exprField.setForeground (java.awt.Color.black);
exprField.addTextListener (new java.awt.event.TextListener () {
public void textValueChanged (java.awt.event.TextEvent evt) {
String expr = exprField.getText();
exprFieldTextValueChanged(expr);
}
});
add ("South", exprField);
for(String[] eles:equations) {
if(map.containsKey(eles[0]))
System.out.println("Duplicate key: "+eles[0]);
else {
map.put(eles[0],eles[1]);
list.add(eles[0]);
}
}
list.addItemListener(this);
add("East",list);
// create the graph canvas and add it
graphCanvas = createGraphCanvas(j);
add ("Center", graphCanvas);
exprFieldTextValueChanged(expr);
}
String[][] equations = new String[][]{
{"Line","3 x-1"},
{"x","x"},
{"x^2","x^2"},
{"x^3","x^3"},
{"x^4","x^4"},
{"exp(x)","exp(x)"},
{"log(x)","log(x)"},
{"sin(x)","sin(x)"},
{"sin(1/x)","sin(1/x)"},
{"x sin(1/x)","x sin(1/x)"},
{"x^2 sin(1/x)","x^2 sin(1/x)"},
{"Sawtooth","x % 1 + if(x<0,1,0)"},
{"squarewave","if(x % 2 + if(x<0,2,0)>1,1,0)"},
};
public void itemStateChanged(ItemEvent e) {
int index = (Integer) e.getItem();
String key = list.getItem(index);
String val = map.get(key);
if(val==null) return;
System.out.println(key+"\t"+val);
exprField.setText(val);
exprFieldTextValueChanged(val);
}
protected FunctionCanvas createGraphCanvas(Jep j) throws JepException {
Variable x;
x = j.addVariable("x",0.0);
FunctionCanvas gc = new FunctionCanvas(j,x);
return gc;
}
/**
* Attempts to parse the expression.
*
* @param newString
* @return the node representing the expression or null on errors
*/
private Node parseExpression(String newString) {
// Parse the new expression
try {
Node node = jep.parse(newString);
return node;
} catch (ParseException e) {
return null;
}
}
/**
* Repaints the graphCanvas whenever the text in the expression field
* changes.
*/
void exprFieldTextValueChanged(String expr) {
Node node = parseExpression(expr);
if(node!=null)
exprField.setForeground(Color.black);
else
exprField.setForeground(Color.red);
graphCanvas.setExpression(node);
graphCanvas.repaint();
}
}