import java.awt.*; import java.applet.*; import java.awt.event.*; import java.util.*; public class AppletTest extends Applet{ public AppletTest() { setLayout(new BorderLayout()); add("Center",new TestCanvas("($$$$+$$$$$)/($$*$$$)")); setVisible(true); } } class TestCanvas extends Canvas implements KeyListener{ public static char DEFAULT_NUMBER = '$'; private Dimension preferredSize = new Dimension(300,200); private String theString; private StringBuffer sb; Vector tokens = new Vector(); Vector numbers = new Vector(); int[] numberPos; int numPos = 0; public TestCanvas() { this("$$$$$/$$$$$"); } public TestCanvas(String str) { setExpression(str); addKeyListener(this); } public void setExpression(String str) { theString = new String(str); StringTokenizer st = new StringTokenizer(str, "/*+-()", true); int counter = 0; while (st.hasMoreTokens()) { String s = st.nextToken(); if (s.startsWith("$")) { numbers.addElement(new Integer(counter)); tokens.addElement(new StringBuffer(s)); } else tokens.addElement(s); counter++; } for (int n = 0; n < tokens.size(); n++) { System.out.println(n+"-"+((Object)tokens.elementAt(n)).toString()); } numberPos = new int[numbers.size()+1]; int total = 0; for (int n = 0; n < numbers.size(); n++) { System.out.println(n+"-"+((Integer)numbers.elementAt(n)).intValue()); numberPos[n] = total; total += ((Object)tokens.elementAt(((Integer)numbers.elementAt(n)).intValue())).toString().length(); } numberPos[numberPos.length-1] = total; numPos = 0; for (int n = 0; n < numberPos.length; n++) System.out.println(n+"."+numberPos[n]); repaint(); } public void paint(Graphics g) { super.paint(g); FontMetrics fm = g.getFontMetrics(); int x = getWidth()- fm.stringWidth(theString)/2; int y = getHeight()/2+fm.getHeight()/2; sb = new StringBuffer(); for (int n=0; n < tokens.size(); n++) sb = sb.append(tokens.elementAt(n)); theString = sb.toString(); g.drawString(theString, 10, 10); } public void keyPressed(KeyEvent e) { char i = e.getKeyChar(); if (i == '\b') { // System.out.print("Back"); if (numPos > 0 ) { numPos--; int word = -1; for (int n = 0; n < numberPos.length; n++) { if (numPos < numberPos[n]) { word = n-1; break; } } if (word >= 0 && word < numberPos.length) { int relPos = numPos -numberPos[word]; StringBuffer buffer = (StringBuffer)tokens.elementAt(((Integer)numbers.elementAt(word)).intValue()); buffer.setCharAt(relPos, '$'); repaint(); } } } else if ((i >= 'A' && i <= 'Z') || (i >= 'a' && i <= 'z') || (i >= '0' && i <= '9')) { System.out.println(i); int word = -1; for (int n = 0; n < numberPos.length; n++) { if (numPos < numberPos[n]) { word = n-1; break; } } System.out.println("NumPos:"+numPos+"\nWord:"+word); if (word >= 0 && word < numberPos.length) { int relPos = numPos -numberPos[word]; StringBuffer buffer = (StringBuffer)tokens.elementAt(((Integer)numbers.elementAt(word)).intValue()); buffer.setCharAt(relPos, (char)i); numPos++; repaint(); } } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public Dimension getPreferredSize() { return preferredSize; } public Dimension getMinimumSize() { return getPreferredSize(); } public Dimension getMaximumSize() { return getPreferredSize(); } }