package mypackage23;


import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.io.File;
import java.lang.reflect.Array;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;
import javax.swing.table.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import org.apache.batik.dom.svg.SVGDOMImplementation;
import org.apache.batik.swing.*;

import org.apache.batik.bridge.BridgeContext;
import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.AbstractZoomInteractor;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.gvt.JGVTComponent;
import org.apache.batik.swing.gvt.Overlay;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.SVGLoadEventDispatcherAdapter;
import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent;
import org.apache.batik.util.SVGConstants;

import org.w3c.dom.Element;
import org.w3c.dom.svg.SVGDocument;
import org.w3c.dom.svg.SVGElement;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class TestProgram
{
 JFrame frame;
 JLabel label = new JLabel ("Status: ");
 JSVGCanvas canvas = new JSVGCanvas();
 JMenuBar menuBar;
 
 BevelBorder bevel;
 JLabel num2 = new JLabel();
 JLabel num = new JLabel();
 ArrayList spots = new ArrayList();
 JButton b2 = new JButton("showAccidents");
 
 
 
  public TestProgram(JFrame f)
  {
   frame = f;
   
  }

 public void addMenuBar() 
 {
   
   menuBar = new JMenuBar();
   frame.setJMenuBar(menuBar);
   JMenu menu = new JMenu("File");
   menuBar.add(menu);
   JMenuItem item = new JMenuItem("open...");
   menu.add(item);
   
   item.addActionListener(new ActionListener() {
   
   public void actionPerformed(ActionEvent ae)
   {
     JFileChooser fc = new JFileChooser(".");
     int choice = fc.showOpenDialog(frame);
     if (choice == JFileChooser.APPROVE_OPTION) 
     {
       File f = fc.getSelectedFile();
      
         canvas.setURI(f.toURI().toString());
       
     }
   }
   
   });
   
   item = new JMenuItem("Quit");
   menu.add(item);
   item.addActionListener(new ActionListener() {
   
   public void actionPerformed(ActionEvent ae)
   {
     System.exit(0);
   }
   });
   
   
 }
 
  public JComponent createComponents() 
 {
    JPanel panel = new JPanel(new BorderLayout());
   
  // canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
 
 
 JScrollPane scroll = new JScrollPane(canvas,ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
   JPanel labelPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
   labelPanel.add(label);
   labelPanel.add(new JLabel(" "));
   
    panel.add("Center", scroll);
   JPanel buttonPanel = new JPanel();
   buttonPanel.setLayout(new GridLayout(1,7,4,4));
  
   buttonPanel.add(b2);
   
   b2.addActionListener(new showAccidents());
  
  JPanel groupd = new JPanel();
  groupd.setLayout(new GridLayout(2,1,4,2));
  groupd.add(buttonPanel);
  panel.add("North",groupd);
  
  
   return panel;
 }
 
 
 class showAccidents implements ActionListener 
 {
   public void actionPerformed(ActionEvent e)
   {
   
    Point2D p1 = new Point2D.Float(205,519);
    Point2D p2 = new Point2D.Float(526,281);
    Point2D p3 = new Point2D.Float(255,533);
    Point2D p4 = new Point2D.Float(521, 309);
    Point2D p5 = new Point2D.Float(410,113);
    
    spots.add(p1);
    spots.add(p2);
    spots.add(p3);
    spots.add(p4);
    spots.add(p5); 
    
     
     Iterator x = spots.iterator();
     
     while (x.hasNext())
     {
       System.out.println(x.next());
     }
      //canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
                      
                      canvas.getUpdateManager().getUpdateRunnableQueue().invokeLater(new Runnable() {
                      
                      public void run()
                      {
                        SVGDocument doc = canvas.getSVGDocument();
                        String SVGNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
                
                        Iterator i = spots.iterator();
                        Element g = doc.getElementById("circleGroup");
                       if (g == null)
                       {
                          g = doc.createElementNS(SVGNS,"g");
                          g.setAttributeNS(null, "id", "circleGroup");
                          doc.getRootElement().appendChild(g);
                       }
                       
                    
                        while (i.hasNext())
                        {
                          Point2D pt2d = (Point2D) i.next();
                          System.out.println("The spot: " + pt2d);
                          Element e = doc.createElementNS(SVGNS,"spot");
                          e.setAttributeNS(null,"cx",""+pt2d.getX());
                          e.setAttributeNS(null,"cy",""+pt2d.getY());
                          e.setAttributeNS(null,"r","8");
                          e.setAttributeNS(null,"style","fill:red");
                          e.setAttributeNS(null,"id","circle: " + pt2d.getX() + "," + pt2d.getY());
                          g.appendChild(e);
                        }
                                              System.out.println("This is just testing :" + g.getAttribute("id"));

                      }
                      }); 
                      
   }
 }
 

 public void addListeners() 
 {
   canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
   canvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter() {
   
   public void documentLoadingStarted(SVGDocumentLoaderEvent e)
   {
     
     label.setText("SVG Document Loading...");
   }
   public void documentLoadingCompleted(SVGDocumentLoaderEvent e)
   {
     
     label.setText("SVG Document Loaded.");
   }
   });
   
   canvas.addGVTTreeBuilderListener( new GVTTreeBuilderAdapter() 
   {
     public void gvtBuildStarted(GVTTreeBuilderEvent e)
     {
       label.setText("GVT Build Started...");
     }
     public void gvtBuildCompleted(GVTTreeBuilderEvent e)
     {
       label.setText("GVT Build complete.");
     }
     
   });
   
   canvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter() {
   
   public void gvtRenderingPrepare(GVTTreeRendererEvent e)
   {
     label.setText("GVT Rendering Started...");
   }
   public void gvtRenderingCompleted(GVTTreeRendererEvent e)
   {
     label.setText("GVT Rendering Complete.");
   }
   });
  
   canvas.addSVGLoadEventDispatcherListener( new SVGLoadEventDispatcherAdapter () 
   {
     public void svgLoadEventDispatchStarted( SVGLoadEventDispatcherEvent e)
     {
      
       label.setText("OnLoad Processing Started...");
     }
     public void svgLoadEventDispatchCompleted(SVGLoadEventDispatcherEvent e)
     {
       
       label.setText("OnLoad Processing Complete.");
     }
   });
  
 }
 
  public static void main(String[] args)
  {
   
   JFrame f = new JFrame("KeyAccident");
    TestProgram app = new TestProgram(f);
    //app.canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
    app.addMenuBar();

    f.getContentPane().add(app.createComponents());
    app.addListeners();
    
    f.addWindowListener(new WindowAdapter() {
    
    public void windowClosing(WindowEvent e)
    {
      System.exit(0);
    }
    });
    f.setSize(600,500);
    f.setVisible(true);
    
  } 
}