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

/**
 * GameInfoDialog クラスは、対局情報を表示するダイアログを提供します。
 * @author Jiro Suzuki
 */
public class GameInfoDialog extends JDialog{

    private static final Font FONT_MSG=new Font("MS UI Gothic",Font.PLAIN,16);

    private IgoModel controller;
    private JPanel jpInfo1;
    private JLabel jlInfoPB;
    private JLabel jlInfoPW;
    private JLabel jlInfoPBrank;
    private JLabel jlInfoPWrank;
    private JLabel jlInfoEvent;
    private JLabel jlInfoGameName;
    private JLabel jlInfoDate;
    private JLabel jlInfoKomi;
    private JLabel jlInfoResult;
    private JTextField jtfInfoPB;
    private JTextField jtfInfoPW;
    private JTextField jtfInfoPBrank;
    private JTextField jtfInfoPWrank;
    private JTextField jtfInfoEvent;
    private JTextField jtfInfoGameName;
    private JTextField jtfInfoDate;
    private JTextField jtfInfoKomi;
    private JTextField jtfInfoResult;
    private JButton bt_infoUpdate;
    private JButton bt_infoCancel;

    /**
     * パラメータに設定された内容で、インスタンスを生成します。
     * @param owner 所有者
     * @param title ダイアログのタイトル
     * @param modal モーダルにするかどうかの真偽値
     * @param controller コントローラー
     */
    public GameInfoDialog(Frame owner,String title,boolean modal,IgoModel controller){
        super(owner,title,modal);
        this.controller=controller;
        jlInfoPB=new JLabel("黒番",SwingConstants.CENTER);
        jlInfoPW=new JLabel("白番",SwingConstants.CENTER);
        jlInfoPBrank=new JLabel("段位",SwingConstants.CENTER);
        jlInfoPWrank=new JLabel("段位",SwingConstants.CENTER);
        jlInfoEvent=new JLabel("大会名",SwingConstants.CENTER);
        jlInfoGameName=new JLabel("対局名",SwingConstants.CENTER);
        jlInfoDate=new JLabel("対局日",SwingConstants.CENTER);
        jlInfoKomi=new JLabel("コミ",SwingConstants.CENTER);
        jlInfoResult=new JLabel("結果",SwingConstants.CENTER);
        jtfInfoPB=new JTextField();
        jtfInfoPW=new JTextField();
        jtfInfoPBrank=new JTextField();
        jtfInfoPWrank=new JTextField();
        jtfInfoEvent=new JTextField();
        jtfInfoGameName=new JTextField();
        jtfInfoDate=new JTextField();
        jtfInfoKomi=new JTextField();
        jtfInfoResult=new JTextField();
        bt_infoUpdate=new JButton("更新");
        bt_infoCancel=new JButton("キャンセル");
        jlInfoPB.setFont(FONT_MSG);
        jlInfoPW.setFont(FONT_MSG);
        jlInfoPBrank.setFont(FONT_MSG);
        jlInfoPWrank.setFont(FONT_MSG);
        jlInfoEvent.setFont(FONT_MSG);
        jlInfoGameName.setFont(FONT_MSG);
        jlInfoDate.setFont(FONT_MSG);
        jlInfoKomi.setFont(FONT_MSG);
        jlInfoResult.setFont(FONT_MSG);
        jtfInfoPB.setFont(FONT_MSG);
        jtfInfoPW.setFont(FONT_MSG);
        jtfInfoPBrank.setFont(FONT_MSG);
        jtfInfoPWrank.setFont(FONT_MSG);
        jtfInfoEvent.setFont(FONT_MSG);
        jtfInfoGameName.setFont(FONT_MSG);
        jtfInfoDate.setFont(FONT_MSG);
        jtfInfoKomi.setFont(FONT_MSG);
        jtfInfoResult.setFont(FONT_MSG);
        bt_infoUpdate.setFont(FONT_MSG);
        bt_infoCancel.setFont(FONT_MSG);
        jlInfoPB.setBounds(5,5,60,30);
        jlInfoPW.setBounds(5,40,60,30);
        jlInfoPBrank.setBounds(275,5,40,30);
        jlInfoPWrank.setBounds(275,40,40,30);
        jlInfoEvent.setBounds(5,75,60,30);
        jlInfoGameName.setBounds(5,110,60,30);
        jlInfoDate.setBounds(5,145,60,30);
        jlInfoKomi.setBounds(5,180,60,30);
        jlInfoResult.setBounds(5,215,60,30);
        jtfInfoPB.setBounds(70,5,200,30);
        jtfInfoPW.setBounds(70,40,200,30);
        jtfInfoPBrank.setBounds(320,5,145,30);
        jtfInfoPWrank.setBounds(320,40,145,30);
        jtfInfoEvent.setBounds(70,75,400,30);
        jtfInfoGameName.setBounds(70,110,400,30);
        jtfInfoDate.setBounds(70,145,200,30);
        jtfInfoKomi.setBounds(70,180,200,30);
        jtfInfoResult.setBounds(70,215,400,30);
        bt_infoUpdate.setBounds(145,250,100,30);
        bt_infoCancel.setBounds(255,250,100,30);
        bt_infoCancel.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                setVisible(false);
            }
        });
        bt_infoUpdate.addMouseListener(new MouseAdapter(){
            public void mouseClicked(MouseEvent e){
                updateInfo();
            }
        });

        jpInfo1=new JPanel();
        jpInfo1.setSize(500,300);
        jpInfo1.setLocation(0,0);
        jpInfo1.setLayout(null);
        jpInfo1.add(jlInfoPB);
        jpInfo1.add(jtfInfoPB);
        jpInfo1.add(jlInfoPBrank);
        jpInfo1.add(jtfInfoPBrank);
        jpInfo1.add(jlInfoPW);
        jpInfo1.add(jtfInfoPW);
        jpInfo1.add(jlInfoPWrank);
        jpInfo1.add(jtfInfoPWrank);
        jpInfo1.add(jlInfoEvent);
        jpInfo1.add(jtfInfoEvent);
        jpInfo1.add(jlInfoGameName);
        jpInfo1.add(jtfInfoGameName);
        jpInfo1.add(jlInfoDate);
        jpInfo1.add(jtfInfoDate);
        jpInfo1.add(jlInfoKomi);
        jpInfo1.add(jtfInfoKomi);
        jpInfo1.add(jlInfoResult);
        jpInfo1.add(jtfInfoResult);
        jpInfo1.add(bt_infoUpdate);
        jpInfo1.add(bt_infoCancel);
        setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);
        getContentPane().setLayout(null);
        getContentPane().add(jpInfo1);
        setBounds(350,200,500,340);
        setVisible(false);
    }

    /**
     * ダイアログを表示します。
     * @param gameInfo 対局情報
     */
    public void showDialog(GameInformation gameInfo){
        jtfInfoPB.setText(gameInfo.getBlackPlayer());
        jtfInfoPW.setText(gameInfo.getWhitePlayer());
        jtfInfoPBrank.setText(gameInfo.getBlackRank());
        jtfInfoPWrank.setText(gameInfo.getWhiteRank());
        jtfInfoEvent.setText(gameInfo.getEvent());
        jtfInfoGameName.setText(gameInfo.getGameName());
        jtfInfoDate.setText(gameInfo.getDate());
        jtfInfoKomi.setText(gameInfo.getKomi());
        jtfInfoResult.setText(gameInfo.getResult());    
        setVisible(true);
    }

    private void updateInfo(){
        GameInformation gameInfo=new GameInformation();
        gameInfo.setBlackPlayer(jtfInfoPB.getText());
        gameInfo.setWhitePlayer(jtfInfoPW.getText());
        gameInfo.setBlackRank(jtfInfoPBrank.getText());
        gameInfo.setWhiteRank(jtfInfoPWrank.getText());
        gameInfo.setEvent(jtfInfoEvent.getText());
        gameInfo.setGameName(jtfInfoGameName.getText());
        gameInfo.setDate(jtfInfoDate.getText());
        gameInfo.setKomi(jtfInfoKomi.getText());
        gameInfo.setResult(jtfInfoResult.getText());
        controller.updateGameInfo(gameInfo);
        setVisible(false);
    }
}