package unfold;

import java.applet.Applet;
import java.awt.*;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import jv.anim.PsAnimation;
import jv.geom.PgElementSet;
import jv.loader.PgLoader;
import jv.object.*;
import jv.project.PvDisplayIf;
import jv.project.PgGeometry;
import jv.viewer.PvDisplay;
import jv.viewer.PvViewer;
import jv.vecmath.PuMath;

import jvx.geom.PwUnfold;
import jvx.geom.PwCleanMesh;


/**
 * Demo applet to call unfolding of a polyhedron.
 * 
 * @see			jvx.geom.PwUnfold
 * @author		Klaus Hildebrandt
 * @version		11.06.03, 1.00 created (kh)
 */
public class PaUnfold extends Applet implements ActionListener{
	
	protected	Button			m_bUnfold;
        protected       Button                  m_bRefold;
	protected	PwUnfold			m_ws;
	protected	PvViewer			m_viewer;
	protected	PgElementSet	m_geom;
	
	/**
	 * Initialize applet
	 */
	public void init(){
		// Create viewer for viewing 3d geometries. References to the applet and frame
		// allow JavaView to decide whether program runs as applet or standalone application,
		// and, in the later case, it allows to use the frame as parent frame.
		m_viewer = new PvViewer(this, null);
		
		//set Layout of applet
		setLayout(new BorderLayout());
		
		//create button and add it to the applet
		Panel panel = new Panel();
		m_bUnfold = new Button("Animate Unfolding");
		m_bUnfold.addActionListener(this);
		panel.add(m_bUnfold);
		m_bRefold = new Button("Reset");
		m_bRefold.addActionListener(this);
		panel.add(m_bRefold);
		add(panel, BorderLayout.SOUTH);
		//load geometry given as a parameter to the applet
		//if no geometry is specified use a sphere instead.
		PgGeometry[] geomArr = null;
		PgLoader loader = new PgLoader();
		//using the old javaview version to compile uncommend the next line and remove the one after that.
		geomArr = loader.load(geomArr, PsConfig.getCodeBase()+m_viewer.getParameter("model"));
		//geomArr = loader.loadGeometry(geomArr, PsConfig.getCodeBase()+m_viewer.getParameter("model"));
		if(geomArr!=null && geomArr[0]!=null && geomArr[0] instanceof PgElementSet){
			m_geom=(PgElementSet)geomArr[0];
		}
		else{
			if(PsDebug.WARNING) PsDebug.warning("No model specified. Using a sphere instead. "+
															"Specify a model by using the parameter model.");
			m_geom = new PgElementSet(3);
			m_geom.computeSphere(10, 10, 1.);
			
		}
		//make sure the mesh of the geometry is ok. 
		//This is optional. 
		PwCleanMesh.identifyVertices(m_geom, PuMath.EPS);
		PwCleanMesh.removeDegenerateElements(m_geom);
		
		//create workshop and assign geometry to it.
		m_ws = new PwUnfold();
		m_ws.setGeometry(m_geom);
		// Get 3d display from viewer and add it to applet
		PvDisplayIf disp = m_viewer.getDisplay();
		m_ws.setDisplay(disp);
		disp.addGeometry(m_geom);
		disp.selectGeometry(m_geom);
		add((Component)disp, BorderLayout.CENTER);
		
		m_anim = m_ws.getAnimation();
	}
	/**
	 * Handle action events.
	 */
	protected PsAnimation m_anim;
	public void actionPerformed(ActionEvent event){
		Object source = event.getSource();
		if(source==m_bUnfold){
			if(m_bUnfold.getLabel().equals("Animate Unfolding")){
				m_anim.start();
				m_bUnfold.setLabel("Stop Animation");
			}
			else{
				m_anim.stop();
				m_bUnfold.setLabel("Animate Unfolding");
			}
		}
		else if(source==m_bRefold){
		    m_ws.reset();
		    m_geom.update(m_geom);
		}
	}
	
}
