/* Free Memory Checker Application/Applet
                Coded By.KeN    Jan.2,1996
*/
import java.awt.*;
import java.lang.Runtime;

public class Memory extends java.applet.Applet {

  MemoryControl controls;   // 後で定義するMemoryControlというクラスを
			    // 使ってオブジェクトcontrolsを作る
  public void init() {
    setLayout( new BorderLayout() ); // 色々なコントロールの位置を決め
				     // る
    MemoryCanvas mc = new MemoryCanvas(); // 後で定義するMemoryCanvas
					  // というクラスを使ってオブ
					  // ジェクトmcを作る
    add( "Center", mc ); // mcは中心に置く
    add( "North", controls = new MemoryControl( mc ) ); // コントロー
							// ルは上部
							// (North)へ
  }
  
  public void start() {
    controls.enable(); // 開始と同時にコントロールが使えるようにする
  }
  
  public void stop() {
    controls.disable(); // 終了と同時にコントロールも使えなくする
  }
  
  public boolean handleEvent( Event evt ) {
    if ( evt.id == Event.WINDOW_DESTROY ) { // ウィンドウが中断された
					    // ら(アプリケーションとし
					    // て動いている時)
      System.exit(0); // 終了
    }
    return ( false );
  }
  
  public static void main( String args[] ) { // アプリケーションとして
					     // 呼び出し
    Frame mf = new Frame( "Memory Check" ); // Memory Checkというタイ
					    // トルで新しいウィンドウ
					    // 作成
    Memory memorymain = new Memory(); // Memoryクラスでmemorymainとい
				      // うオブジェクトを作成
    memorymain.init(); // この辺りで
    memorymain.start(); // アプレットと同じ事をする
    mf.add( "Center", memorymain ); // ウィンドウの中心にmemorymainオ
				    // ブジェクトを置く
    mf.resize( 210, 130 ); // ウィンドウの大きさを(210,130)に
    mf.show(); // ウィンドウ表示
  }
}
    
class MemoryCanvas extends Canvas { // MemoryCanvasクラスを作成

    public void paint( Graphics scr ) {
      Runtime rt;
      rt = Runtime.getRuntime(); // Runtimeに必要な情報を取り込む
      long totalmemory = rt.totalMemory(); // totalのメモリ量
      long freememory = rt.freeMemory(); // freeのメモリ量
      double div = ( (double)( totalmemory - freememory ) /
                     (double)totalmemory ) * 100; // 使用しているパー
						  // センテージ
      switch ( (int)( div / 20 ) ) {
      case 0: // 0〜19%だったら緑
	scr.setColor( Color.green );
	break;
      case 1: // 20〜39%だったら青
	scr.setColor( Color.blue );
	break;
      case 2: // 40〜59%だったら黄
	scr.setColor( Color.yellow );
	break;
      case 3: // 60〜79%だったらオレンジ
	scr.setColor( Color.magenta );
	break;
      case 4: // 80〜100%だったら赤
      case 5:
	scr.setColor( Color.red );
	break;
      }
      scr.setFont( new Font( "Helvetica", Font.BOLD, 24 ) );
      scr.drawString( freememory + "/" + totalmemory, 0, 25 ); // 表示
    }
}

class MemoryControl extends Panel { // MemoryControlクラスを作成
  MemoryCanvas mc;

  public MemoryControl( MemoryCanvas mc ) { // コンストラクタ
    this.mc = mc;
    add( new Button( "Update" ) ); // Updateというラベルのボタン
    add( new Button( "Quit" ) ); // Quitというラベルのボタン
  }
  
  public boolean action( Event evt, Object arg ) { // 何かイベントが起
						   // きた場合
    if ( evt.target instanceof Button ) { // 行われたイベントがButton
					  // に関係するものであれば
      String which = (String)arg; // ラベル名を文字列とする
      if ( which.equals( "Quit" ) == true ) { // ラベル名がQuitだった
					      // ら
	System.exit(0); // 終了(アプレットの場合は無視される)
      }
      mc.repaint(); // 再描画
      return ( true );
    }
    return ( false );
  }
}

