/*
 * XMLPanel.java
 *
 * Created on October 9, 2001, 9:06 AM
 */

package com.imsl.demo.xml;
import com.imsl.chart.Chart;
import com.imsl.chart.JPanelChart;
import com.imsl.chart.xml.ChartXML;
import java.io.*;
import javax.swing.*;

/**
 * View an XML chart description file.
 * The view is a tabbed pane. One tab shows the chart and the other shows
 * the XML file. The XML file can be editted and the results reflected in
 * the chart.
 *
 * @author  brophy
 */
class XMLPanel extends javax.swing.JPanel {
    private JPanelChart panelChart;
    private JTextArea   textArea;
    private ChartXML    chartXML;
    
    /**
     *  Creates new form XMLPanel.
     *  @param name is the resource name of the XML description.
     *  @see java.lang.ClassLoader.html#getResourceAsStream(java.lang.String)
     */
    public XMLPanel() {
        initComponents();
        
        panelChart = new JPanelChart();
        
        textArea = new JTextArea();
        textArea.setTabSize(4);
        textArea.setFont(java.awt.Font.getFont("SansSerif"));
        JScrollPane jScrollPane = new JScrollPane(textArea);
        jTabbedPane1.addTab("Chart", panelChart);
        jTabbedPane1.addTab("XML", jScrollPane);
    }
    
    public void setInputStream(InputStream is) throws IOException {
        // read the resource into a StringBuffer and initialize text area.
        Reader reader = new InputStreamReader(is);
        StringBuffer sb = new StringBuffer(4096);
        char buffer[] = new char[2048];
        while (true) {
            int n = reader.read(buffer);
            if (n < 0)  break;
            sb.append(buffer, 0, n);
        }
        is.close();
        textArea.setText(sb.toString());
        textArea.setCaretPosition(0);
        createChart();
        repaint();
    }
    
    public Chart getChart() {
        if (chartXML == null)  return null;
        return chartXML.getChart();
    }
    
    /**
     *  Creates a chart from its XML description.
     */
    private void createChart() {
        try {
            String text = textArea.getText();
            if (text.length() == 0)  return;
            chartXML = new ChartXML(new org.xml.sax.InputSource(new StringReader(text)), true);
            Chart chart = chartXML.getChart();
            panelChart.setChart(chart);
            chart.setComponent(panelChart);
        } catch (Exception e) {
            JOptionPane.showMessageDialog(this, e.toString(), "Error", JOptionPane.ERROR_MESSAGE);
        }
    }
    
    
    /** 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.
     */
    private void initComponents() {//GEN-BEGIN:initComponents
        jTabbedPane1 = new javax.swing.JTabbedPane();

        setLayout(new java.awt.BorderLayout());

        jTabbedPane1.setTabPlacement(javax.swing.JTabbedPane.BOTTOM);
        jTabbedPane1.setPreferredSize(new java.awt.Dimension(500, 500));
        jTabbedPane1.addChangeListener(new javax.swing.event.ChangeListener() {
            public void stateChanged(javax.swing.event.ChangeEvent evt) {
                jTabbedPane1StateChanged(evt);
            }
        });

        add(jTabbedPane1, java.awt.BorderLayout.CENTER);

    }//GEN-END:initComponents
    
    private void jTabbedPane1StateChanged(javax.swing.event.ChangeEvent evt) {//GEN-FIRST:event_jTabbedPane1StateChanged
        // create the chart when the the chart tab (index==0) is selected.
        if (jTabbedPane1.getSelectedIndex() == 0)  createChart();
    }//GEN-LAST:event_jTabbedPane1StateChanged
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JTabbedPane jTabbedPane1;
    // End of variables declaration//GEN-END:variables
}