//
/* ----------------------------------------------------------------------------------------------
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;
}
}
}
//戻る