package org.freehep.j3d.plot; import java.awt.event.*; import java.awt.AWTEvent; import java.util.Enumeration; import javax.vecmath.*; import javax.media.j3d.*; /** * This class is a simple behavior that invokes the KeyNavigator * to modify the view platform transform. * @author Joy Kyriakopulos (joyk@fnal.gov) * @version $Id: KeyNavigatorBehavior.java 8584 2006-08-10 23:06:37Z duns $ */ public class KeyNavigatorBehavior extends Behavior { private WakeupOnAWTEvent w1 = new WakeupOnAWTEvent(KeyEvent.KEY_PRESSED); private WakeupOnAWTEvent w2 = new WakeupOnAWTEvent(KeyEvent.KEY_RELEASED); private WakeupOnElapsedFrames w3 = new WakeupOnElapsedFrames(1); private WakeupCriterion[] warray = { w1, w2, w3}; private WakeupCondition w = new WakeupOr(warray); private KeyEvent eventKey; private KeyNavigator keyNavigator; /** * Override Behavior's initialize method to setup wakeup criteria. */ public void initialize() { // Establish initial wakeup criteria wakeupOn(w); } /** * Override Behavior's stimulus method to handle the event. */ public void processStimulus(Enumeration criteria) { WakeupOnAWTEvent ev; WakeupCriterion genericEvt; AWTEvent[] events; boolean sawFrame = false; while (criteria.hasMoreElements()) { genericEvt = (WakeupCriterion) criteria.nextElement(); if (genericEvt instanceof WakeupOnAWTEvent) { ev = (WakeupOnAWTEvent) genericEvt; events = ev.getAWTEvent(); processAWTEvent(events); } else if (genericEvt instanceof WakeupOnElapsedFrames && eventKey != null) { sawFrame = true; } } if (sawFrame) keyNavigator.integrateTransformChanges(); // Set wakeup criteria for next time wakeupOn(w); } /** * Process a keyboard event */ private void processAWTEvent(AWTEvent[] events) { for (int loop = 0; loop < events.length; loop++) { if (events[loop] instanceof KeyEvent) { eventKey = (KeyEvent) events[loop]; // change the transformation; for example to zoom if (eventKey.getID() == KeyEvent.KEY_PRESSED || eventKey.getID() == KeyEvent.KEY_RELEASED) { //System.out.println("Keyboard is hit! " + eventKey); keyNavigator.processKeyEvent(eventKey); } } } } /** * Constructs a new key navigator behavior node that operates * on the specified transform group. * @param targetTG the target transform group */ public KeyNavigatorBehavior(TransformGroup targetTG) { keyNavigator = new KeyNavigator(targetTG); } }