import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.lang.Math.*;
public class calculate extends Applet implements ActionListener,
ItemListener,
KeyListener {
AudioClip gong[];
AudioClip StartAudio,ZeroAudio,BackAudio,ModeChangeAudio,ACAudio;
Label InputLabel = null;
Label MemoryLabel = null;
Checkbox TwoCheckbox;
Checkbox EightCheckbox;
Checkbox TenCheckbox;
Checkbox TenSixCheckbox;
String NumberButtonName[] = {" 0 "," 1 "," 2 "," 3 "," 4 ",
" 5 "," 6 "," 7 "," 8 "," 9 ",
" A "," B "," C "," D "," E ",
" F "};
Button NumberButton[] = new Button[16];
Button PointButton;
int xy[][] = { {3,4},{3,3},{6,3},{9,3},{3,2},{6,2},{9,2},{3,1},
{6,1},{9,1},{0,5},{3,5},{6,5},{9,5},{12,5},{15,5}};
public void init() {
super.init();
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
setFont(new Font("DialogInput",Font.PLAIN,20));
addKeyListener(this);
Panel TextPanel = new Panel();
TextPanel.setBackground(Color.green);
TextPanel.setLayout(new GridBagLayout());
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 0; gbc.gridy = 0;
gbc.ipadx = 200; gbc.ipady = 50;
add(TextPanel,gbc);
TextPanel.addKeyListener(this);
InputLabel = new Label();
InputLabel.setBackground(Color.white);
InputLabel.setAlignment(Label.RIGHT);
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 20; gbc.gridy = 10;
gbc.ipadx = 300; gbc.ipady = 10;
InputLabel.setText("0");
TextPanel.add(InputLabel,gbc);
InputLabel.addKeyListener(this);
MemoryLabel = new Label("");
MemoryLabel.setBackground(Color.white);
MemoryLabel.setAlignment(Label.CENTER);
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = 10; gbc.gridy = 10;
gbc.ipadx = 10; gbc.ipady = 10;
TextPanel.add(MemoryLabel,gbc);
MemoryLabel.addKeyListener(this);
Panel WholePanel = new Panel();
WholePanel.setBackground(Color.blue);
WholePanel.setLayout(new GridBagLayout());
gbc.gridx = 0; gbc.gridy = 1;
gbc.ipadx = 200; gbc.ipady = 100;
gbc.fill = GridBagConstraints.BOTH;
add(WholePanel,gbc);
WholePanel.addKeyListener(this);
gbc.gridwidth = 3; gbc.gridheight = 1;
gbc.ipadx = 7; gbc.ipady = 5;
gbc.fill = GridBagConstraints.BOTH;
CheckboxGroup cbg = new CheckboxGroup();
gbc.gridx = 0; gbc.gridy = 0;
TenSixCheckbox = new Checkbox("16", cbg, true);
WholePanel.add(TenSixCheckbox,gbc);
TenSixCheckbox.addItemListener(this);
TenSixCheckbox.setForeground(Color.yellow);
gbc.gridx = 3; gbc.gridy = 0;
TenCheckbox = new Checkbox("10", cbg, true);
WholePanel.add(TenCheckbox,gbc);
TenCheckbox.addItemListener(this);
TenCheckbox.setForeground(Color.yellow);
gbc.gridx = 6; gbc.gridy = 0;
TwoCheckbox = new Checkbox("2", cbg, false);
WholePanel.add(TwoCheckbox,gbc);
TwoCheckbox.addItemListener(this);
TwoCheckbox.setForeground(Color.yellow);
gbc.gridx = 9; gbc.gridy = 0;
EightCheckbox = new Checkbox("8", cbg, false);
WholePanel.add(EightCheckbox,gbc);
EightCheckbox.addItemListener(this);
EightCheckbox.setForeground(Color.yellow);
Button BackButton = new Button(" <-");
BackButton.addActionListener(this);
gbc.gridx = 12; gbc.gridy = 0;
WholePanel.add(BackButton,gbc);
Button ClearAllButton = new Button(" AC");
ClearAllButton.addActionListener(this);
gbc.gridx = 15;
WholePanel.add(ClearAllButton,gbc);
Button MRButton = new Button(" MR");
MRButton.addActionListener(this);
gbc.gridx = 0; gbc.gridy = 1;
WholePanel.add(MRButton,gbc);
gong = new AudioClip[16];
for(int i=0;i<16;i++) {
NumberButton[i] = new Button(NumberButtonName[i]);
NumberButton[i].addActionListener(this);
NumberButton[i].setEnabled(i<10);
gbc.gridx = xy[i][0]; gbc.gridy = xy[i][1];
WholePanel.add(NumberButton[i],gbc);
gong[i] = getAudioClip(getDocumentBase(),new Integer(i).toString()+".au");
}
Button DivideButton = new Button(" / ");
DivideButton.addActionListener(this);
gbc.gridx = 12; gbc.gridy = 1;
WholePanel.add(DivideButton,gbc);
Button ClearButton = new Button("_C_");
ClearButton.addActionListener(this);
gbc.gridx = 15; gbc.gridy = 1;
WholePanel.add(ClearButton,gbc);
Button MCButton = new Button(" MC");
MCButton.addActionListener(this);
gbc.gridx = 0; gbc.gridy = 2;
WholePanel.add(MCButton,gbc);
Button MutipleButton = new Button(" x ");
MutipleButton.addActionListener(this);
gbc.gridx = 12; gbc.gridy = 2;
WholePanel.add(MutipleButton,gbc);
Button SqrtButton = new Button("Sqr");
SqrtButton.addActionListener(this);
gbc.gridx = 15; gbc.gridy = 2;
WholePanel.add(SqrtButton,gbc);
Button MMinusButton = new Button(" M-");
MMinusButton.addActionListener(this);
gbc.gridx = 0; gbc.gridy = 3;
WholePanel.add(MMinusButton,gbc);
Button MinusButton = new Button(" - ");
MinusButton.addActionListener(this);
gbc.gridx = 12; gbc.gridy = 3;
WholePanel.add(MinusButton,gbc);
Button ReverseButton = new Button("1/x");
ReverseButton.addActionListener(this);
gbc.gridx = 15; gbc.gridy = 3;
WholePanel.add(ReverseButton,gbc);
Button MPlusButton = new Button(" M+");
MPlusButton.addActionListener(this);
gbc.gridx = 0; gbc.gridy = 4;
WholePanel.add(MPlusButton,gbc);
Button SignButton = new Button("+/-");
SignButton.addActionListener(this);
gbc.gridx = 6; gbc.gridy = 4;
WholePanel.add(SignButton,gbc);
PointButton = new Button(" . ");
PointButton.addActionListener(this);
gbc.gridx = 9; gbc.gridy = 4;
WholePanel.add(PointButton,gbc);
Button AddButton = new Button(" + ");
AddButton.addActionListener(this);
gbc.gridx = 12; gbc.gridy = 4;
WholePanel.add(AddButton,gbc);
Button EqualButton = new Button(" = ");
EqualButton.addActionListener(this);
gbc.gridx = 15; gbc.gridy = 4;
WholePanel.add(EqualButton,gbc);
for(int i=0;i<WholePanel.getComponentCount();i++) {
WholePanel.getComponents()[i].addKeyListener(this);
}
StartAudio = getAudioClip(getDocumentBase(), "gong.au");
StartAudio.play();
ZeroAudio = getAudioClip(getDocumentBase(), "adapt-or-die.au");
BackAudio = getAudioClip(getDocumentBase(), "ip.au");
ModeChangeAudio = getAudioClip(getDocumentBase(), "drip.au");
ACAudio = getAudioClip(getDocumentBase(), "return.au");
}
public void actionPerformed(ActionEvent e) {
for(int i=1;i<16;i++) {
if(e.getActionCommand().equals(NumberButtonName[i])) {
gong[i].play();
if(Mode==0) {
if( !(currentValue.length()==1 &&
currentValue.equals(NumberButtonName[0].trim())) &&
!(currentValue.length()==2 &&
currentValue.charAt(0)=='-'&¤tValue.charAt(1)=='0') )
currentValue += NumberButtonName[i].trim();
} else if(Mode==1||Mode==2||Mode==3||currentValue.trim().equals("0")) {
Mode = 0;
currentValue = NumberButtonName[i].trim();
}
break;
}
}
if(e.getActionCommand().equals(NumberButtonName[0])) {
gong[0].play();
if(Mode==0) {
if(!(currentValue.length()==1 &&
currentValue.equals(NumberButtonName[0].trim())) &&
!(currentValue.length()==2 && currentValue.charAt(0)=='-'
&& currentValue.charAt(1)=='0') )
currentValue += NumberButtonName[0].trim();
} else if(Mode==1||Mode==2||Mode==3||currentValue.trim().equals("0")) {
currentValue = "0";
Mode = 0;
}
} else if(e.getActionCommand().equals(" . ")) {
if( (Mode==0||currentValue.equals("")||currentValue.equals("0")) && Base==10) {
if(currentValue.indexOf(".")==-1) {
currentValue += ".";
Mode = 0;
}
} else if(Mode==2||Mode==3) {
currentValue = ".";
Mode = 0;
}
} else if(e.getActionCommand().equals("_C_")) {
currentValue = "";
} else if(e.getActionCommand().equals(" / ")) {
if(Mode==0||Mode==2) {
allValue = MyCount(allValue,currentValue,Sign,Base);
Sign = 4; Mode = 3;
currentValue = allValue;
} else if(Mode==3)
Sign = 4;
} else if(e.getActionCommand().equals(" x ")) {
if(Mode==0||Mode==2) {
allValue = MyCount(allValue,currentValue,Sign,Base);
Sign = 3; Mode = 3;
currentValue = allValue;
} else if(Mode==3)
Sign = 3;
} else if(e.getActionCommand().equals(" - ")) {
if(Mode==0||Mode==2) {
allValue = MyCount(allValue,currentValue,Sign,Base);
Sign = 2; Mode = 3;
currentValue = allValue;
} else if(Mode==3)
Sign = 2;
} else if(e.getActionCommand().equals(" + ")) {
if(Mode==0||Mode==2) {
allValue = MyCount(allValue,currentValue,Sign,Base);
Sign = 1; Mode = 3;
currentValue = allValue;
} else if(Mode==3)
Sign = 1;
} else if(e.getActionCommand().equals(" M+")) {
MemoryNumber += Double.valueOf(currentValue).doubleValue();
} else if(e.getActionCommand().equals(" M-")) {
MemoryNumber -= Double.valueOf(currentValue).doubleValue();
} else if(e.getActionCommand().equals(" MC")) {
MemoryNumber = 0;
} else if(e.getActionCommand().equals(" MR")) {
currentValue = Double.toString(MemoryNumber);
Mode = 2;
} else if(e.getActionCommand().equals("+/-")) {
if(currentValue.length()!=0) {
if(currentValue.charAt(0)=='-')
currentValue = currentValue.substring(1);
else
currentValue = "-" + currentValue;
}
} else if(e.getActionCommand().equals(" AC")) {
ACAudio.play();
allValue = "";
currentValue = "";
Sign = 0;
Mode = 1;
} else if(e.getActionCommand().equals("1/x")) {
temp = Double.valueOf(currentValue).doubleValue();
if(temp!=0)
temp = 1 / temp;
currentValue = Double.toString(temp);
Mode = 2;
} else if(e.getActionCommand().equals("Sqr")) {
temp = Double.valueOf(currentValue).doubleValue();
temp = Math.sqrt(temp);
currentValue = Double.toString(temp);
Mode = 2;
} else if(e.getActionCommand().equals(" <-")) {
BackAudio.play();
if(currentValue.length()>0) {
currentValue = currentValue.substring(0,currentValue.length()-1);
if(currentValue.equals("0")||
currentValue.equals("-0")||
currentValue.equals(""))
Mode = 2;
}
} else if(e.getActionCommand().equals(" = ")) {
if(Sign!=0) {
allValue = MyCount(allValue,currentValue,Sign,Base);
currentValue = allValue;
Sign = 0;
Mode = 2;
} else {
ZeroAudio.play();
}
}
if(Math.abs(MemoryNumber)<0.000000000001)
MemoryLabel.setText("");
else
MemoryLabel.setText(" M ");
if(Base!=10) {
int use = currentValue.indexOf((int)'.');
if(use==-1) use = currentValue.length();
String test = currentValue.substring(0,use);
if(Base==10)
currentValue = Integer.toString(Compute(test,Base));
else if(Base==8)
currentValue = Integer.toOctalString(Compute(test,Base));
else if(Base==16)
currentValue = Integer.toHexString(Compute(test,Base)).toUpperCase();
else if(Base==2)
currentValue = Integer.toBinaryString(Compute(test,Base));
}
InputLabel.setText(currentValue);
repaint();
}
public void keyTyped(KeyEvent e) {
/* InputLabel.setText(new Character(e.getKeyChar()).toString()); */
for(int i=0;i<Base;i++)
if(e.getKeyChar()==NumberButtonName[i].charAt(1)
||e.getKeyChar()==NumberButtonName[i].toLowerCase().charAt(1)) {
ActionEvent Fake = new ActionEvent(e.getSource(),
e.getID(),
NumberButtonName[i]);
actionPerformed(Fake);
}
if(e.getKeyChar()=='+') {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," + ");
actionPerformed(Fake);
} else if(e.getKeyChar()=='-') {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," - ");
actionPerformed(Fake);
} else if(e.getKeyChar()=='*') {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," x ");
actionPerformed(Fake);
} else if(e.getKeyChar()=='x') {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," x ");
actionPerformed(Fake);
} else if(e.getKeyChar()=='/') {
actionPerformed(new ActionEvent(e.getSource(),e.getID()," / "));
} else if(e.getKeyChar()==13) {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," = ");
actionPerformed(Fake);
} else if(e.getKeyChar()=='=') {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," = ");
actionPerformed(Fake);
} else if(e.getKeyChar()==KeyEvent.VK_BACK_SPACE) {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," <-");
actionPerformed(Fake);
} else if(e.getKeyChar()=='.') {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," . ");
actionPerformed(Fake);
} else if(e.getKeyChar()==27) {
ActionEvent Fake = new ActionEvent(e.getSource(),e.getID()," AC");
actionPerformed(Fake);
} else if(e.getKeyChar()=='!') {
TenSixCheckbox.setState(true);
HelperForStateChange(16);
} else if(e.getKeyChar()=='@') {
TenCheckbox.setState(true);
HelperForStateChange(10);
} else if(e.getKeyChar()=='#') {
TwoCheckbox.setState(true);
HelperForStateChange(2);
} else if(e.getKeyChar()=='$') {
EightCheckbox.setState(true);
HelperForStateChange(8);
}
}
public void keyPressed(KeyEvent e) {
}
public void keyReleased(KeyEvent e) {
}
private int Compute(String Source,int Base) {
int answer = 0 , num;
for(int i=0;i<Source.length();i++) {
if(Source.charAt(i)<='F'&&Source.charAt(i)>='A')
num = 10 + Source.charAt(i) - 'A';
else
num = Source.charAt(i) - '0';
answer += num *
(int)Math.pow((double)Base,(double)(Source.length()-i-1));
}
return answer;
}
private void HelperForStateChange(int temp) {
ModeChangeAudio.play();
String test = null;
int use = 0;
for(int i=0;i<16;i++)
NumberButton[i].setEnabled(i<temp);
if(temp!=10)
PointButton.setEnabled(false);
else
PointButton.setEnabled(true);
use = currentValue.indexOf((int)'.');
if(use==-1) use = currentValue.length();
test = currentValue.substring(0,use);
if(temp==10&&Base!=10)
currentValue = Integer.toString(Compute(test,Base));
else if(temp==8)
currentValue = Integer.toOctalString(Compute(test,Base));
else if(temp==16)
currentValue = Integer.toHexString(Compute(test,Base)).toUpperCase();
else if(temp==2)
currentValue = Integer.toBinaryString(Compute(test,Base));
Base = temp;
InputLabel.setText(currentValue);
}
public void itemStateChanged(ItemEvent e) {
int temp = Integer.valueOf(e.getItem().toString()).intValue();
HelperForStateChange(temp);
}
private String MyCount(String all,String current,int Type,int Base) {
if(Type==0) return current;
String answer = null;
if(Base==10) {
double temp1 = Double.valueOf(all).doubleValue(),
temp2 = Double.valueOf(current).doubleValue();
switch(Type) {
case 1:
answer = Double.toString(temp1 + temp2);
break;
case 2:
answer = Double.toString(temp1 - temp2);
break;
case 3:
answer = Double.toString(temp1 * temp2);
break;
case 4:
answer = Double.toString(temp1 / temp2);
break;
}
} else {
int temp1 = Compute(all,Base);
int temp2 = Compute(current,Base);
switch(Type) {
case 1: if(Base==2)
answer = Integer.toBinaryString
(new Integer(temp1+temp2).intValue());
else if(Base==8)
answer = Integer.toOctalString
(new Integer(temp1+temp2).intValue());
else if(Base==16)
answer = Integer.toHexString
(new Integer(temp1+temp2).intValue()).toUpperCase();
break;
case 2: if(Base==2)
answer = Integer.toBinaryString
(new Integer(temp1-temp2).intValue());
else if(Base==8)
answer = Integer.toOctalString
(new Integer(temp1-temp2).intValue());
else if(Base==16)
answer = Integer.toHexString
(new Integer(temp1-temp2).intValue()).toUpperCase();
break;
case 3: if(Base==2)
answer = Integer.toBinaryString
(new Integer(temp1*temp2).intValue());
else if(Base==8)
answer = Integer.toOctalString
(new Integer(temp1*temp2).intValue());
else if(Base==16)
answer = Integer.toHexString
(new Integer(temp1*temp2).intValue()).toUpperCase();
break;
case 4: if(Base==2)
answer = Integer.toBinaryString
(new Integer(temp1/temp2).intValue());
else if(Base==8)
answer = Integer.toOctalString
(new Integer(temp1/temp2).intValue());
else if(Base==16)
answer = Integer.toHexString
(new Integer(temp1/temp2).intValue()).toUpperCase();
break;
}
}
return answer;
}
private int Base = 10;
private String allValue = "";
private String currentValue = "0";
private int Sign = 0; /* 0 empty 1 + 2 - 3 * 4 / */
private int Mode = 1; /* 0 normal 1 right after Sign */
private double temp = 0.0;
private double MemoryNumber = 0.0;
}