import java.io.IOException;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JTextArea;
import javax.swing.JButton;
import javax.swing.JLabel;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Scanner;

public class TestWeightedGraph {
    JFrame theFrame;
    JLabel filePrompt;
    JLabel startPrompt;
    JTextField fileField;
    JTextField startField;
    JPanel filePanel;
    JScrollPane filePane;
    JButton computeButton;
    JPanel buttonPanel;
    JTextArea outArea;
    JPanel outPanel;
    JScrollPane outPane;
    
    public TestWeightedGraph() {
        theFrame = new JFrame("Weighted Graph Example");
        theFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        theFrame.setSize(800,700);
        theFrame.getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER,150,5));
        filePrompt = new JLabel("Enter the graph file name >");
        fileField = new JTextField("SampleWeightedGraph.data",20);
        startPrompt = new JLabel("Enter the start vertex");
        startField = new JTextField("0",2);
        computeButton = new JButton("Compute Paths");
        computeButton.addActionListener(new ComputeButtonAction());
        filePanel = new JPanel();
        filePanel.add(filePrompt);
        filePanel.add(fileField);
        filePanel.add(startPrompt);
        filePanel.add(startField);
        filePanel.add(computeButton);
        filePane = new JScrollPane(filePanel);
        outArea = new JTextArea(500,100);
        outArea.setFont(new Font("Courier",Font.BOLD,12));
        outPanel = new JPanel();
        outPanel.add(outArea);
        outPane = new JScrollPane(outPanel);
        outPane.setPreferredSize(new Dimension(700,600));
        theFrame.add(filePane);
        theFrame.add(outPane);
        theFrame.setVisible(true);
    } // end constructor
    
    class ComputeButtonAction implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            Scanner in;
            try {
                String fileName = fileField.getText();
                in = new Scanner(new File(fileName));
            } catch( IOException e1 ) {
                e1.printStackTrace();
                return;
            } // end try
            WeightedGraph g = new WeightedGraph(true);
            while( in.hasNext() ) {
                int vertex1 = in.nextInt();
                int vertex2 = in.nextInt();
                int weight = in.nextInt();
                g.addEdge(vertex1, vertex2, weight);
            } // end while
            outArea.setText(g+"\n");
            int startVertex = Integer.parseInt(startField.getText());
            g.allShortestPaths(startVertex);
            for( int i = 0; i < g.numberOfVertices(); i++ ) {
                outArea.append("A shortest path from "+ startVertex + " to "+ i + " is:\n");
                outArea.append(g.shortestPathArray(i)+"\n");
            } // end for
        } // end actionPerformed
    }// end ComputeButtonAction
    
    
    public static void main(String[] s) throws IOException {
        new TestWeightedGraph();
    } // end main
    
    
}  // TestWeightedGraph

