import java.awt.*;
import java.awt.event.*;

public class Calculater{
 Frame f;
 Label lbNorth;
 Button b1, b2, b3, b4, b5 ,b6 ,b7, b8, b9, b0, 
   bSum, bMin, bMul, bDiv,bEq, bDot, bAC;

 double buf;    // °è»ê °á°ú¸¦ ÀúÀåÇÏ´Â º¯¼ö
 char op = '0';   // ¼±ÅÃµÈ ¿¬»êÀÚ¸¦ ÀúÀåÇÏ´Â º¯¼ö
 boolean operate;  // ¿¬»êÀÚÀÇ ¼±ÅÃ ¿©ºÎ¸¦ ¾Ë±âÀ§ÇÑ ½Ã±×³Î º¯¼ö

 public Calculater(){
   makeGUI();
 }

 private void makeGUI(){

  f = new Frame("Calculater");
  f.setLayout(new BorderLayout(5, 5) );
  
  Panel p = new Panel(new GridLayout(4, 4, 5, 5));
  Font font = new Font("Dialog", Font.BOLD, 30);
  b1 = new Button("1");
  b1.setFont(font);
  b2 = new Button("2");
  b2.setFont(font);
  b3 = new Button("3");
  b3.setFont(font);
  b4 = new Button("4");
  b4.setFont(font);
  b5 = new Button("5");
  b5.setFont(font);
  b6 = new Button("6");
  b6.setFont(font);
  b7 = new Button("7");
  b7.setFont(font);
  b8 = new Button("8");
  b8.setFont(font);
  b9 = new Button("9");
  b9.setFont(font);
  b0 = new Button("0");
  b0.setFont(font);
  bSum = new Button("£«");
  bSum.setFont(font);
  bMin = new Button("£­");
  bMin.setFont(font);
  bMul = new Button("¡¿");
  bMul.setFont(font);
  bDiv = new Button("¡À");
  bDiv.setFont(font);
  bEq = new Button("=");
  bEq.setFont(font);
  bDot = new Button(".");
  bDot.setFont(font);
  bAC = new Button("AC");
  bAC.setFont(font);

  ActionHandler ah = new ActionHandler();
  b1.addActionListener(ah);
  b2.addActionListener(ah);
  b3.addActionListener(ah);
  b4.addActionListener(ah);
  b5.addActionListener(ah);
  b6.addActionListener(ah);
  b7.addActionListener(ah);
  b8.addActionListener(ah);
  b9.addActionListener(ah);
  b0.addActionListener(ah);
  bSum.addActionListener(ah);
  bMin.addActionListener(ah);
  bMul.addActionListener(ah);
  bDiv.addActionListener(ah);
  bEq.addActionListener(ah);
  bDot.addActionListener(ah);
  bAC.addActionListener(ah);

  p.add(b1); p.add(b2); p.add(b3); p.add(bSum);
  p.add(b4); p.add(b5); p.add(b6); p.add(bMin);
  p.add(b7); p.add(b8); p.add(b9); p.add(bMul);
  p.add(b0); p.add(bDot); p.add(bEq); p.add(bDiv);

  lbNorth = new Label("0", Label.RIGHT);
  lbNorth.setFont(font);
  lbNorth.setBackground(Color.black);
  lbNorth.setForeground(Color.yellow);

  f.add(lbNorth, "North");
  f.add(p, "Center");
  f.add(bAC, "South");

  f.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent e) {
    System.exit(0);
   }
  });

  f.setSize(300, 400);
  f.setResizable(false);
  Dimension d = f.getToolkit().getScreenSize();
  f.setLocation( (int)((d.width - f.getWidth())/2) , 
   (int)((d.height - f.getHeight())/2)  );
  f.setVisible(true); 
 }

 public static void main(String []args){
  new Calculater();
 }

 // ¹öÆ° ÇÚµé·¯ Å¬·¡½º..
 class ActionHandler implements ActionListener {

  public void actionPerformed(ActionEvent e) {

   Object o = e.getSource();
   System.out.println(e.getActionCommand());

   // ¼ýÀÚÅ°°¡ ´­¸®¸é È­¸é¿¡ Ç¥½ÃÇÑ´Ù.
   if(o == b1 || o == b2 || o == b3 || o == b4 || o == b5 
     || o == b6  || o == b7 || o == b8 || o == b9 || o == b0) {
    
    printNum(e.getActionCommand());
    // getActionCommand()ÀÇ °æ¿ì ÀÌ ÇÁ·Î±×·¥¿¡¼­´Â 
    // °¢ ¹öÆ°ÀÇ Label¿¡ Ç¥½ÃµÈ ¹®ÀÚ¿­ °ªÀÌ 
    // String Å¸ÀÔÀ¸·Î ¸®ÅÏµÈ´Ù.

   }else if(o == bSum) {
    printOperate('+');
    
   }else if(o == bMin) {
    printOperate('-');

   }else if(o == bMul) {
    printOperate('*');
    
   }else if(o == bDiv) {
    printOperate('/');    

   }else if(o == bEq) {
    lbNorth.setText(getResult());
    op = '0';
    operate = true;

   } else if(o == bDot) {
    String str = lbNorth.getText();
    // ¼Ò¼öÁ¡ÀÌ ¾øÀ» °æ¿ì¿¡¸¸ ¼Ò¼öÁ¡À» Ãß°¡ÇÑ´Ù.
    if(str.indexOf('.') == -1) {
     lbNorth.setText(str + ".");
    }

   } else if (o == bAC) {
    // ¿ÏÀü ÃÊ±âÈ­ 
    lbNorth.setText("0");
    buf = 0.0;
    op = '0';
   }
  } // End of actionPerformed()


  /* ´­·ÁÁø ¼ýÀÚ¸¦ È­¸éÀÇ µÞÀÚ¸®¿¡ Ãß°¡ÇÑ´Ù. */
  private void printNum(String n) {

   String str = lbNorth.getText();
   // ¿¬»êÀÚ°¡ ÀÔ·ÂµÈ ´ÙÀ½¿¡ ¼ýÀÚ¸¦ Ã³À½ ÀÔ·ÂÇÒ °æ¿ì
   if(operate) {
    str = "";
    operate = false;
   }

   // Ã¹ÀÚ¸®°¡ 0 ÀÎ °æ¿ì, ´Ü ½Ç¼öÇü 0. ÀÌ ¾Æ´Ñ°æ¿ì´Â ¾ÕÀÇ 0À» ¹«½ÃÇØ¾ß ÇÑ´Ù.
   if(str.indexOf('0') == 0 && str.indexOf('.') != 1) {
    lbNorth.setText(n);
   } else {
    lbNorth.setText(str + n);
   }
  } // End of printNum()


  /*  '='°¡ Å¬¸¯µÆÀ»¶§ ¿¬»ê ¼öÇàÈÄ °á°ú¸¦ Ãâ·ÂÇÑ´Ù. */
  private String getResult() {

   // ÇöÀç È­¸é¿¡ ÀÔ·ÂµÈ °ªÀ» ÀúÀåÇÑ´Ù.
   double d = 0.0;
   try {
    d = Double.parseDouble(lbNorth.getText());
   }catch(Exception e){}

   // ¿¬»êÀÚÀÇ Á¾·ù¿¡ µû¶ó buf¿¡ ÀúÀåµÈ °ª°ú ÇöÀç ÀÔ·ÂµÈ °ªÀ» ¿¬»êÇÑ´Ù.
   switch(op) {
    case '+' :
     buf += d; break;
    case '-' :
     buf -= d; break;
    case '*' :
     buf *= d; break;
    case '/' :
     buf /= d; break;
    case '0' :
     buf = d; break;
   }
   String result = buf + "";
    
   // ¼ýÀÚ°¡ .0 À¸·Î ³¡³¯ °æ¿ì Á¤¼öÇüÀ¸·Î º¯È¯
   if( result.substring(result.length()-2).equals(".0") ){ 
    result = result.substring(0, result.length()-2);
   }
   // ¼ýÀÚ°¡ 18ÀÚ¸®¸¦ ³ÑÀ¸¸é 18ÀÚ¸®¿¡¼­ ÀÚ¸¥´Ù.
   if(result.length() >18) {
    result = result.substring(0, 18);
   }
   return result;
  } // End of getResult()


  /* ¿¬»êÀÚ°¡ Å¬¸¯µÆÀ» ¶§ Ã³¸®ÇÑ´Ù. */
  private void printOperate(char c) {
   String value = ""; 

   // ¿¬»êÀÚ°¡ ÀÔ·ÂµÈ »óÅÂ¿¡¼­ ´Ù¸¥ ¿¬»êÀÚ·Î ¹Ù²Ü °æ¿ì
   if(operate) {
    value = String.valueOf(buf);
    if( value.substring(value.length()-2).equals(".0") ){ 
     value = value.substring(0, value.length()-2);
    }
   
   // ¼ýÀÚ¸¦ ÀÔ·ÂÇÑ ÈÄ ¿¬»êÀÚ¸¦ ÀÔ·ÂÇÑ °æ¿ì
   } else {
    value = getResult();
   }
   lbNorth.setText("["+ c +"] " + value);
   op = c;
   operate = true;

  } // End of printOperate()

 } // End of ActionHandler

} 

