package egl.barcode.applet;

import java.awt.*;
import java.awt.event.*;
import java.awt.print.PageFormat;
import java.awt.print.Paper;
import java.awt.print.PrinterJob;
import java.io.*;
import javax.swing.*;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.batik.swing.JSVGCanvas;
import org.apache.batik.swing.gvt.GVTTreeRendererAdapter;
import org.apache.batik.swing.gvt.GVTTreeRendererEvent;
import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter;
import org.apache.batik.swing.svg.SVGDocumentLoaderEvent;
import org.apache.batik.swing.svg.GVTTreeBuilderAdapter;
import org.apache.batik.swing.svg.GVTTreeBuilderEvent;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.print.PrintTranscoder;
import org.w3c.dom.svg.SVGDocument;
import org.w3c.dom.svg.SVGSVGElement;

public class SVGApplication
{
    
    public static void main(String[] args)
    {
        JFrame f = new JFrame("Batik");
        SVGApplication app = new SVGApplication(f);
        f.getContentPane().add(app.createComponents());
        
        f.addWindowListener(new WindowAdapter()
        {
            public void windowClosing(WindowEvent e)
            {
                System.exit(0);
            }
        });
        f.setSize(400, 400);
        f.setVisible(true);
    }
    
    JFrame frame;
    JButton button = new JButton("Load...");
    JButton button2 = new JButton("Print");
    JButton button3 = new JButton("Save");
    JLabel label = new JLabel();
    JSVGCanvas svgCanvas = new JSVGCanvas();
    SVGDocument svgDoc=null;
    
    
    // svgCanvas.getSVGDocument();
    PrintTranscoder prm = new PrintTranscoder();
    
    public SVGApplication(JFrame f)
    {
        frame = f;
        svgCanvas.setPreferredSize(new Dimension(100,100));
        
    }
    
    public JComponent createComponents()
    {
        final JPanel panel = new JPanel(new BorderLayout());
        
        JPanel p = new JPanel(new FlowLayout(FlowLayout.LEFT));
        p.add(button);
        p.add(button2);
        p.add(button3);
        p.add(label);
        
        panel.add("North", p);
        panel.add("Center", svgCanvas);
        
        // Set the button action.
        button.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                JFileChooser fc = new JFileChooser(".");
                int choice = fc.showOpenDialog(panel);
                if (choice == JFileChooser.APPROVE_OPTION)
                {
                    File f = fc.getSelectedFile();
                    try
                    {
                        svgCanvas.setURI(f.toURL().toString());
                    }
                    catch (IOException ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }
        });
        
        
        button2.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                PrinterJob printerJob = PrinterJob.getPrinterJob();
                PageFormat pageFormat = printerJob.pageDialog(printerJob.defaultPage());
                Paper pp=pageFormat.getPaper();
                //        p.setSize(8.25*72, 11.69*72);
                svgDoc=svgCanvas.getSVGDocument();
                SVGSVGElement svgElem =svgDoc.getRootElement();
                //String width =svgElem.getAttribute("width");
                //String height =svgElem.getAttribute("height");
                //double widthInInches =new Double(width).intValue() /90.0;
               // double heightInInches = new Double(height).intValue() /90.0;
                
                
                pp.setSize(8.25*72,11.69*72);
                pp.setImageableArea(0,0,8.25*72,11.69*72);
                pageFormat.setPaper(pp);
                PrintTranscoder prm = new PrintTranscoder();
                TranscoderInput ti = new TranscoderInput(svgCanvas.getSVGDocument());
                prm.transcode(ti, null);
                printerJob.setPrintable(prm,pageFormat);
                if (printerJob.printDialog())
                {
                    printerJob.setPrintable(prm, pageFormat);
                    try
                    {
                        printerJob.print(); // Error introduced here
                    }
                    catch (Exception e)
                    {
                        System.out.println(e.getMessage());
                    }
                }
                
            }
        });
        
        button3.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent ae)
            {
                //JFileChooser fc = new JFileChooser(".");
//                int choice = fc.showOpenDialog(panel);
  //              if (choice == JFileChooser.APPROVE_OPTION)
                {
                    //File f = fc.getSelectedFile();
                    try
                    {
                        svgDoc=svgCanvas.getSVGDocument();
                        TransformerFactory tranFactory = TransformerFactory.newInstance();
                        Transformer aTransformer = tranFactory.newTransformer();
                        Source src = new DOMSource(svgDoc);
                        Result dest = new StreamResult(new File("d:\\res.svg"));
                        aTransformer.transform(src, dest);
                    }
                    catch (Exception ex)
                    {
                        ex.printStackTrace();
                    }
                }
            }
        });
        // Set the JSVGCanvas listeners.
        svgCanvas.addSVGDocumentLoaderListener(new SVGDocumentLoaderAdapter()
        {
            public void documentLoadingStarted(SVGDocumentLoaderEvent e)
            {
                label.setText("Document Loading...");
            }
            public void documentLoadingCompleted(SVGDocumentLoaderEvent e)
            {
                label.setText("Document Loaded.");
            }
        });
        
        svgCanvas.addGVTTreeBuilderListener(new GVTTreeBuilderAdapter()
        {
            public void gvtBuildStarted(GVTTreeBuilderEvent e)
            {
                label.setText("Build Started...");
            }
            public void gvtBuildCompleted(GVTTreeBuilderEvent e)
            {
                label.setText("Build Done.");
                frame.pack();
            }
        });
        
        svgCanvas.addGVTTreeRendererListener(new GVTTreeRendererAdapter()
        {
            
            public void gvtRenderingPrepare(GVTTreeRendererEvent e)
            {
                label.setText("Rendering Started...");
            }
            public void gvtRenderingCompleted(GVTTreeRendererEvent e)
            {
                label.setText("");
            }
        });
        
        return panel;
    }
}
