import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

//--------------------------------------------------
// チップセレクトキャンバスクラス
//--------------------------------------------------
class SelectChipCanvas extends Canvas implements MouseListener{
	// 横幅
	static final int WIDTH = 16 * 6;

	// 縦幅
	static final int HEIGHT = 16 * 27;

	// モード（下層レイヤーか上層レイヤーか）
	int mode;	// DOWN_LAYER_MODE or UP_LAYER_MODE

	// マップウィンドウキャンバス
	MapCanvas map_window_canvas;

	// マップ管理クラス
	MapManage manage;

	//オフスクリーンのグラフィックス
	Graphics og;

	// オフスクリーン
	Image off_screen;

	// メモリから作成したイメージ
	Image memory_image;

	// その基にするメモリ
	MemoryImageSource source;

	// オフスクリーンのピクセルデータ
	int[] OffPix;

	//--------------------------------------------------
	// デバッグプリント
	//--------------------------------------------------
	void DebugPrint( String str ){
		System.out.println( str );
	}

	//--------------------------------------------------
	// 初期化
	//--------------------------------------------------
	public void Initialize( MapManage manage, MapCanvas canvas, int mode ){
		//マウスイベント受付
		this.addMouseListener( this );
		this.manage = manage;
		this.map_window_canvas = canvas;

		// モード
		this.mode = mode;

		// オフスクリーン関連
		Dimension d = getSize();

		// オフスクリーン作成
		off_screen = createImage( d.width, d.height );
		og = off_screen.getGraphics();

		OffPix = new int[ d.width * d.height ];
		source = new MemoryImageSource( d.width, d.height,
			new DirectColorModel(24, 0xff0000, 0x00ff00, 0x0000ff),
			OffPix, 0, d.width );
		source.setAnimated( true );
		//source.setFullBufferUpdates( true );

		//描画バッファを作成する
		memory_image = createImage( source );	// 配列から画像作成

		// チップ描画（オフスクリーンに）
		manage.DspMapWindow( OffPix, mode );

		// ピクセル更新
		//source.newPixels();
	}

	//--------------------------------------------------
	// 描画
	//--------------------------------------------------
	public void update( Graphics g ){ paint(g); }
	public void paint( Graphics g ){
		//DebugPrint("paint()");

		// オフスクリーンに、メモリイメージを描画
		og.drawImage( memory_image, 0, 0, this );

		// 枠を作る
		manage.SetGraphics( og );
		manage.DrawRect( this.mode );

		// オフスクリーンを描画
		g.drawImage( off_screen, 0, 0, this );
	}

	//--------------------------------------------------
	// クリックしてチップ選択
	//--------------------------------------------------
	public void mousePressed(MouseEvent e){
		int x = e.getX();
		int y = e.getY();

		//左クリックの場合
		if((e.getModifiers() & e.BUTTON1_MASK) != 0){
			byte id = (byte)( (x / MapManage.CHIP_SIZE) + 6 * ( y / MapManage.CHIP_SIZE ) );

			// 下層レイヤなら海分のオフセット加算
			if( this.mode == manage.DOWN_LAYER_MODE ){
				if( id == 0 ){
					id = 0;
				}else{
					id += manage.SEA_NUM;
				}
			}

			// IDは適正な値？
			boolean ret = manage.IsCorrectID( id, this.mode );

			// 正しいなら更新
			if( ret ){
				manage.SetSelectedID( id );

				// メインに通知
				manage.SetChipMode( this.mode );

				// マップウィンドウも更新
				map_window_canvas.repaint();
			}
		}
		//右クリックの場合
/*
		else if((e.getModifiers() & e.BUTTON3_MASK) != 0){
			// マップモード切り替え
			manage.ChangeMapWindowMode();

			// チップ描画（オフスクリーンに）
			manage.DspMapWindow( OffPix );

			// ピクセル更新
			source.newPixels();
		}
*/
		repaint();
	}
	public void mouseClicked( MouseEvent e ){ }
	public void mouseReleased(MouseEvent e){}
	public void mouseEntered(MouseEvent e){}
	public void mouseExited(MouseEvent e){}
}
