| /* |
| |
| Licensed to the Apache Software Foundation (ASF) under one or more |
| contributor license agreements. See the NOTICE file distributed with |
| this work for additional information regarding copyright ownership. |
| The ASF licenses this file to You under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with |
| the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| See the License for the specific language governing permissions and |
| limitations under the License. |
| |
| */ |
| package org.apache.batik.bridge; |
| |
| import java.util.Calendar; |
| |
| import org.apache.batik.anim.dom.SVGOMAnimationElement; |
| import org.apache.batik.anim.timing.TimedElement; |
| import org.apache.batik.dom.events.DOMTimeEvent; |
| import org.apache.batik.dom.svg.IdContainer; |
| import org.apache.batik.dom.svg.SVGOMUseShadowRoot; |
| import org.apache.batik.constants.XMLConstants; |
| |
| import org.w3c.dom.Element; |
| import org.w3c.dom.Node; |
| import org.w3c.dom.events.DocumentEvent; |
| import org.w3c.dom.events.EventTarget; |
| import org.w3c.dom.smil.TimeEvent; |
| |
| /** |
| * Class that provides utilities for animation support. |
| * |
| * @author <a href="mailto:cam%40mcc%2eid%2eau">Cameron McCormack</a> |
| * @version $Id$ |
| */ |
| public abstract class AnimationSupport { |
| |
| /** |
| * Fires a {@link TimeEvent} on the given {@link EventTarget}. |
| */ |
| public static void fireTimeEvent(EventTarget target, String eventType, |
| Calendar time, int detail) { |
| DocumentEvent de = (DocumentEvent) ((Node) target).getOwnerDocument(); |
| DOMTimeEvent evt = (DOMTimeEvent) de.createEvent("TimeEvent"); |
| evt.initTimeEventNS(XMLConstants.XML_EVENTS_NAMESPACE_URI, eventType, |
| null, |
| detail); |
| evt.setTimestamp(time.getTime().getTime()); |
| target.dispatchEvent(evt); |
| } |
| |
| /** |
| * Returns the timed element with the given ID, using the given node |
| * as the context for the lookup. |
| */ |
| public static TimedElement getTimedElementById(String id, Node n) { |
| Element e = getElementById(id, n); |
| if (e instanceof SVGOMAnimationElement) { |
| SVGAnimationElementBridge b = (SVGAnimationElementBridge) |
| ((SVGOMAnimationElement) e).getSVGContext(); |
| return b.getTimedElement(); |
| } |
| return null; |
| } |
| |
| /** |
| * Returns the event target with the given ID, using the given |
| * node as the context for the lookup. |
| */ |
| public static EventTarget getEventTargetById(String id, Node n) { |
| return (EventTarget) getElementById(id, n); |
| } |
| |
| /** |
| * Returns the element with the given ID, using the given node |
| * as the context for the lookup. |
| */ |
| protected static Element getElementById(String id, Node n) { |
| Node p = n.getParentNode(); |
| while (p != null) { |
| n = p; |
| if (n instanceof SVGOMUseShadowRoot) { |
| p = ((SVGOMUseShadowRoot) n).getCSSParentNode(); |
| } else { |
| p = n.getParentNode(); |
| } |
| } |
| if (n instanceof IdContainer) { |
| return ((IdContainer) n).getElementById(id); |
| } |
| return null; |
| } |
| } |