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="https://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         }