| /* DomEvent.java -- | |
| Copyright (C) 1999,2000,2001 Free Software Foundation, Inc. | |
| This file is part of GNU Classpath. | |
| GNU Classpath is free software; you can redistribute it and/or modify | |
| it under the terms of the GNU General Public License as published by | |
| the Free Software Foundation; either version 2, or (at your option) | |
| any later version. | |
| GNU Classpath is distributed in the hope that it will be useful, but | |
| WITHOUT ANY WARRANTY; without even the implied warranty of | |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| General Public License for more details. | |
| You should have received a copy of the GNU General Public License | |
| along with GNU Classpath; see the file COPYING. If not, write to the | |
| Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA | |
| 02110-1301 USA. | |
| Linking this library statically or dynamically with other modules is | |
| making a combined work based on this library. Thus, the terms and | |
| conditions of the GNU General Public License cover the whole | |
| combination. | |
| As a special exception, the copyright holders of this library give you | |
| permission to link this library with independent modules to produce an | |
| executable, regardless of the license terms of these independent | |
| modules, and to copy and distribute the resulting executable under | |
| terms of your choice, provided that you also meet, for each linked | |
| independent module, the terms and conditions of the license of that | |
| module. An independent module is a module which is not derived from | |
| or based on this library. If you modify this library, you may extend | |
| this exception to your version of the library, but you are not | |
| obligated to do so. If you do not wish to do so, delete this | |
| exception statement from your version. */ | |
| package gnu.xml.dom; | |
| import org.w3c.dom.*; | |
| import org.w3c.dom.events.*; | |
| import org.w3c.dom.views.AbstractView; // used by UIEvent | |
| /** | |
| * "Event" implementation. Events are | |
| * created (through DocumentEvent interface methods on the document object), | |
| * and are sent to any target node in the document. | |
| * | |
| * <p> Applications may define application specific event subclasses, but | |
| * should otherwise use the <em>DocumentTraversal</em> interface to acquire | |
| * event objects. | |
| * | |
| * @author David Brownell | |
| */ | |
| public class DomEvent | |
| implements Event | |
| { | |
| String type; // init | |
| EventTarget target; | |
| EventTarget currentNode; | |
| short eventPhase; | |
| boolean bubbles; // init | |
| boolean cancelable; // init | |
| long timeStamp; // ? | |
| /** Returns the event's type (name) as initialized */ | |
| public final String getType() | |
| { | |
| return type; | |
| } | |
| /** | |
| * Returns event's target; delivery of an event is initiated | |
| * by a <em>target.dispatchEvent(event)</em> invocation. | |
| */ | |
| public final EventTarget getTarget() | |
| { | |
| return target; | |
| } | |
| /** | |
| * Returns the target to which events are currently being | |
| * delivered. When capturing or bubbling, this will not | |
| * be what <em>getTarget</em> returns. | |
| */ | |
| public final EventTarget getCurrentTarget() | |
| { | |
| return currentNode; | |
| } | |
| /** | |
| * Returns CAPTURING_PHASE, AT_TARGET, or BUBBLING; | |
| * only meaningful within EventListener.handleEvent | |
| */ | |
| public final short getEventPhase() | |
| { | |
| return eventPhase; | |
| } | |
| /** | |
| * Returns true if the news of the event bubbles to tree tops | |
| * (as specified during initialization). | |
| */ | |
| public final boolean getBubbles() | |
| { | |
| return bubbles; | |
| } | |
| /** | |
| * Returns true if the default handling may be canceled | |
| * (as specified during initialization). | |
| */ | |
| public final boolean getCancelable() | |
| { | |
| return cancelable; | |
| } | |
| /** | |
| * Returns the event's timestamp. | |
| */ | |
| public final long getTimeStamp() | |
| { | |
| return timeStamp; | |
| } | |
| boolean stop; | |
| boolean doDefault; | |
| /** | |
| * Requests the event no longer be captured or bubbled; only | |
| * listeners on the event target will see the event, if they | |
| * haven't yet been notified. | |
| * | |
| * <p> <em> Avoid using this </em> except for application-specific | |
| * events, for which you the protocol explicitly "blesses" the use | |
| * of this with some event types. Otherwise, you are likely to break | |
| * algorithms which depend on event notification either directly or | |
| * through bubbling or capturing. </p> | |
| * | |
| * <p> Note that this method is not final, specifically to enable | |
| * enforcing of policies about events always propagating. </p> | |
| */ | |
| public void stopPropagation() | |
| { | |
| stop = true; | |
| } | |
| /** | |
| * Requests that whoever dispatched the event not perform their | |
| * default processing when event delivery completes. Initializes | |
| * event timestamp. | |
| */ | |
| public final void preventDefault() | |
| { | |
| doDefault = false; | |
| } | |
| /** Initializes basic event state. */ | |
| public void initEvent(String typeArg, | |
| boolean canBubbleArg, | |
| boolean cancelableArg) | |
| { | |
| eventPhase = 0; | |
| type = typeArg; | |
| bubbles = canBubbleArg; | |
| cancelable = cancelableArg; | |
| timeStamp = System.currentTimeMillis(); | |
| } | |
| /** Constructs, but does not initialize, an event. */ | |
| public DomEvent(String type) | |
| { | |
| this.type = type; | |
| } | |
| /** | |
| * Returns a basic printable description of the event's type, | |
| * state, and delivery conditions | |
| */ | |
| public String toString() | |
| { | |
| StringBuffer buf = new StringBuffer("[Event "); | |
| buf.append(type); | |
| switch (eventPhase) | |
| { | |
| case CAPTURING_PHASE: | |
| buf.append(", CAPTURING"); | |
| break; | |
| case AT_TARGET: | |
| buf.append(", AT TARGET"); | |
| break; | |
| case BUBBLING_PHASE: | |
| buf.append(", BUBBLING"); | |
| break; | |
| default: | |
| buf.append(", (inactive)"); | |
| break; | |
| } | |
| if (bubbles && eventPhase != BUBBLING_PHASE) | |
| { | |
| buf.append(", bubbles"); | |
| } | |
| if (cancelable) | |
| { | |
| buf.append(", can cancel"); | |
| } | |
| // were we to provide subclass info, this's where it'd live | |
| buf.append("]"); | |
| return buf.toString(); | |
| } | |
| /** | |
| * "MutationEvent" implementation. | |
| */ | |
| public static final class DomMutationEvent | |
| extends DomEvent | |
| implements MutationEvent | |
| { | |
| // package private | |
| Node relatedNode; // init | |
| private String prevValue; // init | |
| private String newValue; // init | |
| private String attrName; // init | |
| private short attrChange; // init | |
| /** Returns any "related" node provided by this type of event */ | |
| public final Node getRelatedNode() | |
| { | |
| return relatedNode; | |
| } | |
| /** Returns any "previous value" provided by this type of event */ | |
| public final String getPrevValue() | |
| { | |
| return prevValue; | |
| } | |
| /** Returns any "new value" provided by this type of event */ | |
| public final String getNewValue() | |
| { | |
| return newValue; | |
| } | |
| /** For attribute change events, returns the attribute's name */ | |
| public final String getAttrName() | |
| { | |
| return attrName; | |
| } | |
| /** For attribute change events, returns how the attribuet changed */ | |
| public final short getAttrChange() | |
| { | |
| return attrChange; | |
| } | |
| /** Initializes a mutation event */ | |
| public final void initMutationEvent(String typeArg, | |
| boolean canBubbleArg, | |
| boolean cancelableArg, | |
| Node relatedNodeArg, | |
| String prevValueArg, | |
| String newValueArg, | |
| String attrNameArg, | |
| short attrChangeArg) | |
| { | |
| // super.initEvent is inlined here for speed | |
| // (mutation events are issued on all DOM changes) | |
| eventPhase = 0; | |
| type = typeArg; | |
| bubbles = canBubbleArg; | |
| cancelable = cancelableArg; | |
| timeStamp = System.currentTimeMillis(); | |
| relatedNode = relatedNodeArg; | |
| prevValue = prevValueArg; | |
| newValue = newValueArg; | |
| attrName = attrNameArg; | |
| attrChange = attrChangeArg; | |
| } | |
| // clear everything that should be GC-able | |
| void clear() | |
| { | |
| type = null; | |
| target = null; | |
| relatedNode = null; | |
| currentNode = null; | |
| prevValue = newValue = attrName = null; | |
| } | |
| /** Constructs an uninitialized mutation event. */ | |
| public DomMutationEvent(String type) | |
| { | |
| super(type); | |
| } | |
| } | |
| /** | |
| * "UIEvent" implementation. | |
| */ | |
| public static class DomUIEvent | |
| extends DomEvent | |
| implements UIEvent | |
| { | |
| private AbstractView view; // init | |
| private int detail; // init | |
| /** Constructs an uninitialized User Interface (UI) event */ | |
| public DomUIEvent (String type) { super (type); } | |
| public final AbstractView getView () { return view; } | |
| public final int getDetail () { return detail; } | |
| /** Initializes a UI event */ | |
| public final void initUIEvent(String typeArg, | |
| boolean canBubbleArg, | |
| boolean cancelableArg, | |
| AbstractView viewArg, | |
| int detailArg) | |
| { | |
| super.initEvent(typeArg, canBubbleArg, cancelableArg); | |
| view = viewArg; | |
| detail = detailArg; | |
| } | |
| } | |
| /* | |
| static final class DomMouseEvent extends DomUIEvent | |
| implements MouseEvent | |
| { | |
| // another half dozen state variables/accessors | |
| } | |
| */ | |
| } | |