this is the best that i can do.. still not plotting the points properly..
what i want to do is when the point clicked or dragged to is the right
element, i want the line to snap on the center of the element.

 (please forgive the dirty code)

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import org.apache.batik.bridge.BridgeContext;
import org.apache.batik.gvt.GraphicsNode;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.InteractorAdapter;
import org.apache.batik.swing.gvt.JGVTComponent;
import org.apache.batik.swing.gvt.Overlay;
import org.w3c.dom.svg.SVGElement;

public class CustomInteractor extends InteractorAdapter {

    protected boolean finished = true;
    protected float xStart;
    protected float yStart;
    protected float xEnd;
    protected float yEnd;
    protected Line2D line;
    protected Overlay overlay = new LineOverlay();
    protected BasicStroke markerStroke = new BasicStroke(2,
            BasicStroke.CAP_SQUARE,
            BasicStroke.JOIN_MITER,
            5,
            new float[]{5, 5}, 0);
    protected JGVTComponent source;

    @Override
    public boolean startInteraction(InputEvent ie) {
        return true;
    }

    @Override
    public boolean endInteraction() {
        return finished;
    }

    @Override
    public void mousePressed(MouseEvent e) {
        JGVTComponent c = source = (JGVTComponent) e.getSource();
        Point2D p = new Point2D.Float(e.getX(), e.getY());

        finished = false;
        line = null;
        try {
            AffineTransform bt = c.getRenderingTransform().createInverse();
            p = bt.transform(p, null);
        } catch (NoninvertibleTransformException ex) {
        }
        GraphicsNode gn = c.getGraphicsNode().nodeHitAt(p);
        BridgeContext bc =
                ((JSVGCanvas) c).getUpdateManager().getBridgeContext();
        SVGElement domE = (SVGElement) bc.getElement(gn);

        if ("handle1".equals(domE.getAttribute("id"))) {
            p.setLocation(Float.parseFloat(domE.getAttribute("cx")),
                    Float.parseFloat(domE.getAttribute("cy")));
            AffineTransform bt = c.getRenderingTransform();
            p = bt.transform(p, null);
            xStart = (float) p.getX();
            yStart = (float) p.getY();
        } else {
            xStart = e.getX();
            yStart = e.getY();
        }
        c.getOverlays().add(overlay);
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        JGVTComponent c = (JGVTComponent) e.getSource();
        finished = true;
        c.getOverlays().remove(overlay);
        overlay.paint(c.getGraphics());

        xEnd = e.getX();
        yEnd = e.getY();
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        JGVTComponent c = (JGVTComponent) e.getSource();
        Point2D p = new Point2D.Float(e.getX(), e.getY());
        
        overlay.paint(c.getGraphics());
        try {
            AffineTransform bt = c.getRenderingTransform().createInverse();
            p = bt.transform(p, null);
        } catch (NoninvertibleTransformException ex) {
        }
        GraphicsNode gn = c.getGraphicsNode().nodeHitAt(p);
        BridgeContext bc =
                ((JSVGCanvas) c).getUpdateManager().getBridgeContext();
        SVGElement domE = (SVGElement) bc.getElement(gn);
        if ("handle2".equals(domE.getAttribute("id"))) {
            p.setLocation(Float.parseFloat(domE.getAttribute("cx")),
                    Float.parseFloat(domE.getAttribute("cy")));
            AffineTransform bt = c.getRenderingTransform();
            p = bt.transform(p, null);
            xEnd = (float) p.getX();
            yEnd = (float) p.getY();
        } else {
            xEnd = e.getX();
            yEnd = e.getY();
        }
        line = new Line2D.Float(xStart, yStart, xEnd, yEnd);
        overlay.paint(c.getGraphics());
    }

    protected class LineOverlay implements Overlay {

        public void paint(Graphics g) {
            if (line != null) {
                Graphics2D g2d = (Graphics2D) g;

                g2d.setXORMode(Color.white);
                g2d.setColor(Color.black);
                g2d.setStroke(markerStroke);

                g2d.draw(line);
            }
        }
    }
}
-- 
View this message in context: 
http://www.nabble.com/getting-the-element-in-svg-from-an-overlay-tp18301441p18466057.html
Sent from the Batik - Users mailing list archive at Nabble.com.


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

Reply via email to