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