1: package siege.gui.views;
2:
3: import java.awt.Color;
4: import java.awt.Dimension;
5: import java.awt.Font;
6: import java.awt.event.ActionEvent;
7: import java.awt.event.ActionListener;
8: import java.util.Observable;
9: import java.util.Observer;
10: import javax.swing.BorderFactory;
11: import javax.swing.Box;
12: import javax.swing.BoxLayout;
13: import javax.swing.JButton;
14: import javax.swing.JPanel;
15: import javax.swing.JScrollBar;
16: import javax.swing.JScrollPane;
17: import javax.swing.JTextArea;
18: import javax.swing.JTextField;
19: import javax.swing.border.EtchedBorder;
20: import siege.core.Game;
21: import siege.util.Log;
22:
23: 24: 25: 26: 27:
28: public class ChatView extends JPanel implements Observer
29: {
30: 31: 32:
33: public static Dimension size = new Dimension(500, 150);
34: public static Dimension chatAreaSize = new Dimension(500, 110);
35:
36: 37: 38:
39: public JTextArea chatArea;
40: public JScrollPane chatAreaScrollPane;
41: public JTextField inputField;
42: public JButton sendButton;
43:
44: 45: 46:
47: public ChatView()
48: {
49: super();
50:
51: 52: setPreferredSize(size);
53: setBackground(Color.white);
54: setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
55: setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
56:
57: 58: chatArea = new JTextArea();
59: chatArea.setFont(new Font("SansSerif", Font.TRUETYPE_FONT, 14));
60: chatArea.setLineWrap(true);
61: chatArea.setWrapStyleWord(true);
62: chatArea.setEditable(false);
63:
64: 65: chatAreaScrollPane = new JScrollPane(chatArea);
66: chatAreaScrollPane.setPreferredSize(chatAreaSize);
67: chatAreaScrollPane.setBackground(chatArea.getBackground());
68: chatAreaScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
69: chatAreaScrollPane.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
70:
71: 72: inputField = new JTextField();
73: inputField.setFont(new Font("SansSerif", Font.TRUETYPE_FONT, 14));
74: inputField.setBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED));
75: sendButton = new JButton("Odeslat");
76: sendButton.addActionListener(new ActionListener() {
77: public void actionPerformed(ActionEvent e) {
78: if(isEnabled()) {
79: handleSentMessage(inputField.getText());
80: }
81: }
82: });
83: inputField.addActionListener(new ActionListener() {
84: public void actionPerformed(ActionEvent e) {
85: if(isEnabled()) {
86: handleSentMessage(inputField.getText());
87: }
88: }
89: });
90:
91: 92: JPanel inputPane = new JPanel();
93: inputPane.setBackground(Color.white);
94: inputPane.setLayout(new BoxLayout(inputPane, BoxLayout.LINE_AXIS));
95: inputPane.add(inputField);
96: inputPane.add(Box.createRigidArea(new Dimension(5, 0)));
97: inputPane.add(sendButton);
98:
99: 100: add(chatAreaScrollPane);
101: add(Box.createRigidArea(new Dimension(0, 5)));
102: add(inputPane);
103: }
104:
105: 106: 107:
108: public void initialize()
109: {
110: 111: setEnabled(false);
112: chatArea.setText("");
113: inputField.setText("");
114:
115: 116: Game.getInstance().addObserver(this);
117: Log.message(this, "initialize");
118: }
119:
120:
121: public void handleSentMessage(String message)
122: {
123: Game game = Game.getInstance();
124: game.sendMessage(message);
125: inputField.setText("");
126: chatArea.append("<"+game.getLocalPlayer().getName()+"> "+message+"\n");
127: scrollToBottom();
128: }
129:
130: public void handleReceivedMessage(String message)
131: {
132: Game game = Game.getInstance();
133: chatArea.append("<"+game.getRemotePlayer().getName()+"> "+message+"\n");
134: scrollToBottom();
135: }
136:
137: public void scrollToBottom()
138: {
139: JScrollBar verticalScrollbar = chatAreaScrollPane.getVerticalScrollBar();
140: verticalScrollbar.setValue(verticalScrollbar.getMaximum());
141: }
142:
143: 144: 145:
146: @Override
147: public void setEnabled(boolean enabled) {
148: super.setEnabled(enabled);
149: if(enabled) {
150: sendButton.setEnabled(true);
151: } else {
152: sendButton.setEnabled(false);
153: }
154: }
155:
156: 157: 158:
159: public void update(Observable o, Object arg) {
160: if(o instanceof Game) {
161: Game game = (Game)o;
162: switch(game.getStatus()) {
163: case CONNECTED:
164: setEnabled(true);
165: break;
166: case END:
167: setEnabled(false);
168: break;
169: }
170: }
171: }
172: }
173: