import com.nttdocomo.ui.*;
import com.nttdocomo.util.*;
import com.nttdocomo.io.*;
import com.nttdocomo.net.*;
import javax.microedition.io.*;
import java.io.*;
import java.util.*;

public class Remote extends IApplication{
	public void start(){
	AuthPanel Auther=new AuthPanel(this);//認証画面を表示
	while(Auther.key == 0){//認証が完了するまで無限ループ
	}
	MainCanvas pict=new MainCanvas();//デスクトップ画面用の読み込み
	Display.setCurrent(pict);//表示
	pict.timer.start();//タイマーをスタート
	}
}

//------------------------------------  
//画面表示からキーの動作を行うクラス 
//------------------------------------
class MainCanvas extends Canvas{
HttpAcess httpAc=new HttpAcess();//ネットワーク新規作成
ShortTimer timer=ShortTimer.getShortTimer(this,0,150,true);//150m秒に一回イベント再実行
int pc_x=1280,pc_y=768;//デスクトップの画面サイズ　今の段階では固定推奨
int mb_x=240,mb_y=240;//携帯の画面サイズ　今の段階では固定推奨
int x=0,y=0;//基本座標
int xx=0,yy=0;//画像座標
int p_x=0,p_y=0;//マウス座標
int drug_x=0,drug_y=0;//ドラッグ開始座標
int interval=1;//マウスの移動距離の幅
MediaImage mediaimage;//イメージを作成
private int keyeventPressed = 0;//キーの初期値
Image[][] image=new Image[5][3];//イメージの格納配列
boolean readOk;//画像が読み込めているか確かめる為のフラグ
boolean intrval=false;//幅ボタンが押されたかどうかのフラグ
Font font = Font.getFont(Font.FACE_MONOSPACE|Font.STYLE_BOLD|Font.SIZE_SMALL);//オリジナルフォント設定
Font dfont=Font.getFont(Font.TYPE_DEFAULT);//標準フォント
String inputText="";//初期テキスト

//------------------------------------  
//リモートデスクトップの初期状態を構成
//------------------------------------
	MainCanvas(){
	setSoftLabel(SOFT_KEY_1,"END");//左ソフトボタンにキー登録
	setSoftLabel(SOFT_KEY_2,"幅");//右ソフトボタンにキー登録
	setBackground(Graphics.getColorOfName(Graphics.WHITE));//背景を白で塗りつぶし、画面初期化
	httpAc.send("actions=move&x="+0+"&y="+0,"MouseCtrl.cgi");//デスクトップの最新情報を得る為のテスト
	for(int h=1;h<5;h++){//縦4横3枚、計12枚の画像を読みこみ
		for(int d=0;d<3;d++){
		readOk = httpAc.mediaDL("screen_"+h+""+d+".gif");//画像のDL
		if(readOk) readOk=httpAc.save(httpAc.data);//正常にDL完了すれば、スクラッチパッドに保存
		mediaCreate(readOk,httpAc.length,h,d);//スクラッチパッドから読み込み
		}
	}

	}

//------------------------------------  
//スクラッチパッドから画像を読み込む 
//------------------------------------
	public void mediaCreate(boolean rq,int leng,int h,int d){
	byte[] data = null;
	InputStream in = null;
	int size=leng;
       	if(rq){
       		try{
			in = Connector.openInputStream("scratchpad:///0;pos=0");
			data = new byte[size];
       			in.read(data, 0, size);
			mediaimage=MediaManager.getImage(data);
			in.close();
		}catch(Exception e) {
		}finally {
			try{		
				mediaimage.use();
				}catch(ConnectionException ce){
				rq=false;
				}
			if(rq)image[h][d]=mediaimage.getImage();
		}
	}
	}

//------------------------------------""
//画像、文字列を全てを画面に描画 
//------------------------------------
	public void paint(Graphics g){
		g.lock(); 
	for(int h=1;h<5;h++){
		for(int d=0;d<3;d++){
		g.drawImage(image[h][d],xx+320*(h-1),yy+320*d);
		}
	}
		g.fillArc(p_x,p_y,10,10,0,360);
		//g.drawString("("+x+","+y+")",100,60);
		if(intrval){
		String itl="(interval:"+interval+")";//インターバルの文字列
		int under=font.getDescent();
		int f_width=font.stringWidth(itl);
		int f_height=font.getAscent()+under;
		g.setColor(Graphics.getColorOfRGB(255,255,255));//色設定をセット
		g.fillRect(mb_x-f_width,mb_y-f_height,f_width,f_height);
		g.setColor(Graphics.getColorOfRGB(0,0,0));
		g.setFont(font);//フォント設定をセット
		g.drawString(itl,mb_x-f_width,mb_y-under);
		g.setFont(dfont);
		}
		g.unlock(true); 
	}
	
//------------------------------------//------------------------------------
//キーが押された時のイベント郡 
//------------------------------------//------------------------------------
	public void processEvent(int type,int param){
	boolean flag=false;
	int keyed=getKeypadState();
		if(type==Display.KEY_RELEASED_EVENT){
			if(param==Display.KEY_SOFT1){
				(IApplication.getCurrentApp()).terminate();
			}
			if(param==Display.KEY_SOFT2){
				switch(interval){
				case 1:interval=5;
					break;
				case 5:interval=10;
					break;
				case 10:interval=15;
					break;
				case 15:interval=20;
					break;
				case 20:interval=1;
					break;
				}
			intrval=true;
			}else{
			intrval=false;
			}
			if(param==Display.KEY_4){
			setdrug(x,y);
			}
			if(param==Display.KEY_6){
				httpAc.send("actions=drug&x="+drug_x+"&y="+drug_y+"&z="+x+"&w="+y,"MouseCtrl.cgi");
				flag=true;
			}
			if(param==Display.KEY_1){
				httpAc.send("actions=Lclick&x="+x+"&y="+y,"MouseCtrl.cgi");
				flag=true;
			}
			if(param==Display.KEY_3){
				httpAc.send("actions=Rclick&x="+x+"&y="+y,"MouseCtrl.cgi");
				flag=true;
			}
			if(param==Display.KEY_5){
				httpAc.send("actions=keytype&text="+inputText,"MouseCtrl.cgi");
				flag=true;
			}
			if(param==Display.KEY_SELECT){
				httpAc.send("actions=Dclick&x="+x+"&y="+y,"MouseCtrl.cgi");
				flag=true;
			}
			if(param==Display.KEY_0){
			imeOn(inputText,TextBox.DISPLAY_ANY,TextBox.KANA);
			}
			if(((1<<Display.KEY_UP)&keyed)>0){ 
				if(y>=0){
				y=y-interval;
				set_mouse_p(x,y);
				if(y<0) y=0;
				}
				if(yy<0 && y<pc_y-mb_y/2){
				yy=mb_y/2-y;
				if(yy>=0) yy=0;
				}
			}
			if(((1<<Display.KEY_DOWN)&keyed)>0){
				if(y+interval<=pc_y){
				y=y+interval;
				set_mouse_p(x,y);
				if(y>pc_y) y=pc_y;
				}
				if(y>mb_y/2 && y<=pc_y-mb_y/2){
				yy=mb_y/2-y;
				if(y>=pc_y-mb_y/2) yy=-1*(pc_y-mb_y);
				}else{
				if(y>=pc_y-mb_y/2) yy=-1*(pc_y-mb_y);
				}
				
			}
			if(((1<<Display.KEY_LEFT)&keyed)>0){
				if(x>=0){
				x=x-interval;
				set_mouse_p(x,y);
				if(x<=0) x=0;
				}
				if(xx<0 && x<pc_x-mb_x/2){
				xx=mb_x/2-x;
				if(xx>=0) xx=0;
				}
			}
			if(((1<<Display.KEY_RIGHT)&keyed)>0){ 
				if(x<=pc_x){
				x=x+interval;
				set_mouse_p(x,y);
				if(x>pc_x) x=pc_x;
				}
				if(x>mb_x/2 && x<=pc_x-(mb_x/2)){
				xx=mb_x/2-x;
				if(x>=pc_x-mb_x/2) xx=-1*(pc_x-mb_x);
				}else{
				if(x>=pc_x-mb_x/2) xx=-1*(pc_x-mb_x);
				}
			}
		if(flag){
			for(int h=1;h<5;h++){
				for(int d=0;d<3;d++){
				readOk = httpAc.mediaDL("screen_"+h+""+d+".gif");
				if(readOk) readOk=httpAc.save(httpAc.data);
				if(readOk) mediaCreate(readOk,httpAc.length,h,d);
				}
			}
		}
		repaint();
	}
//------------------------------------  
//テキストイベントが呼ばれた時に使う// 
//------------------------------------
	public void processIMEEvent(int type,String text){
	inputText=text;
	}

//------------------------------------  
//マウスポインターの移動制限 
//------------------------------------
	public void set_mouse_p(int x,int y){
		if(x<=mb_x/2){
		p_x=x;
		if(p_x>=mb_x/2) p_x=mb_x/2;
		if(p_x<=0) p_x=0;
		}
		if(x>=pc_x-mb_x/2){ 
		p_x=Math.abs(pc_x-x-mb_x/2)+mb_x/2;
		if(p_x>=mb_x) p_x=mb_x-10;
		if(p_x<=mb_x/2) p_x=mb_x/2;
		}
		if(y<=mb_y/2){
		p_y=y;
		if(p_y>=mb_y/2) p_y=mb_y/2;
		if(p_y<=0) p_y=0;
		}
		if(y>=pc_y-mb_y/2){ 
		p_y=Math.abs(pc_y-y-mb_y/2)+mb_y/2;
		if(p_y>=mb_y) p_y=mb_y-10;
		if(p_y<=mb_y/2) p_y=mb_y/2;
		}
	}

//------------------------------------  
//ドラッグ開始位置を保存 
//------------------------------------
	public void setdrug(int x,int y){
	drug_x=x;
	drug_y=y;
	}
}
