/*
 * ClientGUI.java
 *
 * Author: Jonathan Boldiga
 * Date: July 22, 2002
 *
 * Description: This is the Client interface for ORBChat, a CORBA based chat program.
 *				This class uses SWING and implements the method beginChat() which allows
 *				two clients to chat with one another. To run ORBChat::Client, execute
 *              the Client.java class file.
 *
 * Copyright (c) 1993-2001 IONA Technologies PLC.
 *  			All Rights Reserved
 *
*/

package Chat;

import java.io.*;

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;

import org.omg.CORBA.*;

public class ClientGUI extends JFrame {

	String currentUser;
	static String destination;
	static Chat.ChatRemote cr;
	protected static boolean flag;
	protected static JList usersOnline;
	protected JTextField textField;
    protected JLabel logo;
    protected JScrollPane scrollTextPane;
    protected static JScrollPane scrollListPane;
    protected static JSplitPane splitPane;
	protected static JTextArea textArea;
    protected static String newline = "\n";

	public ClientGUI(ChatRemote cRemote, String user){
		//Do frame stuff.
		super("ORBChat :: Logged In As " + user);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				closeMe();
			}
		});

		//CORBA objects
		cr = cRemote;
		currentUser = user;

		JPanel contentPane = new JPanel();
		contentPane.setLayout(new GridBagLayout());
		contentPane.setBackground(UIManager.getColor("control"));
		GridBagConstraints constraints = new GridBagConstraints();

		constraints.gridx = 0;
		constraints.gridy = 0;
		constraints.gridwidth = 1;
		constraints.gridheight = 1;
		constraints.insets = new Insets(2, 2, 2, 2);
		constraints.anchor = GridBagConstraints.NORTH;

		//Create the toolbar.
        JToolBar toolBar = new JToolBar();
        addActions(textField, toolBar);

        //Scroll pane stuff
        textArea = new JTextArea(5, 20);
        textArea.setEditable(false);
        scrollTextPane = new JScrollPane(textArea);
        usersOnline = new JList(cr.who());
		usersOnline.setBackground(Color.cyan);
		scrollListPane = new JScrollPane(usersOnline);
		scrollListPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
		usersOnline.addListSelectionListener(new ListSelectionListener(){
			public void valueChanged(ListSelectionEvent event){
		    	java.lang.Object[] users = usersOnline.getSelectedValues();
		    	String selectedUser = null;

				for (int i = 0; i < users.length; i++){
		        	selectedUser = (String)users[i];
				}
		   	}
        });

        //Create a split pane with the two scroll panes in it
		splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
		                                   scrollTextPane, scrollListPane);
		splitPane.setOneTouchExpandable(true);
		splitPane.setDividerLocation(300);

		//Provide minimum sizes for the two components in the split pane
		Dimension minimumSize = new Dimension(150, 300);

		scrollListPane.setMinimumSize(minimumSize);
		scrollTextPane.setMinimumSize(minimumSize);

		//Provide a preferred size for the split pane
        splitPane.setPreferredSize(new Dimension(500, 200));

		contentPane.add(toolBar, constraints);

		constraints.gridx = 0;
		constraints.gridy = GridBagConstraints.RELATIVE;
		constraints.weightx = 1.0;
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.anchor = GridBagConstraints.CENTER;

		contentPane.add(splitPane, constraints);
		constraints.gridx = 0;
		constraints.gridy = GridBagConstraints.RELATIVE;
		contentPane.add(textField = new JTextField(35), constraints);
		constraints.anchor = GridBagConstraints.SOUTH;
		contentPane.add(logo = new JLabel(new ImageIcon("C:\\JB Programming\\Chat\\Classes\\Chat\\images\\IonaLogo1.gif"), SwingConstants.RIGHT), constraints);

		constraints.weightx = 0.0;
		constraints.fill = GridBagConstraints.NONE;

		setContentPane(contentPane);
	}

	public void addActions(final JTextField textF, final JToolBar toolBar){
		JButton button = null;

		//talk button
		button = new JButton("Talk");
		button.setToolTipText("Talk to another client");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				TalkGUI talk = new TalkGUI(cr, currentUser);
				talk.pack();
				talk.setVisible(true);
				beginChat(textField);
			}
		});
		toolBar.add(button);

		//who button
		button = new JButton("Who");
		button.setToolTipText("Who else is online?");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			/*	ClientListGUI clg = new ClientListGUI(cr);
				clg.pack();
				clg.setVisible(true);
				usersOnline = new JList(cr.who());
				splitPane.revalidate();
				splitPane.repaint();
				scrollListPane.revalidate();
				scrollListPane.repaint(); */

				cr.callUpdate(currentUser, cr);
			}
		});
		toolBar.add(button);

		//exit button
		button = new JButton("Exit");
		button.setToolTipText("Exit ORBChat");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				closeMe();
			}
		});
	    toolBar.add(button);

	}

	public void beginChat(final JTextField textF){
		textF.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			    String text = textF.getText();
			    textF.setText("");
				cr.send(text, currentUser, destination);
				displayResult(text, currentUser);
				text = "";
			}
	    });
	}

	public static void destination(String dest){
		destination = dest;
	}

	public static void refreshList(){
		usersOnline = new JList(cr.who());
	}

	protected static void displayResult(String message, String source) {
		textArea.append(source + ":" + " " + message + newline);
	}

	public void closeMe(){
		cr.remove(currentUser);
	    System.exit(0);
	}

}

