package week8_dentaku;

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

public class Dentaku extends JApplet {

  JTextField result = new JTextField(""); //計算結果を表示するテキストフィールド
  double stackedValue = 0.0;  //演算子ボタンを押す前にテキストフィールドにあった値
  boolean isStacked = false;  //stackedValueに数値を入力したかどうか
  boolean afterCalc = false;  //演算子ボタンを押した後かどうか
  String currentOp = "";      //押された演算子ボタンの名前

  /**アプレットの初期化*/
  public void init() {
    //アプレットは、初期設定がBorderLayoutになっている
    this.getContentPane().add(result, BorderLayout.NORTH); //テキストフィールドを配置

    JPanel keyPanel = new JPanel();            //ボタンを配置するパネルを用意
    keyPanel.setLayout(new GridLayout(4,4));  //4行4列のGridLayoutにする
    this.getContentPane().add(keyPanel, BorderLayout.CENTER);

    keyPanel.add(new NumberButton("7"), 0);    //ボタンをレイアウトにはめこんでいく
    keyPanel.add(new NumberButton("8"), 1);
    keyPanel.add(new NumberButton("9"), 2);
    keyPanel.add(new CalcButton("÷"), 3);
    keyPanel.add(new NumberButton("4"), 4);
    keyPanel.add(new NumberButton("5"), 5);
    keyPanel.add(new NumberButton("6"), 6);
    keyPanel.add(new CalcButton("×"), 7);
    keyPanel.add(new NumberButton("1"), 8);
    keyPanel.add(new NumberButton("2"), 9);
    keyPanel.add(new NumberButton("3"), 10);
    keyPanel.add(new CalcButton("−"), 11);
    keyPanel.add(new NumberButton("0"), 12);
    keyPanel.add(new NumberButton("."), 13);
    keyPanel.add(new CalcButton("＋"), 14);
    keyPanel.add(new CalcButton("＝"), 15);

    this.getContentPane().add(new ClearButton(), BorderLayout.SOUTH);
          //Cボタンを配置する

    //****************** Debug Print *************************
    System.out.println("After init()# stackedValue=" + stackedValue+
                       " /isStacked="+isStacked+" /afterCalc="+afterCalc+
                       " /currentOp="+currentOp+" /result.text="+result.getText());
    //****************** Debug Print *************************
  }

  /*  テキストフィールドに引数の文字列をつなげる */
  public void appendResult(String c)  {
    if( ! afterCalc )   //演算子ボタンを押した直後でないなら
      result.setText(result.getText() + c); //押したボタンの名前をつなげる
    else  {
      result.setText(c);  //押したボタンの文字列だけを設定する（いったんクリアしたかに見える）
      afterCalc =false;
    }
  }

  /*  数字を入力するボタンの定義 */
  public class NumberButton extends JButton implements ActionListener {
    public NumberButton(String keyTop)  {
      super(keyTop);    //JButtonクラスのコンストラクタを呼び出す
      this.addActionListener(this);   //このボタンにアクションイベントのリスナを設定
    }

    public void actionPerformed(ActionEvent evt)  {
      String keyNumber = this.getText();  //ボタンの名前を取り出す
      appendResult(keyNumber);    //ボタンの名前をテキストフィールドにつなげる

      //****************** Debug Print *************************
     System.out.println("After clicking the NumberButton# stackedValue=" + stackedValue+
                       " /isStacked="+isStacked+" /afterCalc="+afterCalc+
                       " /currentOp="+currentOp+" /result.text="+result.getText());
     //****************** Debug Print *************************
    }
  }

  /*  演算子ボタンを定義 */
  public class CalcButton extends JButton implements ActionListener {
    public CalcButton(String op)  {
      super(op);
      this.addActionListener(this);
    }

    public void actionPerformed(ActionEvent e)  {
      if(isStacked) {   //以前に演算子ボタンが押されたのなら計算結果を出す
        double resultValue = (Double.valueOf(result.getText())).doubleValue();
        if ( currentOp.equals("＋") )  //演算子に応じて計算する
          stackedValue += resultValue;
        else if ( currentOp.equals("−") )
          stackedValue -= resultValue;
        else if ( currentOp.equals("×") )
          stackedValue *= resultValue;
        else if ( currentOp.equals("÷") )
          stackedValue /= resultValue;
        result.setText(String.valueOf(stackedValue)); //計算結果をテキストフィールドに設定
      }
      currentOp = this.getText(); //ボタン名から押されたボタンの演算子を取り出す
      stackedValue = (Double.valueOf(result.getText())).doubleValue();
      afterCalc = true;
      if ( currentOp.equals("＝") )
        isStacked = false;
      else
        isStacked = true;

    //****************** Debug Print *************************
     System.out.println("After clicking the CalcButton# stackedValue=" + stackedValue+
                      " /isStacked="+isStacked+" /afterCalc="+afterCalc+
                      " /currentOp="+currentOp+" /result.text="+result.getText());
     //****************** Debug Print *************************
    }
  }
    /*  クリアボタンの定義 */
    public class ClearButton extends JButton implements ActionListener  {
      public ClearButton()  {
        super("C");
        this.addActionListener(this);
      }
      public void actionPerformed(ActionEvent evt)  {
        stackedValue = 0.0;
        afterCalc = false;
        isStacked = false;
        result.setText("");

        //****************** Debug Print *************************
       System.out.println("After clicking the ClearButton# stackedValue=" + stackedValue+
                         " /isStacked="+isStacked+" /afterCalc="+afterCalc+
                         " /currentOp="+currentOp+" /result.text="+result.getText());
       //****************** Debug Print *************************
      }
    }
  //ルック＆フィールの設定
  static {
    try {
      //UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      //UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName());
//      UIManager.setLookAndFeel("javax.swing.plaf.motif.MotifLookAndFeel");
//      UIManager.setLookAndFeel("javax.swing.plaf.windows.WindowsLookAndFeel");
      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
    }
    catch(Exception e) {
    }
  }
}
