//
/* ----------------------------------------------------------------------------------------------
filesystem.java ファイルシステム ver. 1.00 (JDK 1.02)
ueyama@infonet.co.jp 2000.08.05
---------------------------------------------------------------------------------------------- */
import java.applet.*;
import java.awt.*;
import java.lang.Math;
import java.util.*;
public class filesystem extends Applet
{
int Mx=340, My=5; // メモリデータ表示座標
int Dr=160; // ディスク半径
int Dl[]=new int[26]; // データの長さ
int Dn[]=new int[26]; // データの順序
boolean W[] =new boolean[26]; // true; 保存
boolean F=false; // true; フォーマット済み
int Fat[]=new int[90]; // FAT
int Dc[]={0x00ff66, 0x00cc99, 0x00ffcc, 0x00ccff, 0x33ff66, 0x33cc99,
0x33ffcc, 0x33ccff, 0x66ff66, 0x66cc99, 0x66ffcc, 0x66ccff,
0x99ff66, 0x99cc99, 0x99ffcc, 0x99ccff, 0xccff66, 0xcccc99,
0xccffcc, 0xccccff, 0xffff66, 0xffcc99, 0xffffcc, 0xffccff,
0xff9966, 0xff99ff,0x666666, 0x999999}; // カラーテーブル
int Bgc;
Graphics gr;
Image Img;
Random Rnd=new Random();
public void init()
{
int i,j,k,d;
int n[]=new int[26];
Random rnd=new Random();
String bg=getParameter("BgColor");
Bgc=Integer.valueOf(bg,16).intValue();
setBackground(new Color(Bgc));
gr=getGraphics();
MediaTracker mt=new MediaTracker(this);
Img=getImage(getCodeBase(),"format.gif");
mt.addImage(Img, 0);
try
{
mt.waitForID(0);
}
catch(InterruptedException e){};
k=0;
for(i=0; i<26; i++)
{
Dl[i]=Math.abs(Rnd.nextInt())%350+10;
n[i]=Math.abs(Rnd.nextInt());
W[i]=false;
}
for(i=0; i<26; i++)
{
d=0;
for(j=0; j<26; j++) {if(n[j]>d) {d=n[j]; k=j;}}
n[k]=0; Dn[i]=k;
}
}
public boolean inside(int x, int a, int b)
{
return (x<=Math.max(a,b) && x>=Math.min(a,b)) ? true:false;
}
public void dsp_d(int t, int s, int n) // 保存データの表示
{
int d=Dr*2-t*24-6;
gr.setColor(new Color(Dc[n]));
for(double r=s*24+3.0; r<(s+1)*24-3.0; r+=1.0)
{
int x=t*12+3+(d+(int)(Math.cos(r*3.14159/180.0)*(d-10))-10)/2;
int y=t*12+3+(d-(int)(Math.sin(r*3.14159/180.0)*(d-10))-10)/2;
gr.fillOval(x,y,10,10);
}
}
public void paint(Graphics g)
{
int i=0, j=0, x=0, y=0;
g.setColor(new Color(Dc[27]));
g.fillOval(0, 0, Dr*2, Dr*2);
g.setColor(new Color(Bgc));
g.fillOval(Dr-50, Dr-50, 100, 100);
g.drawImage(Img, Dr-23, Dr-6, this);
if(F) for(i=0;i<90;i++) dsp_d(i/15, i%15, (Fat[i]<0)?26:Dn[Fat[i]]);
for(i=0;i<26;i++)
{
g.setColor(new Color(Dc[(W[i])?27:Dn[i]]));
g.fillRect(Mx, My+12*i, Dl[i], 10);
}
}
public boolean mouseDown(Event e, int mx, int my)
{
int a,i,j,n,s,t,x,y;
double r;
int r2=(Dr-mx)*(Dr-mx)+(Dr-my)*(Dr-my);
if(mx>Mx && inside(my, My, My+310) && F) // Write
{
i=(my-My)/12;
if(inside(mx, Mx, Mx+Dl[i]) && !W[i])
{
n=(int)Math.ceil((float)Dl[i]/48.0);
for(j=0; j<90; j++)
{
if(Fat[j]<0 && n>0)
{
W[i]=true;
gr.setColor(new Color(Dc[27]));
gr.fillRect(Mx, My+12*i, Dl[i], 10);
dsp_d(j/15, j%15, Dn[i]);
Fat[j]=i;
n--;
}
}
}
}
if(mx<=Dr*2 && my<=Dr*2) // Delete or Format
{
if(inside(r2, 85*85, 157*157) && F) // Delete
{
r=Math.sqrt((float)r2);
s=(int)(Math.asin((double)(Dr-my)/r)*180.0/3.14159);
if(mxDr) s=360+s;
s/=24;
t=(Dr-(int)r-85)/12+6;
a=t*15+s; i=Fat[a];
if(i>=0)
{
W[i]=false;
gr.setColor(new Color(Dc[Dn[i]]));
gr.fillRect(Mx, My+12*i, Dl[i], 10);
for(j=0; j<90; j++)
{
if(Fat[j]==i)
{
dsp_d(j/15, j%15, 26);
Fat[j]=-1;
}
}
}
}
if(r2<50*50) // Format
{
for(i=0;i<90;i++)
{
dsp_d(i/15, i%15, 26); Fat[i]=-1;
}
for(i=0; i<26; i++)
{
gr.setColor(new Color(Dc[Dn[i]]));
gr.fillRect(Mx, My+12*i, Dl[i], 10);
W[i]=false;
}
F=true;
}
}
return true;
}
}
// 戻る