import java.awt.*;
import java.applet.Applet;
import javax.swing.*;
import java.awt.event.*;


public class Calculator extends Applet implements Runnable, ActionListener{
	JButton[] buttons = new JButton[12];    
  JButton[] operButtons = new JButton[8];
  JButton[] deleteButtons = new JButton[3];
  JLabel display = new JLabel();
  String result = "";
  String operation = "";
  String currentValue = "first";
  Double valueDouble = 0.0;
  Double firstValueDouble = 0.0;
  Boolean startNew = false;
  
  //constructor
  public Calculator(){
    Font font = new Font("Serif", Font.BOLD, 36);
    int gapX = 10;
    int gapY = 10;
    int width = 60;
    int height = 60;
    display.setBounds(0, 0, 5*width + 4*gapX, height);
    display.setBorder(BorderFactory.createMatteBorder(1,1,1,1,Color.black));
    display.setHorizontalAlignment(JLabel.RIGHT);
    display.setFont(font);
    int i;
    deleteButtons[0] = new JButton ("Backspace");
    deleteButtons[1] = new JButton ("CE");
    deleteButtons[2] = new JButton ("C");

    for (i=0; i <= 2; i++) {
      deleteButtons[i].setMargin(new Insets(0,0,0,0));
      deleteButtons[i].addActionListener(this);
      deleteButtons[i].setFont(font);
      if (i == 0){
        deleteButtons[i].setBounds(0, height + gapY, 3*width + 2*gapX, height);
      } else {
  //      deleteButtons[i].setBounds(4*width + (i-1)*(width+gapX), height+gapY, width, height);
        deleteButtons[i].setBounds(3*(width+gapX) + (i-1)*(width+gapX), height+gapY, width, height);  
      }
    }

    int j = 1; // auxiliary variable;
    for (i = 1; i<=12; i++ ){
      if (i <= 10) {
        buttons[i-1] = new JButton(String.valueOf(i % 10));
        
      } else {
        switch (i) {
        case 11: buttons[i-1] = new JButton("."); break;
        case 12: buttons[i-1] = new JButton("+/-"); break;
        }
      }
      
      buttons[i-1].setMargin(new Insets(0,0,0,0));
      buttons[i-1].addActionListener(this);
      buttons[i-1].setBounds(((width+gapX) * (i-1)) % (3*(width+gapX)), 
                             (2*height + 2*gapY) + ((height+gapY) * (j-1)),
                             width, 
                             height);
      buttons[i-1].setFont(font);
      if (i % 3 == 0) j++; 
    }
    
    j = 0;
    for (i = 0; i < 8; i++ ){
      switch (i) {
        case 0: operButtons[i] = new JButton("/"); break;
        case 1: operButtons[i] = new JButton("*"); break;
        case 2: operButtons[i] = new JButton("-"); break;
        case 3: operButtons[i] = new JButton("+"); break;
        case 4: operButtons[i] = new JButton("sqr"); break;
        case 5: operButtons[i] = new JButton("%"); break;
        case 6: operButtons[i] = new JButton("1/x"); break;
        case 7: operButtons[i] = new JButton("="); break;
      }
      operButtons[i].setMargin(new Insets(0,0,0,0));
      operButtons[i].setBounds((3*(width+gapX)) + (width+gapX) * j , 
                               (2*height+2*gapY) + (((height+gapY) * i) % (4*(height+gapY))),
                               width, 
                               height); 
      operButtons[i].addActionListener(this);
      operButtons[i].setFont(font);
      if ((i+1) % 4 == 0) j++; 
    }


	}

	public void init(){

   setLayout(null);

   add(display);
   for (int i=0; i <= 2; i++) add(deleteButtons[i]);
   
   for (int i = 0; i<=11; i++ ) add(buttons[i]);   
   
   for (int i = 0; i < 8; i++ ) add(operButtons[i]);
    
   display.setText("0");
  }

	public static void main(String[] args) {
		System.out.println("Hello World!");
	}
	
  //overridden run method
	public void run()	{
			repaint();					//calls the repaint method
		
	}	
	

public void actionPerformed(ActionEvent event){
  
  Object src = event.getSource();
  
  
  if (src instanceof JButton) {
    
    // if number is pressed
    for (int i = 0; i<=9; i++ ){
      if (src == buttons[i]){
        if (startNew){
          result = String.valueOf((i+1) % 10);
        } else {
          result += String.valueOf((i+1) % 10);
        }
        showCalculation(result);
        valueDouble = Double.valueOf(result);
        startNew = false;
      }
    }
    if (src == buttons[10]) {         //      .
      if (startNew){
        result = "0.";
        showCalculation(result);
        
      } else {
        if (result.indexOf(".",0) < 0) {
          result += ".";
          showCalculation(result);
          valueDouble = Double.valueOf(result);
          
        }
      }
      startNew = false;
    }
    if (src == buttons[11]) {           //    +/-
      if (currentValue.equals("second")){
      
        valueDouble = 0.0 - Double.valueOf(result);
        result = String.valueOf(valueDouble);
        showCalculation(result);
      } else {
        firstValueDouble = 0.0 - Double.valueOf(result);
        result = String.valueOf(firstValueDouble);
        showCalculation(result);
        
      }

    }

    if (src == operButtons[0]) {
      operationBegins("/");
      startNew = true;
    }

    if (src == operButtons[1]) {
      operationBegins("*");
      startNew = true;
    }
    if (src == operButtons[2]) {
      operationBegins("-");
    }
    if (src == operButtons[3]) {
      operationBegins("+");
      startNew = true;
    }
    if (src == operButtons[4]) {  //    sqrt
      valueDouble = Double.valueOf(result);
      valueDouble = Math.sqrt(valueDouble);
      result = String.valueOf(valueDouble);
      showCalculation(result);
      startNew = true;
    }
    if (src == operButtons[5]) {  //    %
      operationBegins("%");
      startNew = true;
    }
    if (src == operButtons[6]) {  //    1/x
      valueDouble = Double.valueOf(result);
      valueDouble = 1 / valueDouble;
      result = String.valueOf(valueDouble);
      showCalculation(result);
      startNew = true;
    } 
    if (src == operButtons[7]) {        // equals sign  = 
        if (operation.equals("")){
          firstValueDouble = Double.valueOf(result);
        }
      //if (currentValue.equals("second")){
        if (operation.equals("/")){
          firstValueDouble = firstValueDouble / valueDouble;
        } else if (operation.equals("*")){
          firstValueDouble = firstValueDouble * valueDouble;
        } else if (operation.equals("-")){
          firstValueDouble = firstValueDouble - valueDouble;
        } else if (operation.equals("+")){
          firstValueDouble = firstValueDouble + valueDouble;
        } else if (operation.equals("%")){
          firstValueDouble = firstValueDouble % valueDouble;
        }
        

        
        result = String.valueOf(firstValueDouble);
        showCalculation(result);
        currentValue = "first";
        startNew = true;
      //}
    }
    if (src == deleteButtons[0]) {      //backspace
      if (result.length() == 1){
        result = "";
        display.setText("0");
      } else {
        result = result.substring(0, result.length()-1);
        showCalculation(result);
      }
      if (currentValue.equals("first")){
        firstValueDouble = Double.valueOf(result);
      } else {
        valueDouble = Double.valueOf(result);
      }
      

    }
    if (src == deleteButtons[1]) {      // "CE"  Clears the last typed value
      valueDouble = 0.0;
      showCalculation("0");
      startNew = true;
    }
    if (src == deleteButtons[2]) {      //Clear All  "C"
      result = "";
      operation = "";
      valueDouble = 0.0;
      firstValueDouble = 0.0;
      currentValue = "first";
      display.setText("0");
      startNew = true;
    }
  } 
}

  private void toTheTemp(){
    firstValueDouble = Double.valueOf(result);
    valueDouble = 0.0;
    result = String.valueOf(valueDouble);
    showCalculation(result);
  }
  //method to remeber which operation is performed
  private void operationBegins(String oper){
    valueDouble = Double.valueOf(result);
    firstValueDouble = valueDouble;
    operation = oper;
    currentValue = "second";
    startNew = true;
  }
  private void showCalculation(String res){   // display the result
    if ((res.length() > 2) && (res.substring(res.length()-2, res.length()).equals(".0"))){
      res = res.substring(0,res.length()-2);
    } else if (res.equals("-")){
      res = "0";
    } else if (res.equals(".")){
      res = "0.";
    } 
    result = res;
    display.setText(res);
    
  }
}