package com.stepan.GUI;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import java.util.*;
import com.stepan.domain.Message;
import java.awt.Color;
import javax.swing.border.TitledBorder;
/**
* Main chat window.
* @author Stepan
*/
public class ChatClient {
private JFrame frame;
private JPanel mainBase, buttonPanel;
private JButton send, quit;
private JTextField textF;
private JTextArea textA;
private JScrollPane scrolla;
private JMenuBar mb;
private JMenu m1, m2;
private JMenuItem mi1, mi2, mi3;
private String currentUserName = "anonymous";
private TreeSet<Message> messages = new TreeSet<Message>();
public ChatClient assembleComponents(){
showConfigDialog(this); // shows this and init components later
initRightPanel();
initTextAreaAndField();
initMainPanel(buttonPanel, scrolla, textF);
initMainFrame(mainBase, "Chat Room");
return this;
}
public void setUpMenus(){
initMenuItems();
initMenus();
addMenuItemsToMenus();
mb = new JMenuBar();
mb.add(m1);
mb.add(m2);
frame.setJMenuBar(mb);
}
private void showMessages(){
StringBuilder build = new StringBuilder();
for(Message m : messages){
build.append(m.getAuthor());
build.append(" says: ");
build.append(m.getContent());
build.append("\n");
}
textA.setText(build.toString());
}
/*
action listener
*/
private class InputListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
Object source = e.getSource();
if (source == textF || source == send){ // add data to messages
if(textF.getText().trim().length() > 0){
messages.add(
new Message(textF.getText(), getCurrentUserName()));
textF.setText("");
showMessages();
}
}
if (source == quit || source == mi2){ // quit
System.exit(0);
}
if (source == mi1 ){ // configure
showConfigDialog(getReference());
}
}
}
/*
about listener
*/
private class AboutListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
JOptionPane.showMessageDialog(frame, "not much here");
}
}
/* service methods */
private void showConfigDialog(final ChatClient chat){
javax.swing.SwingUtilities.invokeLater(
new Runnable(){
@Override
public void run(){
new ConfigurationWindow(chat, frame).createDialog();
}
}
);
}
private void initMainFrame (JPanel mainPanel, String title){
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(mainPanel);
frame.setSize(new Dimension(600, 200));
frame.setVisible(true);
}
private void initMainPanel(JPanel east, JScrollPane center, JTextField south){
mainBase = new JPanel();
mainBase.setLayout(new BorderLayout());
mainBase.add(east, BorderLayout.EAST);
mainBase.add(center, BorderLayout.CENTER);
mainBase.add(south, BorderLayout.SOUTH);
}
private void initRightPanel(){
buttonPanel = new JPanel();
buttonPanel.setLayout(new GridLayout(3, 1));
send = new JButton("Send");
send.addActionListener(new InputListener());
quit = new JButton("Quit");
quit.addActionListener(new InputListener());
buttonPanel.add(send);
buttonPanel.add(quit);
}
private void initTextAreaAndField(){
textA = new JTextArea();
textA.setLineWrap(true);
textA.setEnabled(false);
textA.setBackground(Color.white);
scrolla = new JScrollPane(textA);
textF = new JTextField();
textF.setBorder(new TitledBorder("Enter message: "));
textF.addActionListener(new InputListener());
}
public String getCurrentUserName() {
return currentUserName;
}
public void setCurrentUserName(String currentUserName) {
this.currentUserName = currentUserName;
}
public ChatClient getReference(){
return this;
}
private void initMenuItems(){
mi1 = new JMenuItem("Configure");
mi1.addActionListener(new InputListener());
mi2 = new JMenuItem("Quit");
mi2.addActionListener(new InputListener());
mi3 = new JMenuItem("About");
mi3.addActionListener(new AboutListener());
}
private void initMenus(){
m1 = new JMenu("File");
m2 = new JMenu("Help");
}
private void addMenuItemsToMenus(){
m1.add(mi1);
m1.addSeparator();
m1.add(mi2);
m2.add(mi3);
}
}