1 package sellwin.gui; 2 3 import java.util.*; 4 import java.io.*; 5 import java.net.*; 6 import java.awt.*; 7 import java.awt.event.*; 8 import javax.swing.*; 9 import javax.swing.event.*; 10 import javax.swing.text.*; 11 12 import sellwin.utils.*; 13 import sellwin.domain.*; 14 15 19 26 public class ChatDialog extends javax.swing.JDialog implements GUIChars { 27 28 30 private javax.swing.JTextArea msgArea; 31 private javax.swing.JPanel buttonPanel; 32 private javax.swing.JList usersList; 33 private JCheckBox beepBox; 34 private javax.swing.JButton sendButton; 35 private javax.swing.JButton closeButton; 36 private javax.swing.JTextArea conversationArea; 37 private JTextPane conversationTextPane; 38 private javax.swing.JScrollPane jScrollPane3; 39 private javax.swing.JScrollPane jScrollPane2; 40 private javax.swing.JScrollPane jScrollPane1; 41 private javax.swing.JPanel mainPanel; 42 43 private String newline = "\n"; 45 private String [] initStyles = { "bold", "regular" }; 46 private Style bold, regular, regularFrom; 47 48 private ChatOnlineCheck checker = null; 51 private JDialog thisDialog = null; 52 53 private ObjectOutputStream oos = null; 55 private Socket socket = null; 56 private SocketReader socketReader = null; 57 58 private static String currentUser = null; 59 60 private Whiteboard wb = null; 61 62 63 64 public ChatDialog(java.awt.Frame parent, boolean modal) 65 throws ConnectException, IOException { 66 67 super(parent, modal); 68 thisDialog = this; 69 initComponents(); 70 initStylesForTextPane(); 71 72 wb = MainWindow.getWhiteboard(); 73 74 setLang(); 75 setColors(); 76 setFonts(); 77 78 createSocket(); 79 80 try { 81 currentUser = wb.getCurrentUser().getID(); 82 logonToChat(); 83 checker = new ChatOnlineCheck(oos, currentUser); 84 sendQuery(); 85 checker.start(); 86 } catch (Exception e) { 87 ErrorHandler.show(thisDialog, e); 88 } 89 } 90 91 94 private void initStylesForTextPane() { 95 Style def = StyleContext.getDefaultStyleContext().getStyle(StyleContext.DEFAULT_STYLE); 96 97 regular = conversationTextPane.addStyle("regular", def); 98 StyleConstants.setFontFamily(regular, "SansSerif"); 99 StyleConstants.setForeground(regular, Color.RED); 100 101 regularFrom = conversationTextPane.addStyle("regularFrom", def); 102 StyleConstants.setFontFamily(regularFrom, "SansSerif"); 103 StyleConstants.setForeground(regularFrom, Color.GREEN); 104 105 bold = conversationTextPane.addStyle("bold", regular); 106 StyleConstants.setForeground(bold, Color.BLACK); 107 StyleConstants.setBold(bold, true); 108 109 } 110 111 114 private void initComponents() { 115 java.awt.GridBagConstraints gridBagConstraints; 116 117 setTitle("Chat Dialog for " + currentUser); 118 buttonPanel = new javax.swing.JPanel (); 119 beepBox = new JCheckBox("Beep"); 120 sendButton = new javax.swing.JButton (); 121 closeButton = new javax.swing.JButton (); 122 mainPanel = new javax.swing.JPanel (); 123 jScrollPane1 = new javax.swing.JScrollPane (); 124 conversationArea = new javax.swing.JTextArea (); 125 conversationTextPane = new JTextPane(); 126 jScrollPane2 = new javax.swing.JScrollPane (); 127 msgArea = new javax.swing.JTextArea (); 128 jScrollPane3 = new javax.swing.JScrollPane (); 129 usersList = new javax.swing.JList (); 130 131 addWindowListener(new java.awt.event.WindowAdapter () { 132 public void windowClosing(java.awt.event.WindowEvent evt) { 133 closeDialog(evt); 134 } 135 }); 136 137 beepBox.setText("Beep"); 138 buttonPanel.add(beepBox); 139 sendButton.setText("Send"); 140 buttonPanel.add(sendButton); 141 142 closeButton.setText("Close"); 143 buttonPanel.add(closeButton); 144 145 getContentPane().add(buttonPanel, java.awt.BorderLayout.SOUTH); 146 147 mainPanel.setLayout(new java.awt.GridBagLayout ()); 148 149 mainPanel.setBorder(new javax.swing.border.EtchedBorder ()); 150 jScrollPane1.setName("null"); 151 jScrollPane1.setMinimumSize(new java.awt.Dimension (400, 200)); 152 conversationTextPane.setEditable(false); 153 jScrollPane1.setViewportView(conversationTextPane); 154 jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 155 156 gridBagConstraints = new java.awt.GridBagConstraints (); 157 gridBagConstraints.gridwidth = java.awt.GridBagConstraints.REMAINDER; 158 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 159 gridBagConstraints.ipady = 15; 160 gridBagConstraints.insets = new java.awt.Insets (0, 0, 10, 0); 161 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 162 mainPanel.add(jScrollPane1, gridBagConstraints); 163 164 int HEIGHT=100; 165 jScrollPane2.setName("null"); 166 jScrollPane2.setMinimumSize(new java.awt.Dimension (300, HEIGHT)); 167 jScrollPane2.setPreferredSize(new java.awt.Dimension (360, HEIGHT)); 168 jScrollPane2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 169 msgArea.setColumns(30); 170 msgArea.setLineWrap(true); 171 msgArea.setWrapStyleWord(true); 172 msgArea.setRows(6); 173 jScrollPane2.setViewportView(msgArea); 174 175 gridBagConstraints = new java.awt.GridBagConstraints (); 176 gridBagConstraints.gridx = 0; 177 gridBagConstraints.gridy = 1; 178 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 179 gridBagConstraints.insets = new java.awt.Insets (0, 0, 0, 7); 180 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 181 mainPanel.add(jScrollPane2, gridBagConstraints); 182 183 jScrollPane3.setPreferredSize(new java.awt.Dimension (80, HEIGHT)); 184 jScrollPane3.setName("null"); 185 jScrollPane3.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); 186 jScrollPane3.setMinimumSize(new java.awt.Dimension (80, HEIGHT)); 187 jScrollPane3.setMaximumSize(new java.awt.Dimension (80, HEIGHT)); 188 usersList.setName("null"); 189 usersList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 190 jScrollPane3.setViewportView(usersList); 191 192 gridBagConstraints = new java.awt.GridBagConstraints (); 193 gridBagConstraints.gridx = 1; 194 gridBagConstraints.gridy = 1; 195 gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL; 196 gridBagConstraints.anchor = java.awt.GridBagConstraints.WEST; 197 mainPanel.add(jScrollPane3, gridBagConstraints); 198 199 getContentPane().add(mainPanel, java.awt.BorderLayout.CENTER); 200 201 pack(); 202 203 this.addWindowFocusListener( 204 new WindowFocusListener() { 205 public void windowGainedFocus(WindowEvent ev) { 206 207 if ((checker != null) && (checker.isAlive())) 208 ; else { 210 checker = new ChatOnlineCheck(oos, currentUser); 212 checker.start(); 213 214 try { 215 createSocket(); 216 } catch (Exception x) { 217 ErrorHandler.show(thisDialog, x); 218 } 219 } 220 } 221 222 public void windowLostFocus(WindowEvent ev) { 223 } 224 } 225 ); 226 227 sendButton.addActionListener( 228 new ActionListener() { 229 public void actionPerformed(ActionEvent ev) { 230 ChatPacket msg = new ChatPacket(); 231 msg.setAction(ChatPacket.SEND_MSG); 232 ArrayList toList = new ArrayList(); 233 String toUser = (String )usersList.getSelectedValue(); 234 toList.add(toUser); 235 msg.setToList(toList); 236 msg.setMessage(msgArea.getText()); 237 msg.setSender(currentUser); 238 sendMessage(msg); 239 msgArea.setText(""); 240 } 241 } 242 ); 243 244 closeButton.addActionListener( 245 new ActionListener() { 246 public void actionPerformed(ActionEvent ev) { 247 thisDialog.hide(); 248 } 249 } 250 ); 251 252 setSize(463, 219); 253 } 254 255 256 private void closeDialog(java.awt.event.WindowEvent evt) { 257 setVisible(false); 258 dispose(); 259 } 260 261 262 268 public void appendConversation(ChatPacket msg, Style style) { 269 Document doc = conversationTextPane.getDocument(); 270 271 try { 272 doc.insertString(doc.getLength(), msg.getSender(), 273 conversationTextPane.getStyle("bold")); 274 275 doc.insertString(doc.getLength(), " : ", 276 conversationTextPane.getStyle("bold")); 277 278 doc.insertString(doc.getLength(), msg.getMessage(), style); 279 280 doc.insertString(doc.getLength(), newline, style); 281 282 283 } catch (BadLocationException ble) { 284 ErrorHandler.show(thisDialog, ble); 285 } 286 } 287 288 292 public void sendMessage(ChatPacket chatMsg) { 293 try { 294 oos.writeObject(chatMsg); 295 oos.flush(); 296 if (chatMsg.getAction() == ChatPacket.SEND_MSG) 297 appendConversation(chatMsg, regularFrom); 298 } catch (IOException e){ 299 ErrorHandler.show(thisDialog, e); 300 } 301 } 302 303 306 public void createSocket() 307 throws IOException { 308 309 socket = new Socket("localhost", 7900); 310 oos = new ObjectOutputStream(socket.getOutputStream()); 311 socketReader = new SocketReader(socket, conversationTextPane, usersList); 312 socketReader.start(); 313 } 314 315 319 public class SocketReader extends Thread { 320 321 322 private boolean readingSocket = true; 323 324 325 private ObjectInputStream ois = null; 326 private Socket socket = null; 327 328 329 private JList usersList = null; 330 331 332 private JTextPane textPane = null; 333 334 335 public SocketReader(Socket socket, JTextPane textPane, JList usersList) 336 throws IOException { 337 338 this.socket = socket; 339 this.textPane = textPane; 340 this.usersList = usersList; 341 ois = new ObjectInputStream(socket.getInputStream()); 342 } 343 344 347 public void stopRunning() { 348 readingSocket = false; 349 } 350 351 355 public void run() { 356 try { 357 while (readingSocket == true) { 358 ChatPacket msg = (ChatPacket)ois.readObject(); 359 if (msg.getAction() == ChatPacket.QUERY_USERS) { 361 updateUsersList(msg); 363 } else { 364 updateMsgArea(msg); 366 if (beepBox.isSelected()) 367 Toolkit.getDefaultToolkit().beep(); 368 } 369 } 370 } catch (java.io.EOFException err) { 371 ErrorHandler.show(thisDialog, err, wb.getLang().getString("chatServerDied")); 372 } catch (Exception e) { 373 ErrorHandler.show(thisDialog, e); 374 } 375 } 376 377 381 private void updateMsgArea(ChatPacket msg) { 382 appendConversation(msg, regular); 384 } 385 386 390 private void updateUsersList(ChatPacket msg) { 391 392 String selectedItem = (String )usersList.getSelectedValue(); 393 usersList.setListData(msg.getOnlineUsers().toArray()); 394 if (selectedItem != null) { 395 usersList.setSelectedValue(selectedItem, true); 396 } 397 } 398 } 399 400 403 private void logonToChat() { 404 405 ChatPacket msg = new ChatPacket(); 406 msg.setAction(ChatPacket.LOGON); 407 msg.setSender(currentUser); 408 sendMessage(msg); 409 } 410 411 414 private void sendQuery() { 415 try { 416 ChatPacket msg = new ChatPacket(); 417 msg.setSender(currentUser); 418 msg.setAction(ChatPacket.QUERY_USERS); 419 420 oos.writeObject(msg); 421 oos.flush(); 422 } catch (Exception e) { 423 ErrorHandler.show(thisDialog, e); 424 } 425 } 426 427 431 class ChatOnlineCheck extends Thread { 432 private String currentUser = null; 433 private ObjectOutputStream oos = null; 434 private Socket socket = null; 435 private Runnable runnable; 436 private static final int ACT_CHK_TIME = 1000 * 10; private ArrayList alarms=null; 438 private boolean stopRunning=false; 439 440 445 public ChatOnlineCheck(ObjectOutputStream oos, String currentUser) { 446 this.oos = oos; 447 this.currentUser = currentUser; 448 449 runnable = new Runnable () { 450 public void run() { 451 System.out.println("ChatOnlineCheck running "); 452 } 453 }; 454 } 455 456 459 public void stopRunning() { 460 stopRunning = true; 461 } 462 463 470 public void run() { 471 try { 472 ChatPacket msg = new ChatPacket(); 473 msg.setSender(currentUser); 474 msg.setAction(ChatPacket.QUERY_USERS); 475 476 while (stopRunning == false) { 477 sleep(ACT_CHK_TIME); 478 479 oos.writeObject(msg); 480 oos.flush(); 481 SwingUtilities.invokeLater(runnable); 482 } 483 } catch (Exception e) { 484 ErrorHandler.show(thisDialog, e); 485 } 486 } 487 } 488 491 public final void setLang() { 492 setTitle(wb.getLang().getString("chatDialog")); 493 sendButton.setText(wb.getLang().getString("send")); 494 closeButton.setText(wb.getLang().getString("close")); 495 beepBox.setText(wb.getLang().getString("beep")); 496 } 497 498 501 public final void setColors() { 502 } 503 504 507 public final void setFonts() { 508 beepBox.setFont(MainWindow.LABEL_FONT); 509 sendButton.setFont(MainWindow.LABEL_FONT); 510 closeButton.setFont(MainWindow.LABEL_FONT); 511 } 512 513 } 514 | Popular Tags |