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

/**
 * IgoImagePanel クラスは、描画ベースの碁盤イメージを提供します。
 * @author Jiro Suzuki
 */
public class IgoImagePanel extends IgoPanel{

    private static final int FONTSIZE=31;
    private static final int BANSIZEX=630;
    private static final int BANSIZEY=630;
    private static final int BOX=32;
    private static final int ROSU=19;
    private static final Color BOARD_COLOR=new Color(242,216,140);
    private static final Color WHITE_STONE_COLOR=new Color(253,253,253);
    private static final Color OUTLINE_COLOR=new Color(180,180,180);

    private IgoModel controller;
    private IntBoard intBoard;
    private Image  image;
    private Graphics painter;
    private boolean isPutable;

    /**
     * 石が置かれていない碁盤イメージのインスタンスを生成します。
     */
    IgoImagePanel(){
        intBoard=new IntBoard();
        isPutable=false;

        addMouseListener(new MouseAdapter(){
            public void mousePressed(MouseEvent me){
                if(isPutable){
                    boolean isOnBoardRow=false;
                    boolean isOnBoardCol=false;
                    int x=me.getX();
                    int y=me.getY();
                    int minX,minY,row,col;
                    for(row=0;row<ROSU;row++){
                        minY=row*BOX+11;
                        if(y>=minY && y<minY+BOX){
                            isOnBoardRow=true;
                            break;
                        }
                    }
                    for(col=0;col<ROSU;col++){
                        minX=col*BOX+11;
                            if(x>=minX && x<minX+BOX){
                                isOnBoardCol=true;
                                break;
                            }
                    }
                    if(isOnBoardRow && isOnBoardCol){
                        controller.putStone(row,col);
                    }
                }
            }
        });
    }

    /**
     * グラフィックベースの碁盤を描画します。
     * @param g 保護対象の Graphics オブジェクト
     */
    public void paintComponent(Graphics g){ 

        super.paintComponent(g);

        image=createImage(BANSIZEX,BANSIZEY); 
        painter=image.getGraphics();  
        //盤の描画
        painter.setColor(BOARD_COLOR);
        painter.fillRect(0,0,BANSIZEX,BANSIZEY);
        painter.setColor(Color.black);
        //線の描画
        for(int i=0;i<ROSU;i++){
            painter.drawLine(BOX*i+BOX/2+10,BOX/2+10,BOX*i+BOX/2+10,BOX*(ROSU-1)+BOX/2+10);  //縦線
            painter.drawLine(BOX/2+10,BOX*i+BOX/2+10,BOX*(ROSU-1)+BOX/2+10,BOX*i+BOX/2+10);  //横線
        }
        //星の描画
        int dx;
        int dy;
        for(int ix_dx=0;ix_dx<3;ix_dx++){
            dx=BOX/2+BOX*3-3+BOX*6*ix_dx;
            for(int ix_dy=0;ix_dy<3;ix_dy++){
                dy=BOX/2+BOX*3-3+BOX*6*ix_dy;
                painter.fillOval(dx+10,dy+10,6,6);
            }
        }
        //石の描画
        int[][] ban=intBoard.getIntBoard();
        for(int row=0;row<ROSU;row++){
            for(int col=0;col<ROSU;col++){
                switch (ban[row][col]){
                    case 1:  //黒石の描画
                        painter.setColor(Color.black);
                        painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
                        break;
                    case 2:  //白石の描画
                        painter.setColor(WHITE_STONE_COLOR);
                        painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
                        painter.setColor(OUTLINE_COLOR);
                        painter.drawOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
                        break;
                    case 11:  //黒石の描画
                        painter.setColor(Color.black);
                        painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
                        painter.setColor(Color.green);
                        painter.fillOval(col*BOX+19,row*BOX+19,BOX-20,BOX-20);
                        break;
                    case 12:  //白石の描画
                        painter.setColor(WHITE_STONE_COLOR);
                        painter.fillOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
                        painter.setColor(OUTLINE_COLOR);
                        painter.drawOval(col*BOX+10,row*BOX+10,BOX-2,BOX-2);
                        painter.setColor(Color.green);
                        painter.fillOval(col*BOX+19,row*BOX+19,BOX-20,BOX-20);
                        break;
                }
            }
        } 
        g.drawImage(image,0,0,this);
    }

    /**
     * 描画ベースの碁盤を更新します。
     * @param intBoard 碁盤に見立てた行列に、石の色を配置した碁盤データ
     */
    public void update(IntBoard intBoard){
        this.intBoard=intBoard;
        repaint();
    }

    /**
     * コントローラーを設定します。
     * @param controller コントローラー
     */
    public void setIgoGameController(IgoModel controller){
        this.controller=controller;
        isPutable=true;
    }
}