//
/* ----------------------------------------------------------------------------------------------
shiftjis.java シフトJIS漢字コード ver. 2.00 (JDK 1.02)
ueyama@infonet.co.jp 1999.04.04
update: 2007.06.11
---------------------------------------------------------------------------------------------- */
import java.applet.Applet;
import java.awt.*;
public class shiftjis extends Applet implements Runnable
{
int X0=32, Y0=27; // 漢字コード表原点
int Jx0=98,Jy0=93, Jx1=287, Jy1=282; // 漢字コード 2121〜8080 の位置
int Sx0=161, Sy0=286, Sx1=539, Sy1=348; // シフトJIS漢字コード 8140〜A0FC の位置
int Sy2=476, Sy3=508; // シフトJIS漢字コード E0〜F0 の位置
int J8x=568, J8y=259; // JIS コード表原点
// Btn: <| △ |> ▽ |> << >>
int Bx[]={651, 680, 680, 680, 709, 580, 609}; // ボタン表示 X座標
int By[]={491, 465, 491, 517, 491, 491, 491}; // ボタン表示 Y座標
String Jis="3021", Sjis="889f", Jis0="0000", Sjis0="0000";
TextField Code=new TextField(Jis, 8);
boolean Cj=true; // true: JIS, false: S-JIS
Graphics gr;
boolean Run=false;
int Wait=256;
int Bgc;
Image Img, Tbl;
Thread th=null;
public void init()
{
String bg=getParameter("BgColor");
Bgc=Integer.valueOf(bg,16).intValue();
setBackground(new Color(Bgc));
MediaTracker mt=new MediaTracker(this);
Img=getImage(getCodeBase(), getParameter("figure")); // Applet用 GIF画像ファイル
mt.addImage(Img, 0);
Tbl=getImage(getCodeBase(),getParameter("letter")); // JIS X 0208 文字コード表
mt.addImage(Tbl, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
gr=getGraphics();
setLayout(null);
add(Code);
Code.reshape(680,117,44,22); // TextField の表示
}
public void start()
{
if(th==null)
{
th=new Thread(this);
th.start();
}
}
public boolean inside(int x, int a, int b)
{
return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
}
public void sjis2jis() // Shift JIS -> JIS 変換
{
Integer c=Integer.valueOf(Sjis, 16);
int c1=c.intValue()/256, c2=c.intValue()%256;
if(c1<0xa0) c1-=0x70;
else if(c1<0xf0)c1-=0xb0;
else
{
Jis=Integer.toString(c1*256+c2,16);
return;
}
if(c2>=0x80) c2--;c1*=2;
if(c2>=0x9e) c2-=0x5e; else c1--;
c2-=0x1f;
Jis=Integer.toString(c1*256+c2,16);
}
public void jis2sjis() // JIS -> Shift JIS 変換
{
Integer c=Integer.valueOf(Jis, 16);
int c1=c.intValue()/256, c2=c.intValue()%256;
if((c1 & 1)==1)
{
c2+=0x1f;
if(c2>=0x7f) c2++;
}
else c2+=0x7e;
c1=(c1-0x20-1)/2+0x81;
if(c1>=0xa0) c1+=0x40;
Sjis=Integer.toString(c1*256+c2,16);
}
public void inc_dec(boolean low, boolean inc) // Code の Inc, Dec
{
String u=Jis.substring(0,2), l=Jis.substring(2);
Integer i=Integer.valueOf((low)?u:l, 16), k;
int c=i.intValue(), d=(inc)?1:-1, p;
if(inc && c<0x7e || !inc && c>0x21) c+=d;
else
{
c=(inc)? 0x21:0x7e;
if(!low)
{
k=Integer.valueOf(Jis.substring(0,2), 16);
p=k.intValue(); p++;
u=Integer.toString(p,16);
}
}
if(low) Jis=Integer.toString(c,16)+l;
else Jis=u+Integer.toString(c,16);
jis2sjis();
}
public void dsp_g(int x, int y, int f, int v, int c) // 図や文字を描く
{
Graphics gx=gr.create();
int w=0, h=0, ox=0, oy=0;
switch(c)
{
case 0: w=545; h=540; ox= 0; oy= 0; break; // 漢字コード表
case 1: w=205; h=218; ox=545; oy= 0; break; // コード表 (JIS X 0201)
case 2: w= 13; h= 14; ox=545; oy=218; break; // 16進数(文字コード用)
case 3: w= 26; h= 23; ox=545; oy=274; break; // ボタン(移動用)
case 4: w= 26; h= 23; ox=623; oy=274; break; // ボタン(RUN, STOP用)
case 5: w=109; h= 11; ox=545; oy=366; break; // 文字(JIS漢字コード、他)
case 6: w= 43; h= 11; ox=545; oy=410; break; // 文字(JIS, S-JIS)
}
gx.clipRect(x,y,w,h);
gx.clearRect(x,y,w,h);
gx.drawImage(Img, x-(ox+f*w), y-(oy+v*h), this);
gx.dispose();
}
public void dsp_i()
{
int i, m, x, y;
Integer c=Integer.valueOf(Jis, 16);
Graphics gx=gr.create();
x=c.intValue()%256-33; y=c.intValue()/256-33;
gr.clearRect(680,198,16,16);
gx.clipRect(680,198,16,16);
gx.drawImage(Tbl,680-x*16,198-y*16,this); // 文字の表示
gx.dispose();
del_dot();
dsp_jdot(Jis); // 漢字コード表の位置表示
dsp_jdot(Sjis);
dsp_r(Jis); // JISコード表に色をつける
dsp_r(Sjis);
gr.clearRect(680,151,52,38);
for(i=0; i<4; i++) // JIS コードの表示
{
m=Integer.parseInt(Jis.substring(i,i+1),16);
dsp_g(680+i*14,151,m,i/2,2);
}
for(i=0; i<4; i++) // Shift JIS コードの表示
{
m=Integer.parseInt(Sjis.substring(i,i+1),16);
dsp_g(680+i*14,175,m,i/2+2,2);
}
Jis0=Jis; Sjis0=Sjis;
}
public void dsp_r(String s) // JISコード表に色をつける
{
int x,y, u,l;
Integer c=Integer.valueOf(s, 16);
u=(c.intValue()/256); l=c.intValue()%256;
x=u%16*12+J8x; y=u/16*12+J8y;
gr.setXORMode(new Color(Bgc));
if(u<128) gr.setColor(new Color(51,102,255));
else gr.setColor(new Color(255,51,153));
gr.fillRect(x,y,11,11);
x=l%16*12+J8x; y=l/16*12+J8y;
if(u<128) gr.setColor(new Color(204,204,255));
else gr.setColor(new Color(255,204,230));
gr.fillRect(x,y,11,11);
gr.setPaintMode();
}
public void dsp_jdot(String s) // 漢字の位置表示
{
Integer i,j;
i=Integer.valueOf(s.substring(0,2),16); j=Integer.valueOf(s.substring(2),16);
gr.setXORMode(new Color(Bgc));
gr.setColor((i.intValue()<128)? new Color(51,51,255): new Color(255,51,51));
gr.drawOval(j.intValue()*2+X0-4, i.intValue()*2+Y0-4, 10, 10);
gr.fillRect(j.intValue()*2+X0, i.intValue()*2+Y0, 3, 3);
gr.setPaintMode();
}
public void del_dot()
{
if(Jis0!="0000")
{
dsp_jdot(Jis0); // 漢字コード表の位置表示
dsp_jdot(Sjis0);
dsp_r(Jis0); // JISコード表に色をつける
dsp_r(Sjis0);
}
}
public void paint(Graphics g)
{
g.clearRect(0,0,size().width,size().height);
dsp_g(0,0,0,0,0); // 漢字コード表
dsp_g(555,233,0,0,1); // コード表 (JIS X 0201)
dsp_g(555,123,0,0,5); // "文字コード"
dsp_g(555,152,0,1,5); // "JIS 漢字コード"
dsp_g(555,176,0,2,5); // "シフトJIS 漢字コード"
dsp_g(555,200,0,3,5); // "文字データ"
dsp_g(Bx[0],By[0],0,1,3); // ボタン <| の表示
dsp_g(Bx[1],By[1],0,3,3); // ボタン △ の表示
dsp_g(Bx[2],By[2],0,(Run)?3:2,4); // ボタン |> の表示
dsp_g(Bx[3],By[3],0,2,3); // ボタン ▽ の表示
dsp_g(Bx[4],By[4],0,0,3); // ボタン |> の表示
dsp_g(Bx[5],By[5],0,1,4); // ボタン << の表示
dsp_g(Bx[6],By[6],0,0,4); // ボタン >> の表示
del_dot();
dsp_i();
}
public void run()
{
while(th!=null)
{
if(Run)
{
inc_dec(false, true);
dsp_i();
}
try
{
th.sleep(Wait);
}
catch (InterruptedException e){};
}
}
public boolean mouseDown(Event e, int mx, int my)
{
int i,m, x=(mx-X0+1)/2, y=(my-Y0+1)/2;
boolean f=false;
if(inside(mx,Jx0,Jx1) && inside(my,Jy0,Jy1)) // JIS コード
{
f=true;
Jis=Integer.toString(y*256+x,16);
jis2sjis();
}
if(inside(mx,Sx0,Sx1) && (inside(my,Sy0,Sy1) || inside(my,Sy2,Sy3))) // Shift JIS コード
{
f=true;
Sjis=Integer.toString(y*256+x,16);
sjis2jis();
}
if(inside(mx,566,749) && my>=465) // ボタンをクリック
{
f=true;
for(i=0; i<7; i++) if(inside(mx,Bx[i],Bx[i]+26) && inside(my,By[i],By[i]+23)) break;
switch(i)
{
case 0: dsp_g(Bx[0],By[0],1,1,3); inc_dec(false, false); f=true; break; // 左へ
case 1: dsp_g(Bx[1],By[1],1,3,3); inc_dec(true, false); f=true; break; // 上へ
case 2: dsp_g(Bx[2],By[2],1,(Run)?3:2,4); Run=!Run; break; // RUN
case 3: dsp_g(Bx[3],By[3],1,2,3); inc_dec(true, true); f=true; break; // 下へ
case 4: dsp_g(Bx[4],By[4],1,0,3); inc_dec(false, true); f=true; break; // 右へ
case 5: dsp_g(Bx[5],By[5],1,1,4); Wait*=2; break; // 減速
case 6: if(Wait>64){dsp_g(Bx[6],By[6],1,0,4); if(Wait>64) Wait/=2;} break; // 加速
}
}
if(f) dsp_i();
return true;
}
public boolean mouseUp(Event e, int mx, int my)
{
int i,m, x=(mx-X0+1)/2, y=(my-Y0+1)/2;
if(inside(mx,566,749) && my>=465) // ボタンをクリック
{
for(i=0; i<7; i++) if(inside(mx,Bx[i],Bx[i]+26) && inside(my,By[i],By[i]+23)) break;
switch(i)
{
case 0: dsp_g(Bx[0],By[0],0,1,3); break; // 左へ
case 1: dsp_g(Bx[1],By[1],0,3,3); break; // 上へ
case 2: dsp_g(Bx[2],By[2],0,(Run)?3:2,4); break; // RUN
case 3: dsp_g(Bx[3],By[3],0,2,3); break; // 下へ
case 4: dsp_g(Bx[4],By[4],0,0,3); break; // 右へ
case 5: dsp_g(Bx[5],By[5],0,1,4); dsp_g(Bx[6],By[6],0,0,4); break; // 減速
case 6: dsp_g(Bx[6],By[6],(Wait>64)?0:2,0,4); break; // 加速
}
}
return true;
}
public boolean action(Event e, Object o)
{
if(e.target instanceof TextField)
{
String c=Code.getText();
Integer u=Integer.valueOf(c.substring(0,2),16);
Integer l=Integer.valueOf(c.substring(2),16);
Integer n=Integer.valueOf(c, 16);
int i=u.intValue(), j=l.intValue(), m=n.intValue();
if(inside(m, 8481, 32382)) // 0x2121 〜 0x7e7e (JIS)
{
if(inside(i, 33,126) && inside(j, 33,126))
{
Cj=true;
Jis=c;
jis2sjis();
}
}
if(inside(m, 33088, 61436)) // 0x8140 〜 0xeffc (S-JIS)
{
if((inside(i,129,159) || inside(i,224,239)) && inside(j, 64,252) && j!=127)
{
Cj=false;
Sjis=c;
sjis2jis();
}
}
dsp_i();
}
return true;
}
public void stop()
{
if(th!=null)
{
th.stop();
th=null;
}
}
}
//戻る