import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
import javax.swing.*;
import javax.swing.event.*;

import org.apache.batik.dom.svg.*;
import org.apache.batik.dom.events.*;
import org.apache.batik.gvt.*;
import org.apache.batik.svggen.*;
import org.apache.batik.swing.*;
import org.apache.batik.swing.svg.*;
import org.apache.batik.swing.gvt.*;
import org.apache.batik.util.*;

import org.w3c.dom.*;
import org.w3c.dom.events.Event;
import org.w3c.dom.events.EventListener;
import org.w3c.dom.svg.*;
import org.apache.batik.gvt.event.*; 
import org.apache.batik.bridge.UpdateManager;


class SVGCopy extends JFrame {
	
	File file = new File("");
	JPanel shapeTypesPanel;
	JFileChooser fileChooser = new JFileChooser();

// the internal frames:
	JInternalFrame canvasFrame = new JInternalFrame("", true, true) ;
	JInternalFrame editFrame = new JInternalFrame("", false, false) ;
	JScrollPane scrollPanel;

	JDesktopPane desktop = new JDesktopPane();
	JMenu menu = new JMenu("File");
	JMenuItem loadSvg = new JMenuItem("Load");
	JButton selectButton = new JButton("Select Node");

	URL path;

	JSVGCanvas canvas = new JSVGCanvas();
	SVGElement svgRoot;
	Document doc;


	public SVGCopy() {

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				dispose();
				System.exit(0);
			}
		});
		setExtendedState(java.awt.Frame.MAXIMIZED_BOTH);
		initScreen();
	}

	private void initScreen() {

		loadSvg.addActionListener(new ActionListener() {
			
			public void actionPerformed(ActionEvent e) {
			
				loadSvg();
			}	
		});

// Here, i added the Listener:
//----------------------------
		
		canvasFrame.addInternalFrameListener(new InternalFrameAdapter() {
			
			public void internalFrameActivated(InternalFrameEvent e) {
				
				canvas.immediateRepaint();
				canvas.repaint();
				canvas.repaint(0,0,50,50);
				Graphics g = canvas.getGraphics();
				canvas.paintComponent(g);
			}
		});          

		menu.add(loadSvg);
		JMenuBar menubar = new JMenuBar();		
		menubar.add(menu);
		
		setJMenuBar(menubar);

		selectButton.setEnabled(false);
		
		shapeTypesPanel = new JPanel(new GridLayout(1,1,10,5));
		shapeTypesPanel.add(selectButton);

		canvas.setEnableZoomInteractor(false);
		canvas.setEnableImageZoomInteractor(false);
		canvas.setEnablePanInteractor(false);
		canvas.setEnableRotateInteractor(false);
		canvas.setEnableResetTransformInteractor(false);
//		canvas.setDoubleBufferedRendering(true);
//		canvas.setDoubleBuffered(true);
		canvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC); 

//		canvasFrame.setDoubleBuffered(true);
		
		canvas.addGVTTreeRendererListener(new GVTTreeRendererListener() {
			
			public void gvtRenderingCompleted(GVTTreeRendererEvent e) {
				
				System.out.println("Rendering Finished...");
			}
			
			public void gvtRenderingCancelled(GVTTreeRendererEvent e) {} 

			public void gvtRenderingFailed(GVTTreeRendererEvent e) {} 

			public void gvtRenderingStarted(GVTTreeRendererEvent e) {
				
				System.out.println("Rendering Started...");
			} 
			
			public void gvtRenderingPrepare(GVTTreeRendererEvent e) {}
		});
	
		canvas.addGVTTreeBuilderListener(new GVTTreeBuilderListener() {
			
			public void gvtBuildCompleted(GVTTreeBuilderEvent e) {
				
				System.out.println("Building Tree Finished...");
				
				canvas.validate();
				canvasFrame.setSize(canvasFrame.getPreferredSize());
				canvas.revalidate();
				canvasFrame.pack();
			}
					
			public void gvtBuildCancelled(GVTTreeBuilderEvent e) {} 

			public void gvtBuildFailed(GVTTreeBuilderEvent e) {} 

			public void gvtBuildStarted(GVTTreeBuilderEvent e) {
				
				System.out.println("Building Tree Started...");
			} 
		});

		scrollPanel = new JScrollPane(canvas,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
		setContentPane(desktop);
		canvasFrame.getContentPane().add(scrollPanel);
		canvasFrame.validate();
		canvasFrame.setVisible(true);
		canvasFrame.setSize(canvasFrame.getPreferredSize());		
		editFrame.getContentPane().add(shapeTypesPanel);
		editFrame.validate();
		editFrame.setVisible(true);
		editFrame.setSize(editFrame.getPreferredSize());		

		desktop.add(editFrame);
		desktop.add(canvasFrame);
		setVisible(true);
	}

	public void loadSvg() {

		DOMImplementation impl = SVGDOMImplementation.getDOMImplementation();		
		fileChooser.setDialogTitle("Load SVG"); 
		fileChooser.showOpenDialog(this);

		file = fileChooser.getSelectedFile();

		if (file != null) {

			try{
	
				String parser = XMLResourceDescriptor.getXMLParserClassName();
				SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
				doc = f.createDocument(file.toURI().toString());
			}
			catch (IOException ex){
			}
			
			svgRoot = (SVGElement) doc.getDocumentElement();
			canvas.setDocument(doc);
		}	
	}

	public static void main(String args[]) {

		SVGCopy mainFrame = new SVGCopy();
	}
}

