package com.proteus.svg.dynamic;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Iterator;

import javax.swing.JFrame;

import org.apache.batik.dom.svg.SAXSVGDocumentFactory;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.svg.SVGUserAgentAdapter;
import org.apache.batik.util.AbstractParsedURLProtocolHandler;
import org.apache.batik.util.ParsedURL;
import org.apache.batik.util.ParsedURLData;
import org.w3c.dom.Document;

import com.proteus.svg.BrowserControl;

public class SVGFrame extends JFrame {
    SAXSVGDocumentFactory factory;

    JSVGCanvas canvas;

    public SVGFrame() {
        super("SVG Test");
        ParsedURL.registerHandler(new MyProtocolHanlder("sentinel"));
        canvas = new JSVGCanvas(new MyUserAgent(), true, true);
        canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
        factory = new SAXSVGDocumentFactory(
                "org.apache.xerces.parsers.SAXParser");
        InputStreamReader reader = new InputStreamReader(this.getClass()
                .getResourceAsStream("test.svg"));

        try {
            Document doc = factory.createDocument(null, reader);
            canvas.setDocument(doc);
        } catch (IOException e) {
            e.printStackTrace();
        }
        setSize(365, 760);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        getContentPane().add(canvas);
        show();

    }

    public static void main(String[] args) {
        SVGFrame frame = new SVGFrame();
    }

    class MyUserAgent extends SVGUserAgentAdapter {

        public void openLink(String link, boolean arg1) {
            BrowserControl.getInstance().showURL(link);
        }

    }

    class MyProtocolHanlder extends AbstractParsedURLProtocolHandler {

        public MyProtocolHanlder(String arg0) {
            super(arg0);
        }

        public ParsedURLData parseURL(ParsedURL arg0, String arg1) {
            return null;
        }

        public ParsedURLData parseURL(String arg0) {
            return new MyParsedURLData(arg0);
        }

    }

    class MyParsedURLData extends ParsedURLData {

        private String resource;

        public MyParsedURLData(String resource) {
            this.resource = resource;
        }

        public InputStream openStream(String arg0, Iterator arg1)
                throws IOException {
            return super.openStream(arg0, arg1);
        }

        protected InputStream openStreamInternal(String arg0, Iterator arg1,
                Iterator arg2) throws IOException {
            return super.openStreamInternal(arg0, arg1, arg2);
        }

        public InputStream openStreamRaw(String arg0, Iterator arg1)
                throws IOException {
            return super.openStreamRaw(arg0, arg1);
        }

    }
}
