/*
 * DisplayFrame.java
 *
 * Created on April 22, 2005, 10:37 AM
 */

package lab12;

import java.io.*;
import java.util.StringTokenizer;

import lab07.Queue;

/**
 *
 * @author  jkdawg
 */
public class DisplayFrame extends javax.swing.JFrame {
    
    private WordIndex index = new WordIndex ();

    /** Creates new form DisplayFrame */
    public DisplayFrame() {
        initComponents();
    }
    
    /** This method opens the file specified by the fully qualified
     * filename parameter and scans it to build a word index.
     * @param fullname The complete filename (including full directory path).
     */
    public void buildIndex (String fullname) {
        clear ();
        index.removeAll ();

        int lineNumber = 0;

        try {
            FileInputStream stream = new FileInputStream (fullname);
            BufferedReader reader =
                new BufferedReader (new InputStreamReader (stream));

            String nextLine = reader.readLine ();
      
            while (nextLine != null) {
                lineNumber++;
                textDisplayArea.append (lineNumber + ": " + nextLine + "\n");
        
                StringTokenizer tokenizer =
                    new StringTokenizer (nextLine, ".,;:?!-()\"\' \t");
          
                while (tokenizer.hasMoreTokens ()) {
                    String word = tokenizer.nextToken();
                    word = word.toLowerCase ();
                    index.insert (new IndexItem (word, lineNumber));
                }
        
                nextLine = reader.readLine ();
            }
            reader.close ();
            loadWordIndex ();
        }
        catch (IOException e) {
            ErrorDialog dialog = new ErrorDialog (this, true);
            dialog.setText ("Unable to open file " + fullname);
            dialog.setVisible (true);
        }
    }
  
    public void loadWordIndex () {
        Queue queue = index.listAscending();
    
        indexDisplayArea.setText ("");

        while (!queue.isEmpty()) {
            indexDisplayArea.append (((IndexItem) queue.remove()).toString() + "\n");
        }

        indexDisplayArea.append ("\nFile contains " + index.size ()
            + " distinct words\n");
    }

    /** Clears the contents of both center panel compartments (file
     * contents and word index).
     */
    public void clear () {
        textDisplayArea.setText ("");
        indexDisplayArea.setText ("");
        index.removeAll();
        fldFilename.setText("");
    }

    /** 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
        controlPanel = new javax.swing.JPanel();
        lblDirectory = new javax.swing.JLabel();
        fldDirectory = new javax.swing.JTextField();
        lblFilename = new javax.swing.JLabel();
        fldFilename = new javax.swing.JTextField();
        btnStart = new javax.swing.JButton();
        btnClear = new javax.swing.JButton();
        btnExit = new javax.swing.JButton();
        titlePanel = new javax.swing.JPanel();
        lblTitle = new javax.swing.JLabel();
        centerPanel = new javax.swing.JPanel();
        textScrollPane = new javax.swing.JScrollPane();
        textDisplayArea = new javax.swing.JTextArea();
        indexScrollPane = new javax.swing.JScrollPane();
        indexDisplayArea = new javax.swing.JTextArea();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("Lab 12: Word Index Generator");
        controlPanel.setPreferredSize(new java.awt.Dimension(685, 42));
        lblDirectory.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblDirectory.setText("Directory:");
        controlPanel.add(lblDirectory);

        fldDirectory.setColumns(20);
        fldDirectory.setMinimumSize(new java.awt.Dimension(11, 28));
        fldDirectory.setText("samples");
        controlPanel.add(fldDirectory);

        lblFilename.setHorizontalAlignment(javax.swing.SwingConstants.RIGHT);
        lblFilename.setText("Filename:");
        controlPanel.add(lblFilename);

        fldFilename.setColumns(10);
        fldFilename.setMinimumSize(new java.awt.Dimension(11, 28));
        fldFilename.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                fldFilenameActionPerformed(evt);
            }
        });

        controlPanel.add(fldFilename);

        btnStart.setText("Start");
        btnStart.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnStartActionPerformed(evt);
            }
        });

        controlPanel.add(btnStart);

        btnClear.setText("Clear");
        btnClear.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnClearActionPerformed(evt);
            }
        });

        controlPanel.add(btnClear);

        btnExit.setText("Exit");
        btnExit.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnExitActionPerformed(evt);
            }
        });

        controlPanel.add(btnExit);

        getContentPane().add(controlPanel, java.awt.BorderLayout.SOUTH);

        lblTitle.setFont(new java.awt.Font("Microsoft Sans Serif", 1, 18));
        lblTitle.setText("Word Index Generator");
        titlePanel.add(lblTitle);

        getContentPane().add(titlePanel, java.awt.BorderLayout.NORTH);

        centerPanel.setLayout(new java.awt.GridLayout(2, 1));

        textScrollPane.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204)));
        textScrollPane.setViewportView(textDisplayArea);

        centerPanel.add(textScrollPane);

        indexScrollPane.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204)));
        indexScrollPane.setViewportView(indexDisplayArea);

        centerPanel.add(indexScrollPane);

        getContentPane().add(centerPanel, java.awt.BorderLayout.CENTER);

        java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
        setBounds((screenSize.width-800)/2, (screenSize.height-650)/2, 800, 650);
    }//GEN-END:initComponents

    private void fldFilenameActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_fldFilenameActionPerformed
        loadFile();
    }//GEN-LAST:event_fldFilenameActionPerformed

    private void btnClearActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnClearActionPerformed
        clear();
    }//GEN-LAST:event_btnClearActionPerformed

    private void btnStartActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnStartActionPerformed
        loadFile();
    }//GEN-LAST:event_btnStartActionPerformed

    private void btnExitActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnExitActionPerformed
        setVisible(false);
        dispose();
        System.exit(0);
    }//GEN-LAST:event_btnExitActionPerformed
    
    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new DisplayFrame().setVisible(true);
            }
        });
    }
 
    private void loadFile () {
        String fullname = fldDirectory.getText() +
        System.getProperty("file.separator") +
        fldFilename.getText();
        buildIndex (fullname);        
    }
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnClear;
    private javax.swing.JButton btnExit;
    private javax.swing.JButton btnStart;
    private javax.swing.JPanel centerPanel;
    private javax.swing.JPanel controlPanel;
    private javax.swing.JTextField fldDirectory;
    private javax.swing.JTextField fldFilename;
    private javax.swing.JTextArea indexDisplayArea;
    private javax.swing.JScrollPane indexScrollPane;
    private javax.swing.JLabel lblDirectory;
    private javax.swing.JLabel lblFilename;
    private javax.swing.JLabel lblTitle;
    private javax.swing.JTextArea textDisplayArea;
    private javax.swing.JScrollPane textScrollPane;
    private javax.swing.JPanel titlePanel;
    // End of variables declaration//GEN-END:variables
    
}
