package com.wrox.proxml;

import java.io.*;
import javax.swing.*;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.stream.StreamSource;
import javax.xml.transform.stream.StreamResult;

public class SimpleXSLT extends javax.swing.JFrame {
    
    /** Creates new form SimpleXSLT */
    public SimpleXSLT() {
        initComponents();
    }
    
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        controlsPanel = new javax.swing.JPanel();
        sourceCaption = new javax.swing.JLabel();
        sourceField = new javax.swing.JTextField();
        sourceButton = new javax.swing.JButton();
        stylesheetCaption = new javax.swing.JLabel();
        stylesheetField = new javax.swing.JTextField();
        stylesheetButton = new javax.swing.JButton();
        transformButton = new javax.swing.JButton();
        resultPanel = new javax.swing.JPanel();
        resultPane = new javax.swing.JScrollPane();
        resultField = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        sourceCaption.setDisplayedMnemonic('X');
        sourceCaption.setLabelFor(sourceField);
        sourceCaption.setText("Source XML:");
        sourceCaption.setName("sourceXmlCaption");

        sourceField.setName("sourceXMLField");

        sourceButton.setText("...");
        sourceButton.setName("sourceXMLButton");
        sourceButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                sourceButtonActionPerformed(evt);
            }
        });

        stylesheetCaption.setDisplayedMnemonic('S');
        stylesheetCaption.setLabelFor(stylesheetField);
        stylesheetCaption.setText("Stylesheet:");

        stylesheetButton.setText("...");
        stylesheetButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                stylesheetButtonActionPerformed(evt);
            }
        });

        transformButton.setMnemonic('T');
        transformButton.setText("Transform");
        transformButton.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                transformButtonActionPerformed(evt);
            }
        });

        org.jdesktop.layout.GroupLayout controlsPanelLayout = new org.jdesktop.layout.GroupLayout(controlsPanel);
        controlsPanel.setLayout(controlsPanelLayout);
        controlsPanelLayout.setHorizontalGroup(
            controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(controlsPanelLayout.createSequentialGroup()
                .add(controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                    .add(controlsPanelLayout.createSequentialGroup()
                        .add(controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(sourceCaption)
                            .add(stylesheetCaption))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
                            .add(stylesheetField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 296, Short.MAX_VALUE)
                            .add(sourceField, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 296, Short.MAX_VALUE))
                        .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                        .add(controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.TRAILING, false)
                            .add(sourceButton, 0, 0, Short.MAX_VALUE)
                            .add(stylesheetButton, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, 25, Short.MAX_VALUE)))
                    .add(transformButton))
                .addContainerGap())
        );
        controlsPanelLayout.setVerticalGroup(
            controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(controlsPanelLayout.createSequentialGroup()
                .add(controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(sourceCaption)
                    .add(sourceField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                    .add(sourceButton))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(controlsPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.BASELINE)
                    .add(stylesheetCaption)
                    .add(stylesheetButton)
                    .add(stylesheetField, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .add(transformButton))
        );

        resultPanel.setName("ResultsPanel");
        resultPane.setName("ResultField");
        resultField.setColumns(20);
        resultField.setRows(5);
        resultField.setName("resultField");
        resultPane.setViewportView(resultField);

        org.jdesktop.layout.GroupLayout resultPanelLayout = new org.jdesktop.layout.GroupLayout(resultPanel);
        resultPanel.setLayout(resultPanelLayout);
        resultPanelLayout.setHorizontalGroup(
            resultPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(resultPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 400, Short.MAX_VALUE)
        );
        resultPanelLayout.setVerticalGroup(
            resultPanelLayout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(resultPane, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, 271, Short.MAX_VALUE)
        );

        org.jdesktop.layout.GroupLayout layout = new org.jdesktop.layout.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(resultPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .add(controlsPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(org.jdesktop.layout.GroupLayout.LEADING)
            .add(layout.createSequentialGroup()
                .add(controlsPanel, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(org.jdesktop.layout.LayoutStyle.RELATED)
                .add(resultPanel, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, org.jdesktop.layout.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void transformButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_transformButtonActionPerformed
        if(this.sourceField.getText().length() > 0 && 
                this.stylesheetField.getText().length() >0) {
            
            try {
                File source = new File(this.sourceField.getText());
                File stylesheet = new File(this.stylesheetField.getText());

                StreamSource sourceSource = new StreamSource(source);
                StreamSource styleSource = new StreamSource(stylesheet);
                Transformer transformer = 
                        TransformerFactory.newInstance().newTransformer(styleSource);
                StringWriter w = new StringWriter();
                StreamResult result = new StreamResult(w);
                transformer.transform(sourceSource, result);
                this.resultField.setText(w.getBuffer().toString());
            
            } catch (TransformerException te) {
                System.out.println ("\n** Transformer error");
                System.out.println("   " + te.getMessage() );
            } catch(Exception e) {
                System.out.println ("\n** General error");
                System.out.println("   " + e.getMessage() );
            }
        }
    }//GEN-LAST:event_transformButtonActionPerformed

    private void stylesheetButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_stylesheetButtonActionPerformed
        int ret = fc.showOpenDialog(this);
        if(JFileChooser.APPROVE_OPTION == ret) {
            this.stylesheetField.setText(fc.getSelectedFile().getPath());
        }
    }//GEN-LAST:event_stylesheetButtonActionPerformed

    private void sourceButtonActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_sourceButtonActionPerformed
        int ret = fc.showOpenDialog(this);
        if(JFileChooser.APPROVE_OPTION == ret) {
            this.sourceField.setText(fc.getSelectedFile().getPath());
        }
    }//GEN-LAST:event_sourceButtonActionPerformed
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new SimpleXSLT().setVisible(true);
            }
        });
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel controlsPanel;
    private javax.swing.JTextArea resultField;
    private javax.swing.JScrollPane resultPane;
    private javax.swing.JPanel resultPanel;
    private javax.swing.JButton sourceButton;
    private javax.swing.JLabel sourceCaption;
    private javax.swing.JTextField sourceField;
    private javax.swing.JButton stylesheetButton;
    private javax.swing.JLabel stylesheetCaption;
    private javax.swing.JTextField stylesheetField;
    private javax.swing.JButton transformButton;
    // End of variables declaration//GEN-END:variables
    private JFileChooser fc = new JFileChooser();
    
}
