import java.lang.*;
import java.io.*;
import java.awt.*;
import java.net.*;
import java.awt.event.*;
import javax.swing.*;

class gkclient extends JPanel{
    JTextArea fstructArea, resultArea;
    JTextField serveraddress, portaddress;
    JButton generateButton, clearButton;
    int serverport;

    public gkclient(int portno) {
	serverport = portno;
	initGUI();
    }

    void initGUI() {
	
	fstructArea = new JTextArea(15, 60);
	JScrollPane fstructPane = new JScrollPane(fstructArea);
	resultArea = new JTextArea(4, 60);
	resultArea.setLineWrap(true);
	resultArea.setWrapStyleWord(true);
	JScrollPane resultPane = new JScrollPane(resultArea);
	serveraddress = new JTextField("141.151.138.78", 20);
	portaddress = new JTextField("8483", 20);
	generateButton = new JButton("Generate!");
	clearButton = new JButton("Clear");

	ActionListener buttonlistener = new ActionListener() {
		public void actionPerformed(ActionEvent e) {
		    if (((JButton)e.getSource()).getText().equals("Generate!") == true) {
			try {
			    processFStruct();
			}
			catch (IOException ioe) {
			    System.err.println(ioe);
			}
		    } else if (((JButton)e.getSource()).getText().equals("Clear") == true) {
			fstructArea.setText("");
			resultArea.setText("");
		    }
		}
	    };

	generateButton.addActionListener(buttonlistener);
	clearButton.addActionListener(buttonlistener);

	this.add(fstructPane);
	this.add(resultPane);
	this.add(new JLabel("Server:"));
	this.add(serveraddress);
	this.add(new JLabel("                                Port:"));
	this.add(portaddress);
	this.add(generateButton);
	this.add(clearButton);
    }

    void processFStruct() throws IOException {
	StringBuffer fstruct;
	int i;
	String result;
        Socket echoSocket = null;
	PrintWriter out = null;
	BufferedReader in = null;

	fstruct = new StringBuffer(fstructArea.getText());
	for (i = 0; i < fstruct.length(); i++) {
	    if (fstruct.charAt(i) == '\n') {
		fstruct.setCharAt(i, ' ');
	    }
	}
	
	try {
	    serverport = Integer.parseInt(portaddress.getText());
	    echoSocket = new Socket(serveraddress.getText(), serverport);
	    out = new PrintWriter(echoSocket.getOutputStream(), true);
	    in = new BufferedReader(new InputStreamReader(echoSocket.getInputStream()));
	} catch (UnknownHostException e) {
	    System.err.println("Don't know about host.");
	    resultArea.setText("Don't know about host.");
	} catch (IOException e) {
	    System.err.println("Couldn't get I/O for the connection to: .");
	    resultArea.setText("Couldn't get I/O for the connection to: " + serveraddress.getText());
	}
	out.println("genf\t" + fstruct.toString());
	out.flush();

	result = in.readLine();
	if (result.indexOf("res") == 0) {
	    resultArea.setText(result.substring(4, result.length()));
	} else if (result.indexOf("err") == 0) {
	    resultArea.setText("Error " + result.substring(4, result.length()));
	}

	in.close();
	out.close();
	echoSocket.close();
    }

    public static void main(String ARGS[]) {
	JFrame f = new JFrame("GenKit Client GUI");
	gkclient gk = new gkclient(8483);
	f.addWindowListener(new WindowAdapter() {
	    public void windowClosing(WindowEvent e) {System.exit(0); }
	});

	f.getContentPane().add("Center", gk);
	f.pack();
	f.setSize(new Dimension(700, 450));
	f.show();
    }

}
