/*
 * rotateTest.java
 *
 * Created on 20 septembre 2003, 10:03
 */
import org.apache.batik.bridge.UpdateManager;
import org.apache.batik.swing.gvt.*;
import org.apache.batik.swing.svg.*;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.script.Window;
import org.apache.batik.bridge.ViewBox;
import org.apache.batik.bridge.*;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.events.EventTarget;

import java.awt.*;
import java.awt.event.*;
import java.util.*;
import java.net.URL;
import javax.swing.*;
/**
 *
 * @author  manu
 */

    public class rotateTest {
        JSVGCanvas canvas;
        JFrame frame = new JFrame();
        JPanel panel = new JPanel();
        Document document;
        Window window;
        motor motor;
        int refresh = 20;
        
        public rotateTest(){
            canvas = new JSVGCanvas();
            // Forces the canvas to always be dynamic even if the current
            // document does not contain scripting or animation.
            canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
            canvas.addSVGLoadEventDispatcherListener
            (new SVGLoadEventDispatcherAdapter() {
                public void svgLoadEventDispatchStarted
                (SVGLoadEventDispatcherEvent e) {
                    // At this time the document is available...
                    document = canvas.getSVGDocument();
                    // ...and the window object too.
                    window = canvas.getUpdateManager().
                    getScriptingEnvironment().createWindow();
                    
                   
                    
                    registerListeners();
                    
                    
                }
            });
                canvas.setDoubleBufferedRendering(true);
            //canvas.setBackground(new Color(0,0,0));
                canvas.setPreferredSize(new Dimension(250, 250));
                
                panel.add(canvas);
                frame.addWindowListener(new WindowAdapter() {
                public void windowOpened(WindowEvent e) {
                
                initDocument();
                
            }
           });
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(panel);
        
                Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
                Dimension labelSize = frame.getPreferredSize();
                frame.setLocation(screenSize.width/2 - (labelSize.width/2),
                screenSize.height/2 - (labelSize.height/2));
                frame.pack();
                frame.show();
        }
        
        public void registerListeners() {
            // Gets an element from the loaded document.
            Element level6Element = document.getElementById("level6");
            EventTarget level6ET = null;
            level6ET = (EventTarget)level6Element;
            
            // Adds a 'onload' listener
            level6ET.addEventListener("SVGLoad", new OnLoadAction(), false);
            //  Set the JSVGCanvas listeners.
            canvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
                
                public void documentLoadingStarted(SVGDocumentLoaderEvent e) {
                    System.out.println("Document Loading...");
                    
                }
                
                public void documentLoadingCompleted(SVGDocumentLoaderEvent e) {
                    System.out.println("Document Loaded.");
                }
            });
            
            canvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter() {
                
                public void gvtBuildStarted(GVTTreeBuilderEvent e) {
                    System.out.println("Build Started...");
                }
                
                public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
                    System.out.println("Build Done.");
                }
            });
            
            canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
                
                public void gvtRenderingPrepare(GVTTreeRendererEvent e) {
                    System.out.println("Rendering Started...");
                }
                public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
                    System.out.println("Ready.");
                }
            });
            canvas.addUpdateManagerListener(new UpdateManagerListener() {
                
                public void managerResumed(UpdateManagerEvent e) {
                    System.out.println("managerResumed Started...");
                }
                
                public void managerStarted(UpdateManagerEvent e)  {
                    System.out.println("manager Started");
                }
                public void managerStopped(UpdateManagerEvent e) {
                    System.out.println("manager Stopped");
                }
                public void managerSuspended(UpdateManagerEvent e) {
                    System.out.println("manager Suspended");
                }
                public void updateStarted(UpdateManagerEvent e) {
                    
                }
                public void updateCompleted(UpdateManagerEvent e) {
                }
                public void updateFailed(UpdateManagerEvent e) {
                    System.out.println("updateFailed");
                }
            });
            
            
        }
        
        public void initDocument() {
            
            ClassLoader cl = Thread.currentThread().getContextClassLoader();
            URL baseDocumentURL = cl.getResource("level6.svg");
            System.out.println("SVGApplication: baseDocumentURL.toString() = " +
            baseDocumentURL.toString());
            canvas.setURI(baseDocumentURL.toString());
        }
         
        public motor newDefaultmotor() {
        // Class in charge of clock drawing
        gearTrain gt = new gearTrain(document);
        // Class in charge of simulating the stepping motor and
        // manage time related context.
        motor = new motor();
        motor.setGearTrain(gt);
        return motor;
    }   
        
        public static void main(String[] args) {
        new rotateTest();
        
        
    }
 
        public class OnLoadAction implements EventListener {
            public void handleEvent(Event evt) {
            
            motor = newDefaultmotor();
            window.setInterval( motor, refresh);
        }      
    }
}
