/**
 * @(#)DocUI.java
 *
 * Copyright 2000 by Intelligent Technology Inc. All rights reserved.
 *
 * UI
 */
package jp.co.iti.fagot.doc;

import java.awt.Container;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Color;
import java.awt.Rectangle;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.LayoutManager;

import java.util.Hashtable;
import java.util.Enumeration;

import javax.swing.JComponent;
import javax.swing.plaf.ComponentUI;

import jp.co.iti.fagot.gob.GobManager;

import jp.co.iti.fagot.util.ZString;
import jp.co.iti.fagot.util.ZDebug;

import jp.co.nri.rid.environment.MessageDialog;
import jp.co.nri.rid.error.RidMessage;
/**
 * Docパッケージ用ComponentUI
 *
 * @author  福島康治
 * @version 1.01 2000/12/01
 */
public class DocUI extends ComponentUI {

	/**
	 * 唯一のコンストラクタです。
	 */
	public DocUI() {
	super();
	}

	/**
	 * UIの生成
	 */
	public static ComponentUI createUI(JComponent c) {
	return( new DocUI() );
	}

	/**
	 * UIの設定
	 */
	public void installUI(JComponent cmp) {
//	mEditor = cmp;

	cmp.setBackground(Color.white);
	cmp.setForeground(Color.black);
	cmp.setOpaque(true);
	cmp.setAutoscrolls(true);

	cmp.setLayout(mLayout);
	}

	/**
	 * UIの解除
	 */
	public void uninstallUI(JComponent cmp) {
	cmp.setLayout(mLayout);
	}

	/**
	 * 画面表示の更新
	 */
	public void update(Graphics g, JComponent cmp) {
	paint(g, cmp);
	}

	/**
	 * 画面表示
	 */
	public void paint(Graphics g, JComponent cmp) {
	if ( mPainting ) {
		mGraphics = g;
		return ;
	}
	mPainting = true;
	mGraphics = null;

	try {
		DocPane editor = (DocPane)cmp;
			
		// 操作中など描画できない場合は、描画しない
		if ( !editor.canPaint() ) {
			mPainting = false;
			return;
		}

		// 背景の描画
		if ( editor.isOpaque() ) {
			g.setColor(editor.getBackground());
			// 画面の表示されている領域だけクリアするように修正
			Rectangle clipRect = g.getClipBounds();
			if ( clipRect != null ) {
				g.fillRect(clipRect.x, clipRect.y, clipRect.width, clipRect.height);
			} else {
				g.fillRect(0, 0, editor.getWidth(), editor.getHeight());
			}
		}

		// Gobの再構築が必要か？
		boolean isCreateGob = false;
		if ( editor.isUpdateGobs() ) {
			isCreateGob = true;
			editor.createGobs();
		}

		// Graphics の作成
		DocGraphics graphics = new DocGraphics((Graphics2D)g,editor.getGridControler(),isCreateGob);

		GobManager.paint( editor, graphics );

		GobManager.paintCurrent( editor, graphics );

		// 2重ペイントした場合は再ペイント
		Graphics gSave = mGraphics;
		while ( gSave != null ) {
			mGraphics = null;
			editor.repaint();

			// 描画中にpaintが呼ばれたか？
			gSave = mGraphics;
			mPainting = true;
		}
	} catch ( Throwable t ) {
		ZDebug.err("!!!Exception："+t.toString() );
		t.printStackTrace();
		RidMessage ridMsg = new RidMessage();
		MessageDialog.showError(ridMsg.Error("E1900",t.toString()));
		System.exit(0);
	}

	mPainting = false;
	}

	//## サブクラス：レイアウトマネージャ #############################
	/**
	 * リスナー
	 */
	class DocLayout implements LayoutManager{

	//## LayoutManager2 ###############################################
	/**
	 * コンポーネントの追加
	 */
	public void addLayoutComponent(String name, Component comp) {
	if ( name.startsWith("Doc") ) {
		mComponents.put(comp,name);
	}
	}

	/**
	 * コンポーネントの削除
	 */
	public void removeLayoutComponent(Component comp) {
	if ( mComponents.containsKey( comp ) ) {
		mComponents.remove( comp );
	}
	}

	/**
	 * 最小サイズの取得
	 */
	public Dimension minimumLayoutSize(Container parent) {
    return(null);
	}

	/**
	 * 推奨サイズの取得
	 */
	public Dimension preferredLayoutSize(Container parent) {
    return(null);
	}

	/**
	 * レイアウトの設定
	 */
	public void layoutContainer(Container parent) {
	Enumeration elm = mComponents.keys();
	boolean bFirst = true;
	while ( elm.hasMoreElements() ) {
		Component cmp = (Component)elm.nextElement();
		String szRect = (String)mComponents.get( cmp );
		String[] posInfo = ZString.tokenize( szRect ) ;
		if ( posInfo.length == 5 ) {
			double dX      = ZString.parseDouble(posInfo[1],0);
			double dY      = ZString.parseDouble(posInfo[2],0);
			double dWidth  = ZString.parseDouble(posInfo[3],0);
			double dHeight = ZString.parseDouble(posInfo[4],0);
			cmp.setBounds((int)dX,(int)dY,(int)dWidth,(int)dHeight);
			if ( bFirst ) {
				bFirst = false;
				cmp.requestFocus();
			}
		} else {
			ZDebug.trace("  ×layout:"+szRect);
		}
	}
	}

	/**
	 * コンポーネント一覧
	 */
	protected Hashtable mComponents = new Hashtable();

	}

	//## アトリビュート################################################
	/**
	 * レイアウトマネージャ
	 */
	protected DocLayout mLayout = new DocLayout() ;

	/**
	 * 描画中か？
	 */
	protected boolean	mPainting = false ;

	/**
	 * 描画中の場合に保存するGraphics
	 */
	protected Graphics	mGraphics = null ;
}
