import java.awt.event.*;
import java.awt.AWTEvent;
import java.util.Enumeration;
import java.util.HashMap;
import javax.media.j3d.Behavior;
import javax.media.j3d.BranchGroup;
import javax.media.j3d.Canvas3D;
import javax.media.j3d.PickRay;
import javax.media.j3d.TransformGroup;
import javax.media.j3d.Transform3D;
import javax.media.j3d.WakeupCriterion;
import javax.media.j3d.WakeupOnAWTEvent;
import javax.media.j3d.SceneGraphPath;
import javax.vecmath.Point3d;
import javax.vecmath.Vector3d;
import io;

public class ioBehavior extends Behavior {
    private WakeupCriterion AWTEventCondition;
    private Canvas3D Canvas;
    private BranchGroup Root;
    private HashMap io_tg;
    private io selectedIO;

    ioBehavior(Canvas3D canvas, BranchGroup root) {
        Canvas = canvas;
        Root = root;
        io_tg = new HashMap();
        AWTEventCondition = new WakeupOnAWTEvent(MouseEvent.MOUSE_MOVED);
    }

    public void initialize() {
        this.wakeupOn(AWTEventCondition);       
    }

    public void processStimulus(Enumeration criteria) {

        AWTEvent[] awtEvents = null;
        
        WakeupCriterion criterion;
        while(criteria.hasMoreElements()) {
            criterion = (WakeupCriterion)criteria.nextElement();
            awtEvents = ((WakeupOnAWTEvent)criterion).getAWTEvent();
            
            AWTEvent awtEvent;
            MouseEvent event;
            
            for(int eventI=0; eventI<awtEvents.length; eventI++) {
                awtEvent = awtEvents[eventI];
                event = (MouseEvent)awtEvent;
                buildPickRay(event.getX(), event.getY());
            }
        }
        initialize();
    }

    public void buildPickRay(int x, int y) {
        Point3d origin = new Point3d(0, 0, 0);
        Point3d point = new Point3d(0, 0, 0);
        Transform3D t = new Transform3D();
        Vector3d direction = new Vector3d();

        Canvas.getCenterEyeInImagePlate(origin);
        Canvas.getPixelLocationInImagePlate(x, y, point);

        Canvas.getImagePlateToVworld(t);
        t.transform(origin);
        t.transform(point);

        direction.sub(point, origin);
        direction.normalize();
        
        PickRay pr = new PickRay(origin, direction);

        int target = -1;

        SceneGraphPath[] hitPaths = {new SceneGraphPath()};

        hitPaths[0] = Root.pickClosest(pr);
        if(hitPaths[0]==null) {
            selectedIO = null;
        }
        else {
        for(int hitI = 0; hitI<hitPaths.length; hitI++) {
                
        SceneGraphPath hitPath = hitPaths[hitI];
        int i = hitPath.getObject().hashCode();
        String s = Integer.toString(i);
        io targetIO = (io)io_tg.get(s);
        if(targetIO != selectedIO && targetIO != null) {
            selectedIO = targetIO;
            System.out.println(targetIO.getName());
        }

        }
        }
    }

    public void writeMap(String targetCode, io infoObject) {
        io_tg.put(targetCode, infoObject);
    }

}
