//
/* ---------------------------------------------------------------------------------------------- jisx0208.java JIS漢字コード ver. 2.00 (JDK 1.02) ueyama@infonet.co.jp 1998.10.03 update: 2007.06.26 ---------------------------------------------------------------------------------------------- */ import java.applet.Applet; import java.awt.*; import java.lang.Math; import java.util.*; public class jisx0208 extends Applet implements Runnable { int Ph =20; int Ofsx= 40, Ofsy= 40; // コード表左上の座標 int Cx =320, Cy =320; // コード表サイズ int Mx = 99, My = 99; // コード表のマウスクリック値 (0 〜 15) int Dx = 0, Dy = 0; // マウスドラッグ値 int Dx0 =385, Dy0 = 91; // コード表エリア左上の座標 int Bx[]={465, 465, 436, 494, 370, 465}; // ボタン表示 X座標 0:↑ 1:↓ 2:← 3:→ int By[]={287, 338, 313, 313, 338, 313}; // ボタン表示 Y座標 4: Clr 5: Run/Stop int Wait=1024; Image Tbl, Img; Thread th=null; boolean Run=false; boolean Mov=false; // true: 早送りモード int Dir=0; // 0:↑ 1:↓ 2:← 3:→ Graphics gx,gr; public void start() { if(th==null) { th=new Thread(this); th.start(); } } public void update(Graphics g) { paint(g); } public void init() { String bg=getParameter("BgColor"); int c=Integer.valueOf(bg,16).intValue(); setBackground(new Color(c)); gr=getGraphics(); MediaTracker mt=new MediaTracker(this); Tbl=getImage(getCodeBase(), getParameter("figure0")); mt.addImage(Tbl, 0); Img=getImage(getCodeBase(), getParameter("figure1")); mt.addImage(Img, 0); try { mt.waitForID(0); } catch(InterruptedException e){}; } public boolean inside(int n, int a, int b) { return (n<=Math.max(a,b) && n>=Math.min(a,b)) ? true:false; } public void dsp_b(int x, int y, int f, int v, int c) // ボタンの表示 { int ox=0, oy=0, w=0, h=0; switch(c) { case 0: w= 13; h= 14; ox= 0; oy= 0; break; // 16進数 case 1: w= 11; h= 14; ox=208; oy= 0; break; // 2進数 & () case 2: w= 65; h= 14; ox=202; oy= 14; break; // "CODE=" case 3: w= 26; h= 23; ox=202; oy= 28; break; // ボタン case 4: w= 15; h= 94; ox=280; oy= 0; break; // "第1バイト" case 5: w= 94; h= 15; ox=202; oy=189; break; // "第2バイト" case 6: w=202; h=199; ox= 0; oy= 14; break; // コード表図 } gx=gr.create(); gx.clipRect(x,y,w,h); gx.drawImage(Img,x-(ox+f*w),y-(oy+v*h),this); gx.dispose(); } public void dsp_tbl(int x, int y, int f, int v, int c) // コード表の表示 { int ox=0, oy=0, w=0, h=0; switch(c) { case 0: w=321; h=321; ox= 20; oy= 20; break; // コード表の表示 case 1: w=321; h= 21; ox= 20; oy= 0; break; // 上部見出しの表示 case 2: w= 21; h=321; ox= 0; oy= 20; break; // 左見出しの表示 } gx=gr.create(); gx.clipRect(x,y,w,h); gx.drawImage(Tbl,x-(ox+f*Ph),y-(oy+v*Ph),this); gx.dispose(); } public void dsp_code(int x, int y, boolean b) // コードの表示 { int i; String bin,bx,by, hex; gr.clearRect(0,size().width-213,360,30); dsp_b(24,374,0,0,2); // "CODE=" の表示 hex=Integer.toString(y+33+Dy,16)+Integer.toString(x+33+Dx,16); // 16進数 for(i=3; i>=0; i--) dsp_b(94+13*i,374,Integer.parseInt(hex.substring(i,i+1),16),0,0); // 16進数の表示 if(b) // コードを2進数で表示 { bx=Integer.toString(x+33+Dx,2); // コードの表示 by=Integer.toString(y+33+Dy,2); for(i=bx.length(); i<8; i++) bx="0"+bx; // 上位の 0 をつけて8桁の2進数に for(i=by.length(); i<8; i++) by="0"+by; bin="2"+by+"4"+bx+"3"; // カッコ(2,3)やスペース(4)を加える for(i=18;i>=0;i--) dsp_b(150+11*i,374,Integer.parseInt(bin.substring(i,i+1)),0,1); // 2進数の表示 } } public void paint(Graphics g) { int i, j, m=0; if(Run) { g.clearRect(0,0,size().width-213,size().height); // コード表のクリア g.clearRect(Dx0,Dy0,186,186); } else { g.clearRect(0,0,size().width,size().height); for(i=0; i<6; i++) // ボタンの表示 { if(i==0 && Dy==0 || i==1 && Dy==78 || i==2 && Dx==0 || i==3 && Dx==78 || i==4 && Mx==99) m=2; else m=0; j=(i==5 && Mov)?i+1:i; dsp_b(Bx[i], By[i], m,j,3); } } g.setColor(new Color(247,247,208)); // 表の見出しの色 g.fillRect(Ofsx,21,Cx,Ph); g.fillRect(21,Ofsy,Ph,Cy); if(Mx<16 && My<16) { g.setColor(new Color(240,240,192)); // クリックされた行・列の色 g.fillRect(Ofsx,Ofsy+My*Ph,Cx,Ph); g.fillRect(Ofsx+Mx*Ph,Ofsy,Ph,Cy); g.setColor(new Color(224,224,176)); // クリックされた行・列の見出しの色 g.fillRect(21,Ofsy+My*Ph,Ph,Ph); g.fillRect(Ofsx+Mx*Ph,21,Ph,Ph); g.setColor(new Color(208,208,144)); // クリックされた行・列の色 g.fillRect(Ofsx+Mx*Ph,Ofsy+My*Ph,Ph,Ph); dsp_code(Mx, My, true); } g.setColor(new Color(200,200,168)); // コード表エリアの表示 g.fillRect(Dx0+Dx*2,Dy0+Dy*2,32,32); dsp_b(Ofsx-Ph*2+1,Ofsy, 0, 0, 4); // 「第1バイト」の表示 dsp_b(Ofsx,Ofsy-Ph*2+1, 0, 0, 5); // 「第2バイト」の表示 dsp_b(Dx0-14,Dy0-11, 0, 0, 6); // コード表図の表示 dsp_tbl(Ofsx, Ofsy-Ph, Dx, 0, 1); // 上部見出しの表示 dsp_tbl(Ofsx-Ph, Ofsy, 0, Dy, 2); // 左見出しの表示 dsp_tbl(Ofsx, Ofsy, Dx, Dy, 0); // コード表(詳細)の表示 } public boolean area_chk(int n) { boolean f=true; if(n==0) Dy--; if(Dy<0) {Dy=0; f=false;} if(n==1) Dy++; if(Dy>78){Dy=78; f=false;} if(n==2) Dx--; if(Dx<0) {Dx=0; f=false;} if(n==3) Dx++; if(Dx>78){Dx=78; f=false;} return f; } public void run() { while(true) { if(Run) { Run=area_chk(Dir); repaint(); } try { Thread.sleep(Wait); } catch (InterruptedException e){} Wait=64; } } public boolean mouseDown(Event e, int mx, int my) // マウスをクリック { int i; boolean f=true; if(inside(mx,Ofsx,Ofsx+Cx) && inside(my,Ofsy,Ofsy+Cy)) // コード表をクリック { Mx=(mx-Ofsx)/Ph; My=(my-Ofsy)/Ph; repaint(); } if(inside(mx,Dx0,Dx0+188) && inside(my,Dy0,Dy0+188)) // コード表エリアをクリック { Dx=(mx-Dx0-16)/2; Dy=(my-Dy0-16)/2; area_chk(-1); repaint(); } for(i=0; i<6; i++) { if(inside(mx,Bx[i],Bx[i]+26) && inside(my,By[i],By[i]+23)) // ボタンをクリック { if(i<4) { f=area_chk(i); if(Mov) Run=true; } if(i==4 && Mx<16 && My<16) {Mx=99; My=99;} // Clr ボタン if(i==5) Mov=!Mov; // Run/Stop ボタン if(f) { dsp_b(Bx[i],By[i], 1,(i==5 && !Mov)?i+1:i, 3); // ボタンを緑で表示 Dir=i; } } } return true; } public boolean mouseDrag(Event e, int mx, int my) // マウスをドラッグ { if(inside(mx,Dx0,Dx0+188) && inside(my,Dy0,Dy0+188)) { Dx=(mx-Dx0-16)/2; Dy=(my-Dy0-16)/2; area_chk(-1); repaint(); } return true; } public boolean mouseMove(Event e, int mx, int my) // マウスをコード表の中で移動 { if(inside(mx,Ofsx,Ofsx+Cx) && inside(my,Ofsy,Ofsy+Cy) && Mx==99 && My==99) { dsp_code((mx-Ofsx)/Ph, (my-Ofsy)/Ph, false); // コード(16進数)を表示 } return true; } public boolean mouseUp(Event e, int mx, int my) // マウスのクリックを離す { if(Mov) Run=false; Wait=1024; repaint(); return true; } public void stop() { if(th!=null) { th.stop(); th=null; } } } //戻る