import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.InteractorAdapter;
import org.apache.batik.swing.gvt.Overlay;
import java.io.File;
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 javax.swing.JFrame;

public class OverlayExample {

    public static void main(String[] args) {
        // A canvas to show "map.svg"
        final JSVGCanvas c = new JSVGCanvas();
        c.setURI(new File("map.svg").toURI().toString());

        // Add the overlay
        c.getOverlays().add(new Overlay() {
            public void paint(Graphics g) {
                Graphics2D g2d = (Graphics2D) g;
                int w = c.getWidth();
                int h = c.getHeight();
                g2d.setColor(Color.BLACK);
                g2d.setStroke(new BasicStroke(2f));
                g2d.drawRect(w / 2 - 10, h / 2 - 10, 20, 20);
                g2d.drawLine(w / 2, h / 2 - 13, w / 2, h / 2 - 7);
                g2d.drawLine(w / 2, h / 2 + 7, w / 2, h / 2 + 13);
                g2d.drawLine(w / 2 - 13, h / 2, w / 2 - 7, h / 2);
                g2d.drawLine(w / 2 + 7, h / 2, w / 2 + 13, h / 2);
            }
        });

        // Add the interactor
        c.getInteractors().add(new InteractorAdapter() {

            protected boolean isDoubleClick(InputEvent ie) {
                if (ie instanceof MouseEvent) {
                    MouseEvent me = (MouseEvent) ie;
                    return me.getID() == MouseEvent.MOUSE_CLICKED
                            && me.getButton() == MouseEvent.BUTTON1
                            && me.getClickCount() == 2;
                }
                return false;
            }

            public boolean startInteraction(InputEvent ie) {
                return isDoubleClick(ie);
            }

            public boolean endInteraction() {
                return true;
            }

            public void mouseClicked(MouseEvent me) {
                if (isDoubleClick(me)) {
                    JSVGCanvas c = (JSVGCanvas) me.getSource();
                    int cx = c.getWidth() / 2;
                    int cy = c.getHeight() / 2;
                    int x = me.getX();
                    int y = me.getY();
                    AffineTransform at =
                        AffineTransform.getTranslateInstance(cx - x, cy - y);
                    AffineTransform rt =
                        (AffineTransform) c.getRenderingTransform().clone();
                    rt.preConcatenate(at);
                    c.setRenderingTransform(rt);
                }
            }
        });

        // A frame for the canvas to live in
        JFrame f = new JFrame("Overlay example");
        f.setSize(400, 300);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // Add the canvas to the frame
        f.getContentPane().add(c);

        // Show the frame
        f.setVisible(true);
    }
}

