001: /*
002: * Copyright (c) 2000 Silvere Martin-Michiellot All Rights Reserved.
003: *
004: * Silvere Martin-Michiellot grants you ("Licensee") a non-exclusive,
005: * royalty free, license to use, modify and redistribute this
006: * software in source and binary code form,
007: * provided that i) this copyright notice and license appear on all copies of
008: * the software; and ii) Licensee does not utilize the software in a manner
009: * which is disparaging to Silvere Martin-Michiellot.
010: *
011: * This software is provided "AS IS," without a warranty of any kind. ALL
012: * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY
013: * IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
014: * NON-INFRINGEMENT, ARE HEREBY EXCLUDED. Silvere Martin-Michiellot
015: * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES
016: * SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
017: * OR DISTRIBUTING THE SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL
018: * Silvere Martin-Michiellot OR ITS LICENSORS BE LIABLE
019: * FOR ANY LOST REVENUE, PROFIT OR DATA, OR FOR DIRECT,
020: * INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
021: * CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF THE USE OF
022: * OR INABILITY TO USE SOFTWARE, EVEN IF Silvere Martin-Michiellot HAS BEEN
023: * ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
024: *
025: * This software is not designed or intended for use in on-line control of
026: * aircraft, air traffic, aircraft navigation or aircraft communications; or in
027: * the design, construction, operation or maintenance of any nuclear
028: * facility. Licensee represents and warrants that it will not use or
029: * redistribute the Software for such purposes.
030: *
031: */
032:
033: package com.db.behaviors;
034:
035: // This code is repackaged after KeyNavigatorBehavior
036: // Site http://java.sun.com
037: // Email
038:
039: import java.awt.event.*;
040: import java.awt.AWTEvent;
041: import java.util.Enumeration;
042: import javax.vecmath.*;
043: import javax.media.j3d.*;
044:
045: /**
046: * This class is a simple behavior that invokes the KeyNavigator
047: * to modify the view platform transform.
048: */
049: public class KeyNavigatorBehavior extends Behavior {
050:
051: private WakeupOnAWTEvent w1 = new WakeupOnAWTEvent(
052: KeyEvent.KEY_PRESSED);
053: private WakeupOnAWTEvent w2 = new WakeupOnAWTEvent(
054: KeyEvent.KEY_RELEASED);
055: private WakeupOnElapsedFrames w3 = new WakeupOnElapsedFrames(0);
056: private WakeupCriterion[] warray = { w1, w2, w3 };
057: private WakeupCondition w = new WakeupOr(warray);
058: private KeyEvent eventKey;
059: private KeyNavigator keyNavigator;
060:
061: /**
062: * Override Behavior's initialize method to setup wakeup criteria.
063: */
064: public void initialize() {
065:
066: // Establish initial wakeup criteria
067: wakeupOn(w);
068:
069: }
070:
071: /**
072: * Override Behavior's stimulus method to handle the event.
073: */
074: public void processStimulus(Enumeration criteria) {
075:
076: WakeupOnAWTEvent ev;
077: WakeupCriterion genericEvt;
078: AWTEvent[] events;
079: boolean sawFrame = false;
080:
081: while (criteria.hasMoreElements()) {
082: genericEvt = (WakeupCriterion) criteria.nextElement();
083: if (genericEvt instanceof WakeupOnAWTEvent) {
084: ev = (WakeupOnAWTEvent) genericEvt;
085: events = ev.getAWTEvent();
086: processAWTEvent(events);
087: } else if (genericEvt instanceof WakeupOnElapsedFrames
088: && eventKey != null) {
089: sawFrame = true;
090: }
091: }
092: if (sawFrame)
093: keyNavigator.integrateTransformChanges();
094:
095: // Set wakeup criteria for next time
096: wakeupOn(w);
097:
098: }
099:
100: /**
101: * Process a keyboard event
102: */
103: private void processAWTEvent(AWTEvent[] events) {
104:
105: for (int loop = 0; loop < events.length; loop++) {
106: if (events[loop] instanceof KeyEvent) {
107: eventKey = (KeyEvent) events[loop];
108: if (eventKey.getID() == KeyEvent.KEY_PRESSED
109: || eventKey.getID() == KeyEvent.KEY_RELEASED) {
110: keyNavigator.processKeyEvent(eventKey);
111: }
112: }
113: }
114:
115: }
116:
117: /**
118: * Constructs a new key navigator behavior node that operates
119: * on the specified transform group.
120: * @param targetTG the target transform group
121: */
122: public KeyNavigatorBehavior(TransformGroup targetTG) {
123:
124: keyNavigator = new KeyNavigator(targetTG);
125:
126: }
127:
128: }
|