/* Class Chat By Martin Carlsson Internetprogrammering 4 course */ import org.jdom.output.*; import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.*; import org.jdom.*; import javax.swing.text.*; /**Class Chat is both a GUI and Listener class for the XML-based Chat Client Application.*/ public class Chat extends JFrame implements ActionListener { private String host; private int port; private Socket socket; private Thread receiveActivity; private static String usage = "usage: \n"+ "example:java Chat this.is.the.host.adress 7000"; private JTextField nameInputField = new JTextField(); private JTextField emailInputField = new JTextField(); private JTextField homepageInputField = new JTextField(); private JLabel nameLabel, emailLabel, homepageLabel, personalLabel1, personalLabel2, messageLabel; private JTextArea messageInputArea=new JTextArea();// area to write messages in private JScrollPane messageInputAreaPane=new JScrollPane(messageInputArea);// scroll area for the input area private JTextArea messageArea=new JTextArea(); // message area private JScrollPane messageAreaPane=new JScrollPane(messageArea); // scroll area for the message area private JPanel north=new JPanel(),south=new JPanel(); // north and south panels private JPanel southEast=new JPanel(),southWest=new JPanel(); // south east and south west panels private JButton sendButton=new JButton(), quitButton=new JButton(); // send and quit buttons private Receiver receiver; private Sender sender; private org.jdom.Document doc; /** *Constructs a Chat object/instance *@param host host to connect to *@param port port used for the connection */ public Chat(String host, int port)throws IOException { this.host=host; this.port=port; Container con=getContentPane(); north.setLayout(new FlowLayout(FlowLayout.RIGHT)); north.setBackground(Color.blue); north.add(quitButton); south.setLayout(new BorderLayout()); south.setBackground(Color.blue); personalLabel1 = new JLabel(" Personal information"); personalLabel2 = new JLabel(""); personalLabel1.setForeground(Color.white); personalLabel2.setForeground(Color.white); nameLabel = new JLabel(" Name"); emailLabel = new JLabel(" Email"); homepageLabel = new JLabel(" Homepage"); nameLabel.setForeground(Color.yellow); emailLabel.setForeground(Color.yellow); homepageLabel.setForeground(Color.yellow); southWest.setLayout(new GridLayout(4,2)); southWest.setPreferredSize(new Dimension(280,130)); southWest.setBackground(Color.blue); southWest.setForeground(Color.white); southWest.add(personalLabel1); southWest.add(personalLabel2); southWest.add(nameLabel); southWest.add(nameInputField); southWest.add(emailLabel); southWest.add(emailInputField); southWest.add(homepageLabel); southWest.add(homepageInputField); JPanel southEastUp = new JPanel(); southEastUp.setBackground(Color.blue); southEastUp.setLayout(new FlowLayout(FlowLayout.LEFT)); southEastUp.setForeground(Color.white); messageLabel = new JLabel("Message"); messageLabel.setForeground(Color.white); southEastUp.add(messageLabel); JPanel southEastDown = new JPanel(); southEastDown.setBackground(Color.blue); southEastDown.setForeground(Color.white); southEastDown.setLayout(new FlowLayout(FlowLayout.RIGHT)); southEastDown.add(sendButton); southEast.setLayout(new BorderLayout()); southEast.setPreferredSize(new Dimension(270,130)); // Message input area settings messageInputArea.setToolTipText("Type your messages"); messageInputArea.setLineWrap(true); messageInputArea.setBorder(BorderFactory.createEmptyBorder(4,4,4,4));//Onsynlig border runt meddelandeytan messageInputArea.setEditable(true); messageInputArea.requestFocus(); messageInputAreaPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); messageInputAreaPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //Keeps the scrollbar for the input area to the bottom DefaultCaret inputCaret = (DefaultCaret) messageInputArea.getCaret(); inputCaret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); messageInputAreaPane.setPreferredSize(new Dimension(240,50)); southEast.setBackground(Color.blue); southEast.setForeground(Color.white); southEast.add(southEastUp, BorderLayout.NORTH); southEast.add(messageInputAreaPane,BorderLayout.CENTER); southEast.add(southEastDown,BorderLayout.SOUTH); south.add(southWest, BorderLayout.WEST); south.add(southEast,BorderLayout.EAST); // Message area settings messageArea.setToolTipText("Incoming messages"); messageArea.setLineWrap(true); messageArea.setBorder(BorderFactory.createEmptyBorder(4,4,4,4));//Onsynlig border runt meddelandeytan messageArea.setEditable(false); messageInputArea.requestFocus(); //Scroll area for the message area messageAreaPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); messageAreaPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED); //Keeps the scrollbars for the message area to the bottom DefaultCaret caret = (DefaultCaret) messageArea.getCaret(); caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); // button text sendButton.setText("SEND"); quitButton.setText("QUIT"); //Adds listeners for the quit and send buttons sendButton.addActionListener(this); quitButton.addActionListener(this); addWindowListener(new ExitListener()); // Adds panels and message area con.add(south,BorderLayout.SOUTH); con.add(north,BorderLayout.NORTH); con.add(messageAreaPane,BorderLayout.CENTER); setSize(600,400); setResizable(false); show(); // Tries to create a socket try { socket =new Socket(host, port); } catch(UnknownHostException uHe) { messageArea.setText("Unable to connect to "+ host + " on " + port +".....closing"); System.err.println("Unable to connect to "+ host + " on " + port +".....closing"); setTitle("Java Chat Client"); } catch (IOException iE) { messageArea.setText("Unable to connect to "+ host + " on port " + port + ". Check your Internet connection and make sure port " + port + " is open\n."); System.err.println("Unable to connect to "+ host + " on " + port+"."); } sender=new Sender(socket, this); // creates a Sender instance receiver=new Receiver(this, socket); // creates a Receiverinstance receiveActivity= new Thread(receiver); receiveActivity.start(); // starts the receive thread } // end of constructor /** *Empties the input area */ public void clearInputArea() { messageInputArea.setText(""); } /** *Error message for in the message area */ public void setErrorMessage(String error) { messageArea.append("\n" + error + "\n"); } /** *Sets the incoming message, and shows the xml document in the command prompt */ public void setMessage(org.jdom.Document doc) { messageArea.append(doc.getRootElement().getChild("header").getChild("id").getChild("name").getText()); messageArea.append("(" + doc.getRootElement().getChild("header").getChild("id").getChild("email").getText() +") > "); messageArea.append(doc.getRootElement().getChild("body").getText()+"\n"); //Format for pretty printout in the command prompt Format prettyFormat = Format.getPrettyFormat(); prettyFormat.setExpandEmptyElements(true); XMLOutputter prettyXmlOut = new XMLOutputter(prettyFormat); try { System.out.println("*****Inkomming message:"); prettyXmlOut.output(doc, System.out); } catch(Exception e) { } } /** *Listens to closing events */ class ExitListener extends WindowAdapter { public void windowClosing(WindowEvent event) { quit(); } }; /** *Shuts down */ void quit() { String err = "\n Please wait...having some trouble closing.."; try { sender.closeOutStream(); receiver.setLooping(false); receiver.closeInStream(); if(socket!=null) socket.close(); } catch(SocketException sE) { messageArea.append(err); System.err.println(sE); } catch(IOException iE) { messageArea.append(err); System.err.println(iE); } catch(NullPointerException nE) { messageArea.append(err); System.err.println(nE); } System.out.println("\nBye, Bye..."); System.exit(0); } /** *Listens to when the user presses a button. */ public void actionPerformed(ActionEvent ae) { if(ae.getSource()==sendButton) { try { sender.sendAway(nameInputField.getText().trim(), emailInputField.getText().trim(), homepageInputField.getText().trim(),messageInputArea.getText().trim()); clearInputArea(); } catch(Exception e) { messageArea.append("\n Not able to send any messages at this time"); } } else if(ae.getSource() == quitButton) { quit(); } } public String getHost() { return host; } public int getPort() { return port; } /** *Main */ public static void main (String[] args) { int port=2000; // default port String host="localhost"; // default host String portText = "port must be a number between"+ "0 and 65535"; System.out.println("Welcome to Chat\n" + usage + "\n"); try { //if 2 or more arguments if(args.length>=2) { host=args[0]; port =Integer.parseInt(args[1]); } //any host argument? else if(args.length==1) { host=args[0]; } // Is the port in the valid port range? if(port > 65535 || port < 0) System.err.println(portText); else new Chat(host, port); // starts } catch(NumberFormatException nFe) { System.err.println(portText); } catch(Exception e){ System.err.println(usage + "\n\n" + e.getMessage()); } } }//End class Chat