package prolog.ui;

import java.awt.*;
import javax.swing.*;
import prolog.treeview.*;

public class AnimationView extends JComponent
{
	protected Tree tree = null;
	protected FactDbRenderer fdb = null;
	protected Image offscreen = null;

	public AnimationView()
	{
	}

	public void setTree( Tree tree )
	{
		this.tree = tree;
		tree.setContainer( this );
	}

	public Tree getTree()
	{
		return this.tree;
	}

	public void setFactDbRenderer( FactDbRenderer renderer )
	{
		this.fdb = renderer;
	}

	public FactDbRenderer getFactDbRenderer()
	{
		return this.fdb;
	}

	public void paint( Graphics g )
	{
		Dimension d = getSize();
		if( offscreen == null ||
			offscreen.getWidth( null ) != d.width ||
			offscreen.getHeight( null ) != d.height )
		{
			offscreen = createImage(d.width, d.height);
		}
		Graphics offgc = offscreen.getGraphics();

		offgc.setColor( Color.white );
		offgc.fillRect( 0, 0, d.width, d.height );
		if( tree != null )
		{
			offgc.setClip( tree.getPosition() );
			tree.paint( offgc );
			offgc.setClip( null );
		}
		if( fdb != null )
		{
			offgc.setClip( fdb.getPosition() );
			fdb.paint( (Graphics2D) offgc );
			offgc.setClip( null );
		}

		g.drawImage( offscreen, 0, 0, this );
	}

	public void doLayout()
	{
		if( this.fdb != null )
		{
			int left = fdb.getWidth();
			this.tree.setPosition( new Rectangle(left,0,getWidth()-left,getHeight() ) );
			this.fdb.setPosition( new Rectangle(0,0,left,getHeight()) );
			this.tree.doLayout();
		}
	}

	public Dimension getPreferredSize()
	{
		if( this.fdb != null )
		{
			Dimension dbViewD = this.fdb.getPreferredSize();
			Dimension treeView = this.tree.getPreferredSize();

			int width = dbViewD.width + treeView.width;
			int height = dbViewD.height;
			if( treeView.height > height )
				height = treeView.height;
			return
				new Dimension(
					width,
					height );
		}
		else
			return new Dimension( 50, 100 );
	}
}
