Jump to content

ChatApplet.java

From EDM2
import java.io.*;
import java.net.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ChatApplet extends JApplet
                        implements ActionListener {

    /* GUI properties */
    private JTextField  nameField;
    private JButton     connectButton;
    private JTextField  messageField;
    private JTextArea   messageArea;

    /* ChatApplet properties */
    private MyChatSocket    sock;
    public boolean      isConnected = false;

    /* User values */
    private String      name; // of user
    private String      hostname = "127.0.0.1";
    private int         hostport = 2015;

    public void init() {
        JPanel mainPanel = new JPanel(new BorderLayout());

        /* The top most subpanel with user name and
         * connect button */
        JPanel p = new JPanel();
        p.setLayout(new BorderLayout());
        p.add("West", (new JLabel("Name: ")));
        p.add("Center", (nameField =
            new JTextField("Your name please", 15)));
        p.add("East",
            (connectButton = new JButton("Connect")));

        nameField.selectAll();
        nameField.addActionListener(this);

        connectButton.setEnabled(false);
        connectButton.addActionListener(this);

        mainPanel.add("North", p);

        /* The middle subpanel with the message area */
        p = new JPanel(new BorderLayout());
        p.add("North", new JLabel("Messages:"));

        messageArea = new JTextArea(10, 30);
        messageArea.setEditable(false);
        messageArea.setBackground(Color.white);
        p.add("Center", new JScrollPane(messageArea));

        p.add("South", new JLabel(" ")); // spacing (hack)
        mainPanel.add("Center", p);

        /* The lower panel with TextField for input */
        p = new JPanel(new FlowLayout());
        p.add("West", new JLabel("Message: "));

        p.add("East", messageField = new JTextField(40));
        messageField.addActionListener(this);

        mainPanel.add("South", p);

        getContentPane().add(mainPanel);
    }

    public void start() {
        nameField.requestFocus();
    }

    public void actionPerformed(ActionEvent evt) {
        Object source = evt.getSource();

        if (source == messageField) {
            if (isConnected) {
                String txt = messageField.getText().trim();

                if ( !txt.equals("wwhhoo")) {
                    txt = name + " says: " + txt;
                }

                sendMessage(txt);
                messageField.setText("");
            } else {
                messageField.setText("Please connect");
            }
        } else if (source == connectButton) {
            if (isConnected) {
                disconnect();
            } else {
                connect();
            }
        } else if (source == nameField) {
            name = nameField.getText().trim();

            if (name.equals("") ||
                name.startsWith("Your n") ||
                name.startsWith("Enter a")) {

                nameField.setText("Enter a name please");
                nameField.selectAll();
            } else {
                nameField.setEditable(false);
                nameField.setEnabled(false);
                preConnect();
            }
        }
    }

    private void preConnect() {
        String input =
            JOptionPane.showInputDialog(
                this,               // parent component
                "Specify host or OK for present host.\n"
                    + "Actual host is " + hostname,
                "Specify host",     // title
                JOptionPane.QUESTION_MESSAGE);

        if (input.length() > 0) {
            hostname = input;
        }

        do {
            input = JOptionPane.showInputDialog(
                    this,               // parent component
                    "Specify port number or OK for present "
                        + "port.\nActual port is " + hostport,
                    "Specify port",     // title
                    JOptionPane.QUESTION_MESSAGE);

            if (input.length() > 0) {
                try {
                    hostport = Integer.parseInt(input);
                } catch (NumberFormatException e) {
                    hostport = -1;
                }
            }
        } while (hostport < 0);
        connectButton.setEnabled(true);
        connectButton.requestFocus();
    }

    private void connect() {
        if (sock != null) {
            return;
        }

        try {
            while (sock == null) {
                sock = new MyChatSocket(this, hostname, hostport);
            }

            isConnected = true;
            connectButton.setText("Disconnect");
            messageField.requestFocus();
            messageField.setText("");
        } catch (Exception e) {
            setMessage("Connection to " + hostname
                       + " at port " + hostport + " failed.");
            setMessage("Please, try again.");
            connectButton.setEnabled(false);
            nameField.setEditable(true);
            nameField.setEnabled(true);
            nameField.requestFocus();
        }
    }

    public void disconnect() {
        if (isConnected)
            sendMessage("logout");

        isConnected = false;
        setMessage("Disconnected ===================");

        if (sock != null) {
            try {
                sock.close();
            } catch (IOException e) {
                setMessage("Error in disconnect:");
                setMessage(e.getMessage());
            }
        }
        sock = null;
        connectButton.setEnabled(false);
        connectButton.setText("Connect");
        nameField.setEditable(true);
        nameField.setEnabled(true);
        nameField.requestFocus();
    }

    static String EOL =
                System.getProperty("line.separator");
    public void setMessage(String str) {
        messageArea.append(str + EOL);

        if (messageArea.getLineCount() > 500) {
            messageArea.replaceRange("", 0, 4000);
            /* delete 10000 characters, assuming more
             * than 10 characters a row, still leaving
             * a text buffer */
        }

        messageArea.setCaretPosition(
                messageArea.getText().length());
    }

    public void sendMessage(String txt) {
        if (sock == null) {
            connect();
        }

        try {
            PrintWriter pws =
                new PrintWriter(
                    sock.getOutputStream());

            pws.println(txt);
            pws.flush();
        } catch (IOException e) {
            setMessage("Error sending messages.");
            setMessage(e.getMessage());
        }
    }
}