import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;
import com.jblend.media.png.*;
import com.jblend.media.*;
import com.jblend.media.smaf.*;

public class TestMediaPlayer extends MIDlet 
	implements  MediaPlayerListener, SmafPlayerListener {

	private Display		display;
	private SmafPlayer	s_player;
	private KeyManager	key;
	private SmafData	_data;
	private PngPlayer	g_player;

	PngData png_start;
	PngData png_stop;
	PngData png_pause;
	PngData png_resume;
	PngData png_up;
	PngData png_down;
	PngData png_on;
	PngData png_off;

	private int select = 0;			//フォーカスの上下位置
	private boolean l_r = false ;		//フォーカスの左右位置
	private int form = 0;			//描画ボタン　0:start 1:pause,stop 2:resume,stop
	private	boolean repeater = false;	//リピート有無

	public void startApp() { 
		try {/*/-----mmfファイルの読み込み-----/*/
			_data = new SmafData( "resource:Funky_DEMO.mmf" );
			s_player = new SmafPlayer( _data );
			s_player.setBounds( 0, 0, _data.getWidth(), _data.getHeight() );
		} catch( Exception e ) {}
		key = new KeyManager();
		s_player.addMediaPlayerListener( this );
		s_player.addSmafPlayerListener( this );
		Display.getDisplay( this ).setCurrent( key );
		key.repaint();
	}

	public void eventOccurred( SmafPlayer player, int event ) {/*SmafPlayerへのイベント対するコード*/}
	public void playerRepeated( MediaPlayer player ){/*リピート時のコード*/}

  
	public void playerStateChanged( MediaPlayer player ){		/*/-----MediaPlayerの状態が変わった時に通知-----/*/
	        int state = ( (SmafPlayer)player ).getState();	
		if( state == MediaPlayer.READY ){	/*/-----プレイヤーがSTOPした-----/*/
			form = 0;
			select = 0;
		}
	}

	public void pauseApp() { }
	public void destroyApp(boolean unconditional) { }


////////////////////////////////
/*/-----キーマネージャー-----/*/
////////////////////////////////
	public class KeyManager extends Canvas{
		private int	WI = getWidth(), HE = getHeight();	//画面のサイズ
		private int	b_x,b_y;				//大きいボタンのサイズ
		private int	bm_x,bm_y;				//小さいボタンのサイズ
		private int[] button1={ 10, 10, 0, 0};		//ボタンの描画用値
		private int[] button2={ 0, 0, 0, 0};
		private String	str;					//表示する文字
		private int	r_shift=0;				//フォーカス表示位置設定

		public KeyManager(){
			try{						/*/-----PNG画像の読み込み-----/*/
				png_start = new PngData( "resource:start.png" );
				png_stop = new PngData( "resource:stop.png" );
				png_pause = new PngData( "resource:pause.png" );
				png_resume = new PngData( "resource:resume.png" );
				png_up = new PngData( "resource:up.png" );
				png_down = new PngData( "resource:down.png" );
				png_on = new PngData( "resource:on.png" );
				png_off = new PngData( "resource:off.png" );
			}catch(Exception e){}
			b_x =	png_start.getWidth();
			b_y =	png_start.getHeight();
			bm_x =	png_up.getWidth();
			bm_y =	png_down.getHeight();
			g_player = new PngPlayer();
		}

		public void run(){		/*/-----メインループ-----/*/
			while( true ){
				try{
					Thread.sleep( 100 );
				}catch( Exception e ){}
				repaint();
			}
		}

		public void paint(Graphics g){			/*/-----背景、文字の表示、ボタン、フォーカスの表示-----/*/
			
			int	h_font=g.getFont().getHeight();		//文字の高さ

			/*/-----ボタンのサイズ初期化-----/*/
			button1[2] = b_x;
			button1[3] = b_y;
			button2[0] = button1[0];
			button2[1] = button1[1]+button1[3]+5;
			button2[2] = b_x;
			button2[3] = b_y;

			/*/-----背景表示-----/*/
			g.setColor( 0x00FFFFFF );
			g.fillRect( 0, 0, WI, HE );
			

			/*/-----リピートの表示-----/*/
			g.setColor( 0x00000000 );
			if(s_player.getState() == MediaPlayer.READY){
				str="リピート";
				g.drawString( str, 50, button2[2]+30, Graphics.TOP|Graphics.LEFT);
				if( repeater ) g_player.setData( png_on );
				else g_player.setData( png_off );
				g_player.setBounds( 80+bm_x+3, button2[2]+30-4, bm_x, bm_y);
				g_player.play();
			}
			else {
				if( repeater ) str = "リピート On";
				else str = "リピート Off";
				g.drawString( str, 50, button2[2]+30, Graphics.TOP|Graphics.LEFT);
			}

			/*/-----文字の表示-----/*/
			str = "音量";
			g.drawString( str, 50, button2[2]+30+h_font+10, Graphics.TOP|Graphics.LEFT);
			str = String.valueOf(s_player.getVolume());
			g.drawString( str, 75, button2[2]+30+h_font+10, Graphics.TOP|Graphics.LEFT);
			str = "変調";
			g.drawString( str, 50, button2[2]+30+h_font*2+20, Graphics.TOP|Graphics.LEFT);
			str = String.valueOf(s_player.getTranspose());
			g.drawString( str, 75, button2[2]+30+h_font*2+20, Graphics.TOP|Graphics.LEFT);

			/*/-----＋−ボタンの表示-----/*/
			g_player.setData( png_down );
			g_player.setBounds( 10,button2[2]+30+h_font+6, bm_x, bm_y );
			g_player.play();
			g_player.setBounds( 10,button2[2]+30+h_font*2+16, bm_x, bm_y );
			g_player.play();
			
			g_player.setData( png_up );
			g_player.setBounds( 80+bm_x+3 ,button2[2]+30+h_font+6, bm_x, bm_y );
			g_player.play();
			g_player.setBounds( 80+bm_x+3 ,button2[2]+30+h_font*2+16, bm_x, bm_y );
			g_player.play();

	
			/*/-----フォーカスの表示-----/*/		
			g.setColor( 0x000000FF );
			if(l_r) r_shift = bm_x+3+70;
			else r_shift = 0;
			switch( select ){
				case 0:
					g.drawRect( button1[0]-1, button1[1]-1,	button1[2]+1, button1[3]+1);
					break;
				case 1:
					g.drawRect( button2[0]-1, button2[1]-1,	button2[2]+1, button2[3]+1);
					break;
				case 2:
					g.drawRect( 80+bm_x+3 -1, button2[2]+30-4-1, bm_x+1, bm_y+1);
					break;
				case 3:
					g.drawRect( 10-1+r_shift, button2[2]+30+h_font+6-1, bm_x+1, bm_y+1);
					break;
				case 4:
					g.drawRect( 10-1+r_shift, button2[2]+30+h_font*2+16-1, bm_x+1, bm_y+1);
					break;
			}

			/*/-----ボタンの表示-----/*/		
			switch( form ){
				case 0: g_player.setData( png_start );break;
				case 1: g_player.setData( png_pause );break;
				case 2: g_player.setData( png_resume );break;		
			}
			g_player.setBounds( 10, 10, b_x, b_y);
			g_player.play();
			if( form != 0 ){
				g_player.setData( png_stop );
				g_player.setBounds( 10, 10+ b_y +5, b_x, b_y);
		   		g_player.play();
			}
		}


		public void keyPressed( int s ) {		/*/-----キーが押された時の処理-----/*/
			switch( s ){
				case Canvas.FIRE:
					if(select==0 || select==1){	/*/-----再生関係の処理-----/*/
						switch( form ){
							case 0:
								form=1;
								if( repeater ) s_player.play( true );
								else s_player.play();
								break;
							case 1:
								if( select==0 ){ s_player.pause();form=2; }
								else { s_player.stop();form=0; }
								break;
							case 2:
								if( select==0 ){ s_player.resume();form=1; }
								else { s_player.stop();form=0; }
								break;
						}
						select=0;
					}
					else if( select==2 ){			/*/-----リピートの処理-----/*/
						repeater =repeater ? false : true;
					}
					else if( select==3 ){	
						if( l_r ){				/*-----ボリュームUP-----*/
							int i = s_player.getVolume();
							if(i >= 107) s_player.setVolume( 127 );
							else s_player.setVolume( i+20 );
						}
						else {				/*-----ボリュームDOWN-----*/
							int i = s_player.getVolume();
							if(i <= 19) s_player.setVolume( 0 );
							else s_player.setVolume( i-20 );
						}
					}
					else if( select==4 ){	
						if( l_r ){			/*-----調UP-----*/
							int i = s_player.getTranspose();
							if(i >= 12) s_player.setTranspose( 12 );
							else s_player.setTranspose( ++i );
						}
						else {				/*-----調DOWN-----*/
							int i = s_player.getTranspose();
							if(i <= -12)s_player.setTranspose( -12 );
							else s_player.setTranspose( --i );
						}
					}
					break;
				case Canvas.UP:				/*/-----フォーカスの移動-----/*/
					select--;
					if(s_player.getState() != MediaPlayer.READY && select==2) select=1;
					if(form==0 && select==1) select=0;
					if(select < 0) select=4;
					break;
				case Canvas.DOWN:
					select++;
					if(form==0 && select==1) select=2;
					if(s_player.getState() != MediaPlayer.READY && select==2) select=3;
					if(select > 4) select=0;	
					break;
				case Canvas.RIGHT:			/*/-----ボリュームフォーカスの移動-----/*/
				case Canvas.LEFT:
					l_r = l_r ? false : true ;
					break;
			}
			repaint();
		}
	}
}

