import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import com.jblend.media.smaf.phrase .*;

public class TestPhrase extends MIDlet {
	private Display display;
	private View view;

	public TestPhrase () {
		display = Display.getDisplay(this);
	}

	public void startApp(){
		view = new View();
		display.setCurrent(view);
		view.repaint();	
	}
	
	public void pauseApp(){}
	public void destroyApp(boolean unconditional){}

//////////////////////////
/*/-----描画クラス-----/*/
//////////////////////////
	public class View extends Canvas{
		/*/-----フレーズ用必要変数-----/*/
		private PhrasePlayer p_player;
		private Phrase[] p = new Phrase[4];
		private PhraseTrack[] p_tracks =new PhraseTrack[4];

		/*/-----ステータス描画用文字列-----/*/
		private String[] state = new String[4];
		private String[] repeat = new String[4];
		private String[] volume = new String[4];
		private String[] panpot = new String[4];

		private boolean form = false;		//描画状態 false:state+readme true:state+volume&panset
		private int selecting = 0;			//設定中トラック 0:選択なし　1〜4：各トラック選択中
		private int select =0;				//フォーカス	0〜3:トラックの選択中 4:volume 5:panpot
		private boolean[] rpt = new boolean[4];	//各トラックのリピート false:off true:on
		private boolean all_pause = false;	//全トラックのポース false:off true:on
		private int i;						//for分用変数
		private String str;					//drawString用変数

		public View() {
			p_player = PhrasePlayer.getPlayer();	//フレーズプレイヤーの取得
			for( i=0; i<4; i++)
				p_tracks[i]=p_player.getTrack();	//各トラックの取得

			try{		/*/-----フレーズの取得-----/*/
				p[0] = new Phrase("resource:Sample1.spf");
				p[1] = new Phrase("resource:Sample2.spf");
				p[2] = new Phrase("resource:Sample3.spf");
				p[3] = new Phrase("resource:Music_sample.spf");
			}catch(Exception e){}
			for( i=0; i<4; i++)	p_tracks[i].setPhrase(p[i]);	//フレーズを各トラックへ割り当てる
			
			for( i=0; i<4; i++) rpt[i] = false;		//リピート設定の初期化
		}
		
		public void paint (Graphics g) {
			/*/-----トラック必要値の取得-----/*/
			int WI = getWidth(), HE = getHeight();
			int h_font = g.getFont().getHeight();
			for( i=0; i<4; i++){
				/*/-----状態-----/*/
				switch(p_tracks[i].getState()){
					case PhraseTrack.READY:
						state[i] = "Ready";
						break;
					case PhraseTrack.PLAYING:
						state[i] = "Play ";
						break;
					case PhraseTrack.PAUSED:
						state[i] = "Pause";
						break;
					case PhraseTrack.NO_DATA:
						state[i] = "Empty";
						break;
				}

				/*/-----リピート-----/*/
				if(rpt[i])repeat[i] ="R";
				else repeat[i] =" ";

				/*/-----ボリューム-----/*/
				volume[i] = String.valueOf(p_tracks[i].getVolume()); 
				if(volume[i].length() == 2) volume[i] = volume[i] + " ";
				else if(volume[i].length() == 1) volume[i] = volume[i] + "  ";

				/*/-----パンポット-----/*/
				panpot[i] = String.valueOf(p_tracks[i].getPanpot()); 
				if(panpot[i].length() == 2) panpot[i] = panpot[i] + " ";
				else if(panpot[i].length() == 1) panpot[i] = panpot[i] + "  ";
			}
			
			/*/-----背景の描画-----/*/
			g.setColor(0x00FFFFFF);
			g.fillRect( 0, 0, WI, HE);

			/*/-----選択中フォーカスの描画-----/*/
			g.setColor(0x00FFFF00);
			switch(selecting){
				case 0:break;
				case 1:g.fillRect( 0, (h_font+4)*1-1, WI-1, h_font-2);break;
				case 2:g.fillRect( 0, (h_font+4)*2-1, WI-1, h_font-2);break;
				case 3:g.fillRect( 0, (h_font+4)*3-1, WI-1, h_font-2);break;
				case 4:g.fillRect( 0, (h_font+4)*4-1, WI+1, h_font-2);break;
			}

			/*/-----トラック状態の描画-----/*/
			g.setColor(0x00000000);
			str ="  volume panpot";
			g.drawString( str, 50, 0,Graphics.TOP|Graphics.LEFT);
			for( i=0; i<4; i++){
				str = "["+(i+1)+"]" + state[i] + " " + repeat[i] + "  " + volume[i] + "   " + panpot[i];
				g.drawString( str, 5, (h_font+4)*(i+1), Graphics.TOP|Graphics.LEFT);
			}

			/*/-----スライダーの描画-----/*/
			if(form){
				g.setColor(0x00FF0000);
				g.drawRect( 0, (h_font+4)*5-3, WI-1,HE-((h_font+4)*5-3)-1);

				g.setColor(0x00000000);
				str = "Volume";
				g.drawString( str, 10,  (h_font+4)*5, Graphics.TOP|Graphics.LEFT);
				str = "Panpot";
				g.drawString( str, 10,  (h_font+4)*7, Graphics.TOP|Graphics.LEFT);

				g.setColor(0x00BBBBBB);
				g.drawLine( (int)(WI-100)/2, (h_font+4)*6, (int)(WI-100)/2+100, (h_font+4)*6);
				g.drawLine( (int)(WI-100)/2, (h_font+4)*8, (int)(WI-100)/2+100, (h_font+4)*8);

				g.setColor(0x00999999);
				int v_place, p_place;
				v_place=(int)(WI-100)/2+(int)((p_tracks[selecting-1].getVolume()*100)/127);
				p_place=(int)(WI-100)/2+(int)((p_tracks[selecting-1].getPanpot()*100)/127);
				g.drawRect( v_place-2, (h_font+4)*6-5, 5, 10);
				g.drawRect( p_place-2, (h_font+4)*8-5, 5, 10);
			}

			/*/-----操作説明の描画-----/*/
			else {
				g.setColor(0x0000FF00);
				g.drawRect( 0, (h_font+4)*5-3, WI-1,HE-((h_font+4)*5-3)-1);
	
				g.setColor(0x00000000);
				str = "1:start or stop";
				g.drawString( str, 10,  (h_font+4)*5, Graphics.TOP|Graphics.LEFT);
				str = "2:pause or resume";
				g.drawString( str, 10,  (h_font+4)*5 + (h_font)*1, Graphics.TOP|Graphics.LEFT);
				str = "3:repeat on or off";
				g.drawString( str, 10,  (h_font+4)*5 + (h_font)*2, Graphics.TOP|Graphics.LEFT);
				str = "4:all pause or resume";
				g.drawString( str, 10,  (h_font+4)*5 + (h_font)*3, Graphics.TOP|Graphics.LEFT);
				str = "5:all kill or create";
				g.drawString( str, 10,  (h_font+4)*5 + (h_font)*4, Graphics.TOP|Graphics.LEFT);
			}

			/*/-----フォーカスの描画-----/*/
			g.setColor(0x000000FF);
			switch(select){
				case 0:g.drawRect( 0, (h_font+4)*1-1, WI-1, h_font-2);break;
				case 1:g.drawRect( 0, (h_font+4)*2-1, WI-1, h_font-2);break;
				case 2:g.drawRect( 0, (h_font+4)*3-1, WI-1, h_font-2);break;
				case 3:g.drawRect( 0, (h_font+4)*4-1, WI-1, h_font-2);break;
				case 4:g.drawRect( 0, (h_font+4)*5-1, WI-1, h_font-2);break;
				case 5:g.drawRect( 0, (h_font+4)*7-1, WI-1, h_font-2);break;
			}
		}

		public void keyPressed( int s ){
			/*/-----選択中のトラックの取得-----/*/
			int track_n=0;
			if(form)track_n=selecting-1;
			else track_n=select;

			switch(s){
				case Canvas.FIRE:		/*/-----選択-----/*/
					if(form){
						form = false;
						select = selecting-1;
						selecting = 0;
					}
					else{
						form = true;
						selecting = select+1;
						select = 4;
					}
					break;
				case Canvas.DOWN:		/*/-----フォーカスの移動-----/*/
					select++;
					if(form){if(select > 5)select=4;}
					else{if(select > 3)select=0;}
					break;
				case Canvas.UP:
					select--;
					if(form){if(select < 4)select=5;}
					else{if(select < 0)select=3;}
					break;
				case Canvas.RIGHT:	/*/-----スライダーの増加-----/*/
					if(form){
						if(select == 4){
							int track_v;
							track_v = p_tracks[selecting-1].getVolume();
							if(track_v >= 117) p_tracks[selecting-1].setVolume(127);
							else p_tracks[selecting-1].setVolume( track_v+10 );
						}
						
						else if(select == 5){
							int track_p;
							track_p = p_tracks[selecting-1].getPanpot();
							if(track_p >= 117) p_tracks[selecting-1].setPanpot(127);
							else p_tracks[selecting-1].setPanpot( track_p+10 );
						}
					}
					break;
				case Canvas.LEFT:	/*/-----スライダーの減少-----/*/
					if(form){
						if(select == 4){
							int track_v;
							track_v = p_tracks[selecting-1].getVolume();
							if(track_v <= 9) p_tracks[selecting-1].setVolume(0);
							else p_tracks[selecting-1].setVolume( track_v-10 );
							
						}
						else if(select == 5){
							int track_p;
							track_p = p_tracks[selecting-1].getPanpot();
							if(track_p <= 9) p_tracks[selecting-1].setPanpot(0);
							else p_tracks[selecting-1].setPanpot( track_p-10 );
						}
					}
					break;
				case Canvas.KEY_NUM1:	/*/-----Play & Stop-----/*/
					switch(p_tracks[track_n].getState()){
						case PhraseTrack.READY:
							if(rpt[track_n])p_tracks[track_n].play(0);
							else p_tracks[track_n].play();
							break;
						case PhraseTrack.PLAYING:
						case PhraseTrack.PAUSED:
							p_tracks[track_n].stop();
							break;
						default:break;
					}
					break;
				case Canvas.KEY_NUM2:	/*/-----Pause & Resume-----/*/
					switch(p_tracks[track_n].getState()){
						case PhraseTrack.PAUSED:
							p_tracks[track_n].resume();
							break;
						case PhraseTrack.PLAYING:
							p_tracks[track_n].pause();
							break;
						default:break;
					}
					break;
				case Canvas.KEY_NUM3:	/*/-----SetRepeat-----/*/
					if(p_tracks[track_n].getState() == PhraseTrack.READY)
						rpt[track_n] = rpt[track_n] ? false : true;
					break;
				case Canvas.KEY_NUM4:	/*/-----all Pause & Resume-----/*/
					if(all_pause){
						p_player.resume();
						all_pause=false;
					}
					else {
						p_player.pause();
						all_pause=true;
					}
					break;
				case Canvas.KEY_NUM5:	/*/-----all Kill & Create-----/*/
					if(p_tracks[track_n].getState() == PhraseTrack.NO_DATA)
						for( i=0; i<4; i++)	p_tracks[i].setPhrase(p[i]);
					else {
						p_player.kill();
						all_pause=false;
					}
					break;
			}
			repaint();
		}
	}
}