001 package com.croftsoft.apps.chat.view;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import java.io.*;
006 import java.util.*;
007 import javax.swing.*;
008
009 import com.croftsoft.core.animation.AnimatedComponent;
010 import com.croftsoft.core.animation.ComponentAnimator;
011 import com.croftsoft.core.gui.LogPanel;
012 import com.croftsoft.core.lang.NullArgumentException;
013 import com.croftsoft.core.lang.lifecycle.Lifecycle;
014 import com.croftsoft.core.util.consumer.NullConsumer;
015 import com.croftsoft.core.util.queue.Queue;
016
017 import com.croftsoft.apps.chat.ChatConstants;
018 import com.croftsoft.apps.chat.controller.ChatController;
019 import com.croftsoft.apps.chat.event.TalkEvent;
020 import com.croftsoft.apps.chat.model.ChatGame;
021 import com.croftsoft.apps.chat.model.ChatWorld;
022 import com.croftsoft.apps.chat.model.seri.SeriChatGame;
023
024 /*********************************************************************
025 * Chat client user interface.
026 *
027 * @version
028 * 2003-06-25
029 * @since
030 * 2000-04-20
031 * @author
032 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
033 *********************************************************************/
034
035 public final class ChatPanel
036 extends JPanel
037 implements ComponentAnimator, Lifecycle
038 //////////////////////////////////////////////////////////////////////
039 //////////////////////////////////////////////////////////////////////
040 {
041
042 private static final boolean DEBUG = true;
043
044 private static final Font FONT
045 = new Font ( "Arioso", Font.BOLD, 12 );
046
047 private static final Color BACKGROUND_COLOR = Color.BLACK;
048
049 private static final Color FOREGROUND_COLOR = Color.GREEN;
050
051 private static final int TEXT_LENGTH_MAX = 10000;
052
053 private static final int DIVIDER_LOCATION = 300;
054
055 //
056
057 private final Queue eventQueue;
058
059 private final ChatController chatController;
060
061 private final ChatGame chatGame;
062
063 private final ChatSynchronizer chatSynchronizer;
064
065 private final JMenuBar menuBar;
066
067 private final ChatGameAnimator chatGameAnimator;
068
069 private final AnimatedComponent animatedComponent;
070
071 private final LogPanel logPanel;
072
073 private final JTextField textField;
074
075 private final JMenu avatarMenu;
076
077 private final JCheckBoxMenuItem musicCheckBoxMenuItem;
078
079 //////////////////////////////////////////////////////////////////////
080 //////////////////////////////////////////////////////////////////////
081
082 public ChatPanel (
083 Queue eventQueue,
084 ChatController chatController )
085 //////////////////////////////////////////////////////////////////////
086 {
087 super ( new BorderLayout ( ) );
088
089 NullArgumentException.check ( this.eventQueue = eventQueue );
090
091 NullArgumentException.check (
092 this.chatController = chatController );
093
094 chatGame = new SeriChatGame ( );
095
096 chatSynchronizer = new ChatSynchronizer (
097 chatGame.getChatWorld ( ),
098 NullConsumer.INSTANCE );
099
100 avatarMenu = new JMenu ( "Avatar" );
101
102 musicCheckBoxMenuItem = new JCheckBoxMenuItem ( "Music?", true );
103
104 menuBar = createMenuBar ( );
105
106 animatedComponent = new AnimatedComponent ( this );
107
108 animatedComponent.setBackground ( BACKGROUND_COLOR );
109
110 animatedComponent.setForeground ( FOREGROUND_COLOR );
111
112 animatedComponent.setFont ( FONT );
113
114 chatGameAnimator = new ChatGameAnimator (
115 chatGame,
116 animatedComponent,
117 getClass ( ).getClassLoader ( ),
118 ChatConstants.MEDIA_DIR );
119
120 logPanel = new LogPanel (
121 TEXT_LENGTH_MAX,
122 BACKGROUND_COLOR,
123 FONT );
124
125 textField = new JTextField ( );
126
127 JPanel southPanel = new JPanel ( new BorderLayout ( ) );
128
129 southPanel.add (
130 new JScrollPane ( logPanel ), BorderLayout.CENTER );
131
132 southPanel.add ( textField, BorderLayout.SOUTH );
133
134 JSplitPane splitPane = new JSplitPane (
135 JSplitPane.VERTICAL_SPLIT,
136 animatedComponent,
137 southPanel );
138
139 splitPane.setOneTouchExpandable ( true );
140
141 splitPane.setDividerLocation ( DIVIDER_LOCATION );
142
143 add ( splitPane, BorderLayout.CENTER );
144
145 // viewCanvas.load_graphics ( );
146 }
147
148 //////////////////////////////////////////////////////////////////////
149 // interface lifecycle methods
150 //////////////////////////////////////////////////////////////////////
151
152 public void init ( )
153 //////////////////////////////////////////////////////////////////////
154 {
155 animatedComponent.init ( );
156
157 animatedComponent.addComponentListener (
158 new ComponentAdapter ( )
159 {
160 public void componentResized (
161 ComponentEvent componentEvent )
162 {
163 animatedComponent.repaint ( );
164 }
165 } );
166
167 chatController.setAvatarMenu ( avatarMenu );
168
169 chatController.setMoveComponent ( animatedComponent );
170
171 chatController.setMusicCheckBoxMenuItem ( musicCheckBoxMenuItem );
172
173 chatController.setTalkTextField ( textField );
174 }
175
176 public void start ( )
177 //////////////////////////////////////////////////////////////////////
178 {
179 animatedComponent.start ( );
180 }
181
182 public void stop ( )
183 //////////////////////////////////////////////////////////////////////
184 {
185 animatedComponent.stop ( );
186 }
187
188 public void destroy ( )
189 //////////////////////////////////////////////////////////////////////
190 {
191 animatedComponent.destroy ( );
192 }
193
194 //////////////////////////////////////////////////////////////////////
195 // accessor methods
196 //////////////////////////////////////////////////////////////////////
197
198 public JMenuBar getMenuBar ( ) { return menuBar; }
199
200 //////////////////////////////////////////////////////////////////////
201 //////////////////////////////////////////////////////////////////////
202
203 public void update ( JComponent component )
204 //////////////////////////////////////////////////////////////////////
205 {
206 chatGame.update ( );
207
208 Object o;
209
210 while ( ( o = eventQueue.poll ( ) ) != null )
211 {
212 if ( o instanceof TalkEvent )
213 {
214 logPanel.record ( ( ( TalkEvent ) o ).getText ( ) );
215 }
216 else
217 {
218 chatSynchronizer.consume ( o );
219 }
220 }
221
222 chatGameAnimator.update ( component );
223 }
224
225 public void paint (
226 JComponent component,
227 Graphics2D graphics )
228 //////////////////////////////////////////////////////////////////////
229 {
230 chatGameAnimator.paint ( component, graphics );
231 }
232
233 //////////////////////////////////////////////////////////////////////
234 // private methods
235 //////////////////////////////////////////////////////////////////////
236
237 private JMenuBar createMenuBar ( )
238 //////////////////////////////////////////////////////////////////////
239 {
240 JMenuBar menuBar = new JMenuBar ( );
241
242 //
243
244 avatarMenu.setMnemonic ( KeyEvent.VK_A );
245
246 menuBar.add ( avatarMenu );
247
248 //
249
250 ButtonGroup buttonGroup = new ButtonGroup ( );
251
252 for ( int i = 0; i < ChatConstants.AVATAR_TYPES.length; i++ )
253 {
254 JRadioButtonMenuItem radioButtonMenuItem
255 = new JRadioButtonMenuItem (
256 ChatConstants.AVATAR_TYPES [ i ],
257 i == ChatConstants.DEFAULT_AVATAR_TYPE_INDEX );
258
259 buttonGroup.add ( radioButtonMenuItem );
260
261 avatarMenu.add ( radioButtonMenuItem );
262 }
263
264 //
265
266 JMenu optionsMenu = new JMenu ( "Options" );
267
268 optionsMenu.setMnemonic ( KeyEvent.VK_O );
269
270 menuBar.add ( optionsMenu );
271
272 //
273
274 optionsMenu.add ( musicCheckBoxMenuItem );
275
276 return menuBar;
277 }
278
279 //////////////////////////////////////////////////////////////////////
280 //////////////////////////////////////////////////////////////////////
281 }