Newer
Older
nonet / tp6-8 / src / ch / epfl / lca / sc250 / gui / finalgui / CnFrameMain.java
@Andreas Jaggi Andreas Jaggi on 12 Jun 2006 10 KB Changed directory structure
/**
 * 
 */
package ch.epfl.lca.sc250.gui.finalgui;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Vector;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTable;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

/**
 * @author Trefex
 *
 */
public class CnFrameMain extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 8746287051727486324L;
	/**
	 * Vector containing the table rows data
	 */
	private Vector tableRows;
	
	/**
	 * Vector containing the column names. Filled with addColumns.
	 */
	private Vector columns;
	
	/**
	 * Array containing the column names
	 */
	private static final String[] columnNames = {"Received At", "User ID", "IP Address", "Letters"};

	/**
	 * tableModel used by the Table
	 */
	private DefaultTableModel tableModel;

	/**
	 * The table used to display the broadcast messages
	 */
	private JTable broadcastTable;
	/**
	 * The TextArea used to display the messages
	 */
	private JTextArea textArea;
	/**
	 * The TextArea used to display the messages
	 */
	private JTextArea textAreaP2P;
	/**
	 * TextField of the IP
	 */
	private JTextField ipAdressTextField;
	/**
	 * TextField of the Amount of Money
	 */
	private JTextField amountMoneyTextField;
	/**
	 * TextField of the position of the letter
	 */
	private JTextField letterPosition;
	/**
	 * Button used to send the request
	 */
	private JButton sendMessage;
	/**
	 * Instance of the main Program which is of type ITCPSender
	 */
	private ITCPSender tcpSender = null;
	Thread loaderThread;
	
	/**
	 * 
	 * @param windowTitle
	 */
	public CnFrameMain(String windowTitle) {
		setTitle(windowTitle);
		
		// Set Behaviour when "x" is clicked.
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		// Get Screen Dimensions
		Dimension windowSize = Toolkit.getDefaultToolkit().getScreenSize();
		setBounds(50, 50, windowSize.width - 200, windowSize.height - 200);
		
		getContentPane().setLayout(new BorderLayout());

	    JSplitPane sp = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, createUDPPanel(), createP2PPanel());

	    JSplitPane sp2 = new JSplitPane(JSplitPane.VERTICAL_SPLIT, sp, createTCPPanel());

		getContentPane().add(sp2, BorderLayout.CENTER);
		
		
		setVisible(true);
	}

	/**
	 * Retrieves the current time in the following format: dd/MMM/yyyy HH:mm:ss
	 * @return The String representation of the current Date
	 */
	public String getCurrentTime() {
		DateFormat dateFormat = new SimpleDateFormat("dd / MMMM / yyyy -- HH:mm:ss");
        java.util.Date date = new java.util.Date();
		return dateFormat.format(date);
	}
	
	
	
	/**
	 * Constructs a CnFrameUDP Instance with title windowTitle
	 * @param windowTitle The Title if the window
	 */
	public JPanel createUDPPanel() {
		
		// Create new JPanel
		JPanel centerPanel = new JPanel();
		
		// Fill the columns Vector
		addColumns(columnNames);

		tableModel = new DefaultTableModel();
		tableModel.setDataVector(tableRows, columns);

		// create new JPanel
		broadcastTable = new JTable(tableModel);
		broadcastTable.getColumnModel().getColumn(0).setCellRenderer(new CellRenderer());
		broadcastTable.getColumnModel().getColumn(1).setCellRenderer(new CellRenderer());
		broadcastTable.getColumnModel().getColumn(2).setCellRenderer(new CellRenderer());
		broadcastTable.getColumnModel().getColumn(3).setCellRenderer(new CellRenderer());
		
		// Add ScrollBar to the broadcastTable
		JScrollPane scrollPane = new JScrollPane(broadcastTable);
		centerPanel.add(scrollPane);
		
		return centerPanel;
	}
	
	/**
	 * Fill the column name vector
	 * @param columnNames the array of Strings to fill the vector with
	 */
	private void addColumns(String[] columnNames) {
		// Init tableRows and columns Vectors
		tableRows = new Vector();
		columns = new Vector();
		
		for (int i = 0; i < columnNames.length; i++)
			columns.addElement((String) columnNames[i]);
	}
	
	/**
	 * Adds a row to the JTable
	 * @param broadcastIP The IP from the broadcast message
	 * @param letters The Letters
	 */
	private void addRow(String broadcastIP, String userID, String letters) {
		Vector tempVector = new Vector();
		tempVector.addElement(getCurrentTime());
		tempVector.addElement(userID);
		tempVector.addElement(broadcastIP);
		tempVector.addElement(letters);
		tableRows.addElement(tempVector);
		broadcastTable.addNotify();
	}
	
	/**
	 * Modifies the GUI by appending the broadcast Message
	 * @param broadcastIP the IP extracted from the broadcast UDP Message
	 * @param broadcastLetters the letters from the UDP Broadcast
	 */
	public void appendBroadcastMessage(String broadcastIP, String userID, String broadcastLetters) {
		addRow(broadcastIP, userID, broadcastLetters);
	}
	
	/**
	 * Clears the Table
	 *
	 */
	public void clearTable() {
		tableRows.clear();
		broadcastTable.addNotify();
	}
	
	
	/**
	 * Constructs a CnFrameTCP Instance with title windowTitle
	 * @param windowTitle
	 */
	public JPanel createTCPPanel() {
		JPanel centerPanel = new JPanel();
		
		textArea = new JTextArea();
		textArea.setEditable(false);
		
		JScrollPane scrollPane = new JScrollPane(textArea);
		
		centerPanel.setLayout(new GridLayout(1, 1));
		centerPanel.add(scrollPane);
		
		return centerPanel;
	}
	
	/**
	 * Append Text to the textArea
	 * @param textToAppend
	 */
	public void appendText(String textToAppend) {
		textArea.append(getCurrentTime() + " : " + textToAppend);
		textArea.setCaretPosition(textArea.getText().length());
	}
	
	/**
	 * Clear the TextArea.
	 *
	 */
	public void clearTextArea() {
		textArea.replaceRange("", 0, textArea.getText().length());
	}

	/**
	 * Constructs a CnFrameP2P Instance with title windowTitle
	 * @param windowTitle
	 */
	public JPanel createP2PPanel() {
		JPanel mainPanel = new JPanel();
		mainPanel.setLayout(new BorderLayout());
		JPanel centerPanel = new JPanel();
		
		textAreaP2P = new JTextArea();
		textAreaP2P.setEditable(false);
		
		JScrollPane scrollPane = new JScrollPane(textAreaP2P);
		
		centerPanel.setLayout(new GridLayout(1, 1));
		centerPanel.add(scrollPane);
		
		// put the centerPanel to the Center 
		mainPanel.add(centerPanel, BorderLayout.CENTER);
		
		JPanel topPanel = new JPanel();
		topPanel.setLayout(new FlowLayout());
		
		topPanel.add(new JLabel("IP Address: "));
		ipAdressTextField = new JTextField();
		topPanel.add(ipAdressTextField);
		ipAdressTextField.setPreferredSize(new java.awt.Dimension(78, 20));
		

		topPanel.add(new JLabel("Money: "));
		amountMoneyTextField = new JTextField();
		topPanel.add(amountMoneyTextField);
		amountMoneyTextField.setPreferredSize(new java.awt.Dimension(49, 20));
		

		topPanel.add(new JLabel("Position: "));
		letterPosition = new JTextField();
		topPanel.add(letterPosition);
		letterPosition.setPreferredSize(new java.awt.Dimension(56, 20));
		
		
		sendMessage = new JButton();
		topPanel.add(sendMessage);
		sendMessage.setText("Send Request");
		sendMessage.setActionCommand("Send");
		NonBlockingLoadAction nonBlocker = new NonBlockingLoadAction();
		sendMessage.addActionListener(nonBlocker);
		//sendMessage.addActionListener(this);
		
		mainPanel.add(topPanel, BorderLayout.NORTH);
		return mainPanel;
			
	}

	/**
	 * Append Text to the textArea
	 * @param textToAppend
	 */
	public void appendTextP2P(String textToAppend) {
		textAreaP2P.append(getCurrentTime() + " : " + textToAppend);
		textAreaP2P.setCaretPosition(textAreaP2P.getText().length());
	}
	
	/**
	 * Clear the TextArea.
	 */
	public void clearTextAreaP2P() {
		textAreaP2P.replaceRange("", 0, textAreaP2P.getText().length());
	}

	/**
	 * This method is called when an Answer is received from the other Player.
	 * <br> It then is displayed in the GUI, and the GUI is reset.
	 * @param communication
	 */
	public void receivedMessage(String communication) {
		appendTextP2P(communication + "\n");
		ipAdressTextField.setEnabled(true);
		amountMoneyTextField.setEnabled(true);
		letterPosition.setEnabled(true);
		sendMessage.setText("Send Request");
		NonBlockingLoadAction nonBlocker = new NonBlockingLoadAction();
		sendMessage.addActionListener(nonBlocker);
		//sendMessage.addActionListener(this);
		sendMessage.setEnabled(true);
		ipAdressTextField.setText("");
		amountMoneyTextField.setText("");
		letterPosition.setText("");
		appendTextP2P("----- Communication Completed --------\n");
	}

	/**
	 * Used to work with the Interface
	 * @param tcpSender
	 */
	public void setTcpSender(ITCPSender tcpSender) {
		this.tcpSender = tcpSender;
	}
	
	/**
	 * When an offer is received, display a Confirm Dialog where the user can choose Yes or No
	 * @param IP The IP we got the offer from
	 * @param amount The amount the other player gives us for a letter
	 * @param position The position of the letter he wants to buy
	 * @return True or False
	 */
	public boolean getOfferResult(String IP, String amount, String position) {
		boolean chosenValue = false;
		String msgToDisplay = "Buyer from IP: " + IP + "\nWants to buy Letter at Position " + position + " for " + amount + "$";
		int returnValue = JOptionPane.showConfirmDialog(null, msgToDisplay, "You got an Offer !", JOptionPane.YES_NO_OPTION);
		if(returnValue == JOptionPane.OK_OPTION) {
			chosenValue = true;
		} else {
			chosenValue = false;
		}
		return chosenValue;
	}
	
	class NonBlockingLoadAction extends AbstractAction implements Runnable { 
		/**
		 * 
		 */
		private static final long serialVersionUID = 4493869112678216390L;
		// note that this doesn't offer a means of being interrupted 
		// so it refuses second launch instead 
		public void actionPerformed (ActionEvent e) {
			if (loaderThread != null)
				return;
			loaderThread = new Thread ((Runnable) this);
			loaderThread.start();

		}
		public void run() {
			if (tcpSender == null)
				return;
			appendTextP2P("IP: " + ipAdressTextField.getText() + " - Buy For: " + amountMoneyTextField.getText() + " - Position: " + letterPosition.getText() + "\n");
			ipAdressTextField.setEnabled(false);
			amountMoneyTextField.setEnabled(false);
			letterPosition.setEnabled(false);
			sendMessage.setText("Waiting ...");
			sendMessage.removeActionListener(this);
			sendMessage.setEnabled(false);
			
			tcpSender.sendMessage(ipAdressTextField.getText(), amountMoneyTextField.getText(), letterPosition.getText());
			loaderThread = null;

		}
	}
}