001 package com.croftsoft.apps.client;
002
003 import java.awt.*;
004 import java.awt.event.*;
005 import java.util.*;
006 import javax.swing.*;
007
008 import com.croftsoft.core.gui.LogPanel;
009 import com.croftsoft.core.lang.NullArgumentException;
010 import com.croftsoft.core.lang.lifecycle.Lifecycle;
011 import com.croftsoft.core.lang.lifecycle.Updatable;
012
013 import com.whoola.core.speech.ChatSpeaker;
014 import com.whoola.core.speech.ChatSpeakerLib;
015
016 /*********************************************************************
017 * Exemplar view.
018 *
019 * @version
020 * $Id: ClientView.java,v 1.11 2008/04/19 21:31:00 croft Exp $
021 * @since
022 * 2006-10-30
023 * @author
024 * <a href="http://www.CroftSoft.com/">David Wallace Croft</a>
025 *********************************************************************/
026
027 public final class ClientView
028 implements ActionListener, Lifecycle, Updatable
029 //////////////////////////////////////////////////////////////////////
030 //////////////////////////////////////////////////////////////////////
031 {
032
033 private final LogPanel logPanel;
034
035 private final JTextField jTextField;
036
037 private final ChatSpeaker chatSpeaker;
038
039 private final Queue<ClientMessage>
040 modelQueue,
041 viewQueue;
042
043 //////////////////////////////////////////////////////////////////////
044 //////////////////////////////////////////////////////////////////////
045
046 public ClientView (
047 final ClientConfig config,
048 final Queue<ClientMessage> viewQueue,
049 final Queue<ClientMessage> modelQueue )
050 //////////////////////////////////////////////////////////////////////
051 {
052 NullArgumentException.checkArgs (
053 config,
054 this.viewQueue = viewQueue,
055 this.modelQueue = modelQueue );
056
057 logPanel = new LogPanel (
058 1000, // linesMax
059 Color.WHITE, // backgroundColor
060 null ); // font
061
062 jTextField = new JTextField ( );
063
064 jTextField.addActionListener ( this );
065
066 chatSpeaker = ChatSpeakerLib.createChatSpeaker ( );
067 }
068
069 //////////////////////////////////////////////////////////////////////
070 //////////////////////////////////////////////////////////////////////
071
072 public void setContentPane ( final Container contentPane )
073 //////////////////////////////////////////////////////////////////////
074 {
075 contentPane.setLayout ( new BorderLayout ( ) );
076
077 final JScrollPane jScrollPane = new JScrollPane ( logPanel );
078
079 jScrollPane.setHorizontalScrollBarPolicy (
080 ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER );
081
082 contentPane.add ( jScrollPane, BorderLayout.CENTER );
083
084 contentPane.add ( jTextField, BorderLayout.SOUTH );
085 }
086
087 //////////////////////////////////////////////////////////////////////
088 // lifecycle methods
089 //////////////////////////////////////////////////////////////////////
090
091 public void init ( )
092 //////////////////////////////////////////////////////////////////////
093 {
094 // System.out.println ( "View.init()" );
095
096 try
097 {
098 chatSpeaker.init ( );
099 }
100 catch ( final Exception ex )
101 {
102 ex.printStackTrace ( );
103 }
104
105 modelQueue.offer ( new ClientMessage (
106 ClientMessage.Type.SEND_TEXT_REQUEST, "Hello." ) );
107 }
108
109 public void start ( )
110 //////////////////////////////////////////////////////////////////////
111 {
112 // System.out.println ( "View.start()" );
113 }
114
115 public void stop ( )
116 //////////////////////////////////////////////////////////////////////
117 {
118 // System.out.println ( "View.stop()" );
119 }
120
121 public void destroy ( )
122 //////////////////////////////////////////////////////////////////////
123 {
124 // System.out.println ( "View.destroy()" );
125
126 try
127 {
128 chatSpeaker.destroy ( );
129 }
130 catch ( final Exception ex )
131 {
132 ex.printStackTrace ( );
133 }
134 }
135
136 public void update ( )
137 //////////////////////////////////////////////////////////////////////
138 {
139 ClientMessage message = null;
140
141 while ( ( message = viewQueue.poll ( ) ) != null )
142 {
143 final ClientMessage.Type type = message.getType ( );
144
145 switch ( type )
146 {
147 case SPEECH_EVENT:
148
149 doSpeechEvent ( message );
150
151 break;
152
153 case TEXT_EVENT:
154
155 doTextEvent ( message );
156
157 break;
158
159 default:
160
161 System.out.println ( getClass ( ).getName ( ) + ": "
162 + "unknown message type: " + type );
163 }
164 }
165 }
166
167 //////////////////////////////////////////////////////////////////////
168 // interface ActionListener method
169 //////////////////////////////////////////////////////////////////////
170
171 public void actionPerformed ( ActionEvent actionEvent )
172 //////////////////////////////////////////////////////////////////////
173 {
174 if ( actionEvent.getSource ( ) == jTextField )
175 {
176 final String text = jTextField.getText ( );
177
178 jTextField.setText ( "" );
179
180 //logPanel.record ( text );
181
182 modelQueue.offer ( new ClientMessage (
183 ClientMessage.Type.TEXT_EVENT,
184 "you: " + text ) );
185
186 modelQueue.offer ( new ClientMessage (
187 ClientMessage.Type.SEND_TEXT_REQUEST, text ) );
188 }
189 else
190 {
191 throw new IllegalArgumentException ( );
192 }
193 }
194
195 //////////////////////////////////////////////////////////////////////
196 // private methods
197 //////////////////////////////////////////////////////////////////////
198
199 private void doSpeechEvent ( final ClientMessage clientMessage )
200 //////////////////////////////////////////////////////////////////////
201 {
202 final String ssmlString = ( String ) clientMessage.getContent ( );
203
204 try
205 {
206 chatSpeaker.speak ( ssmlString );
207 }
208 catch ( final Exception ex )
209 {
210 ex.printStackTrace ( );
211 }
212 }
213
214 private void doTextEvent ( final ClientMessage clientMessage )
215 //////////////////////////////////////////////////////////////////////
216 {
217 String text = ( String ) clientMessage.getContent ( );
218
219 text = text.replace (
220 "<br xmlns=\"http://www.w3.org/1999/xhtml\"/>",
221 "\n" );
222
223 logPanel.record ( text );
224 }
225
226 //////////////////////////////////////////////////////////////////////
227 //////////////////////////////////////////////////////////////////////
228 }