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]