This is with Batik 1.6...

I was having trouble getting an EventListener registered on
a node in the DOM to receive any mouse events. The node was
a <g> node, and events would be generated by some of the
contained nodes but not others.

So I wrote a small test case (attached), but now I can't
get ANY events to be emitted!

Maybe I'm doing something stupid? Or is this a real bug?

In the attached test case, clicking on the black square should
cause something to be printed to System.out, but nothing happens.

Any help appreciated...

Thanks,
-Archie

__________________________________________________________________________
Archie Cobbs      *        CTO, Awarix        *      http://www.awarix.com
/*
    Demonstrates Batik bug where mouse events fail
    to be generated.
*/

import java.awt.Dimension;
import java.awt.GraphicsEnvironment;
import java.awt.Point;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
import java.util.Set;

import javax.swing.JFrame;
import javax.swing.SwingUtilities;

import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.gvt.GVTTreeRendererListener;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderListener;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderListener;
import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent;
import org.apache.batik.swing.svg.SVGLoadEventDispatcherListener;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;
import org.w3c.dom.svg.SVGDocument;
import org.w3c.dom.svg.SVGElement;
import org.w3c.dom.svg.SVGPoint;
import org.w3c.dom.svg.SVGSVGElement;

public class ClickBug extends WindowAdapter implements SVGDocumentLoaderListener,
  GVTTreeBuilderListener, SVGLoadEventDispatcherListener,
  GVTTreeRendererListener, KeyListener, MouseListener, EventListener {

    private final String url;
    private final String nodeId;
    private final JFrame frame;
    private final JSVGCanvas canvas;
    private SVGDocument svg;
    private SVGElement theNode;
    private boolean didOneTimeStuff;

    public ClickBug(String url, String nodeId) {
        this.url = url;
        this.nodeId = nodeId;
        frame = new JFrame("ClickBug: url=" + url + " nodeId=\"" + nodeId + "\"");
        canvas = new JSVGCanvas(null, false, false);
        canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
        canvas.addSVGDocumentLoaderListener(this);
        canvas.addGVTTreeBuilderListener(this);
        canvas.addGVTTreeRendererListener(this);
        canvas.addSVGLoadEventDispatcherListener(this);
        canvas.addKeyListener(this);
        //canvas.addMouseListener(this);
        canvas.setFocusable(true);
        frame.addWindowListener(this);
    }

    public void go() {
        System.out.println("Loading " + url);
        canvas.setURI(url);
    }

    public void cancel() {
        System.out.println("Load canceled");
    }

    public void showFrame() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                frame.getContentPane().add(canvas);
                frame.pack();
                Dimension size = frame.getSize();
                Point center = GraphicsEnvironment
                  .getLocalGraphicsEnvironment().getCenterPoint();
                int x = (int)(center.getX() - size.getWidth() / 2);
                int y = (int)(center.getY() - size.getHeight() / 2);
                frame.setLocation(new Point(x, y));
                frame.toFront();
                frame.setVisible(true);
            }
        });
    }

    void oneTimeStuff() {
        System.out.println("Doing one-time initialization");
        svg = canvas.getSVGDocument();
        theNode = (SVGElement)svg.getElementById(nodeId);
        if (theNode == null) {
            System.out.println("ERROR: no node with id=\"" + nodeId + "\" found");
            System.exit(1);
        }
        EventTarget t = (EventTarget)theNode;
        t.addEventListener("mousedown", this, false);
        t.addEventListener("mouseup", this, false);
        t.addEventListener("mouseclick", this, false);
        t.addEventListener("mouseover", this, false);
        t.addEventListener("mouseout", this, false);
        System.out.println("Added EventListeners to node \"" + nodeId + "\": " + t);
        canvas.setRenderingTransform(new AffineTransform());
    }

    // EventListener methods

    public void handleEvent(Event event) {
        System.out.println("GOT EVENT: " + event);
    }

    // SVGDocumentLoaderListener methods

    public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
        System.out.println("Document loading started");
    }

    public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
        System.out.println("Document loading completed");
    }

    public void documentLoadingCancelled(SVGDocumentLoaderEvent e) {
        System.out.println("Document loading canceled");
    }

    public void documentLoadingFailed(SVGDocumentLoaderEvent e) {
        System.out.println("Document loading failed");
        cancel();
    }

    // GVTTreeBuilderListener methods

    public void gvtBuildStarted(GVTTreeBuilderEvent e) {
        System.out.println("GVT build started");
    }

    public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
        System.out.println("GVT build completed");
        showFrame();
    }

    public void gvtBuildCancelled(GVTTreeBuilderEvent e) {
        System.out.println("GVT build canceled");
    }

    public void gvtBuildFailed(GVTTreeBuilderEvent e) {
        System.out.println("GVT build failed");
        cancel();
    }

    // GVTTreeRendererListener methods

    public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
        System.out.println("GVT rendering preparing");
    }

    public void gvtRenderingStarted(GVTTreeRendererEvent e) {
        System.out.println("GVT rendering started");
    }

    public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
        System.out.println("GVT rendering complete");
        if (didOneTimeStuff)
            return;
        didOneTimeStuff = true;
        canvas.getUpdateManager().getUpdateRunnableQueue().invokeLater(
            new Runnable() {
                public void run() {
                    oneTimeStuff();
                }
            }
        );
    }

    public void gvtRenderingCancelled(GVTTreeRendererEvent e) {
        System.out.println("GVT rendering canceled");
    }

    public void gvtRenderingFailed(GVTTreeRendererEvent e) {
        System.out.println("GVT rendering failed");
        cancel();
    }

    // SVGLoadEventDispatcherListener methods

    public void svgLoadEventDispatchCancelled(
      SVGLoadEventDispatcherEvent e) {
        System.out.println("Load event dispatch cancelled");
    }

    public void svgLoadEventDispatchCompleted(
      SVGLoadEventDispatcherEvent e) {
        System.out.println("Load event dispatch completed");
    }

    public void svgLoadEventDispatchFailed(SVGLoadEventDispatcherEvent e) {
        System.out.println("Load event dispatch failed");
    }

    public void svgLoadEventDispatchStarted(SVGLoadEventDispatcherEvent e) {
        System.out.println("Load event dispatch started");
    }

    // WindowListener methods

    public void windowClosing(WindowEvent e) {
        System.exit(0);
    }

    // KeyListener methods

    public void keyPressed(KeyEvent e) {
    }

    public void keyReleased(KeyEvent e) {
    }

    public void keyTyped(KeyEvent e) {
        switch (e.getKeyChar()) {
        case 'r':
            canvas.setRenderingTransform(new AffineTransform());
            break;
        case 'q':
            System.exit(0);
            break;
        case '?':
            System.err.println("Hot keys:");
            System.err.println("  r   Reset view transformation");
            System.err.println("  q   Quit");
            break;
        default:
            break;
        }
    }

    // MouseListener methods

    public void mouseClicked(MouseEvent e) {
        System.out.println("mouseClicked(): " + e);
        canvas.requestFocusInWindow();
    }

    public void mousePressed(MouseEvent e) {
        System.out.println("mousePressed(): " + e);
    }

    public void mouseReleased(MouseEvent e) {
        System.out.println("mouseReleased(): " + e);
    }

    public void mouseEntered(MouseEvent e) {
        System.out.println("mouseEntered(): " + e);
    }

    public void mouseExited(MouseEvent e) {
        System.out.println("mouseExited(): " + e);
    }

    // Main entry point

    public static void main(String[] args) throws Exception {

        // Parse command line
        String url = "clickbug.svg";
        String nodeId = "theNode";
        try {
            int i;
            for (i = 0; i < args.length; i++) {
                if (!args[i].startsWith("-"))
                    break;
                if (args[i].equals("-i")) {
                    if (++i >= args.length)
                        throw new IllegalArgumentException();
                    nodeId = args[i];
                } else if (args[i].equals("--")) {
                    i++;
                    break;
                } else
                    throw new IllegalArgumentException();
            }
            switch (args.length - i) {
            case 0:
                break;
            case 1:
                url = args[i];
                break;
            default:
                throw new IllegalArgumentException();
            }
        } catch (IllegalArgumentException e) {
            System.err.println("Usage: java ClickBug [-i nodeId]"
              + " < filename | URL >");
            System.exit(1);
        }

        // Convert filename into URL
        File f = new File(url);
        if (f.exists())
            url = f.toURL().toString();

        // Go
        new ClickBug(url, nodeId).go();
    }
}

image/svg

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to