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 }